ソースを参照

fix: 重复添加好友和进群的bug

xsx 7 ヶ月 前
コミット
3eefa14b27

+ 11 - 0
im-platform/src/main/java/com/bx/implatform/contant/RedisKey.java

@@ -53,6 +53,17 @@ public final class RedisKey {
      */
     public static final String IM_REPEAT_SUBMIT = "im:repeat:submit";
 
+    /**
+     * 分布式锁-添加好友
+     */
+    public static final String IM_LOCK_FRIEND_ADD =  "im:lock:friend:add";
+
+    /**
+     * 分布式锁-进入群聊
+     */
+    public static final String IM_LOCK_GROUP_ENTER =  "im:lock:group:enter";
+
+
     /**
      * 分布式锁-清理过期文件
      */

+ 2 - 1
im-platform/src/main/java/com/bx/implatform/controller/FriendController.java

@@ -5,6 +5,7 @@ import com.bx.implatform.dto.FriendDndDTO;
 import com.bx.implatform.result.Result;
 import com.bx.implatform.result.ResultUtils;
 import com.bx.implatform.service.FriendService;
+import com.bx.implatform.session.SessionContext;
 import com.bx.implatform.vo.FriendVO;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -34,7 +35,7 @@ public class FriendController {
     @PostMapping("/add")
     @Operation(summary = "添加好友", description = "双方建立好友关系")
     public Result addFriend(@NotNull(message = "好友id不可为空") @RequestParam Long friendId) {
-        friendService.addFriend(friendId);
+        friendService.addFriend(SessionContext.getSession().getUserId(),friendId);
         return ResultUtils.success();
     }
 

+ 2 - 1
im-platform/src/main/java/com/bx/implatform/service/FriendService.java

@@ -43,9 +43,10 @@ public interface FriendService extends IService<Friend> {
     /**
      * 添加好友,互相建立好友关系
      *
+     * @param userId 用户id
      * @param friendId 好友的用户id
      */
-    void addFriend(Long friendId);
+    void addFriend(Long userId,Long friendId);
 
     /**
      * 删除好友,双方都会解除好友关系

+ 3 - 2
im-platform/src/main/java/com/bx/implatform/service/impl/FriendServiceImpl.java

@@ -10,6 +10,7 @@ import com.bx.imclient.IMClient;
 import com.bx.imcommon.enums.IMTerminalType;
 import com.bx.imcommon.model.IMPrivateMessage;
 import com.bx.imcommon.model.IMUserInfo;
+import com.bx.implatform.annotation.RedisLock;
 import com.bx.implatform.contant.RedisKey;
 import com.bx.implatform.dto.FriendDndDTO;
 import com.bx.implatform.entity.Friend;
@@ -75,10 +76,10 @@ public class FriendServiceImpl extends ServiceImpl<FriendMapper, Friend> impleme
         return friends.stream().map(this::conver).collect(Collectors.toList());
     }
 
+    @RedisLock(prefixKey = RedisKey.IM_LOCK_FRIEND_ADD, key = "#userId+':'+#friendId")
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void addFriend(Long friendId) {
-        long userId = SessionContext.getSession().getUserId();
+    public void addFriend(Long userId, Long friendId) {
         if (friendId.equals(userId)) {
             throw new GlobalException("不允许添加自己为好友");
         }

+ 2 - 0
im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java

@@ -10,6 +10,7 @@ import com.bx.imclient.IMClient;
 import com.bx.imcommon.model.IMGroupMessage;
 import com.bx.imcommon.model.IMUserInfo;
 import com.bx.imcommon.util.CommaTextUtils;
+import com.bx.implatform.annotation.RedisLock;
 import com.bx.implatform.contant.Constant;
 import com.bx.implatform.contant.RedisKey;
 import com.bx.implatform.dto.GroupDndDTO;
@@ -251,6 +252,7 @@ public class GroupServiceImpl extends ServiceImpl<GroupMapper, Group> implements
         }).collect(Collectors.toList());
     }
 
+    @RedisLock(prefixKey = RedisKey.IM_LOCK_GROUP_ENTER,key = "#dto.getGroupId()")
     @Override
     public void invite(GroupInviteDTO dto) {
         UserSession session = SessionContext.getSession();

+ 1 - 1
im-web/src/components/chat/ChatMessageItem.vue

@@ -271,7 +271,7 @@ export default {
 				.message-content-wrapper {
 					position: relative;
 					display: flex;
-					align-items: end;
+					align-items: flex-end;
 
 					.sending {
 						width: 25px;