一个关于面经的网站开发全程记录--4

141 阅读3分钟

一个关于面经的网站开发全程记录--4

总览:今天搞定评论,回复评论,查看一篇面经的所有评论(分页)

用到的VO类:


@ApiModel(value = "用于接收前端传递过来的评论数据")
@Data
public class CommentVo {

    private String userId;

    private String content;

    private String experId;

    private String username;

    private String avatar;

}


@ApiModel(value = "封装返回的多级评论")
@Data
public class LotsLevelCommentVo {

    @ApiModelProperty(value = "评论的id")
    private String id;

    @ApiModelProperty(value = "评论者的id")
    private String userId;

    @ApiModelProperty(value = "被评论的面经id")
    private String experId;

    @ApiModelProperty(value = "父id")
    private String parentId;

    @ApiModelProperty(value = "评论内容")
    private String content;

    @ApiModelProperty(value = "评论者的用户名")
    private String username;

    @ApiModelProperty(value = "评论者的头像")
    private String avatar;

    @ApiModelProperty(value = "评论的时间")
    private Date pullTime;

    @ApiModelProperty(value = "子评论")
    private List<LotsLevelCommentVo> sonComment;
}

controller接口:


 @Autowired
    private ExperCommentService experCommentService;
    //只要你不是评论别人(回复评论),而是点击评论进行评论,都是顶级评论
    @ApiOperation(value = "点击评论进行评论,都是顶级评论,顶级评论的comm_state是0,非顶级评论是1,顶级评论父id是0")
    @PostMapping(value = "addComment")
    public R addComment(@RequestBody CommentVo commentVo){
        //CommentVo用于获取前端传递过来的评论以及评论人信息
        ExperComment commentExper = new ExperComment();
        
        //将commentVo转换为commentExper类型
        BeanUtils.copyProperties(commentVo, commentExper);
        //设置其为最顶级评论
        commentExper.setCommState(0);
        commentExper.setParentId("0");
        //存入库中
        experCommentService.save(commentExper);
        return R.ok();
    }


    //回复评论
    @ApiOperation(value = "回复评论功能,在别人发布的评论下评论,父id是当前评论的id")
    @PostMapping(value = "answerComment/{beUserId}")
    public R answerComment(@ApiParam(value = "beUserId是被评论人的Id,是上级评论的user_Id") @PathVariable String beUserId,
                           @RequestBody CommentVo commentVo){
        ExperComment comment = new ExperComment();
        BeanUtils.copyProperties(commentVo,comment);
        comment.setCommState(1);
        comment.setParentId(beUserId);
        //将回复的评论
        experCommentService.save(comment);
        return R.ok();
    }

  
    @ApiOperation(value = "根据一篇文章的id,查看一篇文章的所有评论,多级评论显示")
    @GetMapping(value = "pageComment/{current}/{limit}/{experId}")
    public R getAllCommentById(@PathVariable Long current, @PathVariable Long limit,
                               @PathVariable String experId){

        //创建page对象 用于接收查询到的数据
        Page<ExperComment> page = new Page<>(current,limit);

        //定义查询条件, 查询当前游览的面经的评论   只查询顶级评论
        QueryWrapper<ExperComment> wrapper = new QueryWrapper<>();
        /**
        查找experId等于传进来文章的id,就是该文章的全部评论,同时查找所有所有顶层评论
        */
        wrapper.eq("exper_id",experId).and(wrapper1 -> wrapper1.eq("parent_id","0")).
                and(wrapper2 -> wrapper2.eq("comm_state",0));

        //查询数据  将查询到的数据传入page对象中   里边是一篇面经的所有顶层评论
        experCommentService.page(page,wrapper);

        //查询到的对象总数   一篇面经的所有顶层评论个数
        Long total = page.getTotal();

        //所有查询到的数据   是所有的顶级评论的内容
        List<ExperComment> records = page.getRecords();
        log.info("查询到的所有顶级评论:{}",records);   //查询数据正确

        //该类用于将查询到的ExperComment类型装换为LotsLevelCommentVo类进行数据的封装
        List<LotsLevelCommentVo> recordsLevel = new ArrayList<>();

        //进行转换的时候出错  这种转换方式出错 只能转换pojo类型  这是List
        //BeanUtils.copyProperties(records,recordsLevel);

        //将 List<ExperComment> 的泛型转换为   List<LotsLevelCommentVo>   挨个赋值  
        for(ExperComment record : records){
            LotsLevelCommentVo lcmv = new LotsLevelCommentVo();
            lcmv.setId(record.getId());
            lcmv.setExperId(record.getExperId());
            lcmv.setContent(record.getContent());
            lcmv.setAvatar(record.getAvatar());
            lcmv.setParentId(record.getParentId());
            lcmv.setUsername(record.getUsername());
            lcmv.setUserId(record.getUserId());
            lcmv.setPullTime(record.getPullTime());
            recordsLevel.add(lcmv);
        }
        log.info("查询到的所有顶级评论的Vo类:{}",recordsLevel);

        //查询子评论  自己写递归根据parentId将顶级评论的子评论添加到List<LotsLevelCommentVo> sonComment里边
        
        List<LotsLevelCommentVo> sonsReccords = experCommentService.recursion(recordsLevel);
        log.info("封装后的所有评论的Vo类:{}",sonsReccords);

        //返回数据
        Map map = new HashMap<>();
        map.put("total",total);
        map.put("sonsReccords",sonsReccords);
        return R.ok().data(map);
    }

service

@Override
public List<LotsLevelCommentVo> recursion(List<LotsLevelCommentVo> recordsLevel) {
    
    //递归结束条件
    if(recordsLevel == null && recordsLevel.size() == 0)
        return null;

    //recordsLevel是所有传进来的顶层评论  遍历顶层评论获取其所有子评论
    for(LotsLevelCommentVo record : recordsLevel){
        //获取顶层评论的userId
        String userId = record.getUserId();
        //顶层评论的userId就是下级评论的parentId  根据userId==parentId查找所有下级
        QueryWrapper<ExperComment> wrapper = new QueryWrapper<>();
        wrapper.eq("parent_id",userId);
        //是查找出来的所有顶级评论的子评论  类型ExperComment类型  需要转换为LotsLevelCommentVo类型
        List<ExperComment> listExper =  baseMapper.selectList(wrapper);

        //用于类型转换  实际上是存储的顶层评论的所有子评论
        List<LotsLevelCommentVo> listVoExper = new ArrayList<>();
        //进行类型转换
        for (ExperComment one : listExper){
            //用来临时存储子评论
            LotsLevelCommentVo cur = new LotsLevelCommentVo();
            cur.setId(one.getId());
            cur.setExperId(one.getExperId());
            cur.setContent(one.getContent());
            cur.setAvatar(one.getAvatar());
            cur.setParentId(one.getParentId());
            cur.setUsername(one.getUsername());
            cur.setUserId(one.getUserId());
            cur.setPullTime(one.getPullTime());
            listVoExper.add(cur);
        }
        //将所有子评论复制到record的sonComment属性中,listVoExper实际上就是第二级评论(顶级评论是第一级)
        record.setSonComment(listVoExper);
        //将listVoExper(实际上第二级评论)作为逻辑上的第一级评论进行递归查询第三级评论,依次....
        recursion(listVoExper);
    }
    //返回一个泛型为LotsLevelCommentVo的List
    return recordsLevel;
}

以上即是评论的所有相关接口及其实现

欢迎指正