diff --git a/src/main/java/com/youlai/boot/system/service/UserRoleService.java b/src/main/java/com/youlai/boot/system/service/UserRoleService.java index 697b86ca..0d42915b 100644 --- a/src/main/java/com/youlai/boot/system/service/UserRoleService.java +++ b/src/main/java/com/youlai/boot/system/service/UserRoleService.java @@ -15,7 +15,7 @@ public interface UserRoleService extends IService { * @param roleIds * @return */ - boolean saveUserRoles(Long userId, List roleIds); + void saveUserRoles(Long userId, List roleIds); /** * 判断角色是否存在绑定的用户 diff --git a/src/main/java/com/youlai/boot/system/service/impl/UserRoleServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/UserRoleServiceImpl.java index ce747648..6b27244b 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/UserRoleServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/UserRoleServiceImpl.java @@ -3,80 +3,92 @@ package com.youlai.boot.system.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.youlai.boot.core.security.token.TokenManager; +import com.youlai.boot.core.security.util.SecurityUtils; import com.youlai.boot.system.mapper.UserRoleMapper; import com.youlai.boot.system.model.entity.UserRole; import com.youlai.boot.system.service.UserRoleService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @Service +@RequiredArgsConstructor public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService { - /** - * 保存用户角色 - * - * @param userId - * @param roleIds - * @return - */ - @Override - public boolean saveUserRoles(Long userId, List roleIds) { - if (userId == null || CollectionUtil.isEmpty(roleIds)) { - return false; - } - - // 用户原角色ID集合 - List userRoleIds = this.list(new LambdaQueryWrapper() - .eq(UserRole::getUserId, userId)) - .stream() - .map(UserRole::getRoleId) - .collect(Collectors.toList()); - - // 新增用户角色 - List saveRoleIds; - if (CollectionUtil.isEmpty(userRoleIds)) { - saveRoleIds = roleIds; - } else { - saveRoleIds = roleIds.stream() - .filter(roleId -> !userRoleIds.contains(roleId)) - .collect(Collectors.toList()); - } - - List saveUserRoles = saveRoleIds - .stream() - .map(roleId -> new UserRole(userId, roleId)) - .collect(Collectors.toList()); - this.saveBatch(saveUserRoles); - - // 删除用户角色 - if (CollectionUtil.isNotEmpty(userRoleIds)) { - List removeRoleIds = userRoleIds.stream() - .filter(roleId -> !roleIds.contains(roleId)) - .collect(Collectors.toList()); - - if (CollectionUtil.isNotEmpty(removeRoleIds)) { - this.remove(new LambdaQueryWrapper() - .eq(UserRole::getUserId, userId) - .in(UserRole::getRoleId, removeRoleIds) - ); - } - } - return true; + private final TokenManager tokenManager; + /** + * 保存用户角色 + * + * @param userId 用户ID + * @param roleIds 选择的角色ID集合 + * @return + */ + @Override + public void saveUserRoles(Long userId, List roleIds) { + if (userId == null || CollectionUtil.isEmpty(roleIds)) { + return ; } - /** - * 判断角色是否存在绑定的用户 - * - * @param roleId 角色ID - * @return true:已分配 false:未分配 - */ - @Override - public boolean hasAssignedUsers(Long roleId) { - int count = this.baseMapper.countUsersForRole(roleId); - return count > 0; + // 获取现有角色 + List userRoleIds = this.list(new LambdaQueryWrapper() + .select(UserRole::getRoleId) + .eq(UserRole::getUserId, userId)) + .parallelStream() + .map(UserRole::getRoleId) + .toList(); + + // 使用Set提升对比效率 + Set oldRoles = new HashSet<>(userRoleIds); + Set newRoles = new HashSet<>(roleIds); + + // 计算变更集 + Set addedRoles = new HashSet<>(newRoles); + addedRoles.removeAll(oldRoles); + + Set removedRoles = new HashSet<>(oldRoles); + removedRoles.removeAll(newRoles); + + boolean rolesChanged = !addedRoles.isEmpty() || !removedRoles.isEmpty(); + + // 批量保存新增角色 + if (!addedRoles.isEmpty()) { + this.saveBatch(addedRoles.stream() + .map(roleId -> new UserRole(userId, roleId)) + .collect(Collectors.toList())); } + + // 删除废弃角色 + if (!removedRoles.isEmpty()) { + this.remove(new LambdaQueryWrapper() + .eq(UserRole::getUserId, userId) + .in(UserRole::getRoleId, removedRoles)); + } + + // 当权限变更时清除登录态 + if (rolesChanged) { + // 获取用户所有有效token(根据实际token存储实现) + String accessToken = SecurityUtils.getTokenFromRequest(); + tokenManager.invalidateToken(accessToken); + } + } + + /** + * 判断角色是否存在绑定的用户 + * + * @param roleId 角色ID + * @return true:已分配 false:未分配 + */ + @Override + public boolean hasAssignedUsers(Long roleId) { + int count = this.baseMapper.countUsersForRole(roleId); + return count > 0; + } } diff --git a/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java index 3bec2db1..143256af 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java @@ -131,6 +131,7 @@ public class UserServiceImpl extends ServiceImpl implements Us // 设置默认加密密码 String defaultEncryptPwd = passwordEncoder.encode(SystemConstants.DEFAULT_PASSWORD); entity.setPassword(defaultEncryptPwd); + entity.setCreateBy(SecurityUtils.getUserId()); // 新增用户 boolean result = this.save(entity); @@ -163,6 +164,7 @@ public class UserServiceImpl extends ServiceImpl implements Us // form -> entity User entity = userConverter.toEntity(userForm); + entity.setUpdateBy(SecurityUtils.getUserId()); // 修改用户 boolean result = this.updateById(entity); diff --git a/src/main/resources/templates/codegen/index.vue.vm b/src/main/resources/templates/codegen/index.vue.vm index 67ce5bd2..0c256c33 100644 --- a/src/main/resources/templates/codegen/index.vue.vm +++ b/src/main/resources/templates/codegen/index.vue.vm @@ -1,6 +1,6 @@