mirror of
https://github.com/continew-org/continew-admin.git
synced 2025-09-10 08:57:14 +08:00
优化:角色新增类型字段,用于标识角色是系统内置或自定义
1.系统内置角色不允许禁用、删除、修改角色编码和角色数据权限 2.删除角色时,自动删除角色和菜单关联、自动删除角色和部门关联
This commit is contained in:
@@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
|
||||
|
||||
import top.charles7c.cnadmin.common.base.BaseDO;
|
||||
import top.charles7c.cnadmin.common.enums.DataScopeEnum;
|
||||
import top.charles7c.cnadmin.common.enums.DataTypeEnum;
|
||||
import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
|
||||
|
||||
/**
|
||||
@@ -65,4 +66,9 @@ public class RoleDO extends BaseDO {
|
||||
* 状态(1:启用,2:禁用)
|
||||
*/
|
||||
private DisEnableStatusEnum status;
|
||||
|
||||
/**
|
||||
* 类型(1:系统内置,2:自定义)
|
||||
*/
|
||||
private DataTypeEnum type;
|
||||
}
|
||||
|
@@ -16,6 +16,7 @@
|
||||
|
||||
package top.charles7c.cnadmin.system.model.request;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
@@ -74,7 +75,7 @@ public class RoleRequest extends BaseRequest {
|
||||
* 功能权限:菜单 ID 列表
|
||||
*/
|
||||
@Schema(description = "功能权限:菜单 ID 列表")
|
||||
private List<Long> menuIds;
|
||||
private List<Long> menuIds = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* 数据权限(1:全部数据权限,2:本部门及以下数据权限,3:本部门数据权限,4:仅本人数据权限,5:自定义数据权限)
|
||||
@@ -87,7 +88,7 @@ public class RoleRequest extends BaseRequest {
|
||||
* 权限范围:部门 ID 列表
|
||||
*/
|
||||
@Schema(description = "权限范围:部门 ID 列表")
|
||||
private List<Long> deptIds;
|
||||
private List<Long> deptIds = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* 状态(1:启用,2:禁用)
|
||||
|
@@ -28,6 +28,7 @@ import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import top.charles7c.cnadmin.common.base.BaseDetailVO;
|
||||
import top.charles7c.cnadmin.common.config.easyexcel.ExcelBaseEnumConverter;
|
||||
import top.charles7c.cnadmin.common.enums.DataScopeEnum;
|
||||
import top.charles7c.cnadmin.common.enums.DataTypeEnum;
|
||||
import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
|
||||
|
||||
/**
|
||||
@@ -78,6 +79,13 @@ public class RoleDetailVO extends BaseDetailVO {
|
||||
@ExcelProperty(value = "状态", converter = ExcelBaseEnumConverter.class)
|
||||
private DisEnableStatusEnum status;
|
||||
|
||||
/**
|
||||
* 类型(1:系统内置,2:自定义)
|
||||
*/
|
||||
@Schema(description = "类型(1:系统内置,2:自定义)")
|
||||
@ExcelProperty(value = "类型", converter = ExcelBaseEnumConverter.class)
|
||||
private DataTypeEnum type;
|
||||
|
||||
/**
|
||||
* 描述
|
||||
*/
|
||||
@@ -96,4 +104,9 @@ public class RoleDetailVO extends BaseDetailVO {
|
||||
*/
|
||||
@Schema(description = "权限范围:部门 ID 列表")
|
||||
private List<Long> deptIds;
|
||||
|
||||
@Override
|
||||
public Boolean getDisabled() {
|
||||
return DataTypeEnum.SYSTEM.equals(type);
|
||||
}
|
||||
}
|
||||
|
@@ -22,8 +22,8 @@ import lombok.experimental.Accessors;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
|
||||
import top.charles7c.cnadmin.common.base.BaseVO;
|
||||
import top.charles7c.cnadmin.common.constant.SysConsts;
|
||||
import top.charles7c.cnadmin.common.enums.DataScopeEnum;
|
||||
import top.charles7c.cnadmin.common.enums.DataTypeEnum;
|
||||
import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
|
||||
|
||||
/**
|
||||
@@ -69,6 +69,12 @@ public class RoleVO extends BaseVO {
|
||||
@Schema(description = "状态(1:启用,2:禁用)")
|
||||
private DisEnableStatusEnum status;
|
||||
|
||||
/**
|
||||
* 类型(1:系统内置,2:自定义)
|
||||
*/
|
||||
@Schema(description = "类型(1:系统内置,2:自定义)")
|
||||
private DataTypeEnum type;
|
||||
|
||||
/**
|
||||
* 描述
|
||||
*/
|
||||
@@ -77,6 +83,6 @@ public class RoleVO extends BaseVO {
|
||||
|
||||
@Override
|
||||
public Boolean getDisabled() {
|
||||
return SysConsts.ADMIN_ROLE_CODE.equals(code);
|
||||
return DataTypeEnum.SYSTEM.equals(type);
|
||||
}
|
||||
}
|
||||
|
@@ -52,4 +52,12 @@ public interface RoleDeptService {
|
||||
* 部门 ID 列表
|
||||
*/
|
||||
void deleteByDeptIds(List<Long> deptIds);
|
||||
|
||||
/**
|
||||
* 根据角色 ID 删除
|
||||
*
|
||||
* @param roleIds
|
||||
* 角色 ID 列表
|
||||
*/
|
||||
void deleteByRoleIds(List<Long> roleIds);
|
||||
}
|
@@ -44,4 +44,12 @@ public interface RoleMenuService {
|
||||
* @return 菜单 ID 列表
|
||||
*/
|
||||
List<Long> listMenuIdByRoleIds(List<Long> roleIds);
|
||||
|
||||
/**
|
||||
* 根据角色 ID 删除
|
||||
*
|
||||
* @param roleIds
|
||||
* 角色 ID 列表
|
||||
*/
|
||||
void deleteByRoleIds(List<Long> roleIds);
|
||||
}
|
@@ -23,8 +23,6 @@ import lombok.RequiredArgsConstructor;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
|
||||
import top.charles7c.cnadmin.system.mapper.RoleDeptMapper;
|
||||
import top.charles7c.cnadmin.system.model.entity.RoleDeptDO;
|
||||
import top.charles7c.cnadmin.system.service.RoleDeptService;
|
||||
@@ -43,9 +41,6 @@ public class RoleDeptServiceImpl implements RoleDeptService {
|
||||
|
||||
@Override
|
||||
public void save(List<Long> deptIds, Long roleId) {
|
||||
if (CollUtil.isEmpty(deptIds)) {
|
||||
return;
|
||||
}
|
||||
// 删除原有关联
|
||||
roleDeptMapper.lambdaUpdate().eq(RoleDeptDO::getRoleId, roleId).remove();
|
||||
// 保存最新关联
|
||||
@@ -63,4 +58,9 @@ public class RoleDeptServiceImpl implements RoleDeptService {
|
||||
public void deleteByDeptIds(List<Long> deptIds) {
|
||||
roleDeptMapper.lambdaUpdate().in(RoleDeptDO::getDeptId, deptIds).remove();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteByRoleIds(List<Long> roleIds) {
|
||||
roleDeptMapper.lambdaUpdate().in(RoleDeptDO::getRoleId, roleIds).remove();
|
||||
}
|
||||
}
|
||||
|
@@ -44,9 +44,6 @@ public class RoleMenuServiceImpl implements RoleMenuService {
|
||||
|
||||
@Override
|
||||
public void save(List<Long> menuIds, Long roleId) {
|
||||
if (CollUtil.isEmpty(menuIds)) {
|
||||
return;
|
||||
}
|
||||
// 删除原有关联
|
||||
roleMenuMapper.lambdaUpdate().eq(RoleMenuDO::getRoleId, roleId).remove();
|
||||
// 保存最新关联
|
||||
@@ -62,4 +59,9 @@ public class RoleMenuServiceImpl implements RoleMenuService {
|
||||
}
|
||||
return roleMenuMapper.selectMenuIdByRoleIds(roleIds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteByRoleIds(List<Long> roleIds) {
|
||||
roleMenuMapper.lambdaUpdate().in(RoleMenuDO::getRoleId, roleIds).remove();
|
||||
}
|
||||
}
|
||||
|
@@ -16,10 +16,7 @@
|
||||
|
||||
package top.charles7c.cnadmin.system.service.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@@ -32,6 +29,7 @@ import cn.hutool.core.collection.CollUtil;
|
||||
|
||||
import top.charles7c.cnadmin.common.base.BaseServiceImpl;
|
||||
import top.charles7c.cnadmin.common.constant.SysConsts;
|
||||
import top.charles7c.cnadmin.common.enums.DataTypeEnum;
|
||||
import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
|
||||
import top.charles7c.cnadmin.common.model.dto.RoleDTO;
|
||||
import top.charles7c.cnadmin.common.model.vo.LabelValueVO;
|
||||
@@ -86,20 +84,42 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
|
||||
CheckUtils.throwIf(() -> this.checkNameExists(name, id), String.format("修改失败,'%s'已存在", name));
|
||||
String code = request.getCode();
|
||||
CheckUtils.throwIf(() -> this.checkCodeExists(code, id), String.format("修改失败,'%s'已存在", code));
|
||||
RoleDO oldRole = this.getById(id);
|
||||
if (DataTypeEnum.SYSTEM.equals(oldRole.getType())) {
|
||||
CheckUtils.throwIf(() -> DisEnableStatusEnum.DISABLE.equals(request.getStatus()),
|
||||
String.format("'%s' 是系统内置角色,不允许禁用", oldRole.getName()));
|
||||
CheckUtils.throwIfNotEqual(request.getCode(), oldRole.getCode(),
|
||||
String.format("'%s' 是系统内置角色,不允许修改角色编码", oldRole.getName()));
|
||||
CheckUtils.throwIfNotEqual(request.getDataScope(), oldRole.getDataScope(),
|
||||
String.format("'%s' 是系统内置角色,不允许修改角色数据权限", oldRole.getName()));
|
||||
}
|
||||
|
||||
// 更新信息
|
||||
super.update(request, id);
|
||||
// 保存角色和菜单关联
|
||||
roleMenuService.save(request.getMenuIds(), id);
|
||||
// 保存角色和部门关联
|
||||
roleDeptService.save(request.getDeptIds(), id);
|
||||
if (!SysConsts.ADMIN_ROLE_CODE.equals(oldRole.getCode())) {
|
||||
// 保存角色和菜单关联
|
||||
roleMenuService.save(request.getMenuIds(), id);
|
||||
// 保存角色和部门关联
|
||||
roleDeptService.save(request.getDeptIds(), id);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void delete(List<Long> ids) {
|
||||
List<RoleDO> list =
|
||||
baseMapper.lambdaQuery().select(RoleDO::getName, RoleDO::getType).in(RoleDO::getId, ids).list();
|
||||
Optional<RoleDO> isSystemData = list.stream().filter(r -> DataTypeEnum.SYSTEM.equals(r.getType())).findFirst();
|
||||
CheckUtils.throwIf(isSystemData::isPresent,
|
||||
String.format("所选角色 '%s' 是系统内置角色,不允许删除", isSystemData.orElseGet(RoleDO::new).getName()));
|
||||
CheckUtils.throwIf(() -> userRoleService.countByRoleIds(ids) > 0, "所选角色存在用户关联,请解除关联后重试");
|
||||
|
||||
// 删除角色
|
||||
super.delete(ids);
|
||||
// 删除角色和菜单关联
|
||||
roleMenuService.deleteByRoleIds(ids);
|
||||
// 删除角色和部门关联
|
||||
roleDeptService.deleteByRoleIds(ids);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Reference in New Issue
Block a user