PraiseController.java
//取消点赞文章
@RequestMapping(value = "cancel",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public BaseResponse praiseCancel(@RequestBody @Validated PraiseDto dto, BindingResult result){
String checkRes= ValidatorUtil.checkResult(result);
if (StringUtils.isNotBlank(checkRes)){
return new BaseResponse(StatusCode.InvalidParams.getCode(),checkRes);
}
BaseResponse response=new BaseResponse(StatusCode.Success);
try {
response.setData(praiseService.praiseCancel(dto));
}catch (Exception e){
response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
}
return response;
}
PraiseService.java
//取消点赞
@Transactional(rollbackFor = Exception.class)
public Boolean praiseCancel(PraiseDto dto) throws Exception{
final String recordKey=Constant.RedisArticlePraiseUser+dto.getArticleId()+dto.getUserId();
//查看当前用户是否点赞过当前文章:只有点过赞,才能取消点赞
Boolean hasPraise=redisTemplate.hasKey(recordKey);
if (hasPraise){
//移除掉db中的记录
int res=praiseMapper.cancelPraise(dto.getArticleId(),dto.getUserId());
if (res>0){
//移除缓存中:是否点赞的key
redisTemplate.delete(recordKey);
//更新文章的总点赞量
articleMapper.updatePraiseTotal(dto.getArticleId(),-1);
//缓存取消点赞的相关信息
this.cachePraiseCancel(dto);
}
}
return true;
}
//缓存取消点赞时的相关信息
private void cachePraiseCancel(final PraiseDto dto) throws Exception{
HashOperations<String,String,Set<Integer>> praiseHash=redisTemplate.opsForHash();
//记录点赞的明细记录(文章的维度):文章id -> 移除掉特定的用户id(dto.getUserId())
Set<Integer> uIds=praiseHash.get(Constant.RedisArticlePraiseHashKey,dto.getArticleId().toString());
if (uIds!=null && !uIds.isEmpty() && uIds.contains(dto.getUserId())){
uIds.remove(dto.getUserId());
praiseHash.put(Constant.RedisArticlePraiseHashKey,dto.getArticleId().toString(),uIds);
}
}