本项目完整源码是收费的 接毕业设计和论文
作者微信:grapro666 QQ:3642795578 (支持部署调试、支持代做毕设)
接javaweb、python、小程序、H5、APP、各种管理系统、单片机、嵌入式等开发
选题+开题报告+任务书+程序定制+安装调试+论文+答辩ppt
博客地址: https://blog.csdn.net/2303_76227485/article/details/155594508
视频演示: https://www.bilibili.com/video/BV1xx2aBUEaQ/
毕业设计所有选题地址: https://github.com/giteecode/allProject
一、系统介绍
本项目前后端分离(可以改为ssm版本),分为用户、管理员2种角色。
1、用户:
- 注册、登录、课程推荐(使用协同过滤推荐)、公告信息、课程书籍阅读(分章节目录)、课程视频学习(收藏、评论)、在线考试、论坛交流、
- 考试记录、我的收藏、个人信息、密码修改
2、管理员:
- 首页大屏数据统计:用户总数、课程总数、视频类型饼统计、视频柱状图统计
- 课程管理、类型管理、论坛管理、管理员管理、用户管理、轮播图管理、公告管理、试卷管理、试题管理、题库管理、考试管理、考试记录
3、亮点:
使用协同过滤推荐算法推荐课程,基于用户已收藏课程,推荐相似用户后续学习的课程
二、所用技术
后端技术栈:
- Springboot
- mybatisPlus
- Mysql
- Maven
前端技术栈:
- Vue3
- Vue-router
- axios
- elementPlus
- echarts
三、环境介绍
基础环境 :IDEA/eclipse, JDK1.8, Mysql5.7及以上, Maven3.6, node14, navicat
所有项目以及源代码本人均调试运行无问题 可支持远程调试运行
四、页面截图
1、用户:
2、管理员:
五、浏览地址
- 用户账号密码:zhangsan/123456
- 管理员账户密码:admin/admin
六、部署教程
-
使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并执行项目的sql文件
-
使用IDEA/Eclipse导入server_code项目,若为maven项目请选择maven,等待依赖下载完成
-
修改application.yml里面的数据库配置,src/main/java/com/SpringbootSchemaApplication.java启动后端项目
-
vscode或idea打开client_code后台项目
-
在编译器中打开terminal,执行npm install 依赖下载完成后执行 npm run serve,执行成功后会显示访问地址
-
vscode或idea打开manage_code后台项目
-
在编译器中打开terminal,执行npm install 依赖下载完成后执行 npm run serve,执行成功后会显示访问地址
七、协同过滤部分代码
public class UserBasedCollaborativeFiltering { private Map<String, Map<String, Double>> userRatings; private Map<String, List<String>> itemUsers; private Map<String, Integer> userIndex; private Map<Integer, String> indexUser; private Long[][] sparseMatrix; public UserBasedCollaborativeFiltering(Map<String, Map<String, Double>> userRatings) { this.userRatings = userRatings; this.itemUsers = new HashMap<>(); this.userIndex = new HashMap<>();//辅助存储每一个用户的用户索引index映射:user->index this.indexUser = new HashMap<>();//辅助存储每一个索引index对应的用户映射:index->user // 构建物品-用户倒排表 int keyIndex = 0; for (String user : userRatings.keySet()) { Map<String, Double> ratings = userRatings.get(user); for (String item : ratings.keySet()) { if (!itemUsers.containsKey(item)) { itemUsers.put(item, new ArrayList<>()); } itemUsers.get(item).add(user); } //用户ID与稀疏矩阵建立对应关系 this.userIndex.put(user,keyIndex); this.indexUser.put(keyIndex,user); keyIndex++; } int N = userRatings.size(); this.sparseMatrix=new Long[N][N];//建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】 for(int i=0;i<N;i++){ for(int j=0;j<N;j++) this.sparseMatrix[i][j]=(long)0; } for(String item : itemUsers.keySet()) { List<String> userList = itemUsers.get(item); for(String u1 : userList) { for(String u2 : userList) { if(u1.equals(u2)){ continue; } this.sparseMatrix[this.userIndex.get(u1)][this.userIndex.get(u2)]+=1; } } } } public double calculateSimilarity(String user1, String user2) { //计算用户之间的相似度【余弦相似性】 Integer id1 = this.userIndex.get(user1); Integer id2 = this.userIndex.get(user2); if(id1==null || id2==null) return 0.0; return this.sparseMatrix[id1][id2]/Math.sqrt(userRatings.get(indexUser.get(id1)).size()*userRatings.get(indexUser.get(id2)).size()); } public List<String> recommendItems(String targetUser, int numRecommendations) { // 计算目标用户与其他用户的相似度 Map<String, Double> userSimilarities = new HashMap<>(); for (String user : userRatings.keySet()) { if (!user.equals(targetUser)) { double similarity = calculateSimilarity(targetUser, user); userSimilarities.put(user, similarity); } } // 根据相似度进行排序 List<Map.Entry<String, Double>> sortedSimilarities = new ArrayList<>(userSimilarities.entrySet()); sortedSimilarities.sort(Map.Entry.comparingByValue(Comparator.reverseOrder())); // 选择相似度最高的K个用户 List<String> similarUsers = new ArrayList<>(); for (int i = 0; i < numRecommendations; i++) { if (i < sortedSimilarities.size()) { similarUsers.add(sortedSimilarities.get(i).getKey()); } else { break; } } // 获取相似用户喜欢的物品,并进行推荐 Map<String, Double> recommendations = new HashMap<>(); for (String user : similarUsers) { Map<String, Double> ratings = userRatings.get(user); for (String item : ratings.keySet()) { if (userRatings.get(targetUser)!=null && !userRatings.get(targetUser).containsKey(item)) { recommendations.put(item, ratings.get(item)); } } } // 排序推荐物品 LinkedHashMap<String, Double> sortedRecommendations = new LinkedHashMap<>(recommendations); // 取前N个推荐物品 int numItems = Math.min(numRecommendations, sortedRecommendations.size()); sortedRecommendations = sortedRecommendations.entrySet() .stream() .sorted((Map.Entry.<String, Double>comparingByValue().reversed())).limit(numItems) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); List<String> result = new ArrayList<String>(); result.addAll(sortedRecommendations.keySet()); return result; } }








































