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

该博客讨论了如何通过递归方法构建博客评论的层级结构。文章详细阐述了从数据库获取所有评论,找到一级评论,初始化评论的属性如子评论列表和等级标识,然后递归地查找并构建子评论的过程。示例代码展示了如何在Java中实现这一功能,包括实体类Comment的定义和业务逻辑代码。
摘要由CSDN通过智能技术生成

这里拿博客举例子

评论功能问题的描述:

可以评论博客,

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

例如:

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;
    }
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值