基于微服务架构的现代档案管理系统建设全流程

一、开发环境与基础依赖安装

在开始构建之前,必须准备标准化的开发环境。本系统基于Spring Boot 3.x、MySQL 8.0及Docker构建,确保环境版本一致是避免兼容性问题的关键。

1. 安装JDK 17

系统要求JDK 17及以上版本。在Linux终端执行以下命令安装OpenJDK 17:

```bash sudo apt update sudo apt install openjdk-17-jdk -y java -version ```

2. 安装Maven 3.8+

用于构建Java项目,执行如下命令安装Maven:

```bash wget https://dlcdn.apache.org/maven/maven-3/3.9.5/binaries/apache-maven-3.9.5-bin.tar.gz -P /tmp sudo tar xf /tmp/apache-maven-3.9.5-bin.tar.gz -C /opt sudo ln -s /opt/apache-maven-3.9.5 /opt/maven export PATH=/opt/maven/bin:$PATH mvn -version ```

3. 安装Docker与Docker Compose

用于服务容器化部署,执行以下脚本:

```bash curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker $USER ```

二、数据库架构设计与初始化

档案管理的核心在于元数据的结构化存储与全文检索能力。此处使用MySQL 8.0的InnoDB引擎,并利用全文索引支持档案内容的快速检索。

1. 创建数据库与表结构

连接MySQL数据库,执行以下SQL脚本。该脚本包含档案主表、分类表及必要的索引优化:

```sql CREATE DATABASE IF NOT EXISTS digital_archive DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci; USE digital_archive; -- 档案分类表 CREATE TABLE archive_category ( id BIGINT AUTO_INCREMENT PRIMARY KEY, category_name VARCHAR(100) NOT NULL, parent_id BIGINT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_parent (parent_id) ) ENGINE=InnoDB; -- 档案主表 CREATE TABLE archive_record ( id BIGINT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL COMMENT '档案标题', category_id BIGINT NOT NULL COMMENT '关联分类ID', file_path VARCHAR(500) NOT NULL COMMENT '物理存储路径', file_size BIGINT DEFAULT 0 COMMENT '文件大小(字节)', mime_type VARCHAR(100) COMMENT '文件MIME类型', content TEXT COMMENT 'OCR识别后的文本内容,用于全文检索', status TINYINT DEFAULT 1 COMMENT '状态:1-正常,0-删除', created_by VARCHAR(50) DEFAULT 'system', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FULLTEXT KEY ft_content (title, content) -- 全文检索索引 ) ENGINE=InnoDB; -- 插入初始化分类数据 INSERT INTO archive_category (category_name, parent_id) VALUES ('行政文书', 0); INSERT INTO archive_category (category_name, parent_id) VALUES ('技术图纸', 0); ```

三、后端核心服务搭建

后端采用Spring Boot 3.x框架,提供RESTful API接口。为了实现快速落地,此处展示核心配置与代码实现。

1. 项目结构初始化

使用Spring Initializr生成项目,依赖选择:Spring Web、Spring Data JPA、MySQL Driver、Lombok。项目目录结构如下:

```text src/main/java/com/example/archive/ ├── ArchiveApplication.java ├── controller/ │ └── ArchiveController.java ├── entity/ │ └── ArchiveRecord.java ├── repository/ │ └── ArchiveRepository.java └── service/ └── ArchiveService.java ```

2. 配置文件 application.yml

src/main/resources/application.yml中配置数据库连接及JPA属性:

```yaml server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/digital_archive?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: true properties: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect ```

3. 核心实体类 ArchiveRecord.java

定义档案实体,映射数据库表结构:

```java package com.example.archive.entity; import jakarta.persistence.; import lombok.Data; import java.time.LocalDateTime; @Data @Entity @Table(name = "archive_record") public class ArchiveRecord { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private Long categoryId; private String filePath; private Long fileSize; private String mimeType; @Column(columnDefinition = "TEXT") private String content; private Integer status; private String createdBy; private LocalDateTime createdAt; private LocalDateTime updatedAt; } ```

4. 数据访问层 ArchiveRepository.java

基于微服务架构的现代档案管理系统建设全流程

继承JpaRepository,并自定义全文检索方法:

