评论功能实现,包含回复评论。有思路有代码。

╰半夏微凉° 2023-01-13 01:51 165阅读 0赞

这里拿博客举例子

评论功能问题的描述:

可以评论博客,

评论与评论之间可以进行回复,是一个嵌套过程。

例如:

A回复了博客,B回复了A,C回复了B,以此类推。

D回复了博客,C回复了D,A回复了C,以此类推。

需要一个List装所有评论,而不是单个对象来装!

因为博客的评论是多条,每一条都可能包含子评论。

实现思路:

因为是一个套娃的过程,所以需要使用到递归。

1.找出该博客下的所有评论

2.创建用来装一级评论的list

3.遍历所有评论并找出一级评论装入List()。(parentCommentId为0说明是一级评论)

4.遍历装有一级评论的list。初始化一级评论当中的属性。例如:(子级评论的list,level),初始化子级评论list是为了存放子级评论,level是标识符。

5.继续第四步操作,一级评论调用查出子级评论方法,需要传入(一级评论对象,所有评论list)

6.遍历传进来的list。并找出一级评论对象的子评论(传进来的评论对象id 等于 所有评论对象中的parentCommentId)

7.初始化子级评论属性。(list,等级标识符)。

8.递归调用本方法。

代码实现:

实体类

  1. @Date
  2. @ApiModel(value="Comment对象", description="博客评论")
  3. public class Comment implements Serializable {
  4. private static final long serialVersionUID = 1L;
  5. @ApiModelProperty(value = "主键")
  6. @TableId(value = "id", type = IdType.ID_WORKER_STR)
  7. private String id;
  8. @ApiModelProperty(value = "用户头像")
  9. private String avatar;
  10. @ApiModelProperty(value = "评论内容")
  11. private String content;
  12. @ApiModelProperty(value = "用户邮箱")
  13. private String email;
  14. @ApiModelProperty(value = "用户昵称")
  15. private String nickname;
  16. @ApiModelProperty(value = "被评论博客id")
  17. private Long blogId;
  18. @ApiModelProperty(value = "父评论id")
  19. private String parentCommentId;
  20. private Boolean adminComment;
  21. @ApiModelProperty(value = "用户id")
  22. @TableField("uId")
  23. private String uId;
  24. @ApiModelProperty(value = "等级,不用传入参数")
  25. @TableField(exist = false)
  26. private Integer level;
  27. @ApiModelProperty(value = "子级评论,不用传入参数")
  28. @TableField(exist = false)
  29. private List<Comment> commentList;
  30. @ApiModelProperty(value = "逻辑删除 1(true)已删除, 0(false)未删除")
  31. @TableLogic
  32. private Boolean isDeleted;
  33. @ApiModelProperty(value = "创建时间")
  34. @TableField(fill = FieldFill.INSERT)
  35. private Date gmtCreate;
  36. @ApiModelProperty(value = "更新时间")
  37. @TableField(fill = FieldFill.INSERT_UPDATE)
  38. private Date gmtModified;

业务逻辑代码

  1. // 查看博客评论(递归)
  2. @Override
  3. public List<Comment> showBlogComment(String blogId) {
  4. // 查看博客下的所有评论并按照时间降序
  5. List<Comment> commentList = baseMapper.selectList(new QueryWrapper<Comment>().eq("blog_id", blogId).orderByDesc("gmt_create"));
  6. return builderComment(commentList);
  7. }
  8. private List<Comment> builderComment(List<Comment> commentList) {
  9. //封装放回数据的list
  10. List<Comment> dataList = new ArrayList<>();
  11. // 查找所有一级评论
  12. List<Comment> parentComments = new ArrayList<>();
  13. for (Comment comment : commentList) {
  14. // 说明是顶级评论
  15. if (comment.getParentCommentId().equals("0")) {
  16. // 初始化属性
  17. comment.setCommentList(new ArrayList<>());
  18. comment.setLevel(1);
  19. // 装入一级评论的list
  20. parentComments.add(comment);
  21. }
  22. }
  23. // 遍历所有一级评论
  24. for (Comment parentComment:parentComments) {
  25. // 传入一级评论和所有评论
  26. parentComment.getCommentList().add(builderChildComment(parentComment,commentList));
  27. }
  28. return parentComments;
  29. }
  30. private Comment builderChildComment(Comment parentComment, List<Comment> commentList) {
  31. // 初始化子级评论
  32. parentComment.setCommentList(new ArrayList<Comment>());
  33. // 遍历所有评论找出一级评论下的子级评论
  34. for (Comment comment : commentList) {
  35. if (parentComment.getId().equals(comment.getParentCommentId())) {
  36. // 初始化属性
  37. Integer level = parentComment.getLevel();
  38. comment.setLevel(level+1);
  39. if (parentComment.getCommentList() == null) {
  40. parentComment.setCommentList(new ArrayList<Comment>());
  41. }
  42. // 递归调用该方法
  43. parentComment.getCommentList().add(builderChildComment(comment,commentList));
  44. }
  45. }
  46. return parentComment;
  47. }

发表评论

表情:
评论列表 (有 0 条评论,165人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java实现评论回复功能

    评论和回复功能常见于各种Web应用程序,它们允许用户在文章、博客或社交媒体上互相交流和讨论。在Java中实现评论和回复功能可以通过使用数据库和服务器端技术来完成。本文将介绍一种

    相关 评论回复功能的设计与实现

    评论回复功能的数据库设计可以分开设计成两张表,评论表和回复表,也可以将其设计为一张表,我采用的是一张表 评论回复表的相关字段(我做的是商品goods下的评论回复) ![