唐山档案管理系统:从零搭建企业级数字档案库实操指南
一、系统架构与核心技术选型
本系统采用前后端分离架构,前端使用Vue 3 + Element Plus,后端使用Spring Boot 2.7 + MyBatis Plus,数据库使用MySQL 8.0,文件存储使用MinIO对象存储。
1.1 环境要求与版本锁定
确保所有组件版本完全匹配,避免兼容性问题:
- JDK 17.0.8
- Node.js 18.16.0
- MySQL 8.0.33
- MinIO RELEASE.2023-08-29T23-07-35Z
- Redis 7.0.12
二、后端服务搭建与配置
2.1 项目初始化与依赖配置
创建Spring Boot项目,pom.xml关键依赖配置:
```xml2.2 数据库表结构设计
创建核心档案表结构:
```sql CREATE TABLE `archive_file` ( `id` bigint NOT NULL AUTO_INCREMENT, `file_code` varchar(50) NOT NULL COMMENT '档案编号', `file_name` varchar(200) NOT NULL COMMENT '档案名称', `file_type` varchar(20) NOT NULL COMMENT '档案类型', `department` varchar(100) NOT NULL COMMENT '所属部门', `storage_location` varchar(500) COMMENT '物理存放位置', `digital_path` varchar(500) COMMENT '数字文件路径', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_file_code` (`file_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `archive_borrow` ( `id` bigint NOT NULL AUTO_INCREMENT, `file_id` bigint NOT NULL, `borrower` varchar(50) NOT NULL, `borrow_time` datetime NOT NULL, `return_time` datetime, `status` tinyint DEFAULT 0 COMMENT '0-借阅中 1-已归还', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```2.3 配置文件详解
application.yml完整配置:
```yaml server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/archive_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver redis: host: localhost port: 6379 password: database: 0 minio: endpoint: http://localhost:9000 accessKey: minioadmin secretKey: minioadmin bucketName: archive-files mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0 ```2.4 MinIO文件存储配置
创建MinIO配置文件:
```java @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(); } } ```2.5 档案上传接口实现
核心文件上传服务:
```java @Service public class ArchiveService { @Autowired private MinioClient minioClient; @Value("${minio.bucketName}") private String bucketName; public String uploadFile(MultipartFile file, String fileCode) throws Exception { // 检查存储桶是否存在 boolean found = minioClient.bucketExists(BucketExistsArgs.builder() .bucket(bucketName).build()); if (!found) { minioClient.makeBucket(MakeBucketArgs.builder() .bucket(bucketName).build()); } // 生成唯一文件名 String originalFilename = file.getOriginalFilename(); String fileExtension = originalFilename.substring(originalFilename.lastIndexOf(".")); String objectName = fileCode + "_" + System.currentTimeMillis() + fileExtension; // 上传文件 minioClient.putObject( PutObjectArgs.builder() .bucket(bucketName) .object(objectName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build() ); return objectName; } public String getFileUrl(String objectName) throws Exception { return minioClient.getPresignedObjectUrl( GetPresignedObjectUrlArgs.builder() .method(Method.GET) .bucket(bucketName) .object(objectName) .expiry(60 60 24) // 24小时有效 .build() ); } } ```2.6 档案检索接口
实现多条件组合查询:
```java @RestController @RequestMapping("/api/archive") public class ArchiveController { @Autowired private ArchiveFileMapper archiveFileMapper; @GetMapping("/search") public List三、前端界面开发
3.1 Vue项目初始化

创建Vue项目并安装必要依赖:
```bash npm create vue@latest archive-frontend cd archive-frontend npm install element-plus @element-plus/icons-vue axios vue-router pinia ```3.2 档案管理界面实现
档案列表组件:
```vue
档案管理
新增档案
3.3 档案上传组件
实现文件上传功能:
```vue
拖拽文件到此处或 点击上传
支持PDF、Word、Excel、图片格式,单个文件不超过50MB
四、系统部署与运维
4.1 Docker容器化部署
创建后端Dockerfile:
```dockerfile FROM openjdk:17-jdk-slim WORKDIR /app COPY target/archive-system.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"] ```创建前端Dockerfile:
```dockerfile FROM nginx:alpine COPY dist/ /usr/share/nginx/html/ COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 80 ```Nginx配置文件:
```nginx user nginx; worker_processes auto; events { worker_connections 1024; } http { include /etc/nginx/mime.types; server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://backend:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } } ```4.2 使用docker-compose一键部署
创建docker-compose.yml:
```yaml version: '3.8' services: mysql: image: mysql:8.0.33 environment: MYSQL_ROOT_PASSWORD: your_password MYSQL_DATABASE: archive_db volumes: - mysql_data:/var/lib/mysql ports: - "3306:3306" redis: image: redis:7.0.12-alpine ports: - "6379:6379" minio: image: minio/minio:latest command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin volumes: - minio_data:/data ports: - "9000:9000" - "9001:9001" backend: build: ./backend depends_on: - mysql - redis - minio environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/archive_db SPRING_REDIS_HOST: redis MINIO_ENDPOINT: http://minio:9000 ports: - "8080:8080" frontend: build: ./frontend depends_on: - backend ports: - "80:80" volumes: mysql_data: minio_data: ```4.3 启动系统
在项目根目录执行:
```bash 构建并启动所有服务 docker-compose up -d 查看服务状态 docker-compose ps 查看日志 docker-compose logs -f backend ```4.4 系统初始化配置
系统启动后,按顺序执行以下操作:
- 访问MinIO控制台:http://localhost:9001,使用minioadmin/minioadmin登录
- 创建存储桶:在控制台创建名为archive-files的存储桶
- 访问前端界面:http://localhost
- 初始化管理员账号:首次访问时使用默认账号admin/admin123登录
- 配置部门