网站首页/ 信息中心/ 档案百科/

数字档案馆系统搭建实操:从环境配置到上线

发布时间:2026年09月14日 12:40:29 浏览量:0

一、技术选型与环境准备

本指南将基于Spring Boot 3.x + Vue 3 + MinIO + Elasticsearch + MySQL技术栈,构建一个具备文件存储、元数据管理及全文检索功能的数字档案馆系统。在开始之前,请确保你的操作系统已安装JDK 17和Node.js 18。

为了简化基础组件的安装,我们使用Docker Compose一键部署MySQL、MinIO和Elasticsearch。请在项目根目录下创建docker-compose.yml文件,并复制以下内容:

version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: archive_mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: digital_archive
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
minio:
image: minio/minio:latest
container_name: archive_minio
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: admin123
command: server /data --console-address ":9001"
ports:
- "9000:9000"
- "9001:9001"
volumes:
- minio_data:/data
elasticsearch:
image: elasticsearch:7.17.15
container_name: archive_es
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
volumes:
- es_data:/usr/share/elasticsearch/data
volumes:
mysql_data:
minio_data:
es_data:

保存文件后,在终端执行docker-compose up -d命令启动基础服务。等待约30秒,确保所有容器处于Running状态。

二、数据库初始化与配置

连接本地MySQL数据库(端口3306,用户root,密码root123),执行以下SQL脚本建立核心表结构。该表包含档案的基本元数据及文件存储路径。

CREATE DATABASE IF NOT EXISTS digital_archive;
USE digital_archive;
CREATE TABLE t_archive (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
title VARCHAR(255) NOT NULL COMMENT '档案标题',
category VARCHAR(100) COMMENT '档案分类',
file_url VARCHAR(500) COMMENT '文件存储路径',
content_text TEXT COMMENT '全文检索内容(OCR后或摘要)',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '归档时间',
INDEX idx_category (category)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数字档案核心表';

执行完毕后,数据库环境即准备就绪。接下来我们需要创建MinIO的Bucket,用于存储实际文件。访问http://localhost:9001,使用账号admin / admin123登录。在左侧菜单点击“Buckets”,创建一个名为archive-files的Public Bucket。

三、后端核心功能开发

使用Spring Initializr创建项目,依赖选择Spring WebMyBatis FrameworkMySQL DriverLombok。创建完成后,修改pom.xml添加MinIO和Elasticsearch依赖:


io.minio
minio
8.5.7


org.springframework.boot
spring-boot-starter-data-elasticsearch

配置application.yml文件,填入数据库、MinIO及ES的连接信息:

server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/digital_archive?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: root123
driver-class-name: com.mysql.cj.jdbc.Driver
elasticsearch:
rest:
uris: http://localhost:9200
minio:
endpoint: http://localhost:9000
accessKey: admin
secretKey: admin123
bucketName: archive-files

创建实体类Archive.java,对应数据库表结构:

package com.digital.archive.entity;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class Archive {
private Long id;
private String title;
private String category;
private String fileUrl;
private String contentText;
private LocalDateTime createTime;
}

创建MinIO配置类MinioConfig.java

数字档案馆系统搭建实操:从环境配置到上线

package com.digital.archive.config;
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();
}
}

创建核心业务服务ArchiveService.java,实现文件上传、元数据保存及ES索引同步:

package com.digital.archive.service;
import com.digital.archive.entity.Archive;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.UUID;
@Service
public class ArchiveService {
@Autowired private MinioClient minioClient;
@Autowired private JdbcTemplate jdbcTemplate;
@Autowired private RestHighLevelClient esClient;
@Value("${minio.bucketName}") private String bucketName;
public String uploadArchive(MultipartFile file, String title, String category) throws Exception {
// 1. 生成唯一文件名
String fileName = UUID.randomUUID() + "_" + file.getOriginalFilename();
// 2. 上传文件到MinIO
try (InputStream is = file.getInputStream()) {
minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.stream(is, file.getSize(), -1)
.contentType(file.getContentType())
.build());
}
// 3. 保存元数据到MySQL
String fileUrl = "http://localhost:9000/" + bucketName + "/" + fileName;
String sql = "INSERT INTO t_archive (title, category, file_url, content_text) VALUES (?, ?, ?, ?)";
// 这里为了演示,contentText暂时存为文件名,实际场景应接入OCR提取文本
jdbcTemplate.update(sql, title, category, fileUrl, fileName);
// 4. 同步数据到Elasticsearch
IndexRequest request = new IndexRequest("archive_index");
request.source("title", title, "category", category, "content", fileName);
esClient.index(request, RequestOptions.DEFAULT);
return fileUrl;
}
}

创建控制器ArchiveController.java暴露接口:

package com.digital.archive.controller;
import com.digital.archive.service.ArchiveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/api/archive")
public class ArchiveController {
@Autowired private ArchiveService archiveService;
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file,
@RequestParam("title") String title,
@RequestParam("category") String category) {
try {
String url = archiveService.uploadArchive(file, title, category);
return "Upload Success: " + url;
} catch (Exception e) {
return "Upload Failed: " + e.getMessage();
}
}
}

四、前端交互界面开发

在终端执行npm create vue@latest archive-frontend,选择Vue Router和Pinia。进入项目目录,安装Axios和Element Plus:npm install axios element-plus @element-plus/icons-vue

修改src/main.js引入Element Plus:

import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
const app = createApp(App)
app.use(ElementPlus)
app.mount('app')

编写src/App.vue,实现文件上传表单和列表展示:



五、系统启动与验证

后端启动:在IDEA中打开Spring Boot项目,找到包含main方法的主类,运行ArchiveApplication.java。观察控制台日志,确认Tomcat started on port 8080且ES连接成功。

前端启动:在终端进入前端项目目录,执行npm run dev。终端会输出Local访问地址,通常是http://localhost:5173

操作验证:

至此,一个最小化闭环的数字档案馆系统已搭建完成,涵盖了对象存储、关系型数据库元数据管理及前后端交互流程。

汕头档案整理服务怎么选?流程、收费避坑指南全解析
汕头档案整理服务怎么选?流程、收费避坑指南全解析
不少汕头本地的企业、机关单位和园区,都会碰到旧档案堆积、找资料全靠翻的难题,抽内部员工整理费时间又做不到规范,找第三方服务又怕踩坑。今天结合本地行业实际情况,给大家讲清选服务的判断标准、正规整理流程和...
2026年09月14日 12:40:29
档案整理密级鉴定要求具体是什么?有哪些标准和流程?
档案整理密级鉴定要求具体是什么?有哪些标准和流程?
档案整理中的密级鉴定,是指依据国家相关法律法规和标准,对档案内容是否涉及国家秘密、商业秘密、工作秘密或敏感信息进行识别、确定和标注的过程。其核心要求是确保档案信息安全,同时促进档案的合理利用。下面将从...
2026年09月14日 12:40:29
2026年档案整理安全步骤有哪些?操作过程有哪些注意事项?
2026年档案整理安全步骤有哪些?操作过程有哪些注意事项?
2026年规范的档案整理安全步骤主要分为前置安全核查、整理过程管控、归档后安全校验三大核心模块,全程落实可有效规避档案损坏、信息泄露、丢失等各类安全风险。接下来将结合2026年国家档案局最新发布的《档...
2026年09月14日 12:40:29
微信咨询
电话联系
QQ客服
微信咨询一对一服务
服务热线: 028-8744 4417
QQ客服: 2305721818