diff --git a/backend/src/main/java/com/designhub/service/UserService.java b/backend/src/main/java/com/designhub/service/UserService.java index b17ef5b..629c788 100644 --- a/backend/src/main/java/com/designhub/service/UserService.java +++ b/backend/src/main/java/com/designhub/service/UserService.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.designhub.dto.LoginDTO; import com.designhub.dto.RegisterDTO; import com.designhub.entity.Department; +import com.designhub.entity.Role; import com.designhub.entity.User; import com.designhub.entity.UserDepartment; import com.designhub.exception.BusinessException; @@ -27,10 +28,13 @@ import org.springframework.util.StringUtils; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.HashMap; +import java.util.Set; import java.util.stream.Collectors; /** @@ -343,18 +347,17 @@ public class UserService { throw new BusinessException("用户不存在"); } - // 将角色ID列表转换为逗号分隔的字符串 - if (roleIds != null && !roleIds.isEmpty()) { - String roleIdsStr = roleIds.stream() - .map(String::valueOf) - .reduce((a, b) -> a + "," + b) - .orElse(""); - user.setRoleIds(roleIdsStr); - userMapper.updateById(user); - } else { - user.setRoleIds(null); - userMapper.updateById(user); - } + Set targetRoleIds = roleIds == null ? Collections.emptySet() : new LinkedHashSet<>(roleIds); + String roleIdsStr = targetRoleIds.isEmpty() + ? null + : targetRoleIds.stream().map(String::valueOf).collect(Collectors.joining(",")); + Integer targetIsAdmin = hasAdminRole(targetRoleIds) ? 1 : 0; + + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(User::getId, userId) + .set(User::getRoleIds, roleIdsStr) + .set(User::getIsAdmin, targetIsAdmin); + userMapper.update(null, updateWrapper); return true; } @@ -1767,14 +1770,35 @@ public class UserService { if (user == null) { throw new BusinessException(ResultCode.NOT_FOUND, "用户不存在"); } - - // 更新管理员标识 + + Set roleIdSet = parseRoleIds(user.getRoleIds()); + boolean enableAdmin = isAdmin != null && isAdmin == 1; + if (enableAdmin) { + Long adminRoleId = findRoleIdByCode("ADMIN"); + if (adminRoleId == null) { + throw new BusinessException(ResultCode.ERROR, "未找到管理员角色,请先检查角色配置"); + } + roleIdSet.add(adminRoleId); + } else { + Long adminRoleId = findRoleIdByCode("ADMIN"); + if (adminRoleId != null) { + roleIdSet.remove(adminRoleId); + } + } + + String targetRoleIds = roleIdSet.isEmpty() + ? null + : roleIdSet.stream().map(String::valueOf).collect(Collectors.joining(",")); + Integer targetIsAdmin = hasAdminRole(roleIdSet) ? 1 : 0; + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(User::getId, userId); - updateWrapper.set(User::getIsAdmin, isAdmin != null ? isAdmin : 0); + updateWrapper.eq(User::getId, userId) + .set(User::getRoleIds, targetRoleIds) + .set(User::getIsAdmin, targetIsAdmin); boolean result = userMapper.update(null, updateWrapper) > 0; - log.info("设置管理员身份结果: userId={}, isAdmin={}, result={}", userId, isAdmin, result); + log.info("设置管理员身份结果: userId={}, isAdmin={}, roleIds={}, result={}", + userId, targetIsAdmin, targetRoleIds, result); return result; } @@ -1786,4 +1810,48 @@ public class UserService { User user = userMapper.selectById(userId); return user != null && user.getIsAdmin() != null && user.getIsAdmin() == 1; } + + private Set parseRoleIds(String roleIdsStr) { + if (!StringUtils.hasText(roleIdsStr)) { + return new LinkedHashSet<>(); + } + Set roleIds = new LinkedHashSet<>(); + for (String part : roleIdsStr.split(",")) { + String trimmed = part == null ? "" : part.trim(); + if (trimmed.isEmpty()) { + continue; + } + try { + roleIds.add(Long.parseLong(trimmed)); + } catch (NumberFormatException ignored) { + } + } + return roleIds; + } + + private Long findRoleIdByCode(String roleCode) { + if (!StringUtils.hasText(roleCode)) { + return null; + } + return roleService.getAllRoles().stream() + .filter(role -> roleCode.equalsIgnoreCase(role.getRoleCode())) + .map(Role::getId) + .findFirst() + .orElse(null); + } + + private boolean hasAdminRole(Set roleIds) { + if (roleIds == null || roleIds.isEmpty()) { + return false; + } + Set adminRoleIds = roleService.getAllRoles().stream() + .filter(role -> "ADMIN".equalsIgnoreCase(role.getRoleCode()) + || "SUPER_ADMIN".equalsIgnoreCase(role.getRoleCode())) + .map(Role::getId) + .collect(Collectors.toSet()); + if (adminRoleIds.isEmpty()) { + return false; + } + return roleIds.stream().anyMatch(adminRoleIds::contains); + } }