使用SpringBoot实现无限级评论回复功能

这篇具有很好参考价值的文章主要介绍了使用SpringBoot实现无限级评论回复功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

评论功能已经成为APP和网站开发中的必备功能。本文采用springboot+mybatis-plus框架,通过代码主要介绍评论功能的数据库设计和接口数据返回。我们返回的格式可以分三种方案,第一种方案是先返回评论,再根据评论id返回回复信息,第二种方案是将评论回复直接封装成一个类似于树的数据结构进行返回(如果数据对的话,可以根据评论分页),第三种方案是将所有数据用递归的SQL查出来,再把数据解析成树,返回结果

1 数据库表结构设计

表结构:

CREATE TABLE `comment` (
  `id` bigint(18) NOT NULL AUTO_INCREMENT,
  `parent_id` bigint(18) NOT NULL DEFAULT '0',
  `content` text NOT NULL COMMENT '内容',
  `author` varchar(20) NOT NULL COMMENT '评论人',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '评论时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;

数据添加:

INSERT INTO `comment` (`id`, `parent_id`, `content`, `author`, `create_time`) VALUES (1, 0, '这是评论1', '吴名氏', '2023-02-20 17:11:16');
INSERT INTO `comment` (`id`, `parent_id`, `content`, `author`, `create_time`) VALUES (2, 1, '我回复了第一条评论', '吴名氏', '2023-02-20 17:12:00');
INSERT INTO `comment` (`id`, `parent_id`, `content`, `author`, `create_time`) VALUES (3, 2, '我回复了第一条评论的第一条回复', '吴名氏', '2023-02-20 17:12:13');
INSERT INTO `comment` (`id`, `parent_id`, `content`, `author`, `create_time`) VALUES (4, 2, '我回复了第一条评论的第二条回复', '吴名氏', '2023-02-21 09:23:14');
INSERT INTO `comment` (`id`, `parent_id`, `content`, `author`, `create_time`) VALUES (5, 0, '这是评论2', '吴名氏', '2023-02-21 09:41:02');
INSERT INTO `comment` (`id`, `parent_id`, `content`, `author`, `create_time`) VALUES (6, 3, '我回复了第一条评论的第一条回复的第一条回复', '吴名氏', '2023-02-21 09:56:27');

添加后的数据:

使用SpringBoot实现无限级评论回复功能

2 方案一

方案一先返回评论列表,再根据评论id返回回复列表,以此循环,具体代码下文进行展示

2.1 控制层CommentOneController.java

/**
 * 方案一
 * @author wuKeFan
 * @date 2023-02-20 16:58:08
 */
@Slf4j
@RestController
@RequestMapping("/one/comment")
public class CommentOneController {

    @Resource
    private CommentService commentService;

    @GetMapping("/")
    public List<Comment> getList() {
        return commentService.getList();
    }

    @GetMapping("/{id}")
    public Comment getCommentById(@PathVariable Long id) {
        return commentService.getById(id);
    }

    @GetMapping("/parent/{parentId}")
    public List<Comment> getCommentByParentId(@PathVariable Long parentId) {
        return commentService.getCommentByParentId(parentId);
    }

    @PostMapping("/")
    public void addComment(@RequestBody Comment comment) {
        commentService.addComment(comment);
    }

}

2.2 service类CommentService.java

/**
 * service类
 * @author wuKeFan
 * @date 2023-02-20 16:55:23
 */
public interface CommentService {

    List<Comment> getCommentByParentId(Long parentId);

    void addComment(Comment comment);

    Comment getById(Long id);

    List<Comment> getList();
}

2.3 service实现类CommentServiceImpl.java

/**
 * @author wuKeFan
 * @date 2023-02-20 16:56:00
 */
@Service
public class CommentServiceImpl implements CommentService{

    @Resource
    private CommentMapper baseMapper;

    @Override
    public List<Comment> getCommentByParentId(Long parentId) {
        QueryWrapper<Comment> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", parentId);
        return baseMapper.selectList(queryWrapper);
    }

    @Override
    public void addComment(Comment comment) {
        baseMapper.insert(comment);
    }

    @Override
    public Comment getById(Long id) {
        return baseMapper.selectById(id);
    }

    @Override
    public List<Comment> getList() {
        return baseMapper.selectList(new QueryWrapper<Comment>().lambda().eq(Comment::getParentId, 0));
    }

}

2.4 数据库持久层类CommentMapper.java

/**
 * mapper类
 * @author wuKeFan
 * @date 2023-02-20 16:53:59
 */
@Repository
public interface CommentMapper extends BaseMapper<Comment> {

}

2.5 实体类Comment.java

/**
 * 评论表实体类
 * @author wuKeFan
 * @date 2023-02-20 16:53:24
 */
@Data
@TableName("comment")
public class Comment {
    @TableId(type = IdType.AUTO)
    private Long id;
    private Long parentId;
    private String content;
    private String author;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
}

2.6 使用Postman请求接口,查看返回数据

2.6.1 请求评论列表接口(本地的url为:http://localhost:8081/one/comment/ ,GET请求),请求结果如图

使用SpringBoot实现无限级评论回复功能

2.6.2 根据评论id(或者回复id)返回回复列表(本地url为:http://localhost:8081/one/comment/parent/1 ,GET请求),请求结果如图

使用SpringBoot实现无限级评论回复功能

3 方案二

方案二采用的是将数据装到一个类似树的数据结构,然后返回,数据如果多的话,可以根据评论列表进行分页

3.1 控制层CommentTwoController.java

/**
 * @author wuKeFan
 * @date 2023-02-20 17:30:45
 */
@Slf4j
@RestController
@RequestMapping("/two/comment")
public class CommentTwoController {

    @Resource
    private CommentService commentService;

    @GetMapping("/")
    public List<CommentDTO> getAllComments() {
       return commentService.getAllComments();
    }

    @PostMapping("/")
    public void addComment(@RequestBody Comment comment) {
        commentService.addComment(comment);
    }
}

3.2 service类CommentService.java

/**
 * service类
 * @author wuKeFan
 * @date 2023-02-20 16:55:23
 */
public interface CommentService {

    void addComment(Comment comment);

    void setChildren(CommentDTO commentDTO);

    List<CommentDTO> getAllComments();
}

3.3 service实现类CommentServiceImpl.java

/**
 * @author wuKeFan
 * @date 2023-02-20 16:56:00
 */
@Service
public class CommentServiceImpl implements CommentService{

    @Resource
    private CommentMapper baseMapper;

    @Override
    public void addComment(Comment comment) {
        baseMapper.insert(comment);
    }

    @Override
    public List<CommentDTO> getAllComments() {
        List<CommentDTO> rootComments = baseMapper.findByParentId(0L);
        rootComments.forEach(this::setChildren);
        return rootComments;
    }

    /**
     * 递归获取
     * @param commentDTO 参数
     */
    @Override
    public void setChildren(CommentDTO commentDTO){
        List<CommentDTO> children = baseMapper.findByParentId(commentDTO.getId());
        if (!children.isEmpty()) {
            commentDTO.setChildren(children);
            children.forEach(this::setChildren);
        }
    }

}

3.4 数据库持久层类CommentMapper.java

/**
 * mapper类
 * @author wuKeFan
 * @date 2023-02-20 16:53:59
 */
@Repository
public interface CommentMapper extends BaseMapper<Comment> {

    @Select("SELECT id, parent_id as parentId, content, author, create_time as createTime FROM comment WHERE parent_id = #{parentId}")
    List<CommentDTO> findByParentId(Long parentId);

}

3.5 实体类CommentDTO.java

/**
 * 递归方式实体类
 * @author wuKeFan
 * @date 2023-02-20 17:26:48
 */
@Data
public class CommentDTO {

    private Long id;
    private Long parentId;
    private String content;
    private String author;
    private List<CommentDTO> children;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;

}

3.6 使用Postman请求接口,查看返回数据

3.6.1 通过递归的方式以树的数据结构返回(本地url为:http://localhost:8081/two/comment/ ,GET请求),请求结果如图

使用SpringBoot实现无限级评论回复功能

返回的json格式如图:

[
    {
        "id": 1,
        "parentId": 0,
        "content": "这是评论1",
        "author": "吴名氏",
        "children": [
            {
                "id": 2,
                "parentId": 1,
                "content": "我回复了第一条评论",
                "author": "吴名氏",
                "children": [
                    {
                        "id": 3,
                        "parentId": 2,
                        "content": "我回复了第一条评论的第一条回复",
                        "author": "吴名氏",
                        "children": [
                            {
                                "id": 6,
                                "parentId": 3,
                                "content": "我回复了第一条评论的第一条回复的第一条回复",
                                "author": "吴名氏",
                                "children": null,
                                "createTime": "2023-02-21 09:56:27"
                            }
                        ],
                        "createTime": "2023-02-20 17:12:13"
                    },
                    {
                        "id": 4,
                        "parentId": 2,
                        "content": "我回复了第一条评论的第二条回复",
                        "author": "吴名氏",
                        "children": null,
                        "createTime": "2023-02-21 09:23:14"
                    }
                ],
                "createTime": "2023-02-20 17:12:00"
            }
        ],
        "createTime": "2023-02-20 17:11:16"
    },
    {
        "id": 5,
        "parentId": 0,
        "content": "这是评论2",
        "author": "吴名氏",
        "children": null,
        "createTime": "2023-02-21 09:41:02"
    }
]

4 方案三

方案三是将所有数据用递归的SQL查出来,再把数据解析成树,返回结果,适合数据较少的情况下,且MySQL版本需要在8.0以上

4.1 控制层CommentThreeController.java

/**
 * @author wuKeFan
 * @date 2023-02-20 17:30:45
 */
@Slf4j
@RestController
@RequestMapping("/three/comment")
public class CommentThreeController {

    @Resource
    private CommentService commentService;

    @GetMapping("/")
    public List<CommentDTO> getAllCommentsBySql() {
       return commentService.getAllCommentsBySql();
    }

    @PostMapping("/")
    public void addComment(@RequestBody Comment comment) {
        commentService.addComment(comment);
    }
}

4.2 service类CommentService.java

/**
 * service类
 * @author wuKeFan
 * @date 2023-02-20 16:55:23
 */
public interface CommentService {

    List<CommentDTO> getAllCommentsBySql();

}

4.3 service实现类CommentServiceImpl.java

/**
 * @author wuKeFan
 * @date 2023-02-20 16:56:00
 */
@Service
public class CommentServiceImpl implements CommentService{

    @Resource
    private CommentMapper baseMapper;

    /**
     * 递归获取
     * @param commentDTO 参数
     */
    @Override
    public void setChildren(CommentDTO commentDTO){
        List<CommentDTO> children = baseMapper.findByParentId(commentDTO.getId());
        if (!children.isEmpty()) {
            commentDTO.setChildren(children);
            children.forEach(this::setChildren);
        }
    }

}

4.4 数据库持久层类CommentMapper.java

/**
 * mapper类
 * @author wuKeFan
 * @date 2023-02-20 16:53:59
 */
@Repository
public interface CommentMapper extends BaseMapper<Comment> {

    @DS("localhost80")
    List<CommentDTO> getAllCommentsBySql();

}

4.5 实体类Comment.java

/**
 * 评论表实体类
 * @author wuKeFan
 * @date 2023-02-20 16:53:24
 */
@Data
@TableName("comment")
public class Comment {
    @TableId(type = IdType.AUTO)
    private Long id;
    private Long parentId;
    private String content;
    private String author;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    private Integer level;
}

4.6 使用Postman请求接口,查看返回数据

4.6.1 通过递归的方式以树的数据结构返回(本地url为:http://localhost:8081/three/comment/ ,GET请求),请求结果如图

使用SpringBoot实现无限级评论回复功能

返回的json格式如图:

[
    {
        "id": 1,
        "parentId": 0,
        "content": "这是评论1",
        "author": "吴名氏",
        "children": [
            {
                "id": 2,
                "parentId": 1,
                "content": "我回复了第一条评论",
                "author": "吴名氏",
                "children": [
                    {
                        "id": 3,
                        "parentId": 2,
                        "content": "我回复了第一条评论的第一条回复",
                        "author": "吴名氏",
                        "children": [
                            {
                                "id": 6,
                                "parentId": 3,
                                "content": "我回复了第一条评论的第一条回复的第一条回复",
                                "author": "吴名氏",
                                "children": [],
                                "createTime": "2023-02-21 09:56:27",
                                "level": 4
                            }
                        ],
                        "createTime": "2023-02-20 17:12:13",
                        "level": 3
                    },
                    {
                        "id": 4,
                        "parentId": 2,
                        "content": "我回复了第一条评论的第二条回复",
                        "author": "吴名氏",
                        "children": [],
                        "createTime": "2023-02-21 09:23:14",
                        "level": 3
                    }
                ],
                "createTime": "2023-02-20 17:12:00",
                "level": 2
            }
        ],
        "createTime": "2023-02-20 17:11:16",
        "level": 1
    },
    {
        "id": 5,
        "parentId": 0,
        "content": "这是评论2",
        "author": "吴名氏",
        "children": [],
        "createTime": "2023-02-21 09:41:02",
        "level": 1
    }
]

5 总结

以上三种方案各有优缺点,需要从不同场景中使用不同的方案文章来源地址https://www.toymoban.com/news/detail-475326.html

到了这里,关于使用SpringBoot实现无限级评论回复功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • springboot+websocket+微信小程序实现评论区功能

    1. 什么是WebSocket? WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器 全双工通信 ,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据,但是它和 HTTP 最大不同是: WebSocket 是一种 双向通信协议 ,在建立连接后,WebSo

    2024年04月16日
    浏览(82)
  • 在抖音中使用语聚AI,实现自动回复用户视频评论、私信问答

    在抖音中使用语聚AI,实现自动回复用户视频评论、私信问答

    您可以通过集简云数据流程,将语聚AI助手集成到抖音视频评论、抖音私信,实现自动回复用户视频评论、私信问答,大大提升账号互动与运营效率。 ● 抖音普通号评论对接语聚AI(点击可一键使用) ● 抖音企业号私信对接语聚AI(点击可一键使用) 以抖音企业号私信接入

    2024年02月10日
    浏览(9)
  • 使用JS来实现回车评论功能

    个人名片:  😊 作者简介:一名大一在校生,web前端开发专业  🤡  个人主页:几何小超  🐼 座右铭:懒惰受到的惩罚不仅仅是自己的失败,还有别人的成功。  🎅**学习目标:  坚持每一次的学习打卡,掌握更多知识!虽然都说前端已死,但是就算不靠这个吃饭,学一点

    2024年02月06日
    浏览(21)
  • 文章评论以及回复评论邮件通知(Go 搭建 qiucode.cn 之八)

    要说到评论。无疑是博客应用的灵魂所在了,它也正是站长与博友、博友与博友之间互相交流的桥梁,倘若少了它,博客应用将变得暗淡无关,索然无味,恍如一具躺在床榻上的植物人,终究是无法与周边人言语的。 也正是有了评论,站长在该博客应用所发表的博文,博友才

    2024年02月11日
    浏览(7)
  • 【Java项目】SpringBoot项目完成微信公众号收到用户消息自动回复功能附带视频(超详细)

    【Java项目】SpringBoot项目完成微信公众号收到用户消息自动回复功能附带视频(超详细)

    视频讲解 首先你需要先注册一个你的微信公众号 微信公众号平台 然后打开下面的自动回复功能 之后进入到你的开发者中心 开发者中心基本配置 然后生成你的开发者密码,开发者id,以及设置你的IP白名单。 这里的IP白名单中的IP必须是一个公网IP,因为微信官方会把他们的

    2024年02月13日
    浏览(11)
  • 【前后端的那些事】评论功能实现

    【前后端的那些事】评论功能实现

    前言 :最近写项目,发现了一些很有意思的功能,想写文章,录视频把这些内容记录下。但这些功能太零碎,如果为每个功能都单独搭建一个项目,这明显不合适。于是我想,就搭建一个项目,把那些我想将的小功能全部整合到一起。实现 搭一次环境 ,处处使用。 本文主要

    2024年01月18日
    浏览(11)
  • JavaWeb评论功能实现步骤及代码

    JavaWeb评论功能实现步骤及代码

    目录 文章目录 前言 一、分析功能 二、实现功能 1.建评论表 2.Dao层、service层核心代码实现  3.servlet层编写核心代码  4.jsp核心代码  三、展示效果图 总结 评论功能是后端要写常见的功能之一,一般性的网站也都会包含这一功能。像是购物网站、视频网站下方都会有用户评论

    2023年04月08日
    浏览(13)
  • 我实现了一个乞丐版的评论功能

    我实现了一个乞丐版的评论功能

    经过长达八个月的更新迭代,文章的内容已经比较丰富,为了达到评论互动的目的,同时秉承能用就行的原则,开发这个评论功能。 那就叫小码吧 已经部署线上。 设计原则 1 原则1:使用现有element ui 树形组件不重复造轮子 2 原则2:先能用后续完善UI 设计代码 组件核心代码

    2023年04月26日
    浏览(12)
  • 一张表实现短视频“评论区“完整功能

    一张表实现短视频“评论区“完整功能

    前言         现如今,不管是哪种类型的应用,评论区都少不了。从工具类的到媒体信息流类的,评论留言都是最基本的互动环节。比如抖音短视频下,针对视频每个用户都可以发表自己的观点;而针对用户的评论,其他的用户又可以对其进行评论,依次回复下去。      

    2024年02月16日
    浏览(10)
  • Java搭配H5实现前后端交互评论功能

    前言 :         最近有个朋友有偿让我帮他们将这个评论组件整合到他们的静态网页当中,并实现数据持久化。后来他觉得太麻烦,就放弃了。尽管没有拿到相应的报酬,但只是花了短短的时间写完了这个简单功能,并有机会将其分享给大家。内容不长,全是干货,请择需

    2024年04月16日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包