文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot如何实现无限级评论回复功能

2023-07-05 16:35

关注

本篇内容介绍了“SpringBoot如何实现无限级评论回复功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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

@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

public interface CommentService {     List<Comment> getCommentByParentId(Long parentId);     void addComment(Comment comment);     Comment getById(Long id);     List<Comment> getList();}

2.3 service实现类CommentServiceImpl.java

@Servicepublic 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

@Repositorypublic interface CommentMapper extends BaseMapper<Comment> { }

2.5 实体类Comment.java

@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请求接口,查看返回数据

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

SpringBoot如何实现无限级评论回复功能

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

SpringBoot如何实现无限级评论回复功能

3 方案二

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

3.1 控制层CommentTwoController.java

@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

public interface CommentService {     void addComment(Comment comment);     void setChildren(CommentDTO commentDTO);     List<CommentDTO> getAllComments();}

3.3 service实现类CommentServiceImpl.java

@Servicepublic 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;    }         @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

@Repositorypublic 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

@Datapublic 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请求接口,查看返回数据

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

@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

public interface CommentService {     List<CommentDTO> getAllCommentsBySql(); }

4.3 service实现类CommentServiceImpl.java

@Servicepublic class CommentServiceImpl implements CommentService{     @Resource    private CommentMapper baseMapper;         @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

@Repositorypublic interface CommentMapper extends BaseMapper<Comment> {     @DS("localhost80")    List<CommentDTO> getAllCommentsBySql(); }

4.5 实体类Comment.java

@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请求接口,查看返回数据

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    }]

“SpringBoot如何实现无限级评论回复功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