From a8b19cbacc4559419af8b06b2b0ed06209d147e0 Mon Sep 17 00:00:00 2001 From: glz <694770232@qq.com> Date: Wed, 8 Jul 2026 09:55:17 +0800 Subject: [PATCH] feat(admin): add admin role type management MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增后台角色类型枚举AdminRoleTypeEnum 2. 为AdminRole实体添加角色类型字段并设置默认值 3. 新增/更新管理员角色相关DTO的角色类型属性 4. 完善权限服务中的角色增删改查逻辑,增加系统角色保护校验 5. 修复任务消费中角色类型存储为枚举字符串的问题,改为存储枚举值 6. 新增初始化角色类型的SQL脚本 --- .../Dto/Admin/AdminPermissionDto.cs | 22 +++++++++++++++++++ .../Entity/AdminRole.cs | 8 +++++++ .../Enum/AdminRoleTypeEnum.cs | 21 ++++++++++++++++++ .../AdminPermissionService.cs | 11 ++++++++-- .../Consumers/JournalTaskReceiveConsumer.cs | 2 +- 5 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 QYZH.InteractiveMagazine.Models/Enum/AdminRoleTypeEnum.cs diff --git a/QYZH.InteractiveMagazine.Models/Dto/Admin/AdminPermissionDto.cs b/QYZH.InteractiveMagazine.Models/Dto/Admin/AdminPermissionDto.cs index 08855c8..860714c 100644 --- a/QYZH.InteractiveMagazine.Models/Dto/Admin/AdminPermissionDto.cs +++ b/QYZH.InteractiveMagazine.Models/Dto/Admin/AdminPermissionDto.cs @@ -1,3 +1,5 @@ +using QYZH.InteractiveMagazine.Models.Enum; + namespace QYZH.InteractiveMagazine.Models.Dto; /// @@ -148,6 +150,11 @@ public class AdminRoleInput /// public string Code { get; set; } = string.Empty; + /// + /// 角色类型 + /// + public AdminRoleTypeEnum Type { get; set; } = AdminRoleTypeEnum.Normal; + /// /// 备注 /// @@ -184,6 +191,11 @@ public class AdminRoleOutput /// public string Code { get; set; } = string.Empty; + /// + /// 角色类型 + /// + public AdminRoleTypeEnum Type { get; set; } + /// /// 备注 /// @@ -224,6 +236,11 @@ public class AdminRoleSimpleOutput /// 角色编码 /// public string Code { get; set; } = string.Empty; + + /// + /// 角色类型 + /// + public AdminRoleTypeEnum Type { get; set; } } /// @@ -241,6 +258,11 @@ public class AdminRoleQueryInput : PageQueryModel /// public string? Code { get; set; } + /// + /// 角色类型 + /// + public AdminRoleTypeEnum? Type { get; set; } + /// /// 状态 /// diff --git a/QYZH.InteractiveMagazine.Models/Entity/AdminRole.cs b/QYZH.InteractiveMagazine.Models/Entity/AdminRole.cs index 9ffd19a..a5b6982 100644 --- a/QYZH.InteractiveMagazine.Models/Entity/AdminRole.cs +++ b/QYZH.InteractiveMagazine.Models/Entity/AdminRole.cs @@ -1,4 +1,5 @@ using SqlSugar; +using QYZH.InteractiveMagazine.Models.Enum; namespace QYZH.InteractiveMagazine.Models.Entity; @@ -22,6 +23,13 @@ public partial class AdminRole : SqlSugarBaseEntity /// public string Code { get; set; } = string.Empty; + /// + /// Desc:角色类型,0=普通角色,1=系统角色 + /// Default:0 + /// Nullable:False + /// + public AdminRoleTypeEnum Type { get; set; } = AdminRoleTypeEnum.Normal; + /// /// Desc:备注 /// Default: diff --git a/QYZH.InteractiveMagazine.Models/Enum/AdminRoleTypeEnum.cs b/QYZH.InteractiveMagazine.Models/Enum/AdminRoleTypeEnum.cs new file mode 100644 index 0000000..b234aa3 --- /dev/null +++ b/QYZH.InteractiveMagazine.Models/Enum/AdminRoleTypeEnum.cs @@ -0,0 +1,21 @@ +using System.ComponentModel; + +namespace QYZH.InteractiveMagazine.Models.Enum; + +/// +/// 后台角色类型枚举 +/// +public enum AdminRoleTypeEnum +{ + /// + /// 普通角色 + /// + [Description("普通角色")] + Normal = 0, + + /// + /// 系统角色 + /// + [Description("系统角色")] + System = 1 +} diff --git a/QYZH.InteractiveMagazine.Service/AdminPermissionService.cs b/QYZH.InteractiveMagazine.Service/AdminPermissionService.cs index 77ec6d9..78fe19e 100644 --- a/QYZH.InteractiveMagazine.Service/AdminPermissionService.cs +++ b/QYZH.InteractiveMagazine.Service/AdminPermissionService.cs @@ -128,6 +128,7 @@ public class AdminPermissionService( { Name = input.Name.Trim(), Code = input.Code.Trim(), + Type = input.Type, Remark = input.Remark?.Trim(), Status = input.Status, CreatedBy = "System", @@ -157,9 +158,11 @@ public class AdminPermissionService( BusinessException.ThrowIf(role == null, "角色不存在", ResultCode.NOT_FOUND); await ValidateRoleInputAsync(input, id); + BusinessException.ThrowIf(role!.Type == AdminRoleTypeEnum.System && input.Type != AdminRoleTypeEnum.System, "系统角色不能修改为普通角色", ResultCode.FORBIDDEN); - role!.Name = input.Name.Trim(); + role.Name = input.Name.Trim(); role.Code = input.Code.Trim(); + role.Type = input.Type; role.Remark = input.Remark?.Trim(); role.Status = input.Status; role.UpdatedBy = "System"; @@ -182,6 +185,7 @@ public class AdminPermissionService( public async Task DeleteRoleAsync(long id) { var role = await adminRoleRepository.GetByIdAsync(id); + BusinessException.ThrowIf(role?.Type == AdminRoleTypeEnum.System, "系统角色不允许删除", ResultCode.FORBIDDEN); BusinessException.ThrowIf(role == null, "角色不存在", ResultCode.NOT_FOUND); var usedByUser = await adminUserRoleRepository.Queryable().AnyAsync(x => x.RoleId == id && !x.IsDeleted); @@ -221,6 +225,7 @@ public class AdminPermissionService( .Where(x => !x.IsDeleted) .WhereIF(!string.IsNullOrWhiteSpace(input.Name), x => x.Name.Contains(input.Name!)) .WhereIF(!string.IsNullOrWhiteSpace(input.Code), x => x.Code.Contains(input.Code!)) + .WhereIF(input.Type.HasValue, x => x.Type == input.Type!.Value) .WhereIF(input.Status.HasValue, x => x.Status == input.Status!.Value) .OrderByDescending(x => x.CreatedAt) .ToPageListAsync(input.PageIndex, input.PageSize, totalNumber); @@ -283,7 +288,8 @@ public class AdminPermissionService( { Id = role.Id, Name = role.Name, - Code = role.Code + Code = role.Code, + Type = role.Type }) .ToListAsync(); } @@ -490,6 +496,7 @@ public class AdminPermissionService( Id = role.Id, Name = role.Name, Code = role.Code, + Type = role.Type, Remark = role.Remark, Status = role.Status, MenuIds = menuIds, diff --git a/QYZH.InteractiveMagazine.WorkService/Consumers/JournalTaskReceiveConsumer.cs b/QYZH.InteractiveMagazine.WorkService/Consumers/JournalTaskReceiveConsumer.cs index 1f10f2a..e2da403 100644 --- a/QYZH.InteractiveMagazine.WorkService/Consumers/JournalTaskReceiveConsumer.cs +++ b/QYZH.InteractiveMagazine.WorkService/Consumers/JournalTaskReceiveConsumer.cs @@ -963,7 +963,7 @@ public class JournalTaskReceiveConsumer( LastTag = 0, DotPageNum = page?.PageNum ?? 0, PageResultUrl = string.Empty, - Type = task.Type.ToString(), + Type = ((int)task.Type).ToString(), DotPageNo = page?.PageNo ?? string.Empty, PageAnswerDotUrl = string.Empty, BreakCount = GetBreakCount(scoreUnit),