作者介绍:计算机专业研究生,现企业打工人,从事Java全栈开发
主要内容:技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流(SCI论文两篇)
上点关注下点赞 生活越过越灿烂
文末点击 按需交流
前言
随着数字音乐市场的蓬勃发展,用户面临着海量音乐资源的选择难题。为了提升用户体验,个性化音乐推荐系统应运而生,成为连接用户与音乐的桥梁。本音乐推荐管理系统旨在通过先进的算法技术和用户行为分析,为用户提供精准、个性化的音乐推荐服务,帮助用户快速发现喜爱的音乐内容。
功能介绍
平台采用B/S结构,后端采用主流的Springboot框架进行开发,前端采用主流的Vue.js进行开发。
音乐管理:管理系统可以录入、修改和查询音乐的基本信息,如名称、歌手、专辑、简介等。
类型管理:系统可以管理音乐的类型信息,包括类型的名称等。
评论管理:管理和浏览整个网站的评论信息。
用户管理:管理和浏览网站的用户信息,可以新增、编辑和删除用户。
统计分析:系统可以根据音乐的活动数据和用户参与度进行统计和分析,帮助管理员了解整个系统的状况。
消息管理:音乐管理员可以在系统上发布消息,整个网站的用户都能收到。
广告管理:音乐管理员可以在系统上发布广告消息,然后在详情页面右侧展示。
意见反馈:音乐管理员可以在后台查看浏览用户提交的意见反馈信息。
系统信息:管理员可以查看系统的基本信息,包括系统名称、服务器信息、内存信息、cpu信息、软件信息等。
注册登录:用户通过注册和登录后,才能使用网站。
门户浏览:用户进入首页后,可以浏览音乐列表信息,包括最新、最热。
热门推荐:基于协同过滤推荐算法的热门推荐。
用户中心:包括用户基本资料修改、用户基本信息、密码、收藏点赞等。
意见反馈:包括用户提交意见反馈的入口页面。
模糊搜索:顶部搜索功能,支持模糊搜索音乐信息。
音乐评论:详情页下侧用户可以评论音乐。
部分开发过程
热门推荐功能开发流程
热门推荐功能使用的是协同过滤推荐算法。该模块分为两个步骤,分别是记录用户浏览数据,和给用户推荐物品。
记录用户浏览数据,采用的是Controller的detail接口里面,将用户浏览记录保存record表里。相关代码如下:
String ip = IpUtil.gIpAddr(request);
Record record = recordService.getRecord(thing.getId(), ip);
if(record != null){record.setScore(record.getScore() + 1);recordService.updateRecord(record);
}else {Record entity = new Record();entity.setThingId(thing.getId());entity.setIp(ip);entity.setScore(1);recordService.createRecord(entity);
}
再就是给用户推荐的流程,通过调用recommend接口的形式,代码如下。具体流程是:先获取用户的ip,然后构造出所有ip的浏览列表,然后调用recommend方法构造推荐数据,并返回给前端。
public APIResponse recommend(HttpServletRequest request){// 获取ip列表List<String> ips = recordService.getRecordIpList();List<UserCF> users = new ArrayList<>();for(String ip : ips){// 获取ip对于的物品List<Record> recordList = recordService.getRecordListByIp(ip);UserCF userCF = new UserCF(ip);for(Record record: recordList){userCF.set(record.thingId, record.score);}users.add(userCF);}List<Thing> thingList;if(users.size() <= 1){// 1个用户不满足协同推荐条件thingList = service.getDefaultThingList();}else {Recommend recommend = new Recommend();String currentIp = IpUtils.getIpAddr(request);List<RecEntity> recommendList = recommend.recommend(currentIp, users);List<Long> thingIdList = recommendList.stream().map(A -> A.thingId).collect(Collectors.toList());if(thingIdList.size() > 0){thingList = service.getThingListByThingIds(thingIdList);if(thingList == null || thingList.size() < 1){// 如推荐量太少,则走默认thingList = service.getDefaultThingList();}}else {thingList = service.getDefaultThingList();}}return new APIResponse(ResponeCode.SUCCESS, "查询成功", thingList);}
点击与我交流