如何使用MongoDB实现引用评论的评论功能

分析

  • 应用场景是用户在评论区评论游记日记文章
  • 用户可以引用别人的评论 进行评论
  • 评论对象内,包含着 所引用的评论对象,即实现盖楼式评论
    在这里插入图片描述

实体类

  • 通过@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);
//        属性拷贝
//        参数1:源数据对象 参数2:目标数据对象  注意:属性名必须一样
        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);
}

效果演示

  • 这里我是自己引用自己的评论去评论
    在这里插入图片描述
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值