diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/RoleDO.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/RoleDO.java index 5cbb201c..b08c7977 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/RoleDO.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/RoleDO.java @@ -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; } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/RoleRequest.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/RoleRequest.java index 624238d4..98dae03c 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/RoleRequest.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/RoleRequest.java @@ -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 menuIds; + private List menuIds = new ArrayList<>(); /** * 数据权限(1:全部数据权限,2:本部门及以下数据权限,3:本部门数据权限,4:仅本人数据权限,5:自定义数据权限) @@ -87,7 +88,7 @@ public class RoleRequest extends BaseRequest { * 权限范围:部门 ID 列表 */ @Schema(description = "权限范围:部门 ID 列表") - private List deptIds; + private List deptIds = new ArrayList<>(); /** * 状态(1:启用,2:禁用) diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleDetailVO.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleDetailVO.java index 7daf089d..19ba77c8 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleDetailVO.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleDetailVO.java @@ -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 deptIds; + + @Override + public Boolean getDisabled() { + return DataTypeEnum.SYSTEM.equals(type); + } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleVO.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleVO.java index 892e7454..b39a1a92 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleVO.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleVO.java @@ -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); } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleDeptService.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleDeptService.java index 8e225fe6..5668e788 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleDeptService.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleDeptService.java @@ -52,4 +52,12 @@ public interface RoleDeptService { * 部门 ID 列表 */ void deleteByDeptIds(List deptIds); + + /** + * 根据角色 ID 删除 + * + * @param roleIds + * 角色 ID 列表 + */ + void deleteByRoleIds(List roleIds); } \ No newline at end of file diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleMenuService.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleMenuService.java index b22204d6..dadec1b2 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleMenuService.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleMenuService.java @@ -44,4 +44,12 @@ public interface RoleMenuService { * @return 菜单 ID 列表 */ List listMenuIdByRoleIds(List roleIds); + + /** + * 根据角色 ID 删除 + * + * @param roleIds + * 角色 ID 列表 + */ + void deleteByRoleIds(List roleIds); } \ No newline at end of file diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleDeptServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleDeptServiceImpl.java index 5d0b1357..a4068a5a 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleDeptServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleDeptServiceImpl.java @@ -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 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 deptIds) { roleDeptMapper.lambdaUpdate().in(RoleDeptDO::getDeptId, deptIds).remove(); } + + @Override + public void deleteByRoleIds(List roleIds) { + roleDeptMapper.lambdaUpdate().in(RoleDeptDO::getRoleId, roleIds).remove(); + } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleMenuServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleMenuServiceImpl.java index c3101e1b..ff95d99a 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleMenuServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleMenuServiceImpl.java @@ -44,9 +44,6 @@ public class RoleMenuServiceImpl implements RoleMenuService { @Override public void save(List 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 roleIds) { + roleMenuMapper.lambdaUpdate().in(RoleMenuDO::getRoleId, roleIds).remove(); + } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleServiceImpl.java index e7ff7a84..029f5de6 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleServiceImpl.java @@ -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 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 ids) { + List list = + baseMapper.lambdaQuery().select(RoleDO::getName, RoleDO::getType).in(RoleDO::getId, ids).list(); + Optional 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 diff --git a/continew-admin-ui/src/api/system/role.ts b/continew-admin-ui/src/api/system/role.ts index 7dd713db..4d75918e 100644 --- a/continew-admin-ui/src/api/system/role.ts +++ b/continew-admin-ui/src/api/system/role.ts @@ -13,6 +13,7 @@ export interface RoleRecord { dataScope: number; deptIds?: Array; status?: number; + type?: number; createUserString?: string; createTime?: string; updateUserString?: string; diff --git a/continew-admin-ui/src/views/system/role/index.vue b/continew-admin-ui/src/views/system/role/index.vue index 1b9f54b2..a37cb038 100644 --- a/continew-admin-ui/src/views/system/role/index.vue +++ b/continew-admin-ui/src/views/system/role/index.vue @@ -116,7 +116,7 @@ >