点赞功能的实现以及思路

点赞接口实现思路:
在这里插入图片描述
关于表结构的设计:
点赞接口设计至少需要两张表,点赞记录表中至少需要两个字段(文章id,用户id),文章表中需要有一个点赞数据的字段。

service 逻辑处理

   public FabulousVo fabulous(Integer reportId, Integer userId) {
      //对参数进行非空验证
        if (reportId == null && reportId <= 0 || userId == null && userId <= 0) {
            throw new RuntimeException("文章id或用户id为空");
        }
        //查询用户是否点赞过该文章
        Example example = new Example(TFabulous.class);
        example.createCriteria()
                .andEqualTo("reportId", reportId)
                .andEqualTo("userId", userId);
        TFabulous tFabulous = tFabulousMapper.selectOneByExample(example);
        //查询该文章获取点赞数量
        Example example1 = new Example(Report.class);
        example1.createCriteria()
                .andEqualTo("reportId", reportId);
        Report report = reportMapper.selectOneByExample(example1);
        if (null == report) {
            throw new RuntimeException("该文章不存在");
        }
        //线程锁
        Lock lock = lockService.getLock(reportId.toString());
        try {
            lock.acquire();
            //如果用户没有点赞过,则增加用户点赞记录以及增加文章表中的点赞数量
            if (null == tFabulous) {
                TFabulous tFabulousInsert = new TFabulous();
                tFabulousInsert.setReportId(reportId).setUserId(userId);
                int insert = tFabulousMapper.insert(tFabulousInsert);
                if (insert > 0) {
                    report.setLikeNumber(report.getLikeNumber() + 1);
                    reportMapper.updateByPrimaryKey(report);
                }
                //如果用户点赞过,则删除用户点赞记录以及文章表中的点赞数量减一
            } else {
                int delete = tFabulousMapper.delete(tFabulous);
                if (delete > 0) {
                    report.setLikeNumber(report.getLikeNumber() - 1);
                    reportMapper.updateByPrimaryKey(report);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != lock) {
                lock.release();
            }
        }
        //再次查询点赞数量
        Example example2 = new Example(Report.class);
        example2.createCriteria()
                .andEqualTo("reportId", reportId);
        Report getReportNumber = reportMapper.selectOneByExample(example2);
        return new FabulousVo().setFabulousNumber(getReportNumber.getLikeNumber());
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值