Browse Source

chore: 添加枚举名校验,避免相关功能可能出现的bug

喵你个旺呀 1 year ago
parent
commit
4c5105e540

+ 12 - 0
Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs

@@ -318,6 +318,18 @@ public enum ErrorCodeEnum
     /// </summary>
     [ErrorCodeItemMetadata("字典状态错误")]
     D3005,
+    
+    /// <summary>
+    /// 字典编码不能以Enum结尾
+    /// </summary>
+    [ErrorCodeItemMetadata("字典编码不能以Enum结尾")]
+    D3006,
+    
+    /// <summary>
+    /// 禁止修改枚举类型的字典编码
+    /// </summary>
+    [ErrorCodeItemMetadata("禁止修改枚举类型的字典编码")]
+    D3007,
 
     /// <summary>
     /// 菜单已存在

+ 7 - 0
Admin.NET/Admin.NET.Core/Job/EnumToDictJob.cs

@@ -33,6 +33,13 @@ public class EnumToDictJob : IJob
         
         using var serviceScope = _scopeFactory.CreateScope();
         var db = serviceScope.ServiceProvider.GetRequiredService<ISqlSugarClient>().CopyNew();
+        
+        var sysEnumService = serviceScope.ServiceProvider.GetRequiredService<SysEnumService>();
+        var sysDictTypeList = GetDictByEnumType(sysEnumService.GetEnumTypeList());
+
+        // 校验枚举类命名规范,字典相关功能中需要通过后缀判断是否为枚举类型
+        if (sysDictTypeList.Any(x => !x.Name.EndsWith("Enum"))) throw Oops.Bah("枚举类名称必须以Enum结尾");
+            
         try
         {
             await db.BeginTranAsync();

+ 7 - 3
Admin.NET/Admin.NET.Core/Service/Dict/SysDictTypeService.cs

@@ -71,6 +71,8 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     [DisplayName("添加字典类型")]
     public async Task AddDictType(AddDictTypeInput input)
     {
+        if (input.Code.ToLower().EndsWith("enum")) throw Oops.Oh(ErrorCodeEnum.D3006);
+        
         var isExist = await _sysDictTypeRep.IsAnyAsync(u => u.Code == input.Code);
         if (isExist) throw Oops.Oh(ErrorCodeEnum.D3001);
 
@@ -87,10 +89,12 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     [DisplayName("更新字典类型")]
     public async Task UpdateDictType(UpdateDictTypeInput input)
     {
-        var isExist = await _sysDictTypeRep.IsAnyAsync(u => u.Id == input.Id);
-        if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000);
+        var dict = await _sysDictTypeRep.GetFirstAsync(x => x.Id == input.Id);
+        if (dict == null) throw Oops.Oh(ErrorCodeEnum.D3000);
+        
+        if (dict.Code.ToLower().EndsWith("enum") && input.Code != dict.Code) throw Oops.Oh(ErrorCodeEnum.D3007);
 
-        isExist = await _sysDictTypeRep.IsAnyAsync(u => u.Code == input.Code && u.Id != input.Id);
+        var isExist = await _sysDictTypeRep.IsAnyAsync(u => u.Code == input.Code && u.Id != input.Id);
         if (isExist) throw Oops.Oh(ErrorCodeEnum.D3001);
 
         _sysCacheService.Remove($"{CacheConst.KeyDict}{input.Code}");