mirror of https://gitee.com/stylefeng/roses
【8.1.0】【user-role】更新用户角色分配界面,角色绑定
parent
d9bbcb3fbf
commit
780a8940f5
|
@ -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);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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", "非超级管理员不能修改基础系统角色绑定");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 错误编码
|
* 错误编码
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色的类型校验,非系统管理员,只能添加公司级别的角色,并且只能添加当前登录本公司的角色
|
* 角色的类型校验,非系统管理员,只能添加公司级别的角色,并且只能添加当前登录本公司的角色
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue