Browse Source

枚举值服务-迁移可用

King 3 years ago
parent
commit
bae31d110f

+ 3 - 0
Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj

@@ -39,6 +39,9 @@
     <None Update="Configuration\Cache.json">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Update="Configuration\Enum.json">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Update="Configuration\CodeGen.json">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>

+ 8 - 0
Admin.NET/Admin.NET.Application/Configuration/Enum.json

@@ -0,0 +1,8 @@
+{
+    "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
+
+    // 枚举实体所在程序集名称集合
+    "Enum": {
+        "EntityAssemblyNames": [ "Admin.NET.Core", "Admin.NET.Application", "Admin.NET.AppCPMS" ]
+    }
+}

+ 71 - 0
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -3813,6 +3813,16 @@
             默认邮件标题
             </summary>
         </member>
+        <member name="T:Admin.NET.Core.EnumOptions">
+            <summary>
+            枚举配置选项
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.EnumOptions.EntityAssemblyNames">
+            <summary>
+            枚举实体程序集名称集合
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.OAuthOptions">
             <summary>
             第三方登录授权配置选项
@@ -5439,6 +5449,67 @@
             <param name="input"></param>
             <returns></returns>
         </member>
+        <member name="T:Admin.NET.Core.Service.EnumDataInput">
+            <summary>
+            枚举输入参数
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.EnumDataInput.EnumName">
+            <summary>
+            枚举类型名称
+            </summary>
+            <example>Gender</example>
+        </member>
+        <member name="P:Admin.NET.Core.Service.QueryEnumDataInput.EntityName">
+            <summary>
+            实体名称
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.QueryEnumDataInput.FieldName">
+            <summary>
+            字段名称
+            </summary>
+        </member>
+        <member name="T:Admin.NET.Core.Service.EnumDataOutput">
+            <summary>
+            枚举输出参数
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.EnumDataOutput.Code">
+            <summary>
+            字典Id
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.EnumDataOutput.Value">
+            <summary>
+            字典值
+            </summary>
+        </member>
+        <member name="T:Admin.NET.Core.Service.SysEnumDataService">
+            <summary>
+            枚举值服务
+            </summary>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SysEnumDataService.GetEnumTypeList">
+            <summary>
+            获取所有枚举值
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SysEnumDataService.GetEnumDataList(Admin.NET.Core.Service.EnumDataInput)">
+            <summary>
+            通过枚举类型获取枚举值集合
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SysEnumDataService.GetEnumDataListByField(Admin.NET.Core.Service.QueryEnumDataInput)">
+            <summary>
+            通过实体字段类型获取相关集合(目前仅支持枚举类型)
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
         <member name="P:Admin.NET.Core.Service.PageFileInput.FileName">
             <summary>
             文件名称

+ 12 - 0
Admin.NET/Admin.NET.Core/Option/EnumOptions.cs

@@ -0,0 +1,12 @@
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 枚举配置选项
+/// </summary>
+public sealed class EnumOptions : IConfigurableOptions
+{
+    /// <summary>
+    /// 枚举实体程序集名称集合
+    /// </summary>
+    public List<string> EntityAssemblyNames { get; set; }
+}

+ 31 - 0
Admin.NET/Admin.NET.Core/Service/Enum/Dto/EnumDataInput.cs

@@ -0,0 +1,31 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Admin.NET.Core.Service;
+
+/// <summary>
+/// 枚举输入参数
+/// </summary>
+public class EnumDataInput
+{
+    /// <summary>
+    /// 枚举类型名称
+    /// </summary>
+    /// <example>Gender</example>
+    [Required(ErrorMessage = "枚举类型不能为空")]
+    public string EnumName { get; set; }
+}
+
+public class QueryEnumDataInput
+{
+    /// <summary>
+    /// 实体名称
+    /// </summary>
+    [Required(ErrorMessage = "实体名称不能为空")]
+    public string EntityName { get; set; }
+
+    /// <summary>
+    /// 字段名称
+    /// </summary>
+    [Required(ErrorMessage = "字段名称不能为空")]
+    public string FieldName { get; set; }
+}

+ 17 - 0
Admin.NET/Admin.NET.Core/Service/Enum/Dto/EnumDataOutput.cs

@@ -0,0 +1,17 @@
+namespace Admin.NET.Core.Service;
+
+/// <summary>
+/// 枚举输出参数
+/// </summary>
+public class EnumDataOutput
+{
+    /// <summary>
+    /// 字典Id
+    /// </summary>
+    public int Code { get; set; }
+
+    /// <summary>
+    /// 字典值
+    /// </summary>
+    public string Value { get; set; }
+}

