fix: sync admin flag with role assignments

This commit is contained in:
Your Name 2026-02-22 18:44:28 +08:00
parent e7554c746d
commit cca9a4c2eb

View File

@ -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<Long> 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<User> 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<Long> 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<User> 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<Long> parseRoleIds(String roleIdsStr) {
if (!StringUtils.hasText(roleIdsStr)) {
return new LinkedHashSet<>();
}
Set<Long> 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<Long> roleIds) {
if (roleIds == null || roleIds.isEmpty()) {
return false;
}
Set<Long> 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);
}
}