فهرست منبع

😁优化调整APIJSON相关代码

zuohuaijun 2 سال پیش
والد
کامیت
22ebc7d7e5

+ 47 - 0
Admin.NET/Admin.NET.Application/Configuration/Logging.json

@@ -0,0 +1,47 @@
+{
+  "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
+
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning",
+      "Microsoft.EntityFrameworkCore": "Information"
+    },
+    "File": {
+      "Enabled": false, // 启用文件日志
+      "FileName": "logs/{0:yyyyMMdd}_{1}.log", // 日志文件
+      "Append": true, // 追加覆盖
+      // "MinimumLevel": "Information", // 日志级别
+      "FileSizeLimitBytes": 10485760, // 10M=10*1024*1024
+      "MaxRollingFiles": 30 // 只保留30个文件
+    },
+    "Database": {
+      "Enabled": true, // 启用数据库日志
+      "MinimumLevel": "Information"
+    },
+    "ElasticSearch": {
+      "Enabled": false, // 启用ES日志
+      "AuthType": "Basic", // ES认证类型,可选 Basic、ApiKey、Base64ApiKey
+      "User": "dilon", // Basic认证的用户名,使用Basic认证类型时必填
+      "Password": "123456", // Basic认证的密码,使用Basic认证类型时必填
+      "ApiId": "", // 使用ApiKey认证类型时必填
+      "ApiKey": "", // 使用ApiKey认证类型时必填
+      "Base64ApiKey": "TmtrOEszNEJuQ0NyaWlydGtROFk6SG1RZ0w3YzBTc2lCanJTYlV3aXNzZw==", // 使用Base64ApiKey认证类型时必填
+      "Fingerprint": "37:08:6A:C6:06:CC:9A:43:CF:ED:25:A2:1C:A4:69:57:90:31:2C:06:CA:61:56:39:6A:9C:46:11:BD:22:51:DA", // ES使用Https时的证书指纹
+      "ServerUris": [ "http://192.168.1.100:9200" ], // 地址
+      "DefaultIndex": "adminnet" // 索引
+    },
+    "Monitor": {
+      "GlobalEnabled": true, // 启用全局拦截日志
+      "IncludeOfMethods": [], // 拦截特定方法,当GlobalEnabled=false有效
+      "ExcludeOfMethods": [], // 排除特定方法,当GlobalEnabled=true有效
+      "BahLogLevel": "Information", // Oops.Oh 和 Oops.Bah 业务日志输出级别
+      "WithReturnValue": true, // 是否包含返回值,默认true
+      "ReturnValueThreshold": 500, // 返回值字符串阈值,默认0全量输出
+      "JsonBehavior": "None", // 是否输出Json,默认None(OnlyJson、All)
+      "JsonIndented": false, // 是否格式化Json
+      "UseUtcTimestamp": false, // 时间格式UTC、LOCAL
+      "ConsoleLog": true // 是否显示控制台日志
+    }
+  }
+}

+ 1 - 1
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -39,7 +39,7 @@
     <PackageReference Include="SixLabors.ImageSharp.Web" Version="3.1.1" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.0.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.1.0" />
-    <PackageReference Include="SqlSugarCore" Version="5.1.4.146-preview08" />
+    <PackageReference Include="SqlSugarCore" Version="5.1.4.146-preview10" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.10" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />

+ 3 - 5
Admin.NET/Admin.NET.Core/Extension/ObjectExtension.cs

@@ -254,15 +254,13 @@ public static partial class ObjectExtension
     /// <summary>
     /// 是否有值
     /// </summary>
-    /// <param name="str"></param>
+    /// <param name="obj"></param>
     /// <returns></returns>
-    public static bool HasValue(this object str)
+    public static bool IsNullOrEmpty(this object obj)
     {
-        return str != null && !string.IsNullOrEmpty(str.ToString());
+        return obj == null || string.IsNullOrEmpty(obj.ToString());
     }
 
-
-
     /// <summary>
     /// 字符串掩码
     /// </summary>

+ 1 - 1
Admin.NET/Admin.NET.Core/GlobalUsings.cs

@@ -15,7 +15,6 @@ global using Furion.EventBus;
 global using Furion.FriendlyException;
 global using Furion.JsonSerialization;
 global using Furion.Logging;
-global using Furion.RemoteRequest;
 global using Furion.RemoteRequest.Extensions;
 global using Furion.Schedule;
 global using Furion.UnifyResult;
@@ -35,6 +34,7 @@ global using Microsoft.Extensions.Logging;
 global using Microsoft.Extensions.Options;
 global using NewLife;
 global using NewLife.Caching;
+global using Newtonsoft.Json.Linq;
 global using SKIT.FlurlHttpClient;
 global using SKIT.FlurlHttpClient.Wechat.Api;
 global using SKIT.FlurlHttpClient.Wechat.Api.Models;

+ 51 - 72
Admin.NET/Admin.NET.Core/Service/APIJSON/APIJSONService.cs

@@ -2,10 +2,6 @@
 //
 // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证
 
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-using OBS.Model;
-
 namespace Admin.NET.Core.Service;
 
 /// <summary>
@@ -41,33 +37,33 @@ public class APIJSONService : IDynamicApiController, ITransient
         return _selectTable.Query(jobject);
     }
 
-
+    /// <summary>
+    /// 查询表
+    /// </summary>
+    /// <param name="table"></param>
+    /// <param name="jobject"></param>
+    /// <returns></returns>
     [HttpPost("get/{table}")]
-    public async Task<JObject> QueryByTable([FromRoute] string table, [FromBody] JObject jobject)
+    public JObject QueryByTable([FromRoute] string table, [FromBody] JObject jobject)
     {
+        var ht = new JObject
+        {
+            { table + "[]", jobject }
+        };
 
-        JObject ht = new JObject();
-
-        ht.Add(table + "[]", jobject);
-
+        // 自动添加总计数量
         if (jobject["query"] != null && jobject["query"].ToString() != "0" && jobject["total@"] == null)
-        {
-            //自动添加总计数量
             ht.Add("total@", "");
-        }
 
-        //每页最大1000条数据
+        // 每页最大1000条数据
         if (jobject["count"] != null && int.Parse(jobject["count"].ToString()) > 1000)
-        {
             throw Oops.Bah("count分页数量最大不能超过1000");
-        }
 
-        bool isDebug = (jobject["@debug"] != null && jobject["@debug"].ToString() != "0");
         jobject.Remove("@debug");
 
-        bool hasTableKey = false;
-        List<string> ignoreConditions = new List<string> { "page", "count", "query" };
-        JObject tableConditions = new JObject();//表的其它查询条件,比如过滤,字段等
+        var hasTableKey = false;
+        var ignoreConditions = new List<string> { "page", "count", "query" };
+        var tableConditions = new JObject(); // 表的其它查询条件,比如过滤、字段等
         foreach (var item in jobject)
         {
             if (item.Key.Equals(table, StringComparison.CurrentCultureIgnoreCase))
@@ -76,9 +72,7 @@ public class APIJSONService : IDynamicApiController, ITransient
                 break;
             }
             if (!ignoreConditions.Contains(item.Key.ToLower()))
-            {
                 tableConditions.Add(item.Key, item.Value);
-            }
         }
 
         foreach (var removeKey in tableConditions)
@@ -87,133 +81,118 @@ public class APIJSONService : IDynamicApiController, ITransient
         }
 
         if (!hasTableKey)
-        {
             jobject.Add(table, tableConditions);
-        }
 
         return Query(ht);
     }
+
     /// <summary>
     /// 新增
     /// </summary>
-    /// <param name="tables">表对象或数组,如果没有传id则后端生成id</param>
+    /// <param name="tables">表对象或数组,若没有传Id则后端生成Id</param>
     /// <returns></returns>
     [HttpPost("post")]
     [UnitOfWork]
     public JObject Add([FromBody] JObject tables)
     {
-
-        JObject ht = new JObject();
-        foreach (var table in tables)//遍历不同的表
+        var ht = new JObject();
+        foreach (var table in tables)
         {
-            string talbeName = table.Key.Trim();
+            var talbeName = table.Key.Trim();
             var role = _identityService.GetRole();
             if (!role.Insert.Table.Contains(talbeName, StringComparer.CurrentCultureIgnoreCase))
-            {
                 throw Oops.Bah($"没权限添加{talbeName}");
-            }
+
             JToken result;
-            //批量插入
+            // 批量插入
             if (table.Value is JArray)
             {
-                List<object> ids = new();
-                foreach (var record in table.Value)//遍历同一个表下的不同记录
+                var ids = new List<object>();
+                foreach (var record in table.Value)
                 {
                     var cols = record.ToObject<JObject>();
                     var id = _selectTable.InsertSingle(talbeName, cols, role);
                     ids.Add(id);
                 }
-                result = JToken.FromObject(new { id = ids,count=ids.Count });               
+                result = JToken.FromObject(new { id = ids, count = ids.Count });
             }
-            //单条插入
+            // 单条插入
             else
             {
                 var cols = table.Value.ToObject<JObject>();
                 var id = _selectTable.InsertSingle(talbeName, cols, role);
                 result = JToken.FromObject(new { id });
             }
-
             ht.Add(talbeName, result);
         }
-
         return ht;
     }
+
     /// <summary>
-    /// 修改,只支持id作为条件
+    /// 修改(只支持Id作为条件)
     /// </summary>
-    /// <param name="tables">支持多表、多id批量更新</param>
+    /// <param name="tables">支持多表、多Id批量更新</param>
     /// <returns></returns>
-    [HttpPost("put")]
+    [HttpPost("post")]
     [UnitOfWork]
     public JObject Edit([FromBody] JObject tables)
     {
-        JObject ht = new JObject();
-
-        foreach (var table in tables)//每个表
+        var ht = new JObject();
+        foreach (var table in tables)
         {
-            string tableName = table.Key.Trim();
+            var tableName = table.Key.Trim();
             var role = _identityService.GetRole();
-            int count = _selectTable.UpdateSingleTable(tableName,table.Value,role);
+            var count = _selectTable.UpdateSingleTable(tableName, table.Value, role);
             ht.Add(tableName, JToken.FromObject(new { count }));
         }
-
         return ht;
     }
+
     /// <summary>
-    /// 删除 支持非id条件,支持批量
+    /// 删除(支持非Id条件、支持批量)
     /// </summary>
     /// <param name="tables"></param>
     /// <returns></returns>
-    [HttpPost("delete")]
+    [HttpPost("post")]
     [UnitOfWork]
     public JObject Delete([FromBody] JObject tables)
     {
-        JObject ht = new JObject();
+        var ht = new JObject();
         var role = _identityService.GetRole();
-        foreach (var table in tables)//遍历表
+        foreach (var table in tables)
         {
-            string talbeName = table.Key.Trim();
-            var value = JObject.Parse(table.Value.ToString());
-
+            var talbeName = table.Key.Trim();
             if (role.Delete == null || role.Delete.Table == null)
-            {
                 throw Oops.Bah("delete权限未配置");
-            }
             if (!role.Delete.Table.Contains(talbeName, StringComparer.CurrentCultureIgnoreCase))
-            {
                 throw Oops.Bah($"没权限删除{talbeName}");
-            }
             //if (!value.ContainsKey("id"))
-            //{
             //    throw Oops.Bah("未传主键id");
-            //}
 
+            var value = JObject.Parse(table.Value.ToString());
             var sb = new StringBuilder(100);
-            List<SugarParameter> parameters = new List<SugarParameter>();
-            foreach (var f in value)//每个条件
+            var parameters = new List<SugarParameter>();
+            foreach (var f in value)
             {
-                if (f.Value is JArray)//数组
+                if (f.Value is JArray)
                 {
                     sb.Append($"{f.Key} in (@{f.Key}) and ");
                     var paraArray = FuncList.TransJArrayToSugarPara(f.Value);
-                    parameters.Add(new SugarParameter($"@{f.Key}", paraArray));              
+                    parameters.Add(new SugarParameter($"@{f.Key}", paraArray));
                 }
-                else//单个值
+                else
                 {
                     sb.Append($"{f.Key}=@{f.Key} and ");
                     parameters.Add(new SugarParameter($"@{f.Key}", FuncList.TransJObjectToSugarPara(f.Value)));
                 }
-
             }
             if (!parameters.Any())
-            {
                 throw Oops.Bah("请输入删除条件");
-            }
-            string whereSql = sb.ToString().TrimEnd(" and ");
-            int count = _db.Deleteable<object>().AS(talbeName).Where(whereSql, parameters).ExecuteCommand();//无实体删除
-            value.Add("count", count);//命中数量
-            ht.Add(talbeName, value);
 
+            var whereSql = sb.ToString().TrimEnd(" and ");
+            var count = _db.Deleteable<object>().AS(talbeName).Where(whereSql, parameters).ExecuteCommand(); // 无实体删除
+            value.Add("count", count); // 命中数量
+            ht.Add(talbeName, value);
         }
         return ht;
     }

+ 2 - 20
Admin.NET/Admin.NET.Core/Service/APIJSON/FuncList.cs

@@ -2,11 +2,6 @@
 //
 // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证
 
-using NewLife.Reflection;
-using Newtonsoft.Json.Linq;
-using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
-using Org.BouncyCastle.Asn1.X509.Qualified;
-
 namespace Admin.NET.Core.Service;
 
 /// <summary>
@@ -46,7 +41,6 @@ public class FuncList
     {
         return a.ToString().Split(',').Contains(b);
     }
-   
 
     /// <summary>
     /// 根据jtoken的实际类型来转换SugarParameter,避免全转成字符串
@@ -91,10 +85,10 @@ public class FuncList
                 JTokenType.Guid => jToken.ToObject<Guid[]>(),
                 JTokenType.TimeSpan => jToken.ToObject<TimeSpan[]>(),
                 _ => jToken.ToArray()
