diff --git a/src/main/java/cn/hezhaohui/thumb/controller/ThumbController.java b/src/main/java/cn/hezhaohui/thumb/controller/ThumbController.java index ca58955..2df02a3 100644 --- a/src/main/java/cn/hezhaohui/thumb/controller/ThumbController.java +++ b/src/main/java/cn/hezhaohui/thumb/controller/ThumbController.java @@ -22,4 +22,10 @@ public class ThumbController { Boolean success = thumbService.doThumb(doThumbRequest, request); return ResultUtils.sucess(success); } + + @PostMapping("/undo") + public BaseResponse undoThumb(@RequestBody DoThumbRequest doThumbRequest, HttpServletRequest request) { + Boolean success = thumbService.undoThumb(doThumbRequest, request); + return ResultUtils.sucess(success); + } } diff --git a/src/main/java/cn/hezhaohui/thumb/service/ThumbService.java b/src/main/java/cn/hezhaohui/thumb/service/ThumbService.java index 72873ec..1c0f3ed 100644 --- a/src/main/java/cn/hezhaohui/thumb/service/ThumbService.java +++ b/src/main/java/cn/hezhaohui/thumb/service/ThumbService.java @@ -14,4 +14,6 @@ public interface ThumbService extends IService { Boolean doThumb(DoThumbRequest doThumbRequest, HttpServletRequest request); + + Boolean undoThumb(DoThumbRequest doThumbRequest, HttpServletRequest request); } diff --git a/src/main/java/cn/hezhaohui/thumb/service/impl/ThumbServiceImpl.java b/src/main/java/cn/hezhaohui/thumb/service/impl/ThumbServiceImpl.java index d4cc261..4658b3d 100644 --- a/src/main/java/cn/hezhaohui/thumb/service/impl/ThumbServiceImpl.java +++ b/src/main/java/cn/hezhaohui/thumb/service/impl/ThumbServiceImpl.java @@ -67,6 +67,37 @@ public class ThumbServiceImpl extends ServiceImpl }); } } + + @Override + public Boolean undoThumb(DoThumbRequest doThumbRequest, HttpServletRequest request) { + if (doThumbRequest == null || doThumbRequest.getBlogId() == null) { + throw new RuntimeException("参数异常"); + } + User loginUser = userService.getLoginUser(request); + // Lock: 这里使用字符串加锁,获取字符串常量对象才可运行,字符串常量对象具有唯一性 + synchronized (("LOCK-USERID-" + loginUser.getId().toString()).intern()) { + // Transaction: 编程式事务 + return transactionTemplate.execute(status -> { + Long blogId = doThumbRequest.getBlogId(); + // 判断是否已点过赞 + Thumb thumb = this.lambdaQuery() + .eq(Thumb::getUserid, loginUser.getId()) + .eq(Thumb::getBlogId, blogId) + .one(); + if (thumb == null) { + throw new BusinessException(ErrorCode.OPERATION_ERROR, "用户未点赞"); + } + // 更新帖子点赞计数器 + boolean update = blogService.lambdaUpdate() + .eq(Blog::getId, blogId) + .setSql("thumbCount = thumbCount - 1") + .update(); + // 更新点赞表数据 + // 两者一起执行 + return update && this.removeById(thumb.getId()); + }); + } + } }