一、功能设计
基于推荐算法的在线杂志平台主要针对于普通用户来实现的功能,根据用户需求,开发出一个能够在线阅读并且根据用户喜好进行推荐的在线杂志推荐平台。同时,保证后台管理员对于整个系统的管理,例如:杂志管理、杂志分类管理、评论管理、用户的阅读记录管理等功能。基于推荐算法的在线杂志平台
1.前端功能模块
1、登录注册
2、全部杂志
3、杂志分类
4、推荐杂志
5、发布评论
2.后台功能模块
1、用户管理模块
2、角色管理模块
3、杂志管理模块
4、阅读记录管理模块
5、评论管理模块
6、杂志分类管理模块
3.统计分析模块
1、推荐算法:从前依次向后比较,碰到比其大的就进行交换,直到到达此次比较的末尾,则得到此次比较的全局最大值,比较限界的末尾向前滑动,重复此过程。可用于阅读量排序。
2、可视化分析:将用户的阅读数据使用Echarts技术表达出来,制成几个图标可视化,协助平台发展。
二、使用技术
操作系统:Windows10
数据库:MySQL5.5
运用服务器:Tomcat服务器
开发环境:java1.8
开发语言:java
三、协同过滤算法
(1)协同过滤推荐的原理:协同过滤推荐的主要思想利用已有用户群过去的行为预测当前用户最可能喜欢哪些物品。
(2)协同过滤推荐的输入与输出
输入 输出
“用户-物品”评分矩阵 一种是用户对某个物品喜欢或不喜欢程度的预测数值;另一种是 n 项推荐物品的列表
(3)协同过滤推荐的分类:
协同过滤推荐大致可以分为:基于邻域的推荐和基于模型的推荐。前者将所有数据记忆到存储体中。后者(离线)做数据降维,抽象出特征,运行时直接用特征。
基于邻域的推荐:有以下基于用户的协同过滤(给用户推荐和他兴趣相似的其他用户喜欢的物品)和基于物品的协同过滤(给用户推荐和他之前喜欢的物品相似的物品)两种。
基于模型的推荐:使用部分机器学习算法,找出用户与项的相互作用模型,从而找出数据中的特定模式。如关联模型,隐语义模型、图模型、混聚类模型、分类模型、回归模型、矩阵分解模型、神经网络模型、合模型、深度学习模型等。
(4)基于用户的协同过滤推荐步骤:
1、找到和目标用户兴趣相似的用户集合。
2、找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。
(5)实用场景 —— 杂志推荐:
1、个性化杂志推荐更加强调抓住杂志热点,热门程度和时效性是个性化杂志推荐的重点,而个性化相对于这两点略显次要。
2、杂志的更新非常快,物品相关度的表也需要很快更新,虽然 UserCF 对于新用户也需要更新相似度表,但在在线杂志网站中,杂志的更新速度远远快于新用户的加入速度,而且对于新用户,完全可以给他推荐最热门的杂志。
基于用户的协同过滤推荐简单的说,如果 A、B 两个用户都购买了 x、y、z 三本杂志,并且给出了 5 星的好评。那么 A 和 B 就属于同一类用户。可以将 A 看过的杂志w 也推荐给用户B。
四、项目截图
1.管理员端
管理员登录
用户管理
杂志分类管理
杂志管理
评论管理
阅读记录可视化
2.用户端
杂志推荐
查看杂志分类
杂志列表
查看杂志
发布评论
五、代码片段
管理员核心代码:
/**
* (Admin)表控制层
*
* @author makejava
* @since 2022-04-30 14:51:48
*/
@Controller
@RequestMapping("admin")
public class AdminController {
/**
* 服务对象
*/
//管理员
@Resource
private AdminDao adminDao;
//用户
@Resource
private UsersDao usersDao;
//评论
@Resource
private CommentDao commentDao;
//杂志
@Resource
private MagazineDao MagazineDao;
//杂志类别
@Resource
private MagazinedeptDao MagazinedeptDao;
@RequestMapping("joinlogin")
public String joinlogin(Model model) {
return "admin/login";
}
@RequestMapping("joinAdd")
public String joinAdd(Model model) {
return "admin/register";
}
@RequestMapping("add")
public String add(Model model, Admin admin) {
Admin admins = adminDao.queryByUsername(admin.getUsername());
if (admins != null) {
model.addAttribute("error", "用户名已存在");
return joinAdd(model);
}
adminDao.insert(admin);
return joinlogin(model);
}
@RequestMapping("login")
public String login(HttpSession session, Model model, Admin admin) {
admin = adminDao.login(admin);
if (admin == null) {
model.addAttribute("error", "用户名或密码错误");
return joinlogin(model);
}
session.setAttribute("admin", admin);
return usersIndex(model);
}
/*****************************用户管理***************************/
@RequestMapping("users/index")
public String usersIndex(Model model) {
List<Users> users = usersDao.queryAll();
model.addAttribute("users", users);
return "admin/users/index";
}
@RequestMapping("users/add")
public String userAdd(Model model, Users users) {
users.setState("审核通过");
usersDao.insert(users);
return usersIndex(model);
}
@RequestMapping("users/deleteById")
public String userDeleteById(Model model, Integer id) {
usersDao.deleteById(id);
return usersIndex(model);
}
@RequestMapping("users/joinUpdate")
public String userJoinUpdate(Model model, Integer id) {
Users users = usersDao.queryById(id);
model.addAttribute("users", users);
return "admin/users/update";
}
@RequestMapping("users/joinadd")
public String userJoinAdd(Model model, Integer id) {
return "admin/users/add";
}
@RequestMapping("users/update")
public String userUpdate(Model model, Users users) {
users.setState("审核通过");
usersDao.update(users);
return usersIndex(model);
}
/*****************************杂志类别管理***************************/
@RequestMapping("Magazinedept/index")
public String MagazinedeptIndex(Model model) {
List<Magazinedept> Magazinedept = MagazinedeptDao.queryAll();
model.addAttribute("Magazinedept", Magazinedept);
return "admin/Magazinedept/index";
}
@RequestMapping("Magazinedept/add")
public String MagazinedeptAdd(Model model, Magazinedept Magazinedept) {
Magazinedept f = MagazinedeptDao.queryByName(Magazinedept.getName());
if (f == null) {
Magazinedept.setNums("0");
MagazinedeptDao.insert(Magazinedept);
}
return MagazinedeptIndex(model);
}
@RequestMapping("Magazinedept/deleteById")
public String MagazinedeptDeleteById(Model model, Integer id) {
MagazinedeptDao.deleteById(id);
return MagazinedeptIndex(model);
}
@RequestMapping("Magazinedept/joinUpdate")
public String MagazinedeptJoinUpdate(Model model, Integer id) {
Magazinedept Magazinedept = MagazinedeptDao.queryById(id);
model.addAttribute("Magazinedept", Magazinedept);
return "admin/Magazinedept/update";
}
@RequestMapping("Magazinedept/joinadd")
public String MagazinedeptJoinAdd(Model model, Integer id) {
return "admin/Magazinedept/add";
}
@RequestMapping("Magazinedept/update")
public String MagazinedeptUpdate(Model model, Magazinedept Magazinedept) {
Magazinedept f = MagazinedeptDao.queryByName(Magazinedept.getName());
if (f == null) {
String nums = MagazinedeptDao.queryById(Magazinedept.getId()).getNums();
Magazinedept.setNums(nums);
MagazinedeptDao.update(Magazinedept);
}
return MagazinedeptIndex(model);
}
/*****************************杂志管理***************************/
@RequestMapping("Magazine/index")
public String MagazineIndex(Model model) {
List<Magazine> Magazine = MagazineDao.queryAll();
model.addAttribute("Magazine", Magazine);
return "admin/Magazine/index";
}
@RequestMapping("Magazine/add")
public String MagazineAdd(Model model, Magazine Magazine) {
Magazine.setReqtime(Tool.getTime("yyyy-MM-dd HH:mm"));
Magazine.setNum("0");
Magazine.setContent(Tool.getTextarea(Magazine.getContent()));
MagazineDao.insert(Magazine);
return MagazineIndex(model);
}
@RequestMapping("Magazine/deleteById")
public String MagazineDeleteById(Model model, Integer id) {
MagazineDao.deleteById(id);
return MagazineIndex(model);
}
@RequestMapping("Magazine/joinUpdate")
public String MagazineJoinUpdate(Model model, Integer id) {
Magazine Magazine = MagazineDao.queryById(id);
Magazine.setContent(Tool.getTextarea2(Magazine.getContent()));
List<Magazinedept> Magazinedept = MagazinedeptDao.queryAll();
model.addAttribute("Magazine", Magazine);
model.addAttribute("Magazinedept", Magazinedept);
return "admin/Magazine/update";
}
@RequestMapping("Magazine/joinadd")
public String MagazineJoinAdd(Model model, Integer id) {
List<Magazinedept> Magazinedept = MagazinedeptDao.queryAll();
model.addAttribute("Magazinedept", Magazinedept);
return "admin/Magazine/add";
}
@RequestMapping("Magazine/joinreptile")
public String MagazineJoinReptile(Model model) {
return "admin/Magazine/add2";
}
@RequestMapping("Magazine/update")
public String MagazineUpdate(Model model, Magazine Magazine) {
Magazine.setReqtime(Tool.getTime("yyyy-MM-dd HH:mm"));
Magazine.setContent(Tool.getTextarea(Magazine.getContent()));
Magazine.setNum(MagazineDao.queryById(Magazine.getId()).getNum());
MagazineDao.update(Magazine);
return MagazineIndex(model);
}
/*****************************公告管理***************************/
@RequestMapping("comment/index")
public String commentIndex(Model model) {
List<Magazine> Magazine = MagazineDao.queryAll();
model.addAttribute("Magazine", Magazine);
return "admin/comment/index";
}
@RequestMapping("comment/join")
public String commentJoin(Integer id, Model model) {
Magazine Magazine = MagazineDao.queryById(id);
List<Comment> comment = commentDao.queryByFid(Magazine.getId());
model.addAttribute("Magazine", Magazine);
model.addAttribute("comment", comment);
return "admin/comment/index2";
}
@RequestMapping("comment/add")
public String commentJoin(Comment comment, Model model) {
Integer fid = Integer.parseInt(comment.getFid());
if (fid == null) {
return commentIndex(model);
}
comment.setReqtime(Tool.getTime("yyyy-MM-dd HH:ss"));
commentDao.insert(comment);
return commentJoin(fid, model);
}
@RequestMapping("users2/index")
public String users2Index(Model model) {
List<Users> users = usersDao.queryAll();
model.addAttribute("users", users);
return "admin/users2/index";
}
@RequestMapping("users2/joinUpdate")
public String users2JoinUpdate(Model model, Integer id) {
Users user = usersDao.queryById(id);
if (user.getState().equals("未审核")) {
user.setState("审核通过");
} else {
user.setState("未审核");
}
usersDao.update(user);
return users2Index(model);
}
@RequestMapping("echart/index")
public String echartIndex() {
return "admin/echart/index";
}
@RequestMapping("echarts")
@ResponseBody
public Map<String, Object> echarts(Model model) {
Map<String, Object> map = new HashMap<>();
List<String> names = new ArrayList<>();
List<String> nums = new ArrayList<>();
List<Magazinedept> Magazinedept = MagazinedeptDao.queryAll();
for (Magazinedept o : Magazinedept) {
names.add(o.getName());
nums.add(o.getNums());
}
List<Magazine> Magazine = MagazineDao.queryAllLimit();
List<String> names2 = new ArrayList<>();
List<String> nums2 = new ArrayList<>();
for (Magazine o : Magazine) {
names2.add(o.getName());
nums2.add(o.getNum());
}
map.put("names", names);
map.put("nums", nums);
map.put("names2", names2);
map.put("nums2", nums2);
return map;
}
}
用户核心代码:
/**
* (Users)表控制层
*
* @author makejava
* @since 2022-04-30 14:51:54
*/
@Controller
@RequestMapping("user")
public class UsersController {
//管理员
@Resource
private AdminDao adminDao;
//用户
@Resource
private UsersDao usersDao;
//评论
@Resource
private CommentDao commentDao;
//杂志
@Resource
private MagazineDao MagazineDao;
//杂志类别
@Resource
private MagazinedeptDao MagazinedeptDao;
@RequestMapping("joinlogin")
public String joinlogin(Model model) {
return "user/login";
}
@RequestMapping("joinAdd")
public String joinAdd(Model model) {
return "user/register";
}
@RequestMapping("add")
public String add(Model model, Users users) {
Users admins = usersDao.queryByUsername(users.getUsername());
if (admins != null) {
model.addAttribute("error", "用户名已存在");
return joinAdd(model);
}
users.setState("未审核");
usersDao.insert(users);
return joinlogin(model);
}
@RequestMapping("login")
public String login(HttpSession session, Model model, Users users) {
users = usersDao.login(users);
if (users == null) {
model.addAttribute("error", "用户名或密码错误");
return joinlogin(model);
} else if (users.getState().equals("未审核")) {
model.addAttribute("error", "您的账号未审核,还没有登入权限");
return joinlogin(model);
}
session.setAttribute("users", users);
return MagazinedeptIndex(model);
}
@RequestMapping("Magazinedept/index")
public String MagazinedeptIndex(Model model) {
List<Magazinedept> Magazinedept = MagazinedeptDao.queryAll();
model.addAttribute("Magazinedept", Magazinedept);
return "user/Magazinedept/index";
}
@RequestMapping("Magazine/index")
public String MagazineIndex(Model model) {
List<Magazine> Magazine = MagazineDao.queryAll();
model.addAttribute("Magazine", Magazine);
return "user/Magazine/index";
}
@RequestMapping("Magazine/selectById")
public String MagazineSelectById(Model model, Integer id) {
Magazine Magazine = MagazineDao.queryById(id);
model.addAttribute("Magazine", Magazine);
return "user/Magazine/index2";
}
@RequestMapping("Magazine/counts")
@ResponseBody
public void MagazineCounts(Model model, Integer id) {
Magazine Magazine = MagazineDao.queryById(id);
Magazine.setNum(Integer.parseInt(Magazine.getNum()) + 1 +"");
MagazineDao.update(Magazine);
Magazinedept dept = MagazinedeptDao.queryByName(Magazine.getDname());
dept.setNums(Integer.parseInt(dept.getNums()) + 1 +"");
MagazinedeptDao.update(dept);
}
@RequestMapping("comment/index")
public String commentIndex(Model model) {
List<Magazine> Magazine = MagazineDao.queryAll();
model.addAttribute("Magazine", Magazine);
return "user/comment/index";
}
@RequestMapping("comment/join")
public String commentJoin(Integer id, Model model) {
Magazine Magazine = MagazineDao.queryById(id);
List<Comment> comment = commentDao.queryByFid(Magazine.getId());
model.addAttribute("Magazine", Magazine);
model.addAttribute("comment", comment);
return "user/comment/index2";
}
@RequestMapping("comment/add")
public String commentJoin(Comment comment, Model model, HttpSession session) {
Users users = (Users) session.getAttribute("users");
if (users == null) {
model.addAttribute("error", "请重新登入");
return joinlogin(model);
}
Integer fid = Integer.parseInt(comment.getFid());
if (fid == null) {
return commentIndex(model);
}
comment.setUid(users.getId() + "");
comment.setUname(users.getName());
comment.setReqtime(Tool.getTime("yyyy-MM-dd HH:ss"));
commentDao.insert(comment);
return commentJoin(fid, model);
}
@RequestMapping("Magazine2/index")
public String MagazineIndex2(Model model) {
List<Magazine> Magazine = MagazineDao.queryAllLimit();
try{
for (int i = 0; i < Magazine.size() - 1; i++) {
for (int j = 1; j < Magazine.size() - i; j++) {
Magazine folderDIO;
// 对唯一标识进行比较,层级有小到大
if ((Magazine.get(j - 1).getNum()).compareTo(Magazine.get(j).getNum()) > 0) {
folderDIO = Magazine.get(j - 1);
Magazine.set((j - 1), Magazine.get(j));
Magazine.set(j, folderDIO);
}
}
}
} catch (Exception e){
}
model.addAttribute("Magazine", Magazine);
return "user/Magazine2/index";
}
@RequestMapping("Magazine2/selectById")
public String MagazineSelectById2(Model model, Integer id) {
Magazine Magazine = MagazineDao.queryById(id);
model.addAttribute("Magazine", Magazine);
return "user/Magazine2/index";
}
}
详情关注公众号了解: