java设计评论列表

学习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"
}

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容