diff --git a/src/main/java/cn/hezhaohui/thumb/controller/ThumbController.java b/src/main/java/cn/hezhaohui/thumb/controller/ThumbController.java new file mode 100644 index 0000000..ca58955 --- /dev/null +++ b/src/main/java/cn/hezhaohui/thumb/controller/ThumbController.java @@ -0,0 +1,25 @@ +package cn.hezhaohui.thumb.controller; + +import cn.hezhaohui.thumb.common.BaseResponse; +import cn.hezhaohui.thumb.common.ResultUtils; +import cn.hezhaohui.thumb.model.dto.DoThumbRequest; +import cn.hezhaohui.thumb.service.ThumbService; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("thumb") +public class ThumbController { + @Resource + private ThumbService thumbService; + + @PostMapping("/do") + public BaseResponse doThumb(@RequestBody DoThumbRequest doThumbRequest, HttpServletRequest request) { + Boolean success = thumbService.doThumb(doThumbRequest, request); + return ResultUtils.sucess(success); + } +} diff --git a/src/main/java/cn/hezhaohui/thumb/model/dto/DoThumbRequest.java b/src/main/java/cn/hezhaohui/thumb/model/dto/DoThumbRequest.java new file mode 100644 index 0000000..f8271a7 --- /dev/null +++ b/src/main/java/cn/hezhaohui/thumb/model/dto/DoThumbRequest.java @@ -0,0 +1,8 @@ +package cn.hezhaohui.thumb.model.dto; + +import lombok.Data; + +@Data +public class DoThumbRequest { + private Long blogId; +} diff --git a/src/main/java/cn/hezhaohui/thumb/service/ThumbService.java b/src/main/java/cn/hezhaohui/thumb/service/ThumbService.java index a366e56..72873ec 100644 --- a/src/main/java/cn/hezhaohui/thumb/service/ThumbService.java +++ b/src/main/java/cn/hezhaohui/thumb/service/ThumbService.java @@ -1,7 +1,9 @@ package cn.hezhaohui.thumb.service; +import cn.hezhaohui.thumb.model.dto.DoThumbRequest; import cn.hezhaohui.thumb.model.entity.Thumb; import com.baomidou.mybatisplus.extension.service.IService; +import jakarta.servlet.http.HttpServletRequest; /** * @author 23117 @@ -10,4 +12,6 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface ThumbService extends IService { + + Boolean doThumb(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 ddcbbb6..d4cc261 100644 --- a/src/main/java/cn/hezhaohui/thumb/service/impl/ThumbServiceImpl.java +++ b/src/main/java/cn/hezhaohui/thumb/service/impl/ThumbServiceImpl.java @@ -1,10 +1,20 @@ package cn.hezhaohui.thumb.service.impl; +import cn.hezhaohui.thumb.exception.BusinessException; +import cn.hezhaohui.thumb.exception.ErrorCode; +import cn.hezhaohui.thumb.model.dto.DoThumbRequest; +import cn.hezhaohui.thumb.model.entity.Blog; +import cn.hezhaohui.thumb.model.entity.User; +import cn.hezhaohui.thumb.service.BlogService; +import cn.hezhaohui.thumb.service.UserService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import cn.hezhaohui.thumb.model.entity.Thumb; import cn.hezhaohui.thumb.service.ThumbService; import cn.hezhaohui.thumb.mapper.ThumbMapper; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; /** * @author 23117 @@ -15,6 +25,48 @@ import org.springframework.stereotype.Service; public class ThumbServiceImpl extends ServiceImpl implements ThumbService{ + @Resource + private UserService userService; + + @Resource + private BlogService blogService; + + @Resource + private TransactionTemplate transactionTemplate; + + @Override + public Boolean doThumb(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(); + // 判断是否已点过赞 + boolean exists = this.lambdaQuery() + .eq(Thumb::getUserid, loginUser.getId()) + .eq(Thumb::getBlogId, blogId) + .exists(); + if (exists) { + throw new BusinessException(ErrorCode.OPERATION_ERROR, "用户已点赞"); + } + // 更新帖子点赞计数器 + boolean update = blogService.lambdaUpdate() + .eq(Blog::getId, blogId) + .setSql("thumbCount = thumbCount + 1") + .update(); + // 更新点赞表数据 + Thumb thumb = new Thumb(); + thumb.setUserid(loginUser.getId()); + thumb.setBlogId(blogId); + // 两者一起执行 + return update && this.save(thumb); + }); + } + } }