簡易博客點贊系統
好久沒寫 Java 了,整個簡單的項目進行康復訓練。
基于 Spring Boot + SSM + MySQL + Mybatis-Plus + Knife4j + Swagger 的一個簡易博客點贊系統
開源地址:https://github.com/FangMoyu/simple-thumb
功能
- 登錄
- 獲取當前登錄用戶
- 獲取博客
- 展示所有博客
- 點贊
- 取消點贊
亮點
- 基于編程式事務實現點贊和取消點贊功能
- 為避免用戶重復點贊,使用本地鎖對用戶 id 進行加鎖,防止接口短時間重復調用
- 提供了通用返回類、全局異常處理器、自定義錯誤碼等
部分代碼實現
點贊功能
@Overridepublic Boolean doThumb(DoThumbRequest doThumbRequest, HttpServletRequest request) {// 參數校驗ThrowUtils.throwIf(doThumbRequest == null || doThumbRequest.getBlogId() == null,ErrorCode.PARAMS_ERROR, "參數錯誤");User loginUser = userService.getLoginUser(request);// 加鎖,避免用戶短時間多次點贊synchronized (loginUser.getId().toString().intern()) {// 編程式事務return transactionTemplate.execute(status -> {// 獲取當前當前進行點贊的博客idLong blogId = doThumbRequest.getBlogId();// 判斷當前用戶是否已經點贊過該博客boolean exists = this.lambdaQuery().eq(Thumb::getBlogId, blogId).eq(Thumb::getUserId, loginUser.getId()).exists();// 如果已經點贊過,拋出異常ThrowUtils.throwIf(exists, ErrorCode.OPERATION_ERROR, "已經點贊過");// 更新博客點贊數 + 1boolean update = blogService.lambdaUpdate().eq(Blog::getId, blogId).setSql("thumbCount = thumbCount + 1").update();// 保存點贊記錄Thumb thumb = new Thumb();thumb.setBlogId(blogId);thumb.setUserId(loginUser.getId());return update && this.save(thumb);});}}
取消點贊
@Overridepublic Boolean undoThumb(DoThumbRequest doThumbRequest, HttpServletRequest request) {// 參數校驗ThrowUtils.throwIf(doThumbRequest == null || doThumbRequest.getBlogId() == null, ErrorCode.PARAMS_ERROR, "參數錯誤");User loginUser = userService.getLoginUser(request);// 加鎖,避免用戶短時間多次取消點贊synchronized (loginUser.getId().toString().intern()) {// 編程式事務return transactionTemplate.execute(status -> {// 獲取當前當前進行點贊的博客idLong blogId = doThumbRequest.getBlogId();// 判斷當前用戶是否已經點贊過該博客Thumb thumb = this.lambdaQuery().eq(Thumb::getBlogId, blogId).eq(Thumb::getUserId, loginUser.getId()).one();// 如果沒有點贊過,拋出異常ThrowUtils.throwIf(thumb == null, ErrorCode.OPERATION_ERROR, "未點贊過");// 更新博客點贊數 - 1boolean update = blogService.lambdaUpdate().eq(Blog::getId, blogId).setSql("thumbCount = thumbCount - 1").update();// 刪除點贊記錄return update && this.removeById(thumb.getId());});}}