```java package com.example.archive.repository; import com.example.archive.entity.ArchiveRecord; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface ArchiveRepository extends JpaRepository { // 使用MySQL全文检索 @Query(value = "SELECT FROM archive_record WHERE MATCH(title, content) AGAINST(:keyword IN NATURAL LANGUAGE MODE) AND status = 1", nativeQuery = true) List searchByKeyword(@Param("keyword") String keyword); } ```

5. 控制器层 ArchiveController.java

提供档案上传与检索接口:

```java package com.example.archive.controller; import com.example.archive.entity.ArchiveRecord; import com.example.archive.repository.ArchiveRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.nio.file.Paths; import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; @RestController @RequestMapping("/api/archives") public class ArchiveController { @Autowired private ArchiveRepository archiveRepository; private final String UPLOAD_DIR = "/data/uploads"; // 文件上传与元数据保存 @PostMapping("/upload") public Map uploadArchive(@RequestParam("file") MultipartFile file, @RequestParam("title") String title, @RequestParam("categoryId") Long categoryId) throws IOException { // 确保目录存在 File dir = new File(UPLOAD_DIR); if (!dir.exists()) dir.mkdirs(); // 保存文件 String fileName = UUID.randomUUID() + "_" + file.getOriginalFilename(); String filePath = Paths.get(UPLOAD_DIR, fileName).toString(); file.transferTo(new File(filePath)); // 保存元数据 ArchiveRecord record = new ArchiveRecord(); record.setTitle(title); record.setCategoryId(categoryId); record.setFilePath(filePath); record.setFileSize(file.getSize()); record.setMimeType(file.getContentType()); record.setContent("模拟OCR提取内容..."); // 实际生产中集成Tesseract OCR record.setStatus(1); record.setCreatedBy("admin"); record.setCreatedAt(LocalDateTime.now()); archiveRepository.save(record); Map result = new HashMap<>(); result.put("code", 200); result.put("message", "上传成功"); result.put("data", record); return result; } // 档案检索 @GetMapping("/search") public List searchArchives(@RequestParam("keyword") String keyword) { return archiveRepository.searchByKeyword(keyword); } } ```

四、容器化部署配置

为了实现“与时俱进”的交付能力,必须将应用容器化。以下配置将后端应用与MySQL数据库编排在一起。

1. 后端 Dockerfile

在项目根目录创建Dockerfile

```dockerfile 构建阶段 FROM maven:3.8.6-openjdk-17-slim AS build WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean package -DskipTests 运行阶段 FROM openjdk:17-jdk-slim WORKDIR /app COPY --from=build /app/target/.jar app.jar 创建上传目录 RUN mkdir -p /data/uploads EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"] ```

2. Docker Compose 编排文件

创建docker-compose.yml,一键启动所有服务:

```yaml version: '3.8' services: mysql: image: mysql:8.0 container_name: archive_mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: digital_archive ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql - ./init.sql:/docker-entrypoint-initdb.d/init.sql networks: - archive_net app: build: . container_name: archive_app ports: - "8080:8080" volumes: - ./uploads:/data/uploads depends_on: - mysql environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/digital_archive?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: root networks: - archive_net volumes: mysql_data: networks: archive_net: driver: bridge ```

五、系统运行与接口测试

完成代码编写后,通过Docker Compose启动系统,并使用curl命令验证核心功能。

1. 启动服务

确保init.sql文件包含第二部分的SQL脚本,并放在当前目录下。执行启动命令:

```bash docker-compose up -d --build ```

查看日志确认启动成功:

```bash docker-compose logs -f app ```

2. 测试档案上传接口

准备一个测试文件test.txt,内容为“这是测试档案内容”。执行以下命令上传:

```bash curl -X POST "http://localhost:8080/api/archives/upload" \ -F "file=@test.txt" \ -F "title=2023年度技术档案" \ -F "categoryId=1" ```

预期返回JSON包含"code": 200及生成的档案ID。

3. 测试全文检索接口

使用关键词“技术”检索刚才上传的档案:

```bash curl "http://localhost:8080/api/archives/search?keyword=技术" ```

系统应返回包含该档案元数据的JSON数组。至此,一个具备现代架构特征、支持容器化部署的轻量级档案管理系统已完全落地。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统