3.5显示评论

在这里插入图片描述

数据层

数据库设计:
entity_type:评论的目标类别,比如1代表帖子,2代表评论。
entity_id:帖子的id。
target_id:评论的Id(用于做楼中楼回复),具有指向性的。

在这里插入图片描述

@Mapper
public interface CommentMapper {
    List<Comment> selectCommentByEntity(int entityType,int entityId,int offset,int limit);//查询帖子的评论,还是评论的评论

    int selectCountByEntity(int entityType,int entityId);
}

业务层

处理查询评论的业务、处理查询评论数量的业务

@Service
public class CommentService {
    @Autowired
    private CommentMapper commentMapper;

    public List<Comment> findCommentByEntity(int entityType,int entityId,int offset,int limit){
        return commentMapper.selectCommentByEntity(entityType,entityId,offset,limit);
    }

    public int findCommentByCount(int entityType,int entityId){
        return commentMapper.selectCountByEntity(entityType,entityId);
    }
}

表现层

显示帖子详情数据,同时在外循环中嵌套显示该帖子评论对应回复的数据

    @RequestMapping(path = "/detail/{discussPostId}",method = RequestMethod.GET)
    public String getDiscussPost(@PathVariable("discussPostId") int discussPostId, Model model, Page page){
        //查询帖子
        DiscussPost post = discussPostService.findDiscussPostById(discussPostId);
        model.addAttribute("post",post);

        //作者
        User user = userService.findUserById(post.getUserId());
        model.addAttribute("user",user);

        //评论的分页信息
        page.setLimit(5);
        page.setPath("/discuss/detail/"+discussPostId);
        page.setRows(post.getCommentCount());

        //得到当前帖子的所有评论
        //给帖子的评论:评论
        //给评论的评论:回复
        //这里是评论的列表
        List<Comment> commentList =
                commentService.findCommentByEntity(ENTITY_TYPE_POST, post.getId(), page.getOffset(), page.getLimit());

        //View Object List
        List<Map<String,Object>> commentVoList = new ArrayList<>();
        if (commentList != null){
            for (Comment comment :commentList){
                //每次遍历创建一个map用于呈现封装的数据
                //map 是一个评论的VO
                Map<String, Object> commentVo = new HashMap<>();
                //往VO中添加评论和作者
                commentVo.put("comment",comment);
                commentVo.put("user",userService.findUserById(comment.getUserId()));

                //在这里,查询回复
                List<Comment> replyList = commentService.findCommentByEntity(
                        ENTITY_TYPE_COMMENT, comment.getId(), 0, Integer.MAX_VALUE
                );

                //声明 回复 的VO列表
                List<Map<String,Object>> replyVoList  = new ArrayList<>();
                if (replyList != null){
                    for (Comment reply : replyList){
                        Map<String,Object> replyVo = new HashMap<>();
                        //回复
                        replyVo.put("reply",reply);
                        //作者
                        replyVo.put("user",userService.findUserById(reply.getUserId()));

                        //回复有指向性
                        //查询到回复目标的User
                        User target = reply.getTargetId() == 0 ? null : userService.findUserById(reply.getTargetId());
                        replyVo.put("target",target);
                        //装入集合中
                        replyVoList.add(replyVo);
                    }
                }

                //上面的内循环处理了一个评论中的回复
                //所以这里要把replyVoList装进去
                commentVo.put("replys",replyVoList);

                //装入回复数量
                int replyCount = commentService.findCommentByCount(ENTITY_TYPE_COMMENT, comment.getId());
                commentVo.put("replyCount",replyCount);

                //整个在装进去
                commentVoList.add(commentVo);


            }
        }

        model.addAttribute("comments",commentVoList);

        return "/site/discuss-detail";
    }

最后去前端绑定model,这里要细心!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值