-            } ;
+            };
         }
-        else return (JArray)jToken;
 
+        return (JArray)jToken;
     }
 
     /// <summary>
@@ -105,28 +99,16 @@ public class FuncList
     public static string GetValueCSharpType(string input)
     {
         if (DateTime.TryParse(input, out _))
-        {
             return "DateTime";
-        }
         else if (int.TryParse(input, out _))
-        {
             return "int";
-        }
         else if (long.TryParse(input, out _))
-        {
             return "long";
-        }
         else if (decimal.TryParse(input, out _))
-        {
             return "decimal";
-        }
         else if (bool.TryParse(input, out _))
-        {
             return "bool";
-        }
         else
-        {
             return "string";
-        }
     }
 }

+ 17 - 28
Admin.NET/Admin.NET.Core/Service/APIJSON/IdentityService.cs

@@ -6,6 +6,9 @@ using System.Security.Claims;
 
 namespace Admin.NET.Core.Service;
 
+/// <summary>
+/// 权限验证
+/// </summary>
 public class IdentityService : ITransient
 {
     private readonly IHttpContextAccessor _context;
@@ -41,15 +44,9 @@ public class IdentityService : ITransient
     /// <returns></returns>
     public APIJSON_Role GetRole()
     {
-        APIJSON_Role role;
-        if (string.IsNullOrEmpty(GetUserRoleName())) // 若没登录默认取第一个
-        {
-            role = _roles.FirstOrDefault();
-        }
-        else
-        {
-            role = _roles.FirstOrDefault(it => it.RoleName.Equals(GetUserRoleName(), StringComparison.CurrentCultureIgnoreCase));
-        }
+        var role = string.IsNullOrEmpty(GetUserRoleName())
+            ? _roles.FirstOrDefault()
+            : _roles.FirstOrDefault(it => it.RoleName.Equals(GetUserRoleName(), StringComparison.CurrentCultureIgnoreCase));
         return role;
     }
 
@@ -62,17 +59,14 @@ public class IdentityService : ITransient
     {
         var role = GetRole();
         if (role == null || role.Select == null || role.Select.Table == null)
-        {
             return (false, $"appsettings.json权限配置不正确!");
-        }
-        string tablerole = role.Select.Table.FirstOrDefault(it => it == "*" || it.Equals(table, StringComparison.CurrentCultureIgnoreCase));
 
+        var tablerole = role.Select.Table.FirstOrDefault(it => it == "*" || it.Equals(table, StringComparison.CurrentCultureIgnoreCase));
         if (string.IsNullOrEmpty(tablerole))
-        {
             return (false, $"表名{table}没权限查询!");
-        }
-        int index = Array.IndexOf(role.Select.Table, tablerole);
-        string selectrole = role.Select.Column[index];
+
+        var index = Array.IndexOf(role.Select.Table, tablerole);
+        var selectrole = role.Select.Column[index];
         return (true, selectrole);
     }
 
@@ -84,22 +78,17 @@ public class IdentityService : ITransient
     /// <returns></returns>
     public bool ColIsRole(string col, string[] selectrole)
     {
-        if (selectrole.Contains("*"))
+        if (selectrole.Contains("*")) return true;
+
+        if (col.Contains('(') && col.Contains(')'))
         {
-            return true;
+            var reg = new Regex(@"\(([^)]*)\)");
+            var match = reg.Match(col);
+            return selectrole.Contains(match.Result("$1"), StringComparer.CurrentCultureIgnoreCase);
         }
         else
         {
-            if (col.Contains("(") && col.Contains(")"))
-            {
-                Regex reg = new Regex(@"\(([^)]*)\)");
-                Match m = reg.Match(col);
-                return selectrole.Contains(m.Result("$1"), StringComparer.CurrentCultureIgnoreCase);
-            }
-            else
-            {
-                return selectrole.Contains(col, StringComparer.CurrentCultureIgnoreCase);
-            }
+            return selectrole.Contains(col, StringComparer.CurrentCultureIgnoreCase);
         }
     }
 }

+ 153 - 239
Admin.NET/Admin.NET.Core/Service/APIJSON/SelectTable.cs

@@ -2,25 +2,10 @@
 //
 // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证
 
-namespace Admin.NET.Core.Service;
-
 using AspectCore.Extensions.Reflection;
-using NewLife.Data;
-using Newtonsoft.Json.Linq;
-using Newtonsoft.Json.Schema;
-using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
-using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
-using Org.BouncyCastle.Bcpg.OpenPgp;
-using SqlSugar;
-using StackExchange.Redis;
-using System;
-using System.Collections;
-using System.Collections.Generic;
 using System.Dynamic;
-using System.Linq;
-using System.Text.RegularExpressions;
-using static OfficeOpenXml.ExcelErrorValue;
-using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinExpressIntracityUpdateStoreRequest.Types;
+
+namespace Admin.NET.Core.Service;
 
 /// <summary>
 ///
@@ -31,31 +16,25 @@ public class SelectTable : ISingleton
     private readonly TableMapper _tableMapper;
     private readonly ISqlSugarClient _db;
 
-    /// <summary>
-    /// 
-    /// </summary>
-    /// <param name="identityService"></param>
-    /// <param name="tableMapper"></param>
-    /// <param name="dbClient"></param>
     public SelectTable(IdentityService identityService, TableMapper tableMapper, ISqlSugarClient dbClient)
     {
         _identitySvc = identityService;
         _tableMapper = tableMapper;
         _db = dbClient;
     }
+
     /// <summary>
-    /// 判断表名是否正确,如果不正确则抛异常
+    /// 判断表名是否正确,不正确则抛异常
     /// </summary>
     /// <param name="table"></param>
     /// <returns></returns>
     public virtual bool IsTable(string table)
     {
-        if (_db.DbMaintenance.GetTableInfoList().Any(it => it.Name.Equals(table, StringComparison.CurrentCultureIgnoreCase)))
-            return true;
-        else
-            throw new Exception($"表名【{table}】不正确!");
-
+        return _db.DbMaintenance.GetTableInfoList().Any(it => it.Name.Equals(table, StringComparison.CurrentCultureIgnoreCase))
+            ? true
+            : throw new Exception($"表名【{table}】不正确!");
     }
+
     /// <summary>
     /// 判断表的列名是否正确,如果不正确则抛异常,更早地暴露给调用方
     /// </summary>
@@ -64,10 +43,9 @@ public class SelectTable : ISingleton
     /// <returns></returns>
     public virtual bool IsCol(string table, string col)
     {
-        if (_db.DbMaintenance.GetColumnInfosByTableName(table).Any(it => it.DbColumnName.Equals(col, StringComparison.CurrentCultureIgnoreCase)))
-            return true;
-        else
-            throw new Exception($"表【{table}】不存在列【{col}】!请检查输入参数");
+        return _db.DbMaintenance.GetColumnInfosByTableName(table).Any(it => it.DbColumnName.Equals(col, StringComparison.CurrentCultureIgnoreCase))
+            ? true
+            : throw new Exception($"表【{table}】不存在列【{col}】!请检查输入参数");
     }
 
     /// <summary>
@@ -81,46 +59,41 @@ public class SelectTable : ISingleton
     /// <returns></returns>
     public virtual Tuple<dynamic, int> GetTableData(string subtable, int page, int count, int query, string json, JObject dd)
     {
-
         var role = _identitySvc.GetSelectRole(subtable);
-        if (!role.Item1)//没有权限返回异常
-        {
+        if (!role.Item1)
             throw new Exception(role.Item2);
-        }
-        string selectrole = role.Item2;
+
+        var selectrole = role.Item2;
         subtable = _tableMapper.GetTableName(subtable);
 
-        JObject values = JObject.Parse(json);
+        var values = JObject.Parse(json);
         page = values["page"] == null ? page : int.Parse(values["page"].ToString());
         count = values["count"] == null ? count : int.Parse(values["count"].ToString());
         query = values["query"] == null ? query : int.Parse(values["query"].ToString());
         values.Remove("page");
         values.Remove("count");
-        //构造查询过程
+        // 构造查询过程
         var tb = SugarQueryable(subtable, selectrole, values, dd);
 
-        //实际会在这里执行
-        if (query == 1)//1-总数
+        // 实际会在这里执行
+        if (query == 1) // 1-总数
+        {
             return new Tuple<dynamic, int>(null, tb.MergeTable().Count());
+        }
         else
         {
-            if (page > 0)//分页
+            if (page > 0) // 分页
             {
                 int total = 0;
-                if (query == 0)//0-对象
-                    return new Tuple<dynamic, int>(tb.ToPageList(page, count), total);
+                if (query == 0)
+                    return new Tuple<dynamic, int>(tb.ToPageList(page, count), total); // 0-对象
                 else
-                    //2-以上全部
-                    return new Tuple<dynamic, int>(tb.ToPageList(page, count, ref total), total);
-
+                    return new Tuple<dynamic, int>(tb.ToPageList(page, count, ref total), total); // 2-以上全部
             }
-            else//列表
+            else // 列表
             {
                 IList l = tb.ToList();
-                if (query == 0)
-                    return new Tuple<dynamic, int>(l, 0);
-                else
-                    return new Tuple<dynamic, int>(l, l.Count);
+                return query == 0 ? new Tuple<dynamic, int>(l, 0) : new Tuple<dynamic, int>(l, l.Count);
             }
         }
     }
@@ -128,15 +101,12 @@ public class SelectTable : ISingleton
     /// <summary>
     /// 解析并查询
     /// </summary>
-    /// <param name="query"></param>
+    /// <param name="queryJson"></param>
     /// <returns></returns>
     public virtual JObject Query(string queryJson)
     {
-        JObject resultObj = new JObject();
-
-        JObject queryJobj = JObject.Parse(queryJson);
-        resultObj = Query(queryJobj);
-        return resultObj;
+        var queryJobj = JObject.Parse(queryJson);
+        return Query(queryJobj);
     }
 
     /// <summary>
@@ -147,13 +117,12 @@ public class SelectTable : ISingleton
     /// <returns></returns>
     public virtual JObject QuerySingle(JObject queryObj, string nodeName = "infos")
     {
-        JObject resultObj = new JObject();
+        var resultObj = new JObject();
 
-        int total = 0;
+        var total = 0;
         foreach (var item in queryObj)
         {
-            string key = item.Key.Trim();
-
+            var key = item.Key.Trim();
             if (key.EndsWith("[]"))
             {
                 total = QuerySingleList(resultObj, item, nodeName);
@@ -167,7 +136,6 @@ public class SelectTable : ISingleton
                 resultObj.Add("total", total);
             }
         }
-
         return resultObj;
     }
 
@@ -180,12 +148,8 @@ public class SelectTable : ISingleton
     {
         foreach (var item in queryObj)
         {
-            string key = item.Key.Trim();
-
-            if (key.EndsWith("[]"))
-            {
+            if (item.Key.Trim().EndsWith("[]"))
                 return ToSql(item);
-            }
         }
         return string.Empty;
     }
@@ -193,21 +157,20 @@ public class SelectTable : ISingleton
     /// <summary>
     /// 解析并查询
     /// </summary>
-    /// <param name="query"></param>
+    /// <param name="queryObj"></param>
     /// <returns></returns>
     public virtual JObject Query(JObject queryObj)
     {
-        JObject resultObj = new JObject();
+        var resultObj = new JObject();
 
         int total;
         foreach (var item in queryObj)
         {
-            string key = item.Key.Trim();
-
-            if (key.Equals("[]"))//列表
+            var key = item.Key.Trim();
+            if (key.Equals("[]")) // 列表
             {
                 total = QueryMoreList(resultObj, item);
-                resultObj.Add("total", total);//只要是列表查询都自动返回总数
+                resultObj.Add("total", total); // 只要是列表查询都自动返回总数
             }
             else if (key.EndsWith("[]"))
             {
@@ -219,38 +182,32 @@ public class SelectTable : ISingleton
             }
             else if (key.Equals("total@") || key.Equals("total"))
             {
-                //resultObj.Add("total", total);
+                // resultObj.Add("total", total);
                 continue;
             }
-            else//单条
+            else // 单条
             {
                 var template = GetFirstData(key, item.Value.ToString(), resultObj);
                 if (template != null)
-                {
                     resultObj.Add(key, JToken.FromObject(template));
-                }
             }
         }
-
         return resultObj;
     }
 
-
-
-    //动态调用方法
+    // 动态调用方法
     private object ExecFunc(string funcname, object[] param, Type[] types)
     {
         var method = typeof(FuncList).GetMethod(funcname);
-
         var reflector = method.GetReflector();
         var result = reflector.Invoke(new FuncList(), param);
         return result;
     }
 
-    //生成sql
+    // 生成sql
     private string ToSql(string subtable, int page, int count, int query, string json)
     {
-        JObject values = JObject.Parse(json);
+        var values = JObject.Parse(json);
         page = values["page"] == null ? page : int.Parse(values["page"].ToString());
         count = values["count"] == null ? count : int.Parse(values["count"].ToString());
         query = values["query"] == null ? query : int.Parse(values["query"].ToString());
@@ -272,25 +229,24 @@ public class SelectTable : ISingleton
     /// <exception cref="Exception"></exception>
     private dynamic GetFirstData(string subtable, string json, JObject job)
     {
-
         var role = _identitySvc.GetSelectRole(subtable);
-        if (!role.Item1)//没有权限返回异常
-        {
+        if (!role.Item1)
             throw new Exception(role.Item2);
-        }
-        string selectrole = role.Item2;
+
+        var selectrole = role.Item2;
         subtable = _tableMapper.GetTableName(subtable);
-        JObject values = JObject.Parse(json);
+
+        var values = JObject.Parse(json);
         values.Remove("page");
         values.Remove("count");
         var tb = SugarQueryable(subtable, selectrole, values, job).First();
         var dic = (IDictionary<string, object>)tb;
         foreach (var item in values.Properties().Where(it => it.Name.EndsWith("()")))
         {
-            if (item.Value.HasValue())
+            if (item.Value.IsNullOrEmpty())
             {
-                string func = item.Value.ToString().Substring(0, item.Value.ToString().IndexOf("("));
-                string param = item.Value.ToString().Substring(item.Value.ToString().IndexOf("(") + 1).TrimEnd(')');
+                var func = item.Value.ToString().Substring(0, item.Value.ToString().IndexOf("("));
+                var param = item.Value.ToString().Substring(item.Value.ToString().IndexOf("(") + 1).TrimEnd(')');
                 var types = new List<Type>();
                 var paramss = new List<object>();
                 foreach (var va in param.Split(','))
@@ -301,19 +257,17 @@ public class SelectTable : ISingleton
                 dic[item.Name] = ExecFunc(func, paramss.ToArray(), types.ToArray());
             }
         }
-
         return tb;
-
     }
 
-    //单表查询,返回的数据在指定的NodeName节点
+    // 单表查询,返回的数据在指定的NodeName节点
     private int QuerySingleList(JObject resultObj, KeyValuePair<string, JToken> item, string nodeName)
     {
-        string key = item.Key.Trim();
+        var key = item.Key.Trim();
         var jb = JObject.Parse(item.Value.ToString());
         int page = jb["page"] == null ? 0 : int.Parse(jb["page"].ToString());
         int count = jb["count"] == null ? 10 : int.Parse(jb["count"].ToString());
-        int query = jb["query"] == null ? 2 : int.Parse(jb["query"].ToString());//默认输出数据和数量
+        int query = jb["query"] == null ? 2 : int.Parse(jb["query"].ToString()); // 默认输出数据和数量
         int total = 0;
 
         jb.Remove("page"); jb.Remove("count"); jb.Remove("query");
@@ -323,9 +277,8 @@ public class SelectTable : ISingleton
         {
             var datas = GetTableData(t.Key, page, count, query, t.Value.ToString(), null);
             if (query > 0)
-            {
                 total = datas.Item2;
-            }
+
             foreach (var data in datas.Item1)
             {
                 htt.Add(JToken.FromObject(data));
@@ -333,37 +286,33 @@ public class SelectTable : ISingleton
         }
 
         if (!string.IsNullOrEmpty(nodeName))
-        {
             resultObj.Add(nodeName, htt);
-        }
         else
             resultObj.Add(key, htt);
+
         return total;
     }
 
-    //生成sql
+    // 生成sql
     private string ToSql(KeyValuePair<string, JToken> item)
     {
-        string key = item.Key.Trim();
         var jb = JObject.Parse(item.Value.ToString());
         int page = jb["page"] == null ? 0 : int.Parse(jb["page"].ToString());
         int count = jb["count"] == null ? 10 : int.Parse(jb["count"].ToString());
-        int query = jb["query"] == null ? 2 : int.Parse(jb["query"].ToString());//默认输出数据和数量
+        int query = jb["query"] == null ? 2 : int.Parse(jb["query"].ToString()); // 默认输出数据和数量
 
         jb.Remove("page"); jb.Remove("count"); jb.Remove("query");
-        var htt = new JArray();
         foreach (var t in jb)
         {
             return ToSql(t.Key, page, count, query, t.Value.ToString());
         }
-
         return string.Empty;
     }
 
-    //单表查询
+    // 单表查询
     private int QuerySingleList(JObject resultObj, KeyValuePair<string, JToken> item)
     {
-        string key = item.Key.TrimEnd("[]");
+        var key = item.Key.TrimEnd("[]");
         return QuerySingleList(resultObj, item, key);
     }
 
@@ -380,7 +329,7 @@ public class SelectTable : ISingleton
         var jb = JObject.Parse(item.Value.ToString());
         var page = jb["page"] == null ? 0 : int.Parse(jb["page"].ToString());
         var count = jb["count"] == null ? 10 : int.Parse(jb["count"].ToString());
-        var query = jb["query"] == null ? 2 : int.Parse(jb["query"].ToString());//默认输出数据和数量
+        var query = jb["query"] == null ? 2 : int.Parse(jb["query"].ToString()); // 默认输出数据和数量
         jb.Remove("page"); jb.Remove("count"); jb.Remove("query");
         var htt = new JArray();
         List<string> tables = new List<string>(), where = new List<string>();
@@ -393,18 +342,19 @@ public class SelectTable : ISingleton
             string table = tables[0].TrimEnd("[]");
             var temp = GetTableData(table, page, count, query, where[0], null);
             if (query > 0)
-            {
                 total = temp.Item2;
-            }
-            //关联查询,先查子表数据,再根据外键循环查询主表
+
+            // 关联查询,先查子表数据,再根据外键循环查询主表
             foreach (var dd in temp.Item1)
             {
-                var zht = new JObject();
-                zht.Add(table, JToken.FromObject(dd));
-                for (int i = 1; i < tables.Count; i++)//从第二个表开始循环
+                var zht = new JObject
+                {
+                    { table, JToken.FromObject(dd) }
+                };
+                for (int i = 1; i < tables.Count; i++) // 从第二个表开始循环
                 {
                     string subtable = tables[i];
-                    //有bug,暂不支持[]分支
+                    // 有bug,暂不支持[]分支
                     //if (subtable.EndsWith("[]"))
                     //{
                     //   string tableName = subtable.TrimEnd("[]".ToCharArray());
@@ -421,24 +371,17 @@ public class SelectTable : ISingleton
                     //}
                     //else
                     //{
-                    
                     var ddf = GetFirstData(subtable, where[i].ToString(), zht);
                     if (ddf != null)
-                    {
                         zht.Add(subtable, JToken.FromObject(ddf));
-
-                    }
-                    //}
                 }
                 htt.Add(zht);
             }
-
         }
         if (query != 1)
-        {
             resultObj.Add("[]", htt);
-        }
-        //分页自动添加当前页数和数量
+
+        // 分页自动添加当前页数和数量
         if (page > 0 && count > 0)
         {
             resultObj.Add("page", page);
@@ -449,11 +392,10 @@ public class SelectTable : ISingleton
         return total;
     }
 
-    //执行方法
+    // 执行方法
     private void ExecFunc(JObject resultObj, KeyValuePair<string, JToken> item)
     {
-        JObject jb = JObject.Parse(item.Value.ToString());
-        Type type = typeof(FuncList);
+        var jb = JObject.Parse(item.Value.ToString());
 
         var dataJObj = new JObject();
         foreach (var f in jb)
@@ -484,8 +426,8 @@ public class SelectTable : ISingleton
 
         var tb = _db.Queryable(subtable, "tb");
 
-        //select 
-        if (values["@column"].HasValue())
+        // select
+        if (values["@column"].IsNullOrEmpty())
         {
             ProcessColumn(subtable, selectrole, values, tb);
         }
@@ -494,63 +436,59 @@ public class SelectTable : ISingleton
             tb.Select(selectrole);
         }
 
-        //前几行
+        // 前几行
         ProcessLimit(values, tb);
 
-        //where
+        // where
         ProcessWhere(subtable, values, tb, dd);
 
-        //排序
+        // 排序
         ProcessOrder(subtable, values, tb);
 
-        //分组
+        // 分组
         PrccessGroup(subtable, values, tb);
 
-        //Having
+        // Having
         ProcessHaving(values, tb);
+
         return tb;
     }
 
