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

档案个性化培训系统:从零搭建到实战部署全流程

发布时间:2026年09月13日 07:00:17 浏览量:0

一、系统架构设计与技术选型

本系统采用前后端分离架构,前端负责用户交互界面,后端处理业务逻辑与数据存储,通过API进行通信。这种架构便于团队分工、独立部署和扩展。

1.1 技术栈清单

以下是经过生产环境验证的稳定技术组合:

1.2 目录结构规划

在开始编码前,先创建标准的项目目录结构:

``` 档案培训系统/ ├── frontend/ 前端项目 │ ├── public/ │ ├── src/ │ │ ├── api/ 接口定义 │ │ ├── components/ 组件 │ │ ├── views/ 页面 │ │ └── router/ 路由 │ └── package.json └── backend/ 后端项目 ├── src/main/java/com/archive/training/ │ ├── controller/ 控制器 │ ├── service/ 业务层 │ ├── mapper/ 数据层 │ └── entity/ 实体类 └── pom.xml ```

二、数据库设计与初始化

2.1 核心表结构

执行以下SQL语句创建数据库和表:

``` CREATE DATABASE archive_training DEFAULT CHARACTER SET utf8mb4; USE archive_training; -- 用户表 CREATE TABLE `user` ( `id` bigint NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL COMMENT '用户名', `real_name` varchar(50) NOT NULL COMMENT '真实姓名', `department` varchar(100) NOT NULL COMMENT '所属部门', `position` varchar(100) NOT NULL COMMENT '职位', `password` varchar(255) NOT NULL COMMENT '加密密码', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 培训课程表 CREATE TABLE `course` ( `id` bigint NOT NULL AUTO_INCREMENT, `title` varchar(200) NOT NULL COMMENT '课程标题', `description` text COMMENT '课程描述', `category` varchar(50) NOT NULL COMMENT '课程分类', `difficulty_level` tinyint NOT NULL COMMENT '难度等级1-5', `duration_minutes` int NOT NULL COMMENT '预计学习分钟数', `cover_image` varchar(500) COMMENT '封面图URL', `creator_id` bigint NOT NULL COMMENT '创建人ID', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_category` (`category`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 用户学习记录表 CREATE TABLE `learning_record` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_id` bigint NOT NULL, `course_id` bigint NOT NULL, `progress_percent` int DEFAULT 0 COMMENT '学习进度百分比', `last_learn_time` datetime COMMENT '最后学习时间', `total_learn_minutes` int DEFAULT 0 COMMENT '累计学习分钟数', `is_completed` tinyint DEFAULT 0 COMMENT '是否完成', `complete_time` datetime COMMENT '完成时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_user_course` (`user_id`, `course_id`), KEY `idx_user` (`user_id`), KEY `idx_course` (`course_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 个性化推荐权重表 CREATE TABLE `recommendation_weight` ( `user_id` bigint NOT NULL, `category` varchar(50) NOT NULL COMMENT '课程分类', `weight` decimal(5,4) DEFAULT 0.5 COMMENT '权重0-1', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`user_id`, `category`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```

2.2 初始化测试数据

插入基础测试数据:

``` -- 插入测试用户 INSERT INTO `user` (username, real_name, department, position, password) VALUES ('zhangsan', '张三', '档案管理部', '档案管理员', '$2a$10$YourEncryptedPasswordHere'), ('lisi', '李四', '人事档案科', '科长', '$2a$10$YourEncryptedPasswordHere'); -- 插入测试课程 INSERT INTO `course` (title, description, category, difficulty_level, duration_minutes, creator_id) VALUES ('档案数字化基础', '学习档案扫描、图像处理等基础操作', '数字化', 2, 120, 1), ('档案分类与编目', '掌握档案分类原则和编目方法', '分类编目', 3, 180, 1), ('电子档案管理规范', '了解电子档案的保存和管理要求', '电子档案', 4, 150, 1); ```

三、后端服务搭建与核心功能实现

3.1 Spring Boot项目初始化

使用Spring Initializr创建项目,或直接使用以下pom.xml关键依赖:

``` org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-data-redis mysql mysql-connector-java 8.0.33 com.baomidou mybatis-plus-boot-starter 3.5.3.1 io.minio minio 8.5.2 ```

3.2 个性化推荐算法实现

在RecommendationService.java中实现核心推荐逻辑:

``` @Service public class RecommendationService { @Autowired private LearningRecordMapper learningRecordMapper; @Autowired private RecommendationWeightMapper weightMapper; / 为用户生成个性化课程推荐 / public List recommendCourses(Long userId, int limit) { // 1. 获取用户历史学习记录 List records = learningRecordMapper .selectList(new QueryWrapper() .eq("user_id", userId) .orderByDesc("last_learn_time")); // 2. 计算用户对各分类的偏好权重 Map categoryWeights = calculateCategoryWeights(records); // 3. 更新权重表 updateWeightTable(userId, categoryWeights); // 4. 基于权重推荐课程 return getRecommendedCourses(userId, categoryWeights, limit); } / 计算分类权重 / private Map calculateCategoryWeights(List records) { Map weights = new HashMap<>(); Map categoryLearnCount = new HashMap<>(); Map categoryCompleteCount = new HashMap<>(); // 统计学习数据 for (LearningRecord record : records) { Course course = getCourseById(record.getCourseId()); String category = course.getCategory(); categoryLearnCount.put(category, categoryLearnCount.getOrDefault(category, 0) + 1); if (record.getIsCompleted() == 1) { categoryCompleteCount.put(category, categoryCompleteCount.getOrDefault(category, 0) + 1); } } // 计算权重:完成率 0.6 + 学习次数权重 0.4 for (String category : categoryLearnCount.keySet()) { int learnCount = categoryLearnCount.get(category); int completeCount = categoryCompleteCount.getOrDefault(category, 0); double completeRate = learnCount > 0 ? (double) completeCount / learnCount : 0; double learnWeight = Math.min(learnCount 0.1, 1.0); double weight = completeRate 0.6 + learnWeight 0.4; weights.put(category, weight); } return weights; } } ```

3.3 文件上传服务配置

在application.yml中配置MinIO:

``` minio: endpoint: http://localhost:9000 accessKey: your-access-key secretKey: your-secret-key bucket: archive-training ```

档案个性化培训系统:从零搭建到实战部署全流程

实现文件上传控制器:

``` @RestController @RequestMapping("/api/file") public class FileController { @Autowired private MinioClient minioClient; @PostMapping("/upload") public ApiResult uploadFile(@RequestParam("file") MultipartFile file) { try { String originalFilename = file.getOriginalFilename(); String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf(".")); // 上传到MinIO minioClient.putObject( PutObjectArgs.builder() .bucket("archive-training") .object(fileName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build() ); // 返回访问URL String url = minioClient.getPresignedObjectUrl( GetPresignedObjectUrlArgs.builder() .method(Method.GET) .bucket("archive-training") .object(fileName) .expiry(7, TimeUnit.DAYS) .build() ); return ApiResult.success(url); } catch (Exception e) { return ApiResult.error("文件上传失败"); } } } ```

四、前端界面开发与交互实现

4.1 Vue项目初始化与配置

创建Vue项目并安装必要依赖:

``` npm create vue@latest archive-training-frontend cd archive-training-frontend npm install element-plus axios vue-router@4 npm install --save-dev sass ```

配置main.js:

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

4.2 课程学习页面实现

创建CourseLearning.vue组件:

```