美文网首页
java设计评论列表

java设计评论列表

作者: c97e4a46b0c0 | 来源:发表于2019-05-03 21:32 被阅读0次

    学习java已经有一年多了,一直想写一个博客来记录自己的学习历程,同时也跟大家分享一下自己的学习时踩过的坑;想法想了很长的时间,最近终于开始动工了,项目主要使用springboot,MybatisPlus;

    博客的主体肯定就是文章,一片文章的评论时至关重要的,可以便于用户之间的交流,同时也可以看下其他盆友的更好意见,然后评论这个就难住了我,思考再三,再综合自己的项目,给出了一个相对简单的需求;

    需求:

    用户可以评论,也看也回复评论,其他用户还可以评论评论的回复,总之像微博那种;

    评论表

    import com.baomidou.mybatisplus.annotation.TableField;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    import com.baomidou.mybatisplus.extension.activerecord.Model;
    import lombok.Getter;
    import lombok.Setter;
    /**
      * @author create by Erys
      * @email xiaojiju0811@163.com
      * @date 2019/4/29 23:37
      * @description 评论表
      * 表中的levelFlag为评论等级,1表示一级,主要是文章的直接评论, 2表示二级,主要是主题评论的回复
      **/
    @Getter
    
    @Setter
    
    @TableName("tbl_article_comment")
    
    public class Comment extends Model<Comment> {
    
        /**
    
        * 主键
    
        */
    
        @TableId("comment_id")
    
        private long commentId;
    
        /**
    
        * 用户Id
    
    */
    
        private long openUserId;
    
        /**
    
        * 文章Id
    
    */
    
        @TableField("article_id")
    
        private long articleInfoId;
    
        /**
    
        * 评论内容
    
        */
    
        private String commentContent;
    
        /**
    
        * 父级评论Id
    
    */
    
        private long parentCommentId;
    
        /**
    
        * 评论等级
    
        */
    
        private int levelFlag;
    
        /**
    
        * 创建时间
    
        */
    
        private String createTime;
    
        /**
    
        * 修改时间
    
        */
    
        private String updateTime;
    
    }
    

    我的表设计的很简单,因为本身项目就很简单,而且估计流量也不多,需求没有那么的大,别的话不说,如果你自己有更复杂的需求,可以自己再设计,我只是提供一个思路;

    前端需求:
    类似于这种:

    /**
              某某某 评论:你好
                    她她她 回复 某某某: 回复你好
                         你你你 回复 她她她: 哈哈哈哈
                    他他他 回复: 回复你不好
              我我我 评论:辣鸡
                    小仙女 回复 我我我: 你才是辣鸡
    **/
    

    抱歉,我以这种简陋的方式大家展示(手动捂脸)!!

    既然需求搞清楚了,基本就可以操作了,看这个前端需求,和一个数据结构有点像,就是树形结构,具体看下面的图(其实是手打的)

    /**
     *   *                             root
     *   *                       /      |     \
     *   *                      1       2      3
     *   *                  / | | | \
     *   *                 4  5 6 7  8
    **/
    

    所以就直接以树的形式进行组装就行了;

    import lombok.Getter;
    import lombok.Setter;
    
    import java.util.List;
    
    
    @Getter
    @Setter
    public class CommentNodeTree {
    
        private long commentId;
        private long openUserId;
        private String avatar;
        private String nickName;
        private String commentContent;
        private String createTime;
        private List<CommentNodeTree> commentNodeTrees;
    }
    

    其中commentNodeTrees为root的下一层的节点集合;

    具体的service层求树节点:

        @Override
        public IPage commentOnArt(long articleId, IndexPage indexPage) {
    
            // 1 查询评论等级为1的评论
            PageHelper<Comment> pageHelper = new PageHelper<>(indexPage);
            Wrapper<Comment> commentWrapper = new QueryWrapper<>();
            HashMap<String, Object> params = new HashMap<>(2);
            params.put("article_id", articleId);
            params.put("level_flag", 1);
            ((QueryWrapper<Comment>) commentWrapper).allEq(params);
            ((QueryWrapper<Comment>) commentWrapper).orderByDesc("create_time");
            pageHelper = (PageHelper<Comment>) commentMapper.selectPage(pageHelper, commentWrapper);
            List<Comment> levelOne = pageHelper.getRecords();
            if (levelOne.size() == 0) {
                throw new ArticleNotFoundException("文章不存在");
            }
    
            List<CommentNodeTree> trees = new ArrayList<>();
            int size = levelOne.size();
            for (int i = 0; i < size; i++) {
                CommentNodeTree commentNodeTree = new CommentNodeTree();
                Comment comment = levelOne.get(i);
                commentNodeTree.setCommentId(comment.getCommentId());
                commentNodeTree.setCommentContent(comment.getCommentContent());
                commentNodeTree.setOpenUserId(comment.getOpenUserId());
                commentNodeTree.setCreateTime(comment.getCreateTime());
                // todo 缺少用户的信息
                deepSearch(commentNodeTree);
                trees.add(commentNodeTree);
            }
            PageHelper<CommentNodeTree> commentNodeTreePageHelper = new PageHelper<>(indexPage);
            commentNodeTreePageHelper.setRecords(trees);
            return commentNodeTreePageHelper;
        }
        
       /**
         * 递归进行求树形节点
         * @param commentNodeTree 评论树
         */
        private void deepSearch(CommentNodeTree commentNodeTree) {
            if (commentNodeTree == null) {
                return;
            }
            List<CommentNodeTree> commentNodeTrees = openUserMapper.getSecondClassByParentId(commentNodeTree.getCommentId());
            if (commentNodeTrees.size() == 0) {
                return;
            }
            for (int i = 0; i < commentNodeTrees.size(); i++) {
                deepSearch(commentNodeTrees.get(i));
                commentNodeTree.setCommentNodeTrees(commentNodeTrees);
            }
        }
    
    

    使用递归进行组装评论树,这样就OK了;

    结果就是

    {
        "body": {
            "records": [
                {
                    "commentId": 1,
                    "openUserId": 123456789,
                    "avatar": null,
                    "nickName": null,
                    "commentContent": "你好",
                    "createTime": "2018-05-02 00:00:00.0",
                    "commentNodeTrees": [
                        {
                            "commentId": 2,
                            "openUserId": 123456789,
                            "avatar": null,
                            "nickName": null,
                            "commentContent": "回复你好",
                            "createTime": "2018-05-02 00:00:00.0",
                            "commentNodeTrees": [
                                {
                                    "commentId": 6,
                                    "openUserId": 123456789,
                                    "avatar": null,
                                    "nickName": null,
                                    "commentContent": "回复回复你好",
                                    "createTime": "2018-05-02 00:00:00.0",
                                    "commentNodeTrees": null
                                }
                            ]
                        },
                        {
                            "commentId": 3,
                            "openUserId": 123456789,
                            "avatar": null,
                            "nickName": null,
                            "commentContent": "回复你好",
                            "createTime": "2018-05-02 00:00:00.0",
                            "commentNodeTrees": [
                                {
                                    "commentId": 7,
                                    "openUserId": 123456789,
                                    "avatar": null,
                                    "nickName": null,
                                    "commentContent": "2恢复恢复你好",
                                    "createTime": "2018-05-02 00:00:00.0",
                                    "commentNodeTrees": null
                                }
                            ]
                        },
                        {
                            "commentId": 4,
                            "openUserId": 123456789,
                            "avatar": null,
                            "nickName": null,
                            "commentContent": "回复你好",
                            "createTime": "2018-05-02 00:00:00.0",
                            "commentNodeTrees": null
                        },
                        {
                            "commentId": 5,
                            "openUserId": 123456789,
                            "avatar": null,
                            "nickName": null,
                            "commentContent": "回复你好",
                            "createTime": "2018-05-02 00:00:00.0",
                            "commentNodeTrees": null
                        }
                    ]
                }
            ],
            "total": 0,
            "size": 12,
            "current": 1,
            "searchCount": true,
            "pages": 0
        },
        "code": 1,
        "msg": "OK"
    }
    

    这样的结果对于前端开发人员也很好组装组件,更加的友好,如果我的文章帮助到大家,请给我点个喜欢吧,谢谢!

    如果有大佬有更好的建议,就请快速的评论给我,我好改进,互相进步!

    相关文章

      网友评论

          本文标题:java设计评论列表

          本文链接:https://www.haomeiwen.com/subject/ivaznqtx.html