-    //处理字段重命名 "@column":"toId:parentId",对应SQL是toId AS parentId,将查询的字段toId变为parentId返回
+    // 处理字段重命名 "@column":"toId:parentId",对应SQL是toId AS parentId,将查询的字段toId变为parentId返回
     private void ProcessColumn(string subtable, string selectrole, JObject values, ISugarQueryable<ExpandoObject> tb)
     {
         var str = new System.Text.StringBuilder(100);
         foreach (var item in values["@column"].ToString().Split(','))
         {
-            string[] ziduan = item.Split(':');
-            string colName = ziduan[0];
+            var ziduan = item.Split(':');
+            var colName = ziduan[0];
             var ma = new Regex(@"\((\w+)\)").Match(colName);
-            //处理max,min这样的函数
+            // 处理max、min这样的函数
             if (ma.Success && ma.Groups.Count > 1)
-            {
                 colName = ma.Groups[1].Value;
-            }
 
-            //判断列表是否有权限  sum(1),sum(*),Count(1)这样的值直接有效
+            // 判断列表是否有权限  sum(1)、sum(*)、Count(1)这样的值直接有效
             if (colName == "*" || int.TryParse(colName, out int colNumber) || (IsCol(subtable, colName) && _identitySvc.ColIsRole(colName, selectrole.Split(','))))
             {
                 if (ziduan.Length > 1)
                 {
                     if (ziduan[1].Length > 20)
-                    {
                         throw new Exception("别名不能超过20个字符");
-                    }
+
                     str.Append(ziduan[0] + " as `" + ReplaceSQLChar(ziduan[1]) + "`,");
                 }
-                //不对函数加``,解决sum(*),Count(1)等不能使用的问题
+                // 不对函数加``,解决sum(*)、Count(1)等不能使用的问题
                 else if (ziduan[0].Contains('('))
                 {
                     str.Append(ziduan[0] + ",");
                 }
                 else
                     str.Append("`" + ziduan[0] + "`" + ",");
-
             }
         }
         if (string.IsNullOrEmpty(str.ToString()))
-        {
             throw new Exception($"表名{subtable}没有可查询的字段!");
-        }
+
         tb.Select(str.ToString().TrimEnd(','));
     }
 
@@ -563,11 +501,10 @@ public class SelectTable : ISingleton
     /// <param name="dd"></param>
     private void ProcessWhere(string subtable, JObject values, ISugarQueryable<ExpandoObject> tb, JObject dd)
     {
-        List<IConditionalModel> conModels = new List<IConditionalModel>();
-        if (values["identity"].HasValue())
-        {
+        var conModels = new List<IConditionalModel>();
+        if (values["identity"].IsNullOrEmpty())
             conModels.Add(new ConditionalModel() { FieldName = values["identity"].ToString(), ConditionalType = ConditionalType.Equal, FieldValue = _identitySvc.GetUserIdentity() });
-        }
+
         foreach (var va in values)
         {
             string key = va.Key.Trim();
@@ -576,59 +513,52 @@ public class SelectTable : ISingleton
             {
                 continue;
             }
-            if (key.EndsWith("$"))//模糊查询
+            if (key.EndsWith("$")) // 模糊查询
             {
                 FuzzyQuery(subtable, conModels, va);
             }
-            else if (key.EndsWith("{}"))//逻辑运算
+            else if (key.EndsWith("{}")) // 逻辑运算
             {
                 ConditionQuery(subtable, conModels, va);
             }
-            else if (key.EndsWith("%"))//bwtween查询
+            else if (key.EndsWith("%")) // bwtween查询
             {
                 ConditionBetween(subtable, conModels, va, tb);
-
             }
             else if (key.EndsWith("@")) // 关联上一个table
             {
                 if (dd == null)
-                {
                     continue;
-                }
-                string[] str = fieldValue.Split('/');
+
+                var str = fieldValue.Split('/');
                 var lastTableRecord = ((JObject)dd[str[^2]]);
                 if (!lastTableRecord.ContainsKey(str[^1]))
-                {
                     throw new Exception($"找不到关联列:{str},请在{str[^2]}@column中设置");
-                }
-                string value = lastTableRecord[str[^1]].ToString();
 
+                var value = lastTableRecord[str[^1]].ToString();
                 conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('@'), ConditionalType = ConditionalType.Equal, FieldValue = value });
-
             }
-            else if (key.EndsWith("~"))//不等于 这里应该是正则匹配
+            else if (key.EndsWith("~")) // 不等于(应该是正则匹配)
             {
                 //conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('~'), ConditionalType = ConditionalType.NoEqual, FieldValue = fieldValue });
             }
-            else if (IsCol(subtable, key.TrimEnd('!'))) //其他where条件
+            else if (IsCol(subtable, key.TrimEnd('!'))) // 其他where条件
             {
                 ConditionEqual(subtable, conModels, va);
             }
         }
         if (conModels.Any())
-        {
             tb.Where(conModels);
-        }
     }
 
     // "@having":"function0(...)?value0;function1(...)?value1;function2(...)?value2...",
     // SQL函数条件,一般和 @group一起用,函数一般在 @column里声明
     private void ProcessHaving(JObject values, ISugarQueryable<ExpandoObject> tb)
     {
-        if (values["@having"].HasValue())
+        if (values["@having"].IsNullOrEmpty())
         {
-            List<IConditionalModel> hw = new List<IConditionalModel>();
-            List<string> havingItems = new List<string>();
+            var hw = new List<IConditionalModel>();
+            var havingItems = new List<string>();
             if (values["@having"].HasValues)
             {
                 havingItems = values["@having"].Select(p => p.ToString()).ToList();
@@ -639,7 +569,7 @@ public class SelectTable : ISingleton
             }
             foreach (var item in havingItems)
             {
-                string and = item.ToString();
+                var and = item.ToString();
                 var model = new ConditionalModel();
                 if (and.Contains(">="))
                 {
@@ -649,7 +579,6 @@ public class SelectTable : ISingleton
                 }
                 else if (and.Contains("<="))
                 {
-
                     model.FieldName = and.Split(new string[] { "<=" }, StringSplitOptions.RemoveEmptyEntries)[0];
                     model.ConditionalType = ConditionalType.LessThanOrEqual;
                     model.FieldValue = and.Split(new string[] { "<=" }, StringSplitOptions.RemoveEmptyEntries)[1];
@@ -680,45 +609,42 @@ public class SelectTable : ISingleton
                 }
                 hw.Add(model);
             }
-
             //var d = db.Context.Utilities.ConditionalModelToSql(hw);
             //tb.Having(d.Key, d.Value);
             tb.Having(string.Join(",", havingItems));
         }
     }
 
