java递归实现无限制多级评论

java递归实现无限制多级评论

  • SQL

    CREATE TABLE `comment_dto`  (
      `id` int(11) NOT NULL,
      `parent_id` int(11) NULL DEFAULT NULL COMMENT '上级评论ID',
      `blog_id` int(11) NULL DEFAULT NULL COMMENT '文章ID',
      `account_Id` int(11) NULL DEFAULT NULL COMMENT '评论者ID',
      `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '评论内容',
      `create_time` timestamp(0) NULL DEFAULT NULL COMMENT '创建时间',
      `comment_status` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否是最上级评论0:是,1:不是',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of comment_dto
    -- ----------------------------
    INSERT INTO `comment_dto` VALUES (1, 0, 1, 2, '这是一级评论', '2021-07-01 11:28:10', '0');
    INSERT INTO `comment_dto` VALUES (2, 1, 1, 2, '这是二级评论', '2021-07-01 11:28:46', '1');
    INSERT INTO `comment_dto` VALUES (3, 1, 1, 2, '这是二级评论', '2021-07-01 11:29:46', '1');
    INSERT INTO `comment_dto` VALUES (4, 1, 1, 2, '这是二级评论', '2021-07-01 11:30:46', '1');
    INSERT INTO `comment_dto` VALUES (5, 2, 1, 2, '这是三级评论', '2021-07-01 12:30:46', '1');
    INSERT INTO `comment_dto` VALUES (6, 5, 1, 2, '这是四级评论', '2021-07-01 13:30:46', '1');
    
  • Mapper

     <select id="getCommentByBlogId" resultType="CommentDto" parameterType="Integer">
            SELECT bc.`blog_id` as blogId,bc.`parent_id` as parentId,bc.`id`,
                   bc.`account_id` as accountId,bc.`content` as content,bc.`create_time` as date
            FROM comment_dto bc
            WHERE bc.`blog_id` = #{blogId}
              AND bc.`comment_status` = 0;
        </select>
    
        <select id="getCommentByParentId" resultType="CommentDto" parameterType="Integer">
            SELECT bc.`blog_id` as blogId,bc.`id`,bc.`account_id` AS accountId,
                   bc.`content` AS content,
                   bc.`create_time` AS DATE,
                   bc.`parent_id` AS parentId
            FROM comment_dto bc
            WHERE bc.`parent_id` = #{parentId} AND bc.`comment_status` != 0;
        </select>
    
  • Mapper接口

    List<CommentDto> getCommentByBlogId(Integer blogId);
    
    List<CommentDto> getCommentByParentId(Integer parentId);
    
  • model

    
    public class CommentDto {
        /**
         * 主键
         */
        private Integer id;
    
        /**
         * 评论者
         */
        private Integer accountId;
    
        /**
         * 上级评论
         */
        private Integer parentId;
    
        /**
         * 文章
         */
        private Integer blogId;
    
        /**
         * 评论内容
         */
        private String content;
    
        /**
         * 下级评论
         */
        private List<CommentDto> sons;
    
        /**
         * 发生日期
         */
        private String date;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public Integer getAccountId() {
            return accountId;
        }
    
        public void setAccountId(Integer accountId) {
            this.accountId = accountId;
        }
    
        public Integer getParentId() {
            return parentId;
        }
    
        public void setParentId(Integer parentId) {
            this.parentId = parentId;
        }
    
        public Integer getBlogId() {
            return blogId;
        }
    
        public void setBlogId(Integer blogId) {
            this.blogId = blogId;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public List<CommentDto> getSons() {
            return sons;
        }
    
        public void setSons(List<CommentDto> sons) {
            this.sons = sons;
        }
    
        public String getDate() {
            return date;
        }
    
        public void setDate(String date) {
            this.date = date;
        }
    }
    
  • service

     @Autowired
        private RemarkOnMapper commentMapper;
    
    
    
        public List<CommentDto> getAllCommentByBlogId(Integer blogId) {
            List<CommentDto> commentVos = this.commentMapper.getCommentByBlogId(blogId);
            List<CommentDto> sons = getSons(commentVos);
            return sons;
        }
    
        private List<CommentDto> getSons(Integer parentId){
            return this.commentMapper.getCommentByParentId(parentId);
        }
    
    
        private List<CommentDto> getSons(List<CommentDto> parents){
            if(parents == null || parents.size() == 0){
                return null;
            }
            for (CommentDto parent : parents) {
                int parentId = parent.getId();
                List<CommentDto> sonCommentVos = getSons(parentId);
                //递归找子评论
                parent.setSons(getSons(sonCommentVos));
            }
            return parents;
        }
    
  • controller

     @Autowired
        RemarkOnService ros;
    
        @ResponseBody
        @CrossOrigin(origins = "*")
        @RequestMapping(value = "/ROC/gbb", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
        public M<List<CommentDto>> getBlogById(@RequestParam("blogId")Integer blogId){
            return M.succeed(ros.getAllCommentByBlogId(blogId));
        }
    
  • 结果

    {
    	"start": "请求成功",
    	"errMsg": "",
    	"target": [{
    		"id": 1,
    		"accountId": 2,
    		"parentId": 0,
    		"blogId": 1,
    		"content": "这是一级评论",
    		"sons": [{
    			"id": 2,
    			"accountId": 2,
    			"parentId": 1,
    			"blogId": 1,
    			"content": "这是二级评论",
    			"sons": [{
    				"id": 5,
    				"accountId": 2,
    				"parentId": 2,
    				"blogId": 1,
    				"content": "这是三级评论",
    				"sons": [{
    					"id": 6,
    					"accountId": 2,
    					"parentId": 5,
    					"blogId": 1,
    					"content": "这是四级评论",
    					"sons": null,
    					"date": "2021-07-01 13:30:46.0"
    				}],
    				"date": "2021-07-01 12:30:46.0"
    			}],
    			"date": "2021-07-01 11:28:46.0"
    		}, {
    			"id": 3,
    			"accountId": 2,
    			"parentId": 1,
    			"blogId": 1,
    			"content": "这是二级评论",
    			"sons": null,
    			"date": "2021-07-01 11:29:46.0"
    		}, {
    			"id": 4,
    			"accountId": 2,
    			"parentId": 1,
    			"blogId": 1,
    			"content": "这是二级评论",
    			"sons": null,
    			"date": "2021-07-01 11:30:46.0"
    		}],
    		"date": "2021-07-01 11:28:10.0"
    	}],
    	"code": 1
    }
    

参考博客链接:

[https://blog.csdn.net/GDUT_Trim/article/details/115702508?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-7.control]:

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亿只王菜菜

各位爷,赏口饭吃吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值