From d5440cc8db556f437b296cdf185ec034d973441f Mon Sep 17 00:00:00 2001 From: wells <123456@qq.com> Date: Sun, 9 Aug 2026 08:47:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B8=A2=E5=87=BA=E7=BE=A4=E6=88=90=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/tailbet/controller/OpsController.java | 14 +++++++++++++- .../service/impl/GroupServiceImpl.java | 19 ++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/tailbet/controller/OpsController.java b/src/main/java/com/tailbet/controller/OpsController.java index cd4f5c1..75de635 100644 --- a/src/main/java/com/tailbet/controller/OpsController.java +++ b/src/main/java/com/tailbet/controller/OpsController.java @@ -81,7 +81,19 @@ public class OpsController { } /** - * 群主设置管理员 + * 踢出群成员 + *

+ * 操作人需为该群群主或管理员;同时从本地数据库和 OpenIM 移除成员。 + *

+ */ + @PostMapping("/group/kick") + public R kickGroup(@Valid @RequestBody GroupMemberOperateDTO dto) { + Long operatorId = UserContext.getUserId(); + groupService.kickUser(dto.getGroupId(), dto.getUserId(), operatorId); + return R.ok(); + } + + /** *

* 操作人需为该群群主;同时本地与 OpenIM 角色都会更新(OpenIM roleLevel=60=管理员), * OpenIM 同步失败会抛异常回滚本地事务,保证本地与 IM 角色一致。 diff --git a/src/main/java/com/tailbet/service/impl/GroupServiceImpl.java b/src/main/java/com/tailbet/service/impl/GroupServiceImpl.java index c21587a..adc7258 100644 --- a/src/main/java/com/tailbet/service/impl/GroupServiceImpl.java +++ b/src/main/java/com/tailbet/service/impl/GroupServiceImpl.java @@ -219,8 +219,11 @@ public class GroupServiceImpl implements IGroupService { @Transactional public void kickUser(Long groupId, Long targetUserId, Long operatorId) { Group group = groupMapper.selectById(groupId); + if (group == null) { + throw new RuntimeException("群组不存在"); + } - // 检查权限 + // 检查操作人权限 GroupMember operator = groupMemberMapper.selectOne(new LambdaQueryWrapper() .eq(GroupMember::getGroupId, groupId) .eq(GroupMember::getUserId, operatorId)); @@ -228,8 +231,6 @@ public class GroupServiceImpl implements IGroupService { if (operator == null) { throw new RuntimeException("你不是群成员"); } - - // 只有群主和管理员可以踢人 if (operator.getRole() != ROLE_OWNER && operator.getRole() != ROLE_ADMIN) { throw new RuntimeException("只有群主和管理员可以踢人"); } @@ -239,10 +240,18 @@ public class GroupServiceImpl implements IGroupService { throw new RuntimeException("不能踢出群主"); } - // 删除成员 - groupMemberMapper.delete(new LambdaQueryWrapper() + GroupMember target = groupMemberMapper.selectOne(new LambdaQueryWrapper() .eq(GroupMember::getGroupId, groupId) .eq(GroupMember::getUserId, targetUserId)); + if (target == null) { + throw new RuntimeException("目标用户不是群成员"); + } + + // 先同步 OpenIM,失败时事务回滚,避免本地与 IM 状态不一致 + openIMApiClient.kickGroupMember( + String.valueOf(groupId), List.of(String.valueOf(targetUserId))); + + groupMemberMapper.deleteById(target.getId()); // 审计日志 auditService.log(groupId, null, operatorId, "KICK_USER",