档案管理系统架构设计与落地实战:从零到一构建企业级方案
系统架构设计
一个稳定、可扩展的档案管理系统,其核心在于清晰的架构分层。我们将采用经典的三层架构:数据层、服务层和应用层。
数据层设计
数据层负责档案数据的持久化存储。我们选择MySQL作为关系型数据库,用于存储档案元数据、用户信息、操作日志等结构化数据。对于电子文件本身,我们采用分布式文件系统MinIO进行存储,以应对海量非结构化数据。
创建数据库和表结构。以下是核心表的SQL语句,请在MySQL 8.0或更高版本中执行。
``` CREATE DATABASE IF NOT EXISTS archive_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE archive_db; -- 档案分类表 CREATE TABLE `archive_category` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(100) NOT NULL COMMENT '分类名称', `parent_id` int DEFAULT '0' COMMENT '父级分类ID,0为顶级', `code` varchar(50) NOT NULL COMMENT '分类编码,用于树形结构检索', `sort_order` int DEFAULT '0' COMMENT '排序', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_code` (`code`), KEY `idx_parent_id` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='档案分类表'; -- 档案条目表(元数据) CREATE TABLE `archive_item` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `category_id` int NOT NULL COMMENT '所属分类ID', `title` varchar(255) NOT NULL COMMENT '档案标题', `archive_number` varchar(100) NOT NULL COMMENT '档案编号,唯一', `keywords` varchar(500) DEFAULT NULL COMMENT '关键词,用于检索', `description` text COMMENT '档案描述', `storage_location` varchar(500) NOT NULL COMMENT '物理存放位置(如柜号/架位)', `digital_file_path` varchar(1000) DEFAULT NULL COMMENT '数字化文件在MinIO中的存储路径', `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:1-在库,2-借出,3-已销毁', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_archive_number` (`archive_number`), KEY `idx_category_id` (`category_id`), KEY `idx_keywords` (`keywords`(255)), FULLTEXT KEY `ft_title_desc` (`title`,`description`) -- 全文检索 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='档案条目表'; -- 档案借阅记录表 CREATE TABLE `archive_borrow` ( `id` int NOT NULL AUTO_INCREMENT, `item_id` int NOT NULL COMMENT '档案ID', `borrower_id` int NOT NULL COMMENT '借阅人ID', `borrow_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '借出时间', `expected_return_time` datetime NOT NULL COMMENT '应归还时间', `actual_return_time` datetime DEFAULT NULL COMMENT '实际归还时间', `borrow_purpose` varchar(500) DEFAULT NULL COMMENT '借阅用途', PRIMARY KEY (`id`), KEY `idx_item_id` (`item_id`), KEY `idx_borrower_id` (`borrower_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='档案借阅记录表'; ```安装并配置MinIO对象存储。使用Docker快速部署。
``` docker run -p 9000:9000 -p 9001:9001 \ --name minio \ -v /mnt/data:/data \ -e "MINIO_ROOT_USER=admin" \ -e "MINIO_ROOT_PASSWORD=your_strong_password" \ quay.io/minio/minio server /data --console-address ":9001" ```访问 http://你的服务器IP:9001,使用设置的账号密码登录。在控制台创建一个名为 archive-files 的存储桶(Bucket),并设置访问策略。
后端服务搭建
后端使用Spring Boot框架,提供RESTful API。确保已安装JDK 11或以上版本,Maven 3.6+。
项目初始化与核心依赖
使用Spring Initializr(https://start.spring.io/)生成项目,或手动创建。核心pom.xml依赖如下:
```配置文件与MinIO客户端
在application.yml中配置数据源和MinIO连接。
``` spring: datasource: url: jdbc:mysql://localhost:3306/archive_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: your_db_username password: your_db_password driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: true minio: endpoint: http://localhost:9000 accessKey: admin secretKey: your_strong_password bucketName: archive-files ```创建MinIO配置类MinioConfig.java,用于初始化客户端。
``` import io.minio.MinioClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MinioConfig { @Value("${minio.endpoint}") private String endpoint; @Value("${minio.accessKey}") private String accessKey; @Value("${minio.secretKey}") private String secretKey; @Bean public MinioClient minioClient() { return MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); } } ```实现文件上传服务
创建FileStorageService.java,封装MinIO文件操作。
``` import io.minio.; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; import java.util.UUID; @Slf4j @Service @RequiredArgsConstructor public class FileStorageService { private final MinioClient minioClient; @Value("${minio.bucketName}") private String bucketName; public String uploadFile(MultipartFile file, String fileCategory) throws Exception { // 确保存储桶存在 boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); if (!found) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); } // 生成唯一文件名: 分类/时间戳_UUID_原始文件名 String originalFilename = file.getOriginalFilename(); String fileExtension = originalFilename.substring(originalFilename.lastIndexOf(".")); String objectName = String.format("%s/%d_%s%s", fileCategory, System.currentTimeMillis(), UUID.randomUUID().toString().replace("-", ""), fileExtension); // 上传 try (InputStream inputStream = file.getInputStream()) { minioClient.putObject( PutObjectArgs.builder() .bucket(bucketName) .object(objectName) .stream(inputStream, file.getSize(), -1) .contentType(file.getContentType()) .build() ); } log.info("文件上传成功: {}", objectName); return objectName; // 返回存储路径,用于存入数据库 } // 获取文件访问URL(可设置有效期) public String getFileUrl(String objectName) throws Exception { return minioClient.getPresignedObjectUrl( GetPresignedObjectUrlArgs.builder() .method(Method.GET) .bucket(bucketName) .object(objectName) .expiry(60 60) // 链接1小时有效 .build() ); } } ```前端界面开发

前端使用Vue 3 + Element Plus实现。确保已安装Node.js 16+和npm。
项目初始化与依赖
使用Vite快速创建项目。
``` npm create vue@latest archive-frontend 根据提示选择项目配置,确保添加Vue Router和Pinia。 cd archive-frontend npm install element-plus axios npm install ```档案列表与上传组件
创建档案列表页面ArchiveList.vue,核心是表格和上传功能。
```系统部署与优化
后端打包与部署
在Spring Boot项目根目录下,使用Maven打包。
``` mvn clean package -DskipTests ```打包完成后,在target目录下会生成archive-system-0.0.1-SNAPSHOT.jar文件。使用以下命令启动:
``` java -jar -Dspring.profiles.active=prod archive-system-0.0.1-SNAPSHOT.jar ```生产环境建议使用systemd或Docker管理进程。创建一个Dockerfile:
``` FROM openjdk:11-jre-slim VOLUME /tmp COPY target/archive-system-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"] ```构建并运行Docker容器:
``` docker build -t archive-system . docker run -d -p 8080:8080 --name archive-app archive-system ```前端构建与Nginx部署
在前端项目目录下,构建生产版本。
``` npm run build ```构建产物在dist文件夹。配置Nginx托管静态文件并代理后端API。
编辑Nginx配置文件(如/etc/nginx/conf.d/archive.conf):
``` server { listen 80; server_name your_domain.com; 或服务器IP 前端静态文件 location / { root /path/to/archive-frontend/dist; index index.html; try_files $uri $uri/ /index.html; } 代理后端API请求 location /api/ { proxy_pass http://localhost:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } 代理MinIO