+ 112 - 0
Admin.NET/Admin.NET.Core/Service/Enum/SysEnumDataService.cs

@@ -0,0 +1,112 @@
+namespace Admin.NET.Core.Service;
+
+/// <summary>
+/// 枚举值服务
+/// </summary>
+[ApiDescriptionSettings(Name = "SysEnumData", Order = 1000)]
+[AllowAnonymous]
+public class SysEnumDataService : IDynamicApiController, ITransient
+{
+    private readonly EnumOptions _enumOptions;
+
+    public SysEnumDataService(IOptions<EnumOptions> enumOptions)
+    {
+        _enumOptions = enumOptions.Value;
+    }
+
+    /// <summary>
+    /// 获取所有枚举值
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("/sysEnumData/enumTypeList")]
+    public dynamic GetEnumTypeList()
+    {
+
+        List<dynamic> result = new List<dynamic>();
+        var enumTypeList = App.EffectiveTypes.Where(t => t.IsEnum && _enumOptions.EntityAssemblyNames.Contains(t.Assembly.GetName().Name)).ToList();
+
+        foreach (var item in enumTypeList)
+        {
+            result.Add(GetEnumDescription(item));
+        }
+        return result;
+    }
+
+    private dynamic GetEnumDescription(Type type)
+    {
+
+        string description = type.Name;
+        var attrs = type.GetCustomAttributes(typeof(DescriptionAttribute), false);
+        if (attrs.Any())
+        {
+            //获取到:超级管理员
+            var att = ((DescriptionAttribute[])attrs)[0];
+            description = att.Description;
+        }
+        return new
+        {
+            Name = description,
+            Code = type.Name,
+            Sort = 100,
+            Remark = description
+        };
+    }
+
+    /// <summary>
+    /// 通过枚举类型获取枚举值集合
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpGet("/sysEnumData/list")]
+    public async Task<dynamic> GetEnumDataList([FromQuery] EnumDataInput input)
+    {
+        // 查找枚举
+        var enumType = App.EffectiveTypes.FirstOrDefault(t => t.IsEnum && t.Name == input.EnumName);
+        if (enumType == null)
+            throw Oops.Oh(ErrorCodeEnum.D1502).StatusCode(405);
+
+        //// 获取枚举的Key和描述
+        return await Task.Run(() =>
+               EnumExtension.GetEnumDescDictionary(enumType)
+               .Select(x => new EnumDataOutput
+               {
+                   Code = x.Key,
+                   Value = x.Value
+               }));
+    }
+
+    /// <summary>
+    /// 通过实体字段类型获取相关集合(目前仅支持枚举类型)
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpGet("/sysEnumData/listByFiled")]
+    public async Task<dynamic> GetEnumDataListByField([FromQuery] QueryEnumDataInput input)
+    {
+
+        // 获取实体类型属性
+        Type entityType = null;
+
+        foreach (var item in _enumOptions.EntityAssemblyNames)
+        {
+            entityType = Type.GetType($"{item}.Entity.{input.EntityName}");
+            if (entityType != null)
+                break;
+        }
+        if (entityType == null) throw Oops.Oh(ErrorCodeEnum.D1504);
+
+        // 获取字段类型
+        var fieldType = entityType.GetProperties().FirstOrDefault(p => p.Name == input.FieldName)?.PropertyType;
+        if (fieldType is not { IsEnum: true })
+            throw Oops.Oh(ErrorCodeEnum.D1503);
+
+        // 获取枚举的Key和描述
+        return await Task.Run(() =>
+               EnumExtension.GetEnumDescDictionary(fieldType)
+               .Select(x => new EnumDataOutput
+               {
+                   Code = x.Key,
+                   Value = x.Value
+               }));
+    }
+}

+ 1 - 0
Admin.NET/Admin.NET.Web.Core/ProjectOptions.cs

@@ -24,6 +24,7 @@ public static class ProjectOptions
         services.AddConfigurableOptions<WechatPayOptions>();
         services.AddConfigurableOptions<PayCallBackOptions>();
         services.AddConfigurableOptions<CodeGenOptions>();
+        services.AddConfigurableOptions<EnumOptions>();
         services.AddConfigurableOptions<APIJSONOptions>();
         services.AddConfigurableOptions<EmailOptions>();
         services.AddConfigurableOptions<OAuthOptions>();