基于SpringBoot搭建党委数字档案馆系统实操手册

一、基础设施环境一键部署

为了确保开发环境的一致性并降低配置复杂度,本指南采用Docker Compose编排MySQL、Redis、MinIO(对象存储)和Elasticsearch(全文检索)。请确保服务器已安装Docker及Docker Compose。

在项目根目录下创建docker-compose.yml文件,直接复制以下完整内容:

version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: party_archive_mysql
environment:
MYSQL_ROOT_PASSWORD: root123456
MYSQL_DATABASE: party_archive_db
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:7-alpine
container_name: party_archive_redis
ports:
- "6379:6379"
minio:
image: minio/minio:latest
container_name: party_archive_minio
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: admin123456
command: server /data --console-address ":9001"
ports:
- "9000:9000"
- "9001:9001"
volumes:
- minio_data:/data
elasticsearch:
image: elasticsearch:8.11.0
container_name: party_archive_es
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
volumes:
- es_data:/usr/share/elasticsearch/data
volumes:
mysql_data:
minio_data:
es_data:

执行以下命令启动所有中间件:

docker-compose up -d

二、后端核心架构搭建

使用Spring Initializr生成项目基础骨架,依赖选择Spring Web、Spring Data JPA、MySQL Driver、Lombok、Elasticsearch Client。我们将手动添加MinIO依赖。

1. Maven依赖配置

pom.xml中添加MinIO和Elasticsearch的高阶客户端依赖:




org.springframework.boot
spring-boot-starter-web



org.springframework.boot
spring-boot-starter-data-jpa



com.mysql
mysql-connector-j
runtime



io.minio
minio
8.5.7



org.springframework.boot
spring-boot-starter-data-elasticsearch



org.projectlombok
lombok
true


2. 核心配置文件

src/main/resources/application.yml中配置数据源、对象存储及ES连接信息:

server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/party_archive_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root123456
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
自定义MinIO配置
minio:
endpoint: http://localhost:9000
accessKey: admin
secretKey: admin123456
bucketName: party-docs

3. 档案实体类设计

创建PartyArchive.java,定义党委档案的核心字段,包括标题、密级、文号等:

package com.party.archive.entity;
import jakarta.persistence.;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
@Data
@Entity
@Table(name = "t_party_archive")
@Document(indexName = "party_archive_index")
public class PartyArchive {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 200)
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String title;
@Column(length = 50)
private String docNo; // 文号
@Column(length = 20)
private String securityLevel; // 密级:绝密/机密/秘密/公开
@Column(length = 100)
private String category; // 类别:会议纪要/红头文件/人事档案
@Column(length = 500)
private String fileUrl; // MinIO存储路径
@Column(name = "create_time")
private Long createTime;
}

4. MinIO工具类配置

创建MinioConfig.javaMinioUtil.java,用于处理文件上传下载:

package com.party.archive.config;
import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
private String endpoint;
private String accessKey;
private String secretKey;
private String bucketName;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}

5. 业务逻辑层实现

创建ArchiveService.java,实现文件上传至MinIO并将元数据同步保存到MySQL及Elasticsearch:

package com.party.archive.service;
import com.party.archive.entity.PartyArchive;
import com.party.archive.repository.ArchiveRepository;
import com.party.archive.repository.EsArchiveRepository;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import jakarta.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.UUID;
@Service
public class ArchiveService {
@Autowired
private MinioClient minioClient;
@Autowired
private ArchiveRepository archiveRepository;
@Autowired
private EsArchiveRepository esArchiveRepository;
@Value("${minio.bucketName}")
private String bucketName;
@Transactional
public void uploadArchive(MultipartFile file, String title, String docNo, String securityLevel, String category) throws Exception {
// 1. 生成唯一文件名
String fileName = UUID.randomUUID() + "_" + file.getOriginalFilename();
// 2. 上传到MinIO
minioClient.putObject(
PutObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.stream(file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build()
);
// 3. 构建实体
PartyArchive archive = new PartyArchive();
archive.setTitle(title);
archive.setDocNo(docNo);
archive.setSecurityLevel(securityLevel);
archive.setCategory(category);
archive.setFileUrl(fileName);
archive.setCreateTime(System.currentTimeMillis());
// 4. 保存到MySQL
archiveRepository.save(archive);
// 5. 同步到Elasticsearch
esArchiveRepository.save(archive);
}
}

6. 控制器层接口

创建ArchiveController.java,提供上传和搜索接口:

基于SpringBoot搭建党委数字档案馆系统实操手册

package com.party.archive.controller;
import com.party.archive.entity.PartyArchive;
import com.party.archive.repository.EsArchiveRepository;
import com.party.archive.service.ArchiveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@RestController
@RequestMapping("/api/archive")
public class ArchiveController {
@Autowired
private ArchiveService archiveService;
@Autowired
private EsArchiveRepository esArchiveRepository;
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file,
@RequestParam("title") String title,
@RequestParam("docNo") String docNo,
@RequestParam("securityLevel") String securityLevel,
@RequestParam("category") String category) {
try {
archiveService.uploadArchive(file, title, docNo, securityLevel, category);
return "上传归档成功";
} catch (Exception e) {
e.printStackTrace();
return "上传失败: " + e.getMessage();
}
}
@GetMapping("/search")
public Page search(@RequestParam("keyword") String keyword) {
return esArchiveRepository.findByTitleContaining(keyword, PageRequest.of(0, 10));
}
}

三、前端交互页面开发

使用Vue 3配合Element Plus构建管理界面,提供文件上传和即时检索功能。

1. 项目初始化

执行命令创建Vue项目:

npm create vue@latest party-archive-ui
cd party-archive-ui
npm install element-plus axios

2. 上传组件实现

修改src/App.vue,编写完整的上传与搜索逻辑:



四、系统启动与功能验证

完成上述代码编写后,按顺序启动后端与前端服务。

1. 启动后端服务

在IDEA中运行PartyArchiveApplication主类,或使用Maven命令:

mvn spring-boot:run

观察控制台日志,确认MinIO、MySQL、ES连接无报错。

2. 启动前端服务

npm run dev

访问前端控制台输出的Local地址(通常是 http://localhost:5173)。

3. 功能实操验证

  • 上传测试:准备一份PDF文件,填写标题“2023年度党委工作总结”,文号“党字〔2023〕5号”,密级“机密”,类别“会议纪要”。点击“确认归档”,若提示“归档成功”且后端日志打印SQL插入语句,则功能正常。
  • 检索测试:在搜索框输入“党委”,点击搜索。若下方表格列出刚才上传的文档信息,说明Elasticsearch索引同步成功。
AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

扫码咨询
安答联动微信公众号二维码

微信扫码关注安答联动

申请试用
热线电话
申请试用

安答联动档案管理系统