分析
- 应用场景是用户在评论区评论
游记日记
文章 - 用户可以引用别人的评论 进行评论
评论对象
内,包含着 所引用的评论对象
,即实现盖楼式评论
实体类
- 通过@Document和@id与MongoDB绑定, 无需在MongoDB建立对应集合,在MongoDB新增此实体类对象时候,MongoDB则会自动新建
- 注意此
评论对象
含有评论对象(作为引用的评论)
控制器
- 前端点击评论按钮后,将访问此接口,将相关评论内容和信息作为comment对象的参数传递过来
- 这里贴了@RequiredLogin注解,表示需要登录才可以访问此接口,不懂的话,详细可至登陆权限注解-登录拦截器
- 这里从req中获得请求头的
token
,从而获得当前登录对象(令牌登陆的技术) - 通过
BeanUtils.copyProperties(userInfo, comment);
实现属性名同名的值转化,完善了comment的信息 - 最后将此comment对象数据存入MongoDB即可完成评论操作
@RequireLogin
@PostMapping("/commentAdd")
public Object commentAdd(TravelComment comment, HttpServletRequest req) {
String token = req.getHeader("token");
UserInfo userInfo = userInfoRedisService.getUserByToken(token);
BeanUtils.copyProperties(userInfo, comment);
comment.setUserId(userInfo.getId());
travelCommentService.save(comment);
return JsonResult.success();
}
业务层实现方法-save
- 先把comment的id设为空,因为此前使用了BeanUtils的api数据转化了,此comment含有id值,则会被
repository
的save充当插入操作 - 判断此评论对象数据,是否有引用的评论id,若有的话则设置为
评论的评论
类型,若无则设置为普通评论
类型 - 最后保存到MongoDB即可完成评论功能
@Autowired
private TravelCommentRepository repository;
public void save(TravelComment comment) {
comment.setId(null);
comment.setCreateTime(new Date());
String refId = comment.getRefComment().getId();
if (StringUtils.hasLength(refId)) {
Optional<TravelComment> op = repository.findById(refId);
if (op.isPresent()) {
comment.setRefComment(op.get());
}
comment.setType(TravelComment.TRAVLE_COMMENT_TYPE);
} else {
comment.setType(TravelComment.TRAVLE_COMMENT_TYPE_COMMENT);
}
repository.save(comment);
}
将评论显示出来
控制器接口
业务层实现方法
- 直接使用持久层对象,使用JPA规范,在MongoDB查找出符合条件的游记数据出来
@Autowired
private TravelCommentRepository repository;
public List<TravelComment> queryByTravelId(Long travelId) {
return repository.findByTravelId(travelId);
}
mongodb持久层接口
public interface TravelCommentRepository extends MongoRepository<TravelComment,String> {
List<TravelComment> findByTravelId(Long travelId);
}
效果演示
- 这里我是自己引用自己的评论去评论