Explorar o código

增加自定义多个全局规范化结果示例

zuohuaijun %!s(int64=3) %!d(string=hai) anos
pai
achega
57a42a96a0

+ 3 - 79
Admin.NET/Admin.NET.Application/Service/TestService.cs

@@ -83,87 +83,11 @@ public class TestService : IDynamicApiController, ITransient
     }
 
     /// <summary>
-    /// 测试 Markdown
+    /// 自定义规范化结果
     /// </summary>
-    /// <remarks>
-    /// # 先知 / Furion ([探索版](https://gitee.com/dotnetchina/Furion/tree/experimental/))
-    ///
-    ///     一个应用程序框架,您可以将它集成到任何.NET/C# 应用程序中。
-    ///
-    /// An application framework that you can integrate into any.NET/C# application.
-    ///
-    /// ## 安装 / Installation
-    ///
-    /// - [Package Manager] (https://www.nuget.org/packages/Furion)
-    ///
-    /// ```powershell
-    /// Install-Package Furion
-    /// ```
-    ///
-    /// - [.NET CLI] (https://www.nuget.org/packages/Furion)
-    ///
-    /// ```powershell
-    /// dotnet add package Furion
-    /// ```
-    ///
-    /// ## 例子 / Examples
-    ///
-    /// 我们在[主页](https://dotnetchina.gitee.io/furion)上有不少例子,这是让您入门的第一个:
-    ///
-    /// We have several examples [on the website] (https://dotnetchina.gitee.io/furion). Here is the first one to get you started:
-    ///
-    /// ```cs
-    /// Serve.Run();
-    ///
-    ///     [DynamicApiController]
-    ///     public class HelloService
-    ///     {
-    ///         public string Say()
-    ///         {
-    ///             return "Hello, Furion";
-    ///         }
-    ///     }
-    /// ```
-    ///
-    /// 打开浏览器访问 `https://localhost:5001`。
-    ///
-    /// Open browser access `https://localhost:5001`.
-    ///
-    /// ## 文档 / Documentation
-    ///
-    /// 您可以在[主页] (https://dotnetchina.gitee.io/furion)或[备份主页](https://furion.icu)找到 Furion 文档。
-    ///
-    /// You can find the Furion documentation[on the website](https://dotnetchina.gitee.io/furion) or [on the backup website](https://furion.icu).
-    ///
-    /// ## 贡献 / Contributing
-    ///
-    /// 该存储库的主要目的是继续发展 Furion 核心,使其更快、更易于使用。 Furion 的开发在[Gitee](https://gitee.com/dotnetchina/Furion) 上公开进行,我们感谢社区贡献错误修复和改进。
-    ///
-    /// 阅读[贡献指南] (https://dotnetchina.gitee.io/furion/docs/contribute)内容,了解如何参与改进 Furion。
-    ///
-    /// The main purpose of this repository is to continue evolving Furion core, making it faster and easier to use.Development of Furion happens in the open on[Gitee] (https://gitee.com/dotnetchina/Furion), and we are grateful to the community for contributing bugfixes and improvements.
-    ///
-    /// Read[contribution documents] (https://dotnetchina.gitee.io/furion/docs/contribute) to learn how you can take part in improving Furion.
-    ///
-    /// ## 许可证 / License
-    ///
-    /// Furion 采用[MulanPSL - 2.0](https://gitee.com/dotnetchina/Furion/blob/master/LICENSE) 开源许可证。
-    ///
-    /// Furion uses the[MulanPSL - 2.0] (https://gitee.com/dotnetchina/Furion/blob/master/LICENSE) open source license.
-    ///
-    /// ```
-    /// Copyright(c) 2020-2022 百小僧, Baiqian Co., Ltd.
-    /// Furion is licensed under Mulan PSL v2.
-    /// You can use this software according to the terms andconditions of the Mulan PSL v2.
-    /// You may obtain a copy of Mulan PSL v2 at:
-    ///             https://gitee.com/dotnetchina/Furion/blob/master/LICENSE
-    /// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUTWARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
-    /// See the Mulan PSL v2 for more details.
-    /// ```
-    ///
-    /// </remarks>
     /// <returns></returns>
