文教体育用品企业数字档案馆系统从零搭建实操指南
一、系统架构与核心组件选型
本系统采用轻量级微服务架构,核心组件全部使用开源方案,确保零成本落地。以下是具体选型清单:
1.1 存储层方案
文件存储:MinIO(对象存储)
安装命令:
``` wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x minio ./minio server /data --console-address ":9001" ```数据库:PostgreSQL 14
安装命令:
``` sudo apt install postgresql-14 sudo systemctl start postgresql ```1.2 服务层方案
后端框架:Spring Boot 2.7 + MyBatis Plus
前端框架:Vue 3 + Element Plus
全文检索:Elasticsearch 8.5
安装命令:
``` docker pull elasticsearch:8.5.0 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:8.5.0 ```二、数据库设计与初始化
2.1 核心表结构设计
创建数据库:
``` CREATE DATABASE digital_archive; ```档案主表:
``` CREATE TABLE archive_document ( id BIGSERIAL PRIMARY KEY, doc_no VARCHAR(50) NOT NULL UNIQUE, doc_name VARCHAR(200) NOT NULL, doc_type VARCHAR(20) NOT NULL, product_line VARCHAR(50), department VARCHAR(50), storage_path TEXT NOT NULL, file_size BIGINT, file_type VARCHAR(20), upload_user_id BIGINT, upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, status SMALLINT DEFAULT 1, version INTEGER DEFAULT 1 ); ```档案分类表:
``` CREATE TABLE archive_category ( id BIGSERIAL PRIMARY KEY, category_code VARCHAR(30) NOT NULL UNIQUE, category_name VARCHAR(100) NOT NULL, parent_id BIGINT DEFAULT 0, sort_order INTEGER DEFAULT 0, level INTEGER DEFAULT 1 ); ```2.2 索引优化配置
创建复合索引提升查询性能:
``` CREATE INDEX idx_doc_search ON archive_document(doc_type, department, upload_time); CREATE INDEX idx_category_tree ON archive_category(parent_id, level, sort_order); ```三、文件存储服务搭建
3.1 MinIO配置
创建配置文件minio-config.env:
``` MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=YourSecurePassword123 MINIO_VOLUMES="/data" MINIO_OPTS="--console-address :9001" ```使用Docker启动:
``` docker run -d \ -p 9000:9000 \ -p 9001:9001 \ --name minio \ -v /mnt/data:/data \ -v /path/to/minio-config.env:/etc/config.env \ -e "MINIO_CONFIG_ENV_FILE=/etc/config.env" \ minio/minio server /data ```3.2 创建存储桶
登录MinIO控制台(http://服务器IP:9001),依次创建以下存储桶:
- product-design:产品设计文档
- quality-cert:质量认证文件
- patent-docs:专利文档
- training-materials:培训资料
- sports-standard:体育用品标准
四、后端服务开发
4.1 项目初始化

使用Spring Initializr创建项目:
``` spring init --dependencies=web,mybatis,postgresql --type=maven-project digital-archive-system ```application.yml核心配置:
``` spring: datasource: url: jdbc:postgresql://localhost:5432/digital_archive username: postgres password: your_password driver-class-name: org.postgresql.Driver servlet: multipart: max-file-size: 500MB max-request-size: 500MB minio: endpoint: http://localhost:9000 accessKey: admin secretKey: YourSecurePassword123 bucketName: product-design ```4.2 文件上传核心代码
FileUploadService.java:
``` @Service public class FileUploadService { @Value("${minio.endpoint}") private String endpoint; @Value("${minio.bucketName}") private String bucketName; public String uploadFile(MultipartFile file, String category) { try { MinioClient minioClient = MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); String objectName = category + "/" + UUID.randomUUID() + "_" + file.getOriginalFilename(); minioClient.putObject( PutObjectArgs.builder() .bucket(bucketName) .object(objectName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build() ); return endpoint + "/" + bucketName + "/" + objectName; } catch (Exception e) { throw new RuntimeException("上传失败", e); } } } ```4.3 档案检索服务
集成Elasticsearch实现全文检索:
``` @Configuration public class ElasticsearchConfig { @Bean public RestHighLevelClient client() { return new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); } } @Service public class ArchiveSearchService { public List五、前端界面开发
5.1 项目初始化
创建Vue项目:
``` npm create vue@latest digital-archive-frontend cd digital-archive-frontend npm install element-plus axios ```5.2 文件上传组件
FileUpload.vue核心代码:
```5.3 档案检索页面
SearchPage.vue核心代码:
```六、系统部署与运维
6.1 Docker Compose部署
创建docker-compose.yml:
``` version: '3.8' services: postgres: image: postgres:14 environment: POSTGRES_DB: digital_archive POSTGRES_PASSWORD: your_password volumes: - postgres_data:/var/lib/postgresql/data ports: - "5432:5432" minio: image: minio/minio command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: admin MINIO_ROOT_PASSWORD: YourSecurePassword123 volumes: - minio_data:/data ports: - "9000:9000" - "9001:9001" elasticsearch: image: elasticsearch:8.5.0 environment: - discovery.type=single-node - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - es_data:/usr/share/elasticsearch/data ports: - "9200:9200" backend: build: ./backend depends_on: - postgres - minio - elasticsearch ports: - "8080:8080" frontend: build: ./frontend ports: - "80:80" volumes: postgres_data: minio_data: es_data: ```6.2 启动命令
在docker-compose.yml所在目录执行:
docker-compose up -d6.3 数据备份脚本
创建backup.sh:
``` !/bin/bash BACKUP_DIR="/backup/$(date +%Y%m%d)" mkdir -p $BACKUP_DIR 备份PostgreSQL pg_dump -U postgres digital_archive > $BACKUP_DIR/db_backup.sql 备份MinIO数据 mc mirror --overwrite minio/product-design $BACKUP_DIR/minio/ 备份Elasticsearch索引 curl -X GET "localhost:9200/_snapshot/backup_repository" \ -H 'Content-Type: application/json' \ -d '{"type": "fs", "settings": {"location": "'$BACKUP_DIR'/es_backup"}}' ```七、权限控制配置
7.1 角色权限表设计
``` CREATE TABLE user_role ( id BIGSERIAL PRIMARY KEY, role_code VARCHAR(30) NOT NULL UNIQUE, role_name VARCHAR(50) NOT NULL ); CREATE TABLE role_permission ( id BIGSERIAL PRIMARY KEY, role_id BIGINT NOT NULL, permission_code VARCHAR(50) NOT NULL, FOREIGN KEY (role_id) REFERENCES user_role(id) ); -- 初始化角色数据 INSERT INTO user_role (role_code, role_name) VALUES ('admin', '系统管理员'), ('design_dept', '设计部门'), ('quality_dept', '质量部门'), ('view_only', '只读用户'); ```7.2 Spring Security配置
SecurityConfig.java核心配置:
``` @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authz -> authz .requestMatchers("/api/admin/").hasRole("ADMIN") .requestMatchers("/api/upload/").hasAnyRole("ADMIN", "DESIGN_DEPT") .requestMatchers("/api/download/").authenticated() .anyRequest().permitAll() ) .formLogin(form -> form .loginPage("/login") .defaultSuccessUrl("/") .permitAll() ) .logout(logout -> logout .logoutSuccessUrl("/login?logout") .permitAll() ); return http.build(); } } ```八、系统访问与使用
8.1 首次访问配置
- 访问 http://服务器IP 进入系统首页
- 使用默认管理员账号登录:admin / admin123
- 首次登录后立即修改密码
- 进入"系统设置" → "部门管理",添加企业实际部门
- 进入"权限管理",配置各角色权限
8.2 档案上传流程
- 点击"档案上传"按钮
- 选择文件(支持批量选择)
- 填写档案信息:编号、名称、类型、所属产品线
- 选择存储分类(自动匹配MinIO存储桶)
- 点击"开始上传",系统自动生成索引
- 上传完成后,档案立即可被检索
8.3 常见问题解决
问题1:文件上传失败,提示"Connection refused"
解决:检查MinIO服务状态,执行docker ps | grep minio确认容器运行正常
问题2:搜索功能无结果
解决:检查Elasticsearch索引,执行curl http://localhost:9200/_cat/indices?v查看索引状态
问题3:数据库连接失败
解决:检查PostgreSQL服务,执行sudo systemctl status postgresql查看服务状态