【8.1.0】【user-role】更新用户角色分配界面,角色绑定

pull/60/head
fengshuonan 2024-01-17 22:58:18 +08:00
parent d9bbcb3fbf
commit 780a8940f5
4 changed files with 34 additions and 109 deletions

View File

@ -72,12 +72,4 @@ public interface SysRoleServiceApi {
*/ */
List<SysRoleDTO> getRolesByIds(List<Long> roleIds); List<SysRoleDTO> getRolesByIds(List<Long> roleIds);
/**
*
*
* @author fengshuonan
* @since 2024/1/17 0:40
*/
List<SysRoleDTO> getSystemRoleAndCurrentCompanyRole(Long companyId);
} }

View File

@ -58,7 +58,12 @@ public enum SysUserExceptionEnum implements AbstractExceptionEnum {
/** /**
* admin * admin
*/ */
CANT_CHANGE_ADMIN_FLAG(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10009", "不能修改管理员admin的超级管理员标识"); CANT_CHANGE_ADMIN_FLAG(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10009", "不能修改管理员admin的超级管理员标识"),
/**
*
*/
CANT_CHANGE_BASE_SYSTEM_ROLE(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10010", "非超级管理员不能修改基础系统角色绑定");
/** /**
* *

View File

@ -12,7 +12,6 @@ import cn.stylefeng.roses.kernel.sys.api.callback.RemoveRoleCallbackApi;
import cn.stylefeng.roses.kernel.sys.api.callback.RemoveUserCallbackApi; import cn.stylefeng.roses.kernel.sys.api.callback.RemoveUserCallbackApi;
import cn.stylefeng.roses.kernel.sys.api.constants.SysConstants; import cn.stylefeng.roses.kernel.sys.api.constants.SysConstants;
import cn.stylefeng.roses.kernel.sys.api.enums.role.RoleTypeEnum; import cn.stylefeng.roses.kernel.sys.api.enums.role.RoleTypeEnum;
import cn.stylefeng.roses.kernel.sys.api.pojo.role.SysRoleDTO;
import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole; import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole;
import cn.stylefeng.roses.kernel.sys.modular.user.enums.SysUserExceptionEnum; import cn.stylefeng.roses.kernel.sys.modular.user.enums.SysUserExceptionEnum;
import cn.stylefeng.roses.kernel.sys.modular.user.mapper.SysUserRoleMapper; import cn.stylefeng.roses.kernel.sys.modular.user.mapper.SysUserRoleMapper;
@ -25,7 +24,10 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.*; import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants.UPDATE_USER_ROLE_EVENT; import static cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants.UPDATE_USER_ROLE_EVENT;
@ -61,15 +63,20 @@ public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUs
throw new ServiceException(SysUserExceptionEnum.CANT_CHANGE_ADMIN_ROLE); throw new ServiceException(SysUserExceptionEnum.CANT_CHANGE_ADMIN_ROLE);
} }
// 清空已有的用户角色绑定 // 非超级管理员不能改变系统级角色
boolean superAdminFlag = LoginContext.me().getSuperAdminFlag();
if (!superAdminFlag) {
throw new ServiceException(SysUserExceptionEnum.CANT_CHANGE_BASE_SYSTEM_ROLE);
}
// 清空用户绑定的所有系统角色,因为这个界面只分配系统角色
this.removeRoleAlreadyBind(sysUserRoleRequest); this.removeRoleAlreadyBind(sysUserRoleRequest);
// 获取角色的详情 // 获取本次绑定的角色id集合
Set<Long> roleIdList = sysUserRoleRequest.getRoleIdList(); Set<Long> roleIdList = sysUserRoleRequest.getRoleIdList();
List<SysRoleDTO> sysRoleDTOList = sysRoleServiceApi.getRolesByIds(new ArrayList<>(roleIdList));
// 重新绑定用户角色信息 // 重新绑定用户角色信息
List<SysUserRole> newUserRoles = this.createUserRoleBinds(sysUserRoleRequest, roleIdList, sysRoleDTOList); List<SysUserRole> newUserRoles = this.createUserSystemRoleBinds(sysUserRoleRequest, roleIdList);
this.saveBatch(newUserRoles); this.saveBatch(newUserRoles);
// 发布修改用户绑定角色的事件 // 发布修改用户绑定角色的事件
@ -213,52 +220,16 @@ public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUs
} }
/** /**
* *
* *
* @author fengshuonan * @author fengshuonan
* @since 2024/1/17 0:24 * @since 2024/1/17 22:47
*/ */
private void removeRoleAlreadyBind(SysUserRoleRequest sysUserRoleRequest) { private void removeRoleAlreadyBind(SysUserRoleRequest sysUserRoleRequest) {
// 1. 获取系统中的所有角色,包括系统角色和当前公司角色
List<SysRoleDTO> roleResults = sysRoleServiceApi.getSystemRoleAndCurrentCompanyRole(LoginContext.me().getCurrentUserCompanyId());
if (ObjectUtil.isEmpty(roleResults)) {
return;
}
// 2. 所有系统角色id集合
Set<Long> systemRoleIdList = roleResults.stream().filter(i -> i.getRoleType().equals(RoleTypeEnum.SYSTEM_ROLE.getCode())).map(SysRoleDTO::getRoleId)
.collect(Collectors.toSet());
// 3. 所有当前公司角色id集合
Set<Long> currentCompanyRoleIdList = roleResults.stream().filter(i -> i.getRoleType().equals(RoleTypeEnum.COMPANY_ROLE.getCode())).map(SysRoleDTO::getRoleId)
.collect(Collectors.toSet());
LambdaQueryWrapper<SysUserRole> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SysUserRole> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SysUserRole::getUserId, sysUserRoleRequest.getUserId());
// 2. 当前如果是超级管理员在操作,清空用户的系统角色和当前公司角色(因为超级管理员的绑定角色列表,可以看到系统角色和当前公司角色) queryWrapper.eq(SysUserRole::getRoleType, RoleTypeEnum.SYSTEM_ROLE.getCode());
boolean superAdminFlag = LoginContext.me().getSuperAdminFlag(); this.remove(queryWrapper);
if (superAdminFlag) {
Set<Long> paramsRoleIdList = new HashSet<>(systemRoleIdList);
if (ObjectUtil.isNotEmpty(currentCompanyRoleIdList)) {
paramsRoleIdList.addAll(currentCompanyRoleIdList);
}
queryWrapper.eq(SysUserRole::getUserId, sysUserRoleRequest.getUserId());
queryWrapper.in(SysUserRole::getRoleId, paramsRoleIdList);
this.remove(queryWrapper);
}
// 3. 如果当前不是超级管理员则只能清空当前公司的角色id集合
else {
if (ObjectUtil.isEmpty(currentCompanyRoleIdList)) {
return;
}
queryWrapper.eq(SysUserRole::getUserId, sysUserRoleRequest.getUserId());
queryWrapper.in(SysUserRole::getRoleId, currentCompanyRoleIdList);
this.remove(queryWrapper);
}
} }
/** /**
@ -319,26 +290,16 @@ public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUs
* *
* @param sysUserRoleRequest * @param sysUserRoleRequest
* @param roleIdList * @param roleIdList
* @param sysRoleDTOList id
* @author fengshuonan * @author fengshuonan
* @since 2024-01-17 17:27 * @since 2024-01-17 17:27
*/ */
private List<SysUserRole> createUserRoleBinds(SysUserRoleRequest sysUserRoleRequest, Set<Long> roleIdList, List<SysRoleDTO> sysRoleDTOList) { private List<SysUserRole> createUserSystemRoleBinds(SysUserRoleRequest sysUserRoleRequest, Set<Long> roleIdList) {
List<SysUserRole> newUserRoles = new ArrayList<>(); List<SysUserRole> newUserRoles = new ArrayList<>();
for (Long newRoleId : roleIdList) { for (Long newRoleId : roleIdList) {
SysUserRole sysUserRole = new SysUserRole(); SysUserRole sysUserRole = new SysUserRole();
sysUserRole.setUserId(sysUserRoleRequest.getUserId()); sysUserRole.setUserId(sysUserRoleRequest.getUserId());
sysUserRole.setRoleId(newRoleId); sysUserRole.setRoleId(newRoleId);
sysUserRole.setRoleType(RoleTypeEnum.SYSTEM_ROLE.getCode());
// 填充角色的类型和所属公司
for (SysRoleDTO sysRoleDTO : sysRoleDTOList) {
if (sysRoleDTO.getRoleId().equals(newRoleId)) {
sysUserRole.setRoleType(sysRoleDTO.getRoleType());
sysUserRole.setRoleOrgId(sysRoleDTO.getRoleOrgId());
break;
}
}
newUserRoles.add(sysUserRole); newUserRoles.add(sysUserRole);
} }
return newUserRoles; return newUserRoles;

View File

@ -241,12 +241,17 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
public List<SysRole> userAssignRoleList(SysRoleRequest sysRoleRequest) { public List<SysRole> userAssignRoleList(SysRoleRequest sysRoleRequest) {
LambdaQueryWrapper<SysRole> wrapper = this.createWrapper(sysRoleRequest); LambdaQueryWrapper<SysRole> wrapper = this.createWrapper(sysRoleRequest);
// 超级管理员,直接返回所有系统角色,非超级管理员看不到角色信息绑定
boolean superAdminFlag = LoginContext.me().getSuperAdminFlag();
if (superAdminFlag) {
wrapper.eq(SysRole::getRoleType, RoleTypeEnum.SYSTEM_ROLE.getCode());
} else {
return new ArrayList<>();
}
// 只查询id和名称 // 只查询id和名称
wrapper.select(SysRole::getRoleId, SysRole::getRoleName, SysRole::getRoleType); wrapper.select(SysRole::getRoleId, SysRole::getRoleName, SysRole::getRoleType);
// 过滤角色的权限信息
this.filterUserAssignRoleList(wrapper);
return this.list(wrapper); return this.list(wrapper);
} }
@ -342,21 +347,6 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
return BeanUtil.copyToList(sysRoleList, SysRoleDTO.class, CopyOptions.create().ignoreError()); return BeanUtil.copyToList(sysRoleList, SysRoleDTO.class, CopyOptions.create().ignoreError());
} }
@Override
public List<SysRoleDTO> getSystemRoleAndCurrentCompanyRole(Long companyId) {
LambdaQueryWrapper<SysRole> sysRoleLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysRoleLambdaQueryWrapper.eq(SysRole::getRoleType, RoleTypeEnum.SYSTEM_ROLE.getCode());
sysRoleLambdaQueryWrapper.or(i -> i.eq(SysRole::getRoleCompanyId, companyId));
sysRoleLambdaQueryWrapper.select(SysRole::getRoleName, SysRole::getRoleId, SysRole::getRoleCode, SysRole::getRoleType);
List<SysRole> sysRoleList = this.list(sysRoleLambdaQueryWrapper);
if (ObjectUtil.isEmpty(sysRoleList)) {
return new ArrayList<>();
}
return BeanUtil.copyToList(sysRoleList, SysRoleDTO.class, CopyOptions.create().ignoreError());
}
/** /**
* *
* *
@ -447,29 +437,6 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
wrapper.eq(SysRole::getRoleCompanyId, LoginContext.me().getCurrentUserCompanyId()); wrapper.eq(SysRole::getRoleCompanyId, LoginContext.me().getCurrentUserCompanyId());
} }
/**
*
*
* @author fengshuonan
* @since 2024-01-16 19:08
*/
private void filterUserAssignRoleList(LambdaQueryWrapper<SysRole> wrapper) {
// 超级管理员,获取系统类型的角色 + 当前登录公司的角色
boolean superAdminFlag = LoginContext.me().getSuperAdminFlag();
if (superAdminFlag) {
// 根据角色类型填充参数
wrapper.nested(i ->
i.eq(SysRole::getRoleType, RoleTypeEnum.SYSTEM_ROLE.getCode())
.or()
.eq(SysRole::getRoleCompanyId, LoginContext.me().getCurrentUserCompanyId()));
return;
}
// 非超级管理员直接拼好角色类型和角色的公司id只能查本公司的
wrapper.eq(SysRole::getRoleType, RoleTypeEnum.COMPANY_ROLE.getCode());
wrapper.eq(SysRole::getRoleCompanyId, LoginContext.me().getCurrentUserCompanyId());
}
/** /**
* *
* *