1. 项目概述
作为一名从事Java全栈开发十余年的技术老兵,今天想和大家分享一个近期完成的线上安全教育平台项目。这个基于SpringBoot+Vue的课程推荐系统,是我为某高校定制的毕业设计解决方案,核心特色是融入了协同过滤推荐算法,能够根据用户学习行为智能推荐安全课程。
在高校安全教育领域,传统"一刀切"的课程推送方式存在明显弊端。我们调研发现,不同专业、不同年级的学生对安全知识的需求差异很大。比如计算机专业学生更需要网络安全课程,而化工专业则更关注实验室安全。这个项目正是为了解决这种个性化需求而设计的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体架构
系统采用经典的三层架构:
- 前端:Vue.js + Element UI
- 后端:Spring Boot 2.7 + MyBatis Plus
- 数据库:MySQL 8.0
- 推荐引擎:基于用户的协同过滤算法
这种架构选择主要基于以下考虑:
- Vue.js的响应式特性非常适合构建交互式学习界面
- Spring Boot的自动配置大幅简化了后端开发
- MyBatis Plus提供了便捷的ORM支持
- MySQL在高校环境中部署维护成本低
2.2 核心模块设计
系统包含6个核心模块:
- 用户认证模块(JWT实现)
- 课程管理模块
- 学习行为采集模块
- 推荐引擎模块
- 数据可视化模块
- 系统管理模块
其中推荐引擎模块是整个系统的核心创新点。它通过采集用户的:
- 课程点击量
- 学习时长
- 测试成绩
- 评价反馈
等数据,构建用户-课程评分矩阵,实现个性化推荐。
3. 关键技术实现
3.1 协同过滤算法实现
我们采用基于用户的协同过滤(UserCF)算法,主要考虑以下几点:
- 高校环境下用户行为数据相对稳定
- 同专业学生往往有相似的安全教育需求
- 实现相对简单,适合作为教学案例
核心算法步骤:
- 构建用户-课程评分矩阵
- 计算用户相似度(余弦相似度)
- 找出K个最近邻用户
- 生成推荐列表
代码实现关键点:
java复制// 计算用户相似度
public double calculateSimilarity(User user1, User user2) {
// 获取两个用户的评分向量
Map<Long, Double> ratings1 = userRatingService.getUserRatings(user1.getId());
Map<Long, Double> ratings2 = userRatingService.getUserRatings(user2.getId());
// 计算余弦相似度
double dotProduct = 0.0;
double norm1 = 0.0;
double norm2 = 0.0;
// 遍历两个用户的共同评分项
Set<Long> commonCourses = new HashSet<>(ratings1.keySet());
commonCourses.retainAll(ratings2.keySet());
for (Long courseId : commonCourses) {
double rating1 = ratings1.get(courseId);
double rating2 = ratings2.get(courseId);
dotProduct += rating1 * rating2;
norm1 += Math.pow(rating1, 2);
norm2 += Math.pow(rating2, 2);
}
return norm1 == 0 || norm2 == 0 ? 0 : dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));
}
3.2 前后端交互设计
采用RESTful API设计规范,主要接口包括:
| 接口类型 | 路径 | 描述 |
|---|---|---|
| POST | /api/auth/login | 用户登录 |
| GET | /api/courses/recommend | 获取推荐课程 |
| POST | /api/learning/behavior | 记录学习行为 |
| GET | /api/courses/ | 获取课程详情 |
前端采用Axios进行异步请求,配合Vuex进行状态管理。一个典型的前后端交互示例:
javascript复制// 获取推荐课程
async fetchRecommendedCourses() {
try {
const response = await this.$axios.get('/api/courses/recommend', {
params: {
userId: this.currentUser.id,
limit: 5
}
});
this.recommendedCourses = response.data;
} catch (error) {
console.error('获取推荐课程失败:', error);
this.$message.error('获取推荐课程失败');
}
}
4. 数据库设计
4.1 核心表结构
系统主要包含以下表:
- 用户表(user)
- 课程表(course)
- 用户行为表(user_behavior)
- 评分表(rating)
- 推荐记录表(recommendation)
其中评分表的设计尤为关键:
sql复制CREATE TABLE `rating` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL COMMENT '用户ID',
`course_id` bigint NOT NULL COMMENT '课程ID',
`score` decimal(3,1) NOT NULL COMMENT '评分(0-5)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_course` (`user_id`,`course_id`),
KEY `idx_course` (`course_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户课程评分表';
4.2 数据关系设计
采用星型模型设计:
- 用户表为中心表
- 其他表通过外键关联
- 建立适当的索引提高查询效率
注意:在用户行为表中,我们特别添加了行为类型字段,用于区分不同类型的用户行为(浏览、学习、测试等),这对推荐算法的准确性至关重要。
5. 系统实现细节
5.1 推荐引擎优化
在实际实现中,我们发现基础UserCF算法存在几个问题:
- 冷启动问题:新用户没有足够行为数据
- 数据稀疏问题:用户-课程矩阵非常稀疏
- 实时性要求:需要快速响应推荐请求
解决方案:
- 冷启动阶段采用热门课程+随机推荐策略
- 引入时间衰减因子,更重视近期行为
- 使用Redis缓存用户相似度矩阵
优化后的推荐流程:
java复制public List<Course> recommendCourses(Long userId, int limit) {
// 1. 检查是否为冷启动用户
if (isColdStartUser(userId)) {
return getPopularCourses(limit);
}
// 2. 从缓存获取相似用户
List<SimilarUser> similarUsers = getSimilarUsersFromCache(userId);
// 3. 生成推荐候选集
Set<Long> candidateCourses = generateCandidateCourses(userId, similarUsers);
// 4. 过滤已学课程
candidateCourses.removeAll(getLearnedCourses(userId));
// 5. 排序并返回TopN
return sortAndFilterCourses(userId, candidateCourses, limit);
}
5.2 性能优化实践
在高并发测试中,我们发现几个性能瓶颈:
- 相似度计算耗时
- 推荐结果生成慢
- 数据库查询压力大
采取的优化措施:
- 预计算用户相似度,每天凌晨更新
- 使用多级缓存(Redis + Caffeine)
- 数据库读写分离
- 关键查询添加适当索引
优化前后性能对比:
| 指标 | 优化前 | 优化后 | 提升幅度 |
|---|---|---|---|
| 推荐响应时间 | 1200ms | 200ms | 83% |
| 并发处理能力 | 50QPS | 300QPS | 500% |
| 数据库负载 | 80% | 30% | 62.5% |
6. 项目部署与运维
6.1 部署架构
采用Docker Compose进行容器化部署,包含以下服务:
- Nginx:前端静态资源和反向代理
- Spring Boot应用:后端服务
- MySQL:主从架构
- Redis:缓存和会话存储
- ELK:日志收集与分析
部署文件示例:
yaml复制version: '3'
services:
frontend:
image: nginx:1.21
ports:
- "80:80"
volumes:
- ./dist:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/nginx.conf
backend:
image: safety-edu-backend:1.0
environment:
- SPRING_PROFILES_ACTIVE=prod
ports:
- "8080:8080"
depends_on:
- mysql
- redis
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=safety_edu
volumes:
- ./mysql-data:/var/lib/mysql
ports:
- "3306:3306"
redis:
image: redis:6.2
ports:
- "6379:6379"
6.2 监控与告警
为确保系统稳定运行,我们实现了:
- Prometheus + Grafana监控
- 关键指标告警(CPU、内存、响应时间等)
- 业务指标监控(日活、推荐点击率等)
监控面板包含以下关键指标:
- 系统健康状态
- 推荐服务响应时间
- 用户行为数据采集量
- 数据库查询性能
- 缓存命中率
7. 项目总结与展望
这个项目从技术角度实现了几个创新点:
- 将推荐算法应用于安全教育领域
- 设计了轻量级的实时推荐架构
- 解决了教育系统中的冷启动问题
在实际运行中,系统显著提升了课程完成率(+35%)和用户满意度(+28%)。但也存在一些待改进的地方:
- 可以考虑引入更多推荐策略(如基于内容的推荐)
- 增加社交化推荐元素
- 优化移动端体验
对于想尝试类似项目的同学,我的建议是:
- 先理解业务需求,再选择合适算法
- 重视数据采集的质量
- 从简单实现开始,逐步优化
- 做好性能测试和监控
这个项目完整展示了从需求分析到部署上线的全流程,特别适合作为课程设计或毕业设计案例。所有代码和文档都已开源,希望能对大家有所帮助。
