档案管理系统架构设计与落地实战:从零到一构建企业级方案

系统架构设计

一个稳定、可扩展的档案管理系统,其核心在于清晰的架构分层。我们将采用经典的三层架构:数据层、服务层和应用层。

数据层设计

数据层负责档案数据的持久化存储。我们选择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依赖如下:

``` org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-data-jpa mysql mysql-connector-java runtime io.minio minio 8.5.2 org.projectlombok lombok true ```

配置文件与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 ```

生产环境建议使用systemdDocker管理进程。创建一个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
AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统