Mongodb很适合做这件事,api的调用仅仅是使用到了入门级别的CRUD,理清楚了思路,编码也会顺风顺水,所以你会发现我在这篇博客中说的比编码还多。 |
评论榜预期的功能
就像是StackOverFlow的那样, 用户可以发出自己的提问,其他用户来解答, 同时楼主可以回复别人的评论,别人依然可以回复楼主
数据结构
mongodb可以存储文档啊, 其实我们要做的就是构建一个合适的类,评论帮也就成功一大半了
问题/ 评论 实体如下
问题
public class Problem implements Serializable { @Id private String _id;// key private String nickname; // 用户名 private String avator; // 用户头像 private String userId; // 户名id private String title ; // 标题 private String content ; // 内容 private boolean answered ; // 是否已经回答 private Date createTime ; // 创建时间 private boolean flag =false; // 标记是否是本人,默认是非本人 private List<Answer> answerList; // 问题的回答列表 }
评论
public class Answer { private String id;// 当前回答的唯一标识 private String nickname; // 用户名 private String avator; // 用户头像 private Integer userId; // 回答的用户的id private String Content ; // 回答的内容 private Date time; private boolean flag = false;// 默认false.不是本人 private Integer group; // 分组的标记 }
思路
Answer实体中,并没有添加一个集合用来存放Answer类型的实体,如果添加上这个集合的话,确实想法还不错,回复中有其他人对自己的回复,天生的树形结构,但是考虑到前端的渲染的难度加大,放弃了这种方案
问题的实体类中维护了一个回答的实体类的集合,所有针对楼主问题的回答实例全部放在这个集合中, 也包括楼主对问题回答者的回复, 还包含回答者对问题的回复
于是这样就仅仅存在两层,一个问题中维护着对这个问题的全部回复,前端渲染的难度大大降低,但是后来却来事了
用户查询一个问题的详情时,后端如何处理
当用户查询一个问题的详情时,后端拿着问题的id,去数据库中将问题的实例取出来,紧接着处理Answer集合,将按照时间排序的集合按照我们指定的方式分组,再按时间排序
按什么分组呢?
当时是按照不同的用户分组, 同一个用户的全部评论,已经楼主对它的回复,以及别人对它的回复都放在一起, 所以需要一个字段,group(我选的用户id), 专门存储分组的标志. 组内的实例再按照时间排序,这样整体的层次就划分好了
public JsonResult problemDetail(@PathVariable String problemId){ Optional<Problem> byId = problemRepository.findById(problemId); if (!byId.isPresent()){ return JsonResult.fail("您没有获取到详情页,请联系管理员"); } Problem problem = byId.get(); if (problem.getAnswerList().size()>0){ Map<Integer, List<Answer>> collect = problem.getAnswerList() .stream().collect(Collectors.groupingBy(Answer::getGroup)); ArrayList<Answer> list = new ArrayList<>(); collect.forEach((k,v)->{ list.addAll(v); }); problem.setAnswerList(list); } return JsonResult.ok("返回详情页"+problem); }
定位出当前用户的评论
如果前端想在页面的分左右两部分展示自己的评论和别人的评论,就需要一个标记,既然上面都已经在遍历了,多加一个判断也无妨, 拿着前端提交过来的用户id和Answer中的userId比对, 如果相等,就把这个评论的flag标记为true, 前端根据这个标记区分, 从而给用户更多的权限,比如删除自己的评论
局限性
如果没个问题都像网易音乐那种,上万条评论,这样的话,估计就废了,虽然使用stream会快,但是也扛不住量啊, 但是数量小的话,还是可以接受的, 其实理想的状态是评论可以以分页的形式获取出来, 感觉才正宗。
郑州不孕不育医院:http://yyk.39.net/zz3/zonghe/1d427.html
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。