从零搭建烟台数字档案馆系统的技术选型与实施指南
系统架构设计
数字档案馆系统采用分层架构设计,确保系统的可扩展性和可维护性。
技术栈选型
以下是核心技术的选型依据和具体版本:
- 后端框架:Spring Boot 2.7.18,提供快速启动和自动配置能力。
- 数据库:PostgreSQL 15.3,用于存储结构化元数据;MinIO 2023-11-15,用于存储非结构化电子文件。
- 全文检索:Elasticsearch 8.12.0,提供档案目录和内容的快速检索。
- 前端框架:Vue 3.3.4 + Element Plus 2.3.9,构建管理后台。
环境搭建与基础服务部署
1. 服务器环境准备
使用CentOS 7.9作为操作系统,执行以下命令初始化环境:
``` 更新系统并安装基础工具 sudo yum update -y sudo yum install -y wget curl vim git net-tools 安装Docker及Docker Compose sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl start docker sudo systemctl enable docker 安装Docker Compose sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose ```2. 使用Docker Compose部署基础服务
创建 `docker-compose.yml` 文件,内容如下:
``` version: '3.8' services: postgres: image: postgres:15.3 container_name: archive-postgres environment: POSTGRES_DB: digital_archive POSTGRES_USER: archive_admin POSTGRES_PASSWORD: YourStrong@Pass123 volumes: - ./postgres_data:/var/lib/postgresql/data ports: - "5432:5432" restart: unless-stopped minio: image: minio/minio:RELEASE.2023-11-15T20-43-25Z container_name: archive-minio command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin123 volumes: - ./minio_data:/data ports: - "9000:9000" - "9001:9001" restart: unless-stopped elasticsearch: image: elasticsearch:8.12.0 container_name: archive-es environment: - discovery.type=single-node - ES_JAVA_OPTS=-Xms512m -Xmx512m - xpack.security.enabled=false ulimits: memlock: soft: -1 hard: -1 volumes: - ./es_data:/usr/share/elasticsearch/data ports: - "9200:9200" restart: unless-stopped ```在文件所在目录执行命令启动服务:
``` sudo docker-compose up -d ```等待1-2分钟后,通过以下命令验证服务状态:
``` sudo docker-compose ps ```所有服务的状态应为 `Up`。
后端服务开发与配置
1. 创建Spring Boot项目
使用Spring Initializr(https://start.spring.io)生成项目,依赖选择:
- Spring Web
- Spring Data JPA
- PostgreSQL Driver
- Lombok
下载生成的项目压缩包并解压,使用IDE导入。
2. 配置核心连接
编辑 `src/main/resources/application.yml` 文件:
``` spring: datasource: url: jdbc:postgresql://your_server_ip:5432/digital_archive username: archive_admin password: YourStrong@Pass123 driver-class-name: org.postgresql.Driver jpa: hibernate: ddl-auto: update show-sql: true properties: hibernate: dialect: org.hibernate.dialect.PostgreSQLDialect format_sql: true minio: endpoint: http://your_server_ip:9000 accessKey: minioadmin secretKey: minioadmin123 bucket: archive-files elasticsearch: host: your_server_ip port: 9200 ```注意:将 `your_server_ip` 替换为你的实际服务器IP地址。
3. 实现档案实体与存储逻辑
创建档案核心实体类 `ArchiveItem.java`:
``` import javax.persistence.; import java.time.LocalDateTime; @Entity @Table(name = "archive_items") @Data // Lombok注解,自动生成getter/setter public class ArchiveItem { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String archiveCode; // 档号 @Column(nullable = false) private String title; // 题名 @Column(length = 1000) private String description; // 描述 private String fonds; // 全宗 private String filingYear; // 归档年度 @Column(nullable = false) private String filePath; // 在MinIO中的存储路径 private String fileType; private Long fileSize; @Column(nullable = false) private LocalDateTime createTime = LocalDateTime.now(); private String creator; } ```创建MinIO文件服务类 `MinioService.java`,实现文件上传、下载、删除功能。关键上传方法如下:
``` @Service public class MinioService { @Value("${minio.endpoint}") private String endpoint; @Value("${minio.accessKey}") private String accessKey; @Value("${minio.secretKey}") private String secretKey; @Value("${minio.bucket}") private String bucketName; private MinioClient minioClient; @PostConstruct public void init() { this.minioClient = MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); } public String uploadFile(MultipartFile file, String objectName) throws Exception { // 检查存储桶是否存在 boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); if (!found) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); } // 上传文件 minioClient.putObject( PutObjectArgs.builder() .bucket(bucketName) .object(objectName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build() ); return objectName; } } ```4. 集成Elasticsearch实现全文检索
在 `pom.xml` 中添加依赖:
```
创建ES文档类 `ArchiveDocument.java` 和对应的Repository接口,实现档案信息的索引与检索。
前端管理界面开发
1. 初始化Vue项目
使用Vite创建项目:
``` npm create vue@latest digital-archive-admin ```按照提示选择项目配置,务必包含 TypeScript 和 Router。
进入项目目录,安装Element Plus和Axios:
``` cd digital-archive-admin npm install element-plus axios npm install ```2. 配置API请求与全局状态
创建 `src/utils/request.ts` 文件,配置Axios实例:
``` import axios from 'axios'; const request = axios.create({ baseURL: 'http://your_backend_ip:8080/api', timeout: 10000, }); // 请求拦截器 request.interceptors.request.use( config => { const token = localStorage.getItem('archive_token'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, error => { return Promise.reject(error); } ); export default request; ```3. 实现档案上传组件
创建 `src/components/ArchiveUpload.vue` 组件,核心模板部分:
```系统集成与部署
1. 前后端联调
启动后端服务:
``` cd /path/to/spring-boot-project ./mvnw spring-boot:run ```启动前端开发服务器:
``` cd /path/to/vue-project npm run dev ```访问 http://localhost:5173 测试前端界面,确保能调用后端API完成档案上传、检索等操作。
2. 生产环境部署配置
后端打包为JAR:
``` ./mvnw clean package -DskipTests ```创建生产环境Dockerfile部署后端:
``` FROM openjdk:11-jre-slim COPY target/digital-archive-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"] ```前端构建静态文件:
``` npm run build ```使用Nginx部署前端,配置示例:
``` server { listen 80; server_name your_domain.com; root /var/www/digital-archive; index index.html; location / { try_files $uri $uri/ /index.html; } location /api { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ```3. 数据备份策略配置
创建数据库备份脚本 `backup_postgres.sh`:
``` !/bin/bash BACKUP_DIR="/backup/postgres" DATE=$(date +%Y%m%d_%H%M%S) docker exec archive-postgres pg_dump -U archive_admin digital_archive > $BACKUP_DIR/archive_$DATE.sql 保留最近7天备份 find $BACKUP_DIR -name ".sql" -mtime +7 -delete ```添加到crontab,每天凌晨2点执行:
``` 0 2 /path/to/backup_postgres.sh ```关键问题排查
- MinIO连接失败:检查服务器防火墙是否开放9000端口,执行 `sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent && sudo firewall-cmd --reload`。
- Elasticsearch启动报内存不足:编辑 `docker-compose.yml` 中ES服务的 `ES_JAVA_OPTS` 参数,根据服务器内存调整,如 `-Xms1g -Xmx1g`。
- 档案文件无法预览:检查MinIO存储桶的访问策略,确保文件设置为可公开读取或通过预签名URL访问。