点赞接口实现思路:
关于表结构的设计:
点赞接口设计至少需要两张表,点赞记录表中至少需要两个字段(文章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());
}