-    //"@group":"column0,column1...",分组方式。如果 @column里声明了Table的id,则id也必须在 @group中声明;其它情况下必须满足至少一个条件:
-    //1.分组的key在 @column里声明
-    //2.Table主键在 @group中声明
+    // "@group":"column0,column1...",分组方式。如果 @column里声明了Table的id,则id也必须在 @group中声明;其它情况下必须满足至少一个条件:
+    // 1.分组的key在 @column里声明
+    // 2.Table主键在 @group中声明
     private void PrccessGroup(string subtable, JObject values, ISugarQueryable<ExpandoObject> tb)
     {
-        if (values["@group"].HasValue())
+        if (values["@group"].IsNullOrEmpty())
         {
-            List<GroupByModel> groupList = new();//多库兼容写法
+            var groupList = new List<GroupByModel>(); // 多库兼容写法
             foreach (var col in values["@group"].ToString().Split(','))
             {
                 if (IsCol(subtable, col))
                 {
-                    //str.Append(and + ",");
+                    // str.Append(and + ",");
                     groupList.Add(new GroupByModel() { FieldName = col });
                 }
             }
             if (groupList.Any())
-            {
                 tb.GroupBy(groupList);
-            }
         }
     }
 
-    //处理排序 "@order":"name-,id"查询按 name降序、id默认顺序 排序的User数组
+    // 处理排序 "@order":"name-,id"查询按 name降序、id默认顺序 排序的User数组
     private void ProcessOrder(string subtable, JObject values, ISugarQueryable<ExpandoObject> tb)
     {
-        if (values["@order"].HasValue())
+        if (values["@order"].IsNullOrEmpty())
         {
-            List<OrderByModel> orderList = new(); //多库兼容写法
+            var orderList = new List<OrderByModel>(); // 多库兼容写法
             foreach (var item in values["@order"].ToString().Split(','))
             {
-                string col = item.Replace("-", "").Replace("+", "").Replace(" desc", "").Replace(" asc", "");//增加对原生排序的支持
+                string col = item.Replace("-", "").Replace("+", "").Replace(" desc", "").Replace(" asc", ""); // 增加对原生排序的支持
                 if (IsCol(subtable, col))
                 {
                     orderList.Add(new OrderByModel()
@@ -730,9 +656,7 @@ public class SelectTable : ISingleton
             }
 
             if (orderList.Any())
-            {
                 tb.OrderBy(orderList);
-            }
         }
     }
 
@@ -743,31 +667,33 @@ public class SelectTable : ISingleton
     /// <param name="tb"></param>
     private void ProcessLimit(JObject values, ISugarQueryable<ExpandoObject> tb)
     {
-        if (values["@count"].HasValue())
+        if (values["@count"].IsNullOrEmpty())
         {
             int c = values["@count"].ToObject<int>();
             tb.Take(c);
         }
     }
 
-
-    //条件查询 "key{}":"条件0,条件1...",条件为任意SQL比较表达式字符串,非Number类型必须用''包含条件的值,如'a'
-    //&, |, ! 逻辑运算符,对应数据库 SQL 中的 AND, OR, NOT。 
-    //   横或纵与:同一字段的值内条件默认 | 或连接,不同字段的条件默认 & 与连接。 
-    //   ① & 可用于"key&{}":"条件"等 
-    //   ② | 可用于"key|{}":"条件", "key|{}":[] 等,一般可省略 
-    //   ③ ! 可单独使用,如"key!":Object,也可像&,|一样配合其他功能符使用
+    // 条件查询 "key{}":"条件0,条件1...",条件为任意SQL比较表达式字符串,非Number类型必须用''包含条件的值,如'a'
+    // &, |, ! 逻辑运算符,对应数据库 SQL 中的 AND, OR, NOT。
+    // 横或纵与:同一字段的值内条件默认 | 或连接,不同字段的条件默认 & 与连接。
+    // ① & 可用于"key&{}":"条件"等
+    // ② | 可用于"key|{}":"条件", "key|{}":[] 等,一般可省略
+    // ③ ! 可单独使用,如"key!":Object,也可像&,|一样配合其他功能符使用
     private void ConditionQuery(string subtable, List<IConditionalModel> conModels, KeyValuePair<string, JToken> va)
     {
-        string vakey = va.Key.Trim();
-        string field = vakey.TrimEnd("{}".ToCharArray());
-        string columnName = field.TrimEnd(new char[] { '&', '|' });
+        var vakey = va.Key.Trim();
+        var field = vakey.TrimEnd("{}".ToCharArray());
+        var columnName = field.TrimEnd(new char[] { '&', '|' });
         IsCol(subtable, columnName);
         var ddt = new List<KeyValuePair<WhereType, ConditionalModel>>();
         foreach (var and in va.Value.ToString().Split(','))
         {
-            var model = new ConditionalModel();
-            model.FieldName = columnName;
+            var model = new ConditionalModel
+            {
+                FieldName = columnName
+            };
+
             if (and.StartsWith(">="))
             {
                 model.ConditionalType = ConditionalType.GreaterThanOrEqual;
@@ -775,7 +701,6 @@ public class SelectTable : ISingleton
             }
             else if (and.StartsWith("<="))
             {
-
                 model.ConditionalType = ConditionalType.LessThanOrEqual;
                 model.FieldValue = and.TrimStart("<=".ToCharArray());
             }
@@ -793,10 +718,8 @@ public class SelectTable : ISingleton
             ddt.Add(new KeyValuePair<WhereType, ConditionalModel>(field.EndsWith("!") ? WhereType.Or : WhereType.And, model));
         }
         conModels.Add(new ConditionalCollections() { ConditionalList = ddt });
-
     }
 
-
     /// <summary>
     /// "key%":"start,end" => "key%":["start,end"],其中 start 和 end 都只能为 Boolean, Number, String 中的一种,如 "2017-01-01,2019-01-01" ,["1,90000", "82001,100000"] ,可用于连续范围内的筛选
     /// 目前不支持数组形式
@@ -807,9 +730,9 @@ public class SelectTable : ISingleton
     /// <param name="tb"></param>
     private void ConditionBetween(string subtable, List<IConditionalModel> conModels, KeyValuePair<string, JToken> va, ISugarQueryable<ExpandoObject> tb)
     {
-        string vakey = va.Key.Trim();
-        string field = vakey.TrimEnd("%".ToCharArray());
-        List<string> inValues = new List<string>();
+        var vakey = va.Key.Trim();
+        var field = vakey.TrimEnd("%".ToCharArray());
+        var inValues = new List<string>();
         if (va.Value.HasValues)
         {
             foreach (var cm in va.Value)
@@ -821,12 +744,13 @@ public class SelectTable : ISingleton
         {
             inValues.Add(va.Value.ToString());
         }
+
         for (var i = 0; i < inValues.Count; i++)
         {
             var fileds = inValues[i].Split(',');
             if (fileds.Length == 2)
             {
-                string type = FuncList.GetValueCSharpType(fileds[0]);
+                var type = FuncList.GetValueCSharpType(fileds[0]);
                 ObjectFuncModel f = ObjectFuncModel.Create("between", field, $"{{{type}}}:{fileds[0]}", $"{{{type}}}:{fileds[1]}");
                 tb.Where(f);
             }
@@ -842,8 +766,8 @@ public class SelectTable : ISingleton
     /// <param name="key"></param>
     private void ConditionEqual(string subtable, List<IConditionalModel> conModels, KeyValuePair<string, JToken> va)
     {
-        string key = va.Key;
-        string fieldValue = va.Value.ToString();
+        var key = va.Key;
+        var fieldValue = va.Value.ToString();
         // in / not in
         if (va.Value is JArray)
         {
@@ -856,7 +780,6 @@ public class SelectTable : ISingleton
         }
         else
         {
-
             if (string.IsNullOrEmpty(fieldValue))
             {
                 // is not null or ''
@@ -870,7 +793,6 @@ public class SelectTable : ISingleton
                 {
                     conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('!'), FieldValue = null });
                 }
-
             }
             // = / !=
             else
@@ -885,15 +807,15 @@ public class SelectTable : ISingleton
         }
     }
 
-    //模糊搜索	"key$":"SQL搜索表达式" => "key$":["SQL搜索表达式"],任意SQL搜索表达式字符串,如 %key%(包含key), key%(以key开始), %k%e%y%(包含字母k,e,y) 等,%表示任意字符
+    // 模糊搜索  "key$":"SQL搜索表达式" => "key$":["SQL搜索表达式"],任意SQL搜索表达式字符串,如 %key%(包含key), key%(以key开始), %k%e%y%(包含字母k,e,y) 等,%表示任意字符
     private void FuzzyQuery(string subtable, List<IConditionalModel> conModels, KeyValuePair<string, JToken> va)
     {
-        string vakey = va.Key.Trim();
-        string fieldValue = va.Value.ToString();
+        var vakey = va.Key.Trim();
+        var fieldValue = va.Value.ToString();
         var conditionalType = ConditionalType.Like;
         if (IsCol(subtable, vakey.TrimEnd('$')))
         {
-            //支持三种like查询
+            // 支持三种like查询
             if (fieldValue.StartsWith("%") && fieldValue.EndsWith("%"))
             {
                 conditionalType = ConditionalType.Like;
@@ -910,16 +832,12 @@ public class SelectTable : ISingleton
         }
     }
 
-
-
-
-
-
-    //处理sql注入
+    // 处理sql注入
     private string ReplaceSQLChar(string str)
     {
-        if (str == String.Empty)
-            return String.Empty;
+        if (string.IsNullOrWhiteSpace(str))
+            return string.Empty;
+
         str = str.Replace("'", "");
         str = str.Replace(";", "");
         str = str.Replace(",", "");
@@ -938,7 +856,7 @@ public class SelectTable : ISingleton
         str = str.Replace("$", "");
         str = str.Replace("\"", "");
 
-        //删除与数据库相关的词
+        // 删除与数据库相关的词
         str = Regex.Replace(str, "delete from", "", RegexOptions.IgnoreCase);
         str = Regex.Replace(str, "drop table", "", RegexOptions.IgnoreCase);
         str = Regex.Replace(str, "truncate", "", RegexOptions.IgnoreCase);
@@ -951,8 +869,6 @@ public class SelectTable : ISingleton
         return str;
     }
 
-
-
     /// <summary>
     /// 单条插入
     /// </summary>
@@ -965,14 +881,14 @@ public class SelectTable : ISingleton
         role ??= _identitySvc.GetRole();
         var dt = new Dictionary<string, object>();
 
-        foreach (var f in cols)//遍历字段
+        foreach (var f in cols) // 遍历字段
         {
             if (//f.Key.ToLower() != "id" &&   //是否一定要传id
                 IsCol(tableName, f.Key) &&
                 (role.Insert.Column.Contains("*") || role.Insert.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase)))
                 dt.Add(f.Key, FuncList.TransJObjectToSugarPara(f.Value));
         }
-        //如果外部没传id,就后端生成或使用数据库默认值,如果都没有会出错
+        // 如果外部没传Id,就后端生成或使用数据库默认值,如果都没有会出错
         object id;
         if (!dt.ContainsKey("id"))
         {
@@ -987,6 +903,7 @@ public class SelectTable : ISingleton
 
         return id;
     }
+
     /// <summary>
     /// 为每天记录创建udpate sql
     /// </summary>
@@ -998,9 +915,8 @@ public class SelectTable : ISingleton
     {
         role ??= _identitySvc.GetRole();
         if (!record.ContainsKey("id"))
-        {
             throw Oops.Bah("未传主键id");
-        }
+
         var dt = new Dictionary<string, object>();
         var sb = new StringBuilder(100);
         object id = null;
@@ -1008,13 +924,12 @@ public class SelectTable : ISingleton
         {
             if (f.Key.Equals("id", StringComparison.OrdinalIgnoreCase))
             {
-                if (f.Value is JArray)//id数组
+                if (f.Value is JArray)
                 {
                     sb.Append($"{f.Key} in (@{f.Key})");
                     id = FuncList.TransJArrayToSugarPara(f.Value);
-
                 }
-                else//单个id
+                else
                 {
                     sb.Append($"{f.Key}=@{f.Key}");
                     id = FuncList.TransJObjectToSugarPara(f.Value);
@@ -1041,18 +956,17 @@ public class SelectTable : ISingleton
     {
         role ??= _identitySvc.GetRole();
         int count = 0;
-        if (records is JArray)//遍历每行记录
+        if (records is JArray)
         {
             foreach (var record in records.ToObject<JObject[]>())
             {
                 count += UpdateSingleRecord(tableName, record, role);
             }
         }
-        else//单条记录
+        else
         {
             count = UpdateSingleRecord(tableName, records.ToObject<JObject>(), role);
         }
-
         return count;
     }
 }

+ 2 - 6
Admin.NET/Admin.NET.Core/Service/APIJSON/TableMapper.cs

@@ -9,7 +9,7 @@ namespace Admin.NET.Core.Service;
 /// </summary>
 public class TableMapper : ITransient
 {
-    private readonly Dictionary<string, string> _options = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+    private readonly Dictionary<string, string> _options = new(StringComparer.OrdinalIgnoreCase);
 
     public TableMapper(IOptions<Dictionary<string, string>> options)
     {
@@ -26,10 +26,6 @@ public class TableMapper : ITransient
     /// <returns></returns>
     public string GetTableName(string oldname)
     {
-        if (_options.ContainsKey(oldname))
-        {
-            return _options[oldname];
-        }
-        return oldname;
+        return _options.ContainsKey(oldname) ? _options[oldname] : oldname;
     }
 }

+ 0 - 0
Admin.NET/Admin.NET.Core/Service/APIJSON/APIJSON接口用例.apifox.json → Admin.NET/Admin.NET.Core/Service/APIJSON/用例APIFOX.json