============= 后端_评论列表 ============= 1 数据库表 1.1 评论表 CREATE TABLE `ysdblogdb`.`t_comment` ( `id` bigint(0) NOT NULL AUTO_INCREMENT, `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `create_date` bigint(0) NOT NULL, `article_id` bigint(0) NOT NULL, `author_id` bigint(0) NOT NULL, `parent_id` bigint(0) NOT NULL, `to_uid` bigint(0) NOT NULL, `level` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, PRIMARY KEY (`id`) USING BTREE, INDEX `article_id`(`article_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; 2 实体类 2.1 评论实体类 /ysdblog-api/src/main/java/com/weihome/ysdblog/dao/pojo/Comment.java: @Data public class Comment { private Long id; private String content; private Long createDate; private Long articleId; private Long authorId; private Long parentId; private Long toUid; private Integer level; } 3 数据访问接口 3.1 评论数据访问接口 /ysdblog-api/src/main/java/com/weihome/ysdblog/dao/mapper/CommentMapper.java: public interface CommentMapper extends BaseMapper { } 4 视图对象 4.1 评论视图对象 /ysdblog-api/src/main/java/com/weihome/ysdblog/vo/CommentVo.java: @Data public class CommentVo { // 基于雪花算法自动生成的分布式ID可能很大 // 在Json中以数值形式表示可能导致前端损失精度 // 加此注解显式指明该属性在Json中以字符串形式表达 @JsonSerialize(using = ToStringSerializer.class) private Long id; private String content; private String createDate; private UserVo author; private List children; private UserVo toUser; private Integer level; } 5 评论服务 5.1 评论服务接口 /ysdblog-api/src/main/java/com/weihome/ysdblog/service/CommentService.java: public interface CommentService { /** * 根据文章ID查询评论列表 */ Result list(Long articleId); } 5.2 评论服务实现 /ysdblog-api/src/main/java/com/weihome/ysdblog/service/impl/CommentServiceImpl.java: @Service public class CommentServiceImpl implements CommentService { @Autowired CommentMapper commentMapper; @Autowired UserService userService; @Override public Result list(Long articleId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Comment::getArticleId, articleId); queryWrapper.eq(Comment::getLevel, 1); // 从顶级评论开始 List comments = commentMapper.selectList(queryWrapper); return Result.success(copyList(comments)); } private List copyList(List comments) { List commentVos = new ArrayList<>(); for (Comment comment: comments) commentVos.add(copy(comment)); return commentVos; } private CommentVo copy(Comment comment) { CommentVo commentVo = new CommentVo(); BeanUtils.copyProperties(comment, commentVo); commentVo.setCreateDate(new DateTime(comment.getCreateDate()) .toString("yyyy-MM-dd HH:mm:ss")); UserVo author = new UserVo(); BeanUtils.copyProperties( userService.findUserById(comment.getAuthorId()), author); commentVo.setAuthor(author); if (comment.getLevel() == 1) commentVo.setChildren( findCommentsByParentId(comment.getId())); else { UserVo toUser = new UserVo(); BeanUtils.copyProperties( userService.findUserById(comment.getToUid()), toUser); commentVo.setToUser(toUser); } return commentVo; } private List findCommentsByParentId(Long parentId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Comment::getParentId, parentId); queryWrapper.eq(Comment::getLevel, 2); return copyList(commentMapper.selectList(queryWrapper)); } } 6 评论控制器 /ysdblog-api/src/main/java/com/weihome/ysdblog/controller/CommentController.java: @RestController @RequestMapping("comment") public class CommentController { @Autowired private CommentService commentService; /** * 根据文章ID查询评论列表 */ @GetMapping("list/{articleId}") public Result list(@PathVariable Long articleId) { return commentService.list(articleId); } } 7 运行测试 Postman GET localhost:8888/comment/list/1511577146642972674 ------------------------------------------------------- { "success": true, "code": 200, "msg": "success", "data": [ { "id": "1511582322946785281", "content": "comment_a", "createDate": "2022-04-06 13:51:24", "author": { "id": 1511575239857848321, "account": "user_a", "avatar": "/static/img/logo.b3a48c0.png", "nickname": "nickname_a" }, "children": [ { "id": "1511582783766577154", "content": "comment_b", "createDate": "2022-04-06 13:53:14", "author": { "id": 1511575239857848321, "account": "user_a", "avatar": "/static/img/logo.b3a48c0.png", "nickname": "nickname_a" }, "children": null, "toUser": { "id": 1511575239857848321, "account": "user_a", "avatar": "/static/img/logo.b3a48c0.png", "nickname": "nickname_a" }, "level": 2 } ], "toUser": null, "level": 1 } ] }