一个关于面经的网站开发全程记录--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;
}
以上即是评论的所有相关接口及其实现
欢迎指正