这里拿博客举例子
评论功能问题的描述:
可以评论博客,
评论与评论之间可以进行回复,是一个嵌套过程。
例如:
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.递归调用本方法。
代码实现:
实体类
@Date
@ApiModel(value="Comment对象", description="博客评论")
public class Comment implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.ID_WORKER_STR)
private String id;
@ApiModelProperty(value = "用户头像")
private String avatar;
@ApiModelProperty(value = "评论内容")
private String content;
@ApiModelProperty(value = "用户邮箱")
private String email;
@ApiModelProperty(value = "用户昵称")
private String nickname;
@ApiModelProperty(value = "被评论博客id")
private Long blogId;
@ApiModelProperty(value = "父评论id")
private String parentCommentId;
private Boolean adminComment;
@ApiModelProperty(value = "用户id")
@TableField("uId")
private String uId;
@ApiModelProperty(value = "等级,不用传入参数")
@TableField(exist = false)
private Integer level;
@ApiModelProperty(value = "子级评论,不用传入参数")
@TableField(exist = false)
private List<Comment> commentList;
@ApiModelProperty(value = "逻辑删除 1(true)已删除, 0(false)未删除")
@TableLogic
private Boolean isDeleted;
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private Date gmtCreate;
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;
业务逻辑代码
// 查看博客评论(递归)
@Override
public List<Comment> showBlogComment(String blogId) {
// 查看博客下的所有评论并按照时间降序
List<Comment> commentList = baseMapper.selectList(new QueryWrapper<Comment>().eq("blog_id", blogId).orderByDesc("gmt_create"));
return builderComment(commentList);
}
private List<Comment> builderComment(List<Comment> commentList) {
//封装放回数据的list
List<Comment> dataList = new ArrayList<>();
// 查找所有一级评论
List<Comment> parentComments = new ArrayList<>();
for (Comment comment : commentList) {
// 说明是顶级评论
if (comment.getParentCommentId().equals("0")) {
// 初始化属性
comment.setCommentList(new ArrayList<>());
comment.setLevel(1);
// 装入一级评论的list
parentComments.add(comment);
}
}
// 遍历所有一级评论
for (Comment parentComment:parentComments) {
// 传入一级评论和所有评论
parentComment.getCommentList().add(builderChildComment(parentComment,commentList));
}
return parentComments;
}
private Comment builderChildComment(Comment parentComment, List<Comment> commentList) {
// 初始化子级评论
parentComment.setCommentList(new ArrayList<Comment>());
// 遍历所有评论找出一级评论下的子级评论
for (Comment comment : commentList) {
if (parentComment.getId().equals(comment.getParentCommentId())) {
// 初始化属性
Integer level = parentComment.getLevel();
comment.setLevel(level+1);
if (parentComment.getCommentList() == null) {
parentComment.setCommentList(new ArrayList<Comment>());
}
// 递归调用该方法
parentComment.getCommentList().add(builderChildComment(comment,commentList));
}
}
return parentComment;
}