-    public string GetDescription()
+    [CustomUnifyResult("APP")]
+    public string CustomUnifyResult()
     {
         return "Furion";
     }

+ 6 - 1
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -9,6 +9,11 @@
             常量下拉框特性
             </summary>
         </member>
+        <member name="T:Admin.NET.Core.CustomUnifyResultAttribute">
+            <summary>
+            自定义规范化结果特性
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.NotTableAttribute">
             <summary>
             非实体表特性
@@ -7468,7 +7473,7 @@
             <param name="unifyResultSettings"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.NET.Core.AdminResultProvider.RESTfulResult(System.Int32,System.Boolean,System.Object,System.Object)">
+        <member name="M:Admin.NET.Core.AdminResultProvider.RESTfulResult(Microsoft.AspNetCore.Http.HttpContext,System.Int32,System.Boolean,System.Object,System.Object)">
             <summary>
             返回 RESTful 风格结果集
             </summary>

+ 2 - 0
Admin.NET/Admin.NET.Core/Attribute/ConstSelectorAttribute.cs

@@ -3,6 +3,8 @@
 /// <summary>
 /// 常量下拉框特性
 /// </summary>
+[SuppressSniffer]
+[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)]
 public class ConstSelectorAttribute : Attribute
 {
     public string Name { get; set; }

+ 16 - 0
Admin.NET/Admin.NET.Core/Attribute/CustomUnifyResultAttribute.cs

@@ -0,0 +1,16 @@
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 自定义规范化结果特性
+/// </summary>
+[SuppressSniffer]
+[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)]
+public class CustomUnifyResultAttribute : Attribute
+{
+    public string Name { get; set; }
+
+    public CustomUnifyResultAttribute(string name)
+    {
+        Name = name;
+    }
+}

+ 2 - 1
Admin.NET/Admin.NET.Core/Attribute/NotTableAttribute.cs

@@ -3,7 +3,8 @@
 /// <summary>
 /// 非实体表特性
 /// </summary>
-[SuppressSniffer, AttributeUsage(AttributeTargets.Class)]
+[SuppressSniffer]
+[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
 public class NotTableAttribute : Attribute
 {
 }

+ 1 - 1
Admin.NET/Admin.NET.Core/Entity/SysDictData.cs

@@ -1,4 +1,4 @@
-namespace Admin.NET.Core;
+namespace Admin.NET.Core;
 
 /// <summary>
 /// 系统字典值表

+ 2 - 1
Admin.NET/Admin.NET.Core/Service/DataBase/SysDataBaseService.cs

@@ -205,7 +205,8 @@ public class SysDataBaseService : IDynamicApiController, ITransient
             m.DataType = CodeGenUtil.ConvertDataType(m.DataType);
         });
         var tContent = File.ReadAllText(templatePath);
-        var tResult = _viewEngine.RunCompileFromCached(tContent, new {
+        var tResult = _viewEngine.RunCompileFromCached(tContent, new
+        {
             input.TableName,
             input.EntityName,
             input.BaseClassName,

+ 4 - 2
Admin.NET/Admin.NET.Core/Service/Dict/SysDictDataService.cs

@@ -144,7 +144,8 @@ public class SysDictDataService : IDynamicApiController, ITransient
             new JoinQueryInfos(JoinType.Left, a.Id == b.DictTypeId))
             .Where(a => a.Code == code)
             .Where((a, b) => a.Status == StatusEnum.Enable && b.Status == StatusEnum.Enable)
-            .Select((a, b) => new {
+            .Select((a, b) => new
+            {
                 Label = b.Value,
                 Value = b.Code
             }).ToListAsync();
@@ -162,7 +163,8 @@ public class SysDictDataService : IDynamicApiController, ITransient
             new JoinQueryInfos(JoinType.Left, a.Id == b.DictTypeId))
             .Where((a, b) => a.Code == input.Code)
             .WhereIF(input.Status.HasValue, (a, b) => b.Status == (StatusEnum)input.Status.Value)
-            .Select((a, b) => new {
+            .Select((a, b) => new
+            {
                 Label = b.Value,
                 Value = b.Code
             }).ToListAsync();

+ 4 - 2
Admin.NET/Admin.NET.Core/Service/Notice/SysNoticeService.cs

@@ -226,14 +226,16 @@ public class SysNoticeService : ISysNoticeService, IDynamicApiController, ITrans
         int index = 0;
         foreach (var item in dic)
         {
-            noticeClays.Add(new {
+            noticeClays.Add(new
+            {
                 Index = index++,
                 Key = item.Describe,
                 Value = item.Value,
                 NoticeData = notices.Where(m => m.Type == item.Value).ToList()
             });
         }
-        return new {
+        return new
+        {
             Rows = noticeClays,
             TotalRows = count
         };

+ 4 - 2
Admin.NET/Admin.NET.Core/Service/WeChat/WeChatPayService.cs

@@ -85,7 +85,8 @@ public class WeChatPayService : IDynamicApiController, ITransient
         };
         await _weChatPayUserRep.InsertAsync(wechatPay);
 
-        return new {
+        return new
+        {
             response.PrepayId,
             request.OutTradeNumber
         };
@@ -132,7 +133,8 @@ public class WeChatPayService : IDynamicApiController, ITransient
         };
         await _weChatPayUserRep.InsertAsync(wechatPay);
 
-        return new {
+        return new
+        {
             response.PrepayId,
             request.OutTradeNumber
         };

+ 2 - 1
Admin.NET/Admin.NET.Core/Service/WeChat/WeChatService.cs

@@ -80,7 +80,8 @@ public class WeChatService : IDynamicApiController, ITransient
         var wxUser = await _weChatUserRep.GetFirstAsync(p => p.OpenId == input.OpenId);
         if (wxUser == null)
             throw Oops.Oh("微信登录");
-        return new {
+        return new
+        {
             wxUser.Avatar,
             accessToken = JWTEncryption.Encrypt(new Dictionary<string, object>
             {

+ 16 - 6
Admin.NET/Admin.NET.Core/Util/AdminResultProvider.cs

@@ -14,7 +14,7 @@ public class AdminResultProvider : IUnifyResultProvider
     /// <returns></returns>
     public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
     {
-        return new JsonResult(RESTfulResult(metadata.StatusCode, errors: metadata.Errors));
+        return new JsonResult(RESTfulResult(context.HttpContext, metadata.StatusCode, errors: metadata.Errors));
     }
 
     /// <summary>
@@ -25,7 +25,7 @@ public class AdminResultProvider : IUnifyResultProvider
     /// <returns></returns>
     public IActionResult OnSucceeded(ActionExecutedContext context, object data)
     {
-        return new JsonResult(RESTfulResult(StatusCodes.Status200OK, true, data));
+        return new JsonResult(RESTfulResult(context.HttpContext, StatusCodes.Status200OK, true, data));
     }
 
     /// <summary>
@@ -36,7 +36,7 @@ public class AdminResultProvider : IUnifyResultProvider
     /// <returns></returns>
     public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
     {
-        return new JsonResult(RESTfulResult(metadata.StatusCode ?? StatusCodes.Status400BadRequest, errors: metadata.ValidationResult));
+        return new JsonResult(RESTfulResult(context.HttpContext, metadata.StatusCode ?? StatusCodes.Status400BadRequest, errors: metadata.ValidationResult));
     }
 
     /// <summary>
@@ -55,12 +55,12 @@ public class AdminResultProvider : IUnifyResultProvider
         {
             // 处理 401 状态码
             case StatusCodes.Status401Unauthorized:
-                await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "401 登录已过期,请重新登录"),
+                await context.Response.WriteAsJsonAsync(RESTfulResult(context, statusCode, errors: "401 登录已过期,请重新登录"),
                     App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
                 break;
             // 处理 403 状态码
             case StatusCodes.Status403Forbidden:
-                await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "403 禁止访问,没有权限"),
+                await context.Response.WriteAsJsonAsync(RESTfulResult(context, statusCode, errors: "403 禁止访问,没有权限"),
                     App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
                 break;
 
@@ -76,8 +76,18 @@ public class AdminResultProvider : IUnifyResultProvider
     /// <param name="data"></param>
     /// <param name="errors"></param>
     /// <returns></returns>
-    private static AdminResult<object> RESTfulResult(int statusCode, bool succeeded = default, object data = default, object errors = default)
+    private static AdminResult<object> RESTfulResult(HttpContext context, int statusCode, bool succeeded = default, object data = default, object errors = default)
     {
+        //// 获取自定义规范化结果特性
+        //var methodAttr = context.GetMetadata<CustomUnifyResultAttribute>();
+        //if (methodAttr.Name == "APP")
+        //{
+        //    return new JsonResult(new
+        //    {
+        //        AppResult = "APP返回格式"
+        //    });
+        //}
+
         return new AdminResult<object>
         {
             Code = statusCode,

+ 10 - 5
Admin.NET/Admin.NET.Core/Util/ServerUtil.cs

@@ -13,7 +13,8 @@ public class ServerUtil
     {
         var furionAssembly = typeof(Furion.App).Assembly.GetName();
         var sqlSugarAssembly = typeof(ISqlSugarClient).Assembly.GetName();
-        return new {
+        return new
+        {
             HostName = Environment.MachineName, // HostName
             SystemOs = RuntimeInformation.OSDescription, // 系统名称
             OsArchitecture = Environment.OSVersion.Platform.ToString() + " " + RuntimeInformation.OSArchitecture.ToString(), // 系统架构
@@ -31,7 +32,8 @@ public class ServerUtil
     public static dynamic GetServerUseInfo()
     {
         var ramInfo = GetRamInfo();
-        return new {
+        return new
+        {
             TotalRam = Math.Ceiling(ramInfo.Total / 1024).ToString() + " GB", // 总内存
             RamRate = Math.Ceiling(100 * ramInfo.Used / ramInfo.Total) + " %", // 内存使用率
             CpuRate = Math.Ceiling(double.Parse(GetCpuRate())) + " %", // Cpu使用率
@@ -45,7 +47,8 @@ public class ServerUtil
     /// <returns></returns>
     public static async Task<dynamic> GetServerNetWorkInfo()
     {
-        return new {
+        return new
+        {
             WanIp = await GetWanIpFromPCOnline(), // 外网IP
             LocalIp = App.HttpContext?.Connection?.LocalIpAddress.ToString(),
             SendAndReceived = "", //"上行" + Math.Round(networkInfo.SendLength / 1024.0 / 1024 / 1024, 2) + "GB 下行" + Math.Round(networkInfo.ReceivedLength / 1024.0 / 1024 / 1024, 2) + "GB", // 上下行流量统计
@@ -64,7 +67,8 @@ public class ServerUtil
             var output = ShellUtil.Bash("free -m");
             var lines = output.Split("\n");
             var memory = lines[1].Split(" ", StringSplitOptions.RemoveEmptyEntries);
-            return new {
+            return new
+            {
                 Total = double.Parse(memory[1]),
                 Used = double.Parse(memory[2]),
                 Free = double.Parse(memory[3])
@@ -78,7 +82,8 @@ public class ServerUtil
             var totalMemoryParts = lines[1].Split("=", StringSplitOptions.RemoveEmptyEntries);
             var total = Math.Round(double.Parse(totalMemoryParts[1]) / 1024, 2);
             var free = Math.Round(double.Parse(freeMemoryParts[1]) / 1024, 2);
-            return new {
+            return new
+            {
                 Total = total,
                 Free = free,
                 Used = total - free