From f983ceb86a942c7e930357360a10869a104db086 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 4 Jul 2025 10:19:59 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/SysRoleController.java | 3 +- .../system/mapper/SysUserRoleMapper.java | 11 +++ .../system/service/ISysRoleService.java | 12 ++- .../service/impl/SysRoleServiceImpl.java | 85 ++++++------------- 4 files changed, 50 insertions(+), 61 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java index e6afa3c07..fd019fbdb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java @@ -23,6 +23,7 @@ import org.dromara.system.service.ISysUserService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Arrays; import java.util.List; /** @@ -144,7 +145,7 @@ public class SysRoleController extends BaseController { @Log(title = "角色管理", businessType = BusinessType.DELETE) @DeleteMapping("/{roleIds}") public R remove(@PathVariable Long[] roleIds) { - return toAjax(roleService.deleteRoleByIds(roleIds)); + return toAjax(roleService.deleteRoleByIds(Arrays.asList(roleIds))); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java index 83403480e..bbc94c976 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java @@ -1,5 +1,6 @@ package org.dromara.system.mapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.system.domain.SysUserRole; @@ -20,4 +21,14 @@ public interface SysUserRoleMapper extends BaseMapperPlus selectUserIdsByRoleId(Long roleId); + /** + * 根据角色ID统计关联的用户数量 + * + * @param roleId 角色ID + * @return 绑定该角色的用户数量 + */ + default long countUserByRoleId(Long roleId) { + return selectCount(new LambdaQueryWrapper().eq(SysUserRole::getRoleId, roleId)); + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java index cec4bf775..004a2e7b0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java @@ -167,7 +167,7 @@ public interface ISysRoleService { * @param roleIds 需要删除的角色ID * @return 结果 */ - int deleteRoleByIds(Long[] roleIds); + int deleteRoleByIds(List roleIds); /** * 取消授权用户角色 @@ -195,8 +195,18 @@ public interface ISysRoleService { */ int insertAuthUsers(Long roleId, Long[] userIds); + /** + * 根据角色ID,强制下线所有拥有该角色的在线用户 + * + * @param roleId 角色ID + */ void cleanOnlineUserByRole(Long roleId); + /** + * 强制下线指定用户ID列表中的所有在线用户 + * + * @param userIds 用户ID列表 + */ void cleanOnlineUser(List userIds); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java index f6d106854..b39867903 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -1,6 +1,5 @@ package org.dromara.system.service.impl; -import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; @@ -15,7 +14,7 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.constant.TenantConstants; -import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.enums.UserType; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.RoleService; import org.dromara.common.core.utils.MapstructUtils; @@ -267,7 +266,7 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService { */ @Override public long countUserRoleByRoleId(Long roleId) { - return userRoleMapper.selectCount(new LambdaQueryWrapper().eq(SysUserRole::getRoleId, roleId)); + return userRoleMapper.countUserByRoleId(roleId); } /** @@ -412,21 +411,20 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService { @CacheEvict(cacheNames = CacheNames.SYS_ROLE_CUSTOM, allEntries = true) @Override @Transactional(rollbackFor = Exception.class) - public int deleteRoleByIds(Long[] roleIds) { - for (Long roleId : roleIds) { - SysRole role = baseMapper.selectById(roleId); + public int deleteRoleByIds(List roleIds) { + List list = baseMapper.selectByIds(roleIds); + for (SysRole role : list) { checkRoleAllowed(BeanUtil.toBean(role, SysRoleBo.class)); - checkRoleDataScope(roleId); - if (countUserRoleByRoleId(roleId) > 0) { + checkRoleDataScope(role.getRoleId()); + if (countUserRoleByRoleId(role.getRoleId()) > 0) { throw new ServiceException(String.format("%1$s已分配,不能删除!", role.getRoleName())); } } - List ids = Arrays.asList(roleIds); // 删除角色与菜单关联 - roleMenuMapper.delete(new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, ids)); + roleMenuMapper.delete(new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, roleIds)); // 删除角色与部门关联 - roleDeptMapper.delete(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, ids)); - return baseMapper.deleteByIds(ids); + roleDeptMapper.delete(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, roleIds)); + return baseMapper.deleteByIds(roleIds); } /** @@ -492,61 +490,30 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService { return rows; } + /** + * 根据角色ID,强制下线所有拥有该角色的在线用户 + * + * @param roleId 角色ID + */ @Override public void cleanOnlineUserByRole(Long roleId) { - // 如果角色未绑定用户 直接返回 - Long num = userRoleMapper.selectCount(new LambdaQueryWrapper().eq(SysUserRole::getRoleId, roleId)); - if (num == 0) { - return; - } - List keys = StpUtil.searchTokenValue("", 0, -1, false); - if (CollUtil.isEmpty(keys)) { - return; - } - // 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作 - keys.parallelStream().forEach(key -> { - String token = StringUtils.substringAfterLast(key, ":"); - // 如果已经过期则跳过 - if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { - return; - } - LoginUser loginUser = LoginHelper.getLoginUser(token); - if (ObjectUtil.isNull(loginUser) || CollUtil.isEmpty(loginUser.getRoles())) { - return; - } - if (loginUser.getRoles().stream().anyMatch(r -> r.getRoleId().equals(roleId))) { - try { - StpUtil.logoutByTokenValue(token); - } catch (NotLoginException ignored) { - } - } - }); + List userIds = userRoleMapper.selectUserIdsByRoleId(roleId); + this.cleanOnlineUser(userIds); } + /** + * 强制下线指定用户ID列表中的所有在线用户 + * + * @param userIds 用户ID列表 + */ @Override public void cleanOnlineUser(List userIds) { - List keys = StpUtil.searchTokenValue("", 0, -1, false); - if (CollUtil.isEmpty(keys)) { + if (CollUtil.isEmpty(userIds)) { return; } - // 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作 - keys.parallelStream().forEach(key -> { - String token = StringUtils.substringAfterLast(key, ":"); - // 如果已经过期则跳过 - if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { - return; - } - LoginUser loginUser = LoginHelper.getLoginUser(token); - if (ObjectUtil.isNull(loginUser)) { - return; - } - if (userIds.contains(loginUser.getUserId())) { - try { - StpUtil.logoutByTokenValue(token); - } catch (NotLoginException ignored) { - } - } - }); + for (Long userId : userIds) { + StpUtil.kickout(UserType.SYS_USER.getUserType() + ":" + userId); + } } /**