教育数字档案馆系统从零开发到部署全流程实操
基础环境依赖安装
在开始构建教育数字档案馆系统之前,必须先准备好运行环境。本系统采用Spring Boot后端配合Vue前端,依赖JDK 17、Maven 3.8+、Node.js 18+以及Docker环境。请严格按照以下步骤执行环境初始化。
1. 安装JDK 17与Maven
在CentOS 7环境下,执行以下命令直接安装OpenJDK 17和Maven:
yum install -y java-17-openjdk java-17-openjdk-devel
wget https://archive.apache.org/dist/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
tar -zxvf apache-maven-3.8.6-bin.tar.gz -C /usr/local/
export PATH=/usr/local/apache-maven-3.8.6/bin:$PATH
2. 安装Node.js 18
前端构建需要Node环境,使用NVM安装最新稳定版:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc
nvm install 18
nvm use 18
核心存储服务部署
数字档案馆的核心在于非结构化数据(PDF、图片、视频)的存储。我们使用MinIO作为对象存储服务,MySQL作为元数据存储。使用Docker Compose一键拉起这两个服务。
1. 创建docker-compose.yml文件
在服务器目录下创建docker-compose.yml,写入以下内容。请注意,这里直接设置了账号密码,请根据实际生产环境修改:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: edu_archive_mysql
environment:
MYSQL_ROOT_PASSWORD: root@123456
MYSQL_DATABASE: edu_archive_db
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
minio:
image: minio/minio:latest
container_name: edu_archive_minio
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
ports:
- "9000:9000"
- "9001:9001"
volumes:
- minio_data:/data
volumes:
mysql_data:
minio_data:
2. 启动服务
执行以下命令启动基础存储服务:
docker-compose up -d
启动成功后,访问http://服务器IP:9001即可进入MinIO控制台。登录后创建一个名为edu-docs的Bucket,并将访问权限设置为Public(方便后续测试)。
数据库初始化与表结构
连接到刚才启动的MySQL容器,初始化核心业务表。我们需要一张表来存储档案的元数据信息。
1. 连接数据库并建表
执行以下SQL脚本,建立archive_record表:
CREATE TABLE `archive_record` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`title` varchar(255) NOT NULL COMMENT '档案标题',
`category` varchar(50) DEFAULT NULL COMMENT '档案分类(如:教学、行政、科研)',
`file_name` varchar(255) DEFAULT NULL COMMENT '原始文件名',
`file_url` varchar(500) NOT NULL COMMENT '文件在MinIO的访问路径',
`file_size` bigint DEFAULT NULL COMMENT '文件大小(字节)',
`uploader` varchar(100) DEFAULT NULL COMMENT '上传人',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
PRIMARY KEY (`id`),
KEY `idx_category` (`category`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='教育数字档案记录表';
后端服务开发
后端使用Spring Boot 3.x版本,集成MyBatis Plus进行数据库操作,MinIO Java SDK进行文件上传。
1. 项目依赖配置 (pom.xml)
创建Maven项目,在pom.xml中引入必要的依赖:
org.springframework.boot
spring-boot-starter-web
com.baomidou
mybatis-plus-boot-starter
3.5.3
mysql
mysql-connector-java
io.minio
minio
8.5.2
org.projectlombok
lombok
2. 配置文件 (application.yml)
在src/main/resources/application.yml中配置数据库连接和MinIO参数:

server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/edu_archive_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: root@123456
driver-class-name: com.mysql.cj.jdbc.Driver
minio:
endpoint: http://localhost:9000
accessKey: minioadmin
secretKey: minioadmin
bucketName: edu-docs
3. 核心实体类与配置
创建实体类ArchiveRecord.java:
package com.edu.archive.entity;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class ArchiveRecord {
private Long id;
private String title;
private String category;
private String fileName;
private String fileUrl;
private Long fileSize;
private String uploader;
private LocalDateTime createTime;
}
创建MinIO配置类MinioConfig.java:
package com.edu.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();
}
}
4. 文件上传与保存接口
创建ArchiveController.java,实现文件上传和列表查询接口。这里为了演示,直接使用Controller处理逻辑,实际项目中请拆分Service层:
package com.edu.archive.controller;
import com.edu.archive.entity.ArchiveRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.;
import org.springframework.web.multipart.MultipartFile;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import java.time.LocalDateTime;
import java.util.UUID;
@RestController
@RequestMapping("/api/archive")
public class ArchiveController {
@Autowired
private MinioClient minioClient;
@Autowired
private ArchiveMapper archiveMapper;
@Value("${minio.bucketName}")
private String bucketName;
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file,
@RequestParam("title") String title,
@RequestParam("category") String category) throws Exception {
String fileName = UUID.randomUUID() + "_" + file.getOriginalFilename();
// 上传到MinIO
minioClient.putObject(
PutObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.stream(file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build()
);
// 保存元数据到数据库
ArchiveRecord record = new ArchiveRecord();
record.setTitle(title);
record.setCategory(category);
record.setFileName(file.getOriginalFilename());
record.setFileUrl("http://localhost:9000/" + bucketName + "/" + fileName);
record.setFileSize(file.getSize());
record.setUploader("Admin");
record.setCreateTime(LocalDateTime.now());
archiveMapper.insert(record);
return "上传成功,文件ID: " + record.getId();
}
}
@Mapper
interface ArchiveMapper extends BaseMapper {}
前端交互界面开发
前端使用Vue 3配合Element Plus组件库,实现档案上传和列表展示功能。
1. 初始化项目并安装依赖
npm create vue@latest edu-archive-web
cd edu-archive-web
npm install element-plus axios
2. 修改App.vue实现完整功能
为了方便操作,将所有逻辑集中在App.vue中。替换src/App.vue内容如下:
教育数字档案馆上传
点击选择文件
提交归档
启动前端服务:
npm run dev
系统打包与容器化部署
开发完成后,我们需要将后端打包为JAR,前端打包为静态资源,并使用Docker进行统一部署。
1. 后端打包
在后端项目根目录执行:
mvn clean package -DskipTests
打包完成后,将target/xxx.jar复制到服务器的/app/backend目录。
2. 前端打包与Nginx配置
在前端项目根目录执行:
npm run build
将生成的dist目录内容复制到服务器的/app/frontend/html目录。在服务器创建nginx.conf:
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
}
location /api/ {
proxy_pass http://backend:8080;
}
}
}
3. 编写最终部署Docker Compose
创建deploy.yml用于整体部署:
version: '3.8'
services:
backend:
image: openjdk:17
container_name: archive_backend
volumes:
- /app/backend/app.jar:/app.jar
command: java -jar /app.jar
ports:
- "8080:8080"
depends_on:
- mysql
frontend:
image: nginx:latest
container_name: archive_frontend
volumes:
- /app/frontend/html:/usr/share/nginx/html
- /app/frontend/nginx.conf:/etc/nginx/nginx.conf
ports:
- "80:80"
depends_on:
- backend
- minio
此处复用之前的mysql和minio配置,确保在同一网络下
mysql:
image: mysql:8.0
container_name: edu_archive_mysql
environment:
MYSQL_ROOT_PASSWORD: root@123456
MYSQL_DATABASE: edu_archive_db
ports:
- "3306:3306"
minio:
image: minio/minio:latest
container_name: edu_archive_minio
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
ports:
- "9000:9000"
- "9001:9001"
执行docker-compose -f deploy.yml up -d --build即可完成整套教育数字档案馆系统的部署。此时通过浏览器访问服务器IP地址,即可看到上传界面,进行文件归档操作。