福利院数字档案馆系统从零搭建与部署实操指南
1. 基础环境一键部署
为了保证环境的一致性,我们使用 Docker Compose 来编排 MySQL、Redis 和 MinIO(用于存储档案文件)。请在服务器本地创建一个 welfare-archive 目录,并在其中创建 docker-compose.yml 文件,直接复制以下内容:
```yaml version: '3.8' services: mysql: image: mysql:8.0 container_name: welfare_mysql environment: MYSQL_ROOT_PASSWORD: root123456 MYSQL_DATABASE: welfare_archive_db ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql redis: image: redis:7-alpine container_name: welfare_redis ports: - "6379:6379" minio: image: minio/minio:latest container_name: welfare_minio environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin123 command: server /data --console-address ":9001" ports: - "9000:9000" - "9001:9001" volumes: - minio_data:/data volumes: mysql_data: minio_data: ```保存文件后,在当前目录下执行启动命令:
docker-compose up -d
执行完毕后,使用 docker ps 确认三个容器均为 Up 状态。此时,MinIO 的管理后台地址为 http://服务器IP:9001,请登录进入,创建一个名为 welfare-docs 的 Bucket,并将访问权限设置为 Public。
2. 数据库表结构设计
连接本地 MySQL(端口 3306,用户 root,密码 root123456),选中 welfare_archive_db 数据库,执行以下 SQL 建表语句。该表包含了福利院档案的核心字段,如儿童姓名、入院日期、档案类型及文件存储路径。
```sql CREATE TABLE `t_archive_info` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `child_name` varchar(50) NOT NULL COMMENT '儿童姓名', `admission_no` varchar(50) NOT NULL COMMENT '入院编号', `archive_type` varchar(20) NOT NULL COMMENT '档案类型:健康/教育/法律', `file_name` varchar(255) DEFAULT NULL COMMENT '原始文件名', `file_url` varchar(500) NOT NULL COMMENT '文件MinIO存储路径', `upload_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间', `uploader` varchar(50) DEFAULT 'admin' COMMENT '上传人', PRIMARY KEY (`id`), UNIQUE KEY `uk_admission` (`admission_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='福利院数字档案表'; ```3. 后端核心代码实现
后端采用 Spring Boot 3 + MyBatis 构建。首先在 IDEA 中创建 Maven 项目,坐标如下:
- GroupId: com.welfare
- ArtifactId: archive-system
- Version: 1.0.0
3.1 依赖配置 (pom.xml)
打开 pom.xml,引入 Web、MyBatis、MySQL 驱动、MinIO 客户端和 Lombok 依赖:
```xml3.2 应用配置
在 src/main/resources 下创建 application.yml,填入数据库和 MinIO 的连接信息:
```yaml server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/welfare_archive_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: root123456 driver: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/.xml minio: endpoint: http://localhost:9000 accessKey: minioadmin secretKey: minioadmin123 bucketName: welfare-docs ```3.3 实体类与Mapper
创建包结构 com.welfare.archive.entity 并编写实体类:
```java package com.welfare.archive.entity; import lombok.Data; import java.time.LocalDateTime; @Data public class ArchiveInfo { private Long id; private String childName; private String admissionNo; private String archiveType; private String fileName; private String fileUrl; private LocalDateTime uploadTime; private String uploader; } ```在 com.welfare.archive.mapper 包下创建接口:
```java package com.welfare.archive.mapper; import com.welfare.archive.entity.ArchiveInfo; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface ArchiveMapper { void insert(ArchiveInfo info); List在 src/main/resources/mapper 下创建 ArchiveMapper.xml:
```xml3.4 业务逻辑与控制器
在 com.welfare.archive.service 下创建 MinioService 用于处理文件上传:
```java package com.welfare.archive.service; import io.minio.MinioClient; import io.minio.PutObjectArgs; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.UUID; @Service public class MinioService { private final MinioClient minioClient; @Value("${minio.bucketName}") private String bucketName; public MinioService(@Value("${minio.endpoint}") String endpoint, @Value("${minio.accessKey}") String accessKey, @Value("${minio.secretKey}") String secretKey) { this.minioClient = MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); } public String uploadFile(MultipartFile file) throws Exception { String fileName = file.getOriginalFilename(); String datePath = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd")); String objectName = datePath + "/" + UUID.randomUUID() + "_" + fileName; minioClient.putObject(PutObjectArgs.builder() .bucket(bucketName) .object(objectName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build()); return "/" + bucketName + "/" + objectName; } } ```在 com.welfare.archive.controller 下创建 ArchiveController,提供上传和列表接口:
```java package com.welfare.archive.controller; import com.welfare.archive.entity.ArchiveInfo; import com.welfare.archive.mapper.ArchiveMapper; import com.welfare.archive.service.MinioService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.; import org.springframework.web.multipart.MultipartFile; import java.util.List; @RestController @RequestMapping("/api/archive") @CrossOrigin(origins = "") public class ArchiveController { @Autowired private ArchiveMapper archiveMapper; @Autowired private MinioService minioService; @PostMapping("/upload") public String upload(@RequestParam("file") MultipartFile file, @RequestParam("childName") String childName, @RequestParam("admissionNo") String admissionNo, @RequestParam("archiveType") String archiveType) throws Exception { String fileUrl = minioService.uploadFile(file); ArchiveInfo info = new ArchiveInfo(); info.setChildName(childName); info.setAdmissionNo(admissionNo); info.setArchiveType(archiveType); info.setFileName(file.getOriginalFilename()); info.setFileUrl(fileUrl); info.setUploader("Admin"); archiveMapper.insert(info); return "上传成功,路径: " + fileUrl; } @GetMapping("/list") public List4. 前端管理界面开发

前端使用 Vue 3 + Element Plus。在终端执行以下命令创建项目:
npm create vue@latest welfare-frontend
进入项目目录并安装依赖:
cd welfare-frontend
npm install
npm install element-plus axios
4.1 配置 Axios
在 src 目录下新建 utils/request.js:
```javascript import axios from 'axios'; const request = axios.create({ baseURL: 'http://localhost:8080', timeout: 5000 }); export default request; ```4.2 主页面改造
修改 src/App.vue,编写一个包含上传表单和数据表格的完整页面:
```vue福利院数字档案管理系统
同时,确保 src/main.js 中引入了 Element Plus:
```javascript import { createApp } from 'vue' import App from './App.vue' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' createApp(App).use(ElementPlus).mount('app') ```5. 系统启动与验证
首先启动后端服务。在 IDEA 中找到带有 @SpringBootApplication 的主类,运行 main 方法。看到控制台输出 Started ArchiveSystemApplication 即表示后端就绪。
接着启动前端服务。在 welfare-frontend 目录下执行:
npm run dev
终端会输出一个本地访问地址,通常是 http://localhost:5173。使用浏览器访问该地址。
验证步骤:
- 在页面表单中输入儿童姓名“张三”,入院编号“IN2023001”,选择档案类型“健康档案”。
- 点击“选择文件”,上传一个测试用的 PDF 或图片文件。
- 点击“提交入库”,观察上方是否弹出“档案上传成功”提示。
- 查看下方表格,是否立即刷新出了刚才录入的数据。
- 点击表格右侧的“查看”按钮,应能在新标签页中打开 MinIO 中的文件预览。