mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-10-31 10:57:13 +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