Browse Source

😉代码调整优化 !556

zuohuaijun 3 years ago
parent
commit
3d1dc9c94d

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

@@ -30,7 +30,7 @@
   </ItemGroup>
   </ItemGroup>
 
 
   <ItemGroup>
   <ItemGroup>
-	  <None Update="Configuration\ApiJson.json">
+	  <None Update="Configuration\APIJSON.json">
 		  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
 		  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
 	  </None>
 	  </None>
 	  <None Update="Configuration\App.json">
 	  <None Update="Configuration\App.json">

+ 33 - 33
Admin.NET/Admin.NET.Application/Configuration/ApiJson.json

@@ -1,34 +1,34 @@
 {
 {
-  "$schema": "https://gitee.com/dotnetchina/Furion/raw/net6/schemas/v3/furion-schema.json",
-  // 代码生成配置项-程序集名称集合
-  "ApiJson": {
-    "RoleList": [
-      {
-        "name": "role1", //权限名称 唯一
-        "select": { //查询权限
-          "table": [ "*" ], //可操作的表
-          "column": [ "tb.*" ], //可操作的字段
-          "where": []
-        },
-        "update": { //修改权限
-          "table": [ "moment", "User", "Comment" ],
-          "column": [ "tb.*", "tb.*", "tb.*" ]
-        },
-        "insert": { //添加权限
-          "table": [ "moment", "User", "Comment" ],
-          "column": [ "tb.*", "tb.*", "tb.*" ]
-        },
-        "delete": { //删除权限
-          "table": [ "moment", "User", "Comment" ]
-        }
-      },
-      {
-        "name": "role2",
-        "select": {
-          "table": [ "monent" ],
-          "column": [ "*" ]
-        }
-      }
-    ]
-  }
-}
+    "$schema": "https://gitee.com/dotnetchina/Furion/raw/net6/schemas/v3/furion-schema.json",
+
+    "APIJSON": {
+        "Roles": [
+            {
+                "RoleName": "Role1", // 权限名称 唯一
+                "Select": { // 查询
+                    "Table": [ "*" ], // 可操作的表
+                    "Column": [ "tb.*" ], // 可操作的字段
+                    "Filter": []
+                },
+                "Insert": { // 添加
+                    "Table": [ "table1", "table2", "table3" ],
+                    "Column": [ "tb.*", "tb.*", "tb.*" ]
+                },
+                "Update": { // 修改
+                    "Table": [ "table1", "table2", "table3" ],
+                    "Column": [ "tb.*", "tb.*", "tb.*" ]
+                },
+                "Delete": { // 删除
+                    "Table": [ "table1", "table2", "table3" ]
+                }
+            },
+            {
+                "RoleName": "Role2",
+                "Select": {
+                    "Table": [ "table1" ],
+                    "Column": [ "*" ]
+                }
+            }
+        ]
+    }
+}

+ 129 - 73
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -3351,6 +3351,13 @@
             <param name="defaultValue"></param>
             <param name="defaultValue"></param>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
+        <member name="M:Admin.NET.Core.ObjectExtension.IsNullOrEmpty(System.Object)">
+            <summary>
+            判断是否有值
+            </summary>
+            <param name="obj"></param>
+            <returns></returns>
+        </member>
         <member name="M:Admin.NET.Core.RepositoryExtension.FakeDelete``1(SqlSugar.ISugarRepository,``0)">
         <member name="M:Admin.NET.Core.RepositoryExtension.FakeDelete``1(SqlSugar.ISugarRepository,``0)">
             <summary>
             <summary>
             实体假删除 _rep.FakeDelete(entity)
             实体假删除 _rep.FakeDelete(entity)
@@ -3628,14 +3635,64 @@
             ES服务注册
             ES服务注册
             </summary>
             </summary>
         </member>
         </member>
-        <member name="T:Admin.NET.Core.ApiJsonOptions">
+        <member name="T:Admin.NET.Core.APIJSONOptions">
+            <summary>
+            APIJSON配置选项
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.APIJSONOptions.Roles">
+            <summary>
+            角色集合
+            </summary>
+        </member>
+        <member name="T:Admin.NET.Core.APIJSON_Role">
+            <summary>
+            APIJSON角色权限
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.APIJSON_Role.RoleName">
+            <summary>
+            角色名称
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.APIJSON_Role.Select">
+            <summary>
+            查询
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.APIJSON_Role.Insert">
+            <summary>
+            增加
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.APIJSON_Role.Update">
+            <summary>
+            更新
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.APIJSON_Role.Delete">
+            <summary>
+            删除
+            </summary>
+        </member>
+        <member name="T:Admin.NET.Core.APIJSON_RoleItem">
+            <summary>
+            APIJSON角色权限内容
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.APIJSON_RoleItem.Table">
+            <summary>
+            表集合
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.APIJSON_RoleItem.Column">
             <summary>
             <summary>
-            ApiJson配置选项
+            列集合
             </summary>
             </summary>
         </member>
         </member>
-        <member name="P:Admin.NET.Core.ApiJsonOptions.RoleList">
+        <member name="P:Admin.NET.Core.APIJSON_RoleItem.Filter">
             <summary>
             <summary>
-            ApiJson集合RoleList
+            过滤器
             </summary>
             </summary>
         </member>
         </member>
         <member name="T:Admin.NET.Core.CacheOptions">
         <member name="T:Admin.NET.Core.CacheOptions">
@@ -4031,107 +4088,101 @@
             </summary>
             </summary>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="T:Admin.NET.Core.Service.ApiJson.ApiJsonService">
+        <member name="T:Admin.NET.Core.Service.APIJSONService">
             <summary>
             <summary>
-            系统数据库管理服务
+            APIJSON服务
             </summary>
             </summary>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.ApiJsonService.Post(Newtonsoft.Json.Linq.JObject)">
+        <member name="M:Admin.NET.Core.Service.APIJSONService.Post(Newtonsoft.Json.Linq.JObject)">
             <summary>
             <summary>
-            ApiJson 统一入口
+            统一入口
             </summary>
             </summary>
             <param name="jobject"></param>
             <param name="jobject"></param>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="T:Admin.NET.Core.Service.ApiJson.FuncList">
+        <member name="T:Admin.NET.Core.Service.FuncList">
             <summary>
             <summary>
             自定义方法
             自定义方法
             </summary>
             </summary>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.FuncList.Merge(System.Object,System.Object)">
+        <member name="M:Admin.NET.Core.Service.FuncList.Merge(System.Object,System.Object)">
             <summary>
             <summary>
-            
+            字符串相加
             </summary>
             </summary>
             <param name="a"></param>
             <param name="a"></param>
             <param name="b"></param>
             <param name="b"></param>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.FuncList.MergeObj(System.Object,System.Object)">
+        <member name="M:Admin.NET.Core.Service.FuncList.MergeObj(System.Object,System.Object)">
             <summary>
             <summary>
-            
+            对象合并
             </summary>
             </summary>
             <param name="a"></param>
             <param name="a"></param>
             <param name="b"></param>
             <param name="b"></param>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.FuncList.isContain(System.Object,System.Object)">
+        <member name="M:Admin.NET.Core.Service.FuncList.IsContain(System.Object,System.Object)">
             <summary>
             <summary>
-            
+            是否包含
             </summary>
             </summary>
             <param name="a"></param>
             <param name="a"></param>
             <param name="b"></param>
             <param name="b"></param>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.IIdentityService.GetUserIdentity">
+        <member name="M:Admin.NET.Core.Service.IdentityService.GetUserIdentity">
             <summary>
             <summary>
-            获取当前用户id
+            获取当前用户Id
             </summary>
             </summary>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.IIdentityService.GetUserRoleName">
+        <member name="M:Admin.NET.Core.Service.IdentityService.GetUserRoleName">
             <summary>
             <summary>
-            获取当前用户权限名称
+            获取当前用户权限名称
             </summary>
             </summary>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.IIdentityService.GetRole">
+        <member name="M:Admin.NET.Core.Service.IdentityService.GetRole">
             <summary>
             <summary>
             获取当前用户权限
             获取当前用户权限
             </summary>
             </summary>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.IIdentityService.GetSelectRole(System.String)">
+        <member name="M:Admin.NET.Core.Service.IdentityService.GetSelectRole(System.String)">
             <summary>
             <summary>
             获取当前表的可查询字段
             获取当前表的可查询字段
             </summary>
             </summary>
             <param name="table"></param>
             <param name="table"></param>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.StringExtensions.IsValue(System.Object)">
-            <summary>
-            是否有值
-            </summary>
-            <param name="str"></param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.StringExtensions.GetParamName(System.String)">
+        <member name="M:Admin.NET.Core.Service.IdentityService.ColIsRole(System.String,System.String[])">
             <summary>
             <summary>
-            
+            当前列是否在角色里面
             </summary>
             </summary>
-            <param name="param"></param>
+            <param name="col"></param>
+            <param name="selectrole"></param>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="T:Admin.NET.Core.Service.ApiJson.SelectTable">
-            <summary>
+        <member name="T:Admin.NET.Core.Service.SelectTable">
+             <summary>
             
             
-            </summary>
+             </summary>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.SelectTable.#ctor(Admin.NET.Core.Service.ApiJson.IIdentityService,APIJSON.NET.Services.ITableMapper,SqlSugar.ISqlSugarClient)">
-            <summary>
+        <member name="M:Admin.NET.Core.Service.SelectTable.#ctor(Admin.NET.Core.Service.IdentityService,Admin.NET.Core.Service.TableMapper,SqlSugar.ISqlSugarClient)">
+             <summary>
             
             
-            </summary>
-            <param name="identityService"></param>
-            <param name="tableMapper"></param>
-            <param name="dbClient"></param>
+             </summary>
+             <param name="identityService"></param>
+             <param name="tableMapper"></param>
+             <param name="dbClient"></param>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.SelectTable.IsTable(System.String)">
+        <member name="M:Admin.NET.Core.Service.SelectTable.IsTable(System.String)">
             <summary>
             <summary>
             判断表名是否正确
             判断表名是否正确
             </summary>
             </summary>
             <param name="table"></param>
             <param name="table"></param>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.SelectTable.IsCol(System.String,System.String)">
+        <member name="M:Admin.NET.Core.Service.SelectTable.IsCol(System.String,System.String)">
             <summary>
             <summary>
             判断表的列名是否正确
             判断表的列名是否正确
             </summary>
             </summary>
@@ -4139,7 +4190,7 @@
             <param name="col"></param>
             <param name="col"></param>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.SelectTable.ExecFunc(System.String,System.Object[],System.Type[])">
+        <member name="M:Admin.NET.Core.Service.SelectTable.ExecFunc(System.String,System.Object[],System.Type[])">
             <summary>
             <summary>
             动态调用方法
             动态调用方法
             </summary>
             </summary>
@@ -4148,34 +4199,34 @@
             <param name="types"></param>
             <param name="types"></param>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.SelectTable.GetTableData(System.String,System.Int32,System.Int32,System.Int32,System.String,Newtonsoft.Json.Linq.JObject)">
-            <summary>
+        <member name="M:Admin.NET.Core.Service.SelectTable.GetTableData(System.String,System.Int32,System.Int32,System.Int32,System.String,Newtonsoft.Json.Linq.JObject)">
+             <summary>
             
             
-            </summary>
-            <param name="subtable"></param>
-            <param name="page"></param>
-            <param name="count"></param>
-            <param name="json"></param>
-            <param name="dd"></param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.SelectTable.GetFirstData(System.String,System.String,Newtonsoft.Json.Linq.JObject)">
-            <summary>
+             </summary>
+             <param name="subtable"></param>
+             <param name="page"></param>
+             <param name="count"></param>
+             <param name="json"></param>
+             <param name="dd"></param>
+             <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SelectTable.GetFirstData(System.String,System.String,Newtonsoft.Json.Linq.JObject)">
+             <summary>
             
             
-            </summary>
-            <param name="subtable"></param>
-            <param name="json"></param>
-            <param name="dd"></param>
-            <returns></returns>
+             </summary>
+             <param name="subtable"></param>
+             <param name="json"></param>
+             <param name="dd"></param>
+             <returns></returns>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.SelectTable.Query(System.String)">
+        <member name="M:Admin.NET.Core.Service.SelectTable.Query(System.String)">
             <summary>
             <summary>
             解析并查询
             解析并查询
             </summary>
             </summary>
-            <param name="query"></param>
+            <param name="queryJson"></param>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.SelectTable.QuerySingle(Newtonsoft.Json.Linq.JObject,System.String)">
+        <member name="M:Admin.NET.Core.Service.SelectTable.QuerySingle(Newtonsoft.Json.Linq.JObject,System.String)">
             <summary>
             <summary>
             单表查询
             单表查询
             </summary>
             </summary>
@@ -4183,18 +4234,30 @@
             <param name="nodeName">返回数据的节点名称  默认为 infos</param>
             <param name="nodeName">返回数据的节点名称  默认为 infos</param>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.SelectTable.ToSql(Newtonsoft.Json.Linq.JObject)">
+        <member name="M:Admin.NET.Core.Service.SelectTable.ToSql(Newtonsoft.Json.Linq.JObject)">
             <summary>
             <summary>
             获取查询语句
             获取查询语句
             </summary>
             </summary>
             <param name="queryObj"></param>
             <param name="queryObj"></param>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
-        <member name="M:Admin.NET.Core.Service.ApiJson.SelectTable.Query(Newtonsoft.Json.Linq.JObject)">
+        <member name="M:Admin.NET.Core.Service.SelectTable.Query(Newtonsoft.Json.Linq.JObject)">
             <summary>
             <summary>
             解析并查询
             解析并查询
             </summary>
             </summary>
-            <param name="query"></param>
+            <param name="queryObj"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Admin.NET.Core.Service.TableMapper">
+            <summary>
+            表名映射
+            </summary>
+        </member>
+        <member name="M:Admin.NET.Core.Service.TableMapper.GetTableName(System.String)">
+            <summary>
+            获取表别名
+            </summary>
+            <param name="oldname"></param>
             <returns></returns>
             <returns></returns>
         </member>
         </member>
         <member name="T:Admin.NET.Core.Service.LoginInput">
         <member name="T:Admin.NET.Core.Service.LoginInput">
@@ -8111,12 +8174,5 @@
             SM工具类
             SM工具类
             </summary>
             </summary>
         </member>
         </member>
-        <member name="M:APIJSON.NET.Services.ITableMapper.GetTableName(System.String)">
-            <summary>
-            表别名获取
-            </summary>
-            <param name="oldname"></param>
-            <returns></returns>
-        </member>
     </members>
     </members>
 </doc>
 </doc>

+ 10 - 0
Admin.NET/Admin.NET.Core/Extension/ObjectExtension.cs

@@ -246,4 +246,14 @@ public static partial class ObjectExtension
             return defaultValue.GetValueOrDefault();
             return defaultValue.GetValueOrDefault();
         }
         }
     }
     }
+
+    /// <summary>
+    /// 判断是否有值
+    /// </summary>
+    /// <param name="obj"></param>
+    /// <returns></returns>
+    public static bool IsNullOrEmpty(this object obj)
+    {
+        return obj == null || string.IsNullOrEmpty(obj.ToString());
+    }
 }
 }

+ 55 - 12
Admin.NET/Admin.NET.Core/Option/ApiJsonOptions.cs

@@ -1,21 +1,64 @@
-using Admin.NET.Core.Service.ApiJson;
+namespace Admin.NET.Core;
 
 
-namespace Admin.NET.Core;
+/// <summary>
+/// APIJSON配置选项
+/// </summary>
+public sealed class APIJSONOptions : IConfigurableOptions
+{
+    /// <summary>
+    /// 角色集合
+    /// </summary>
+    public List<APIJSON_Role> Roles { get; set; }
+}
 
 
 /// <summary>
 /// <summary>
-/// ApiJson配置选项
+/// APIJSON角色权限
 /// </summary>
 /// </summary>
-public sealed class ApiJsonOptions : IConfigurableOptions
+public class APIJSON_Role
 {
 {
     /// <summary>
     /// <summary>
-    /// ApiJson集合RoleList
+    /// 角色名称
+    /// </summary>
+    public string RoleName { get; set; }
+
+    /// <summary>
+    /// 查询
+    /// </summary>
+    public APIJSON_RoleItem Select { get; set; }
+
+    /// <summary>
+    /// 增加
+    /// </summary>
+    public APIJSON_RoleItem Insert { get; set; }
+
+    /// <summary>
+    /// 更新
     /// </summary>
     /// </summary>
-    public List<Role> RoleList { get; set; }
-    //public Tablempper Tablempper { get; set; }
+    public APIJSON_RoleItem Update { get; set; }
+
+    /// <summary>
+    /// 删除
+    /// </summary>
+    public APIJSON_RoleItem Delete { get; set; }
 }
 }
 
 
-//public sealed class Tablempper
-//{
-//    public string User { get; set;}
-//    public string Org { get; set;}
-//}
+/// <summary>
+/// APIJSON角色权限内容
+/// </summary>
+public class APIJSON_RoleItem
+{
+    /// <summary>
+    /// 表集合
+    /// </summary>
+    public string[] Table { get; set; }
+
+    /// <summary>
+    /// 列集合
+    /// </summary>
+    public string[] Column { get; set; }
+
+    /// <summary>
+    /// 过滤器
+    /// </summary>
+    public string[] Filter { get; set; }
+}

+ 13 - 29
Admin.NET/Admin.NET.Core/Service/ApiJson/ApiJsonService.cs

@@ -1,49 +1,33 @@
-using APIJSON.NET.Services;
-using Newtonsoft.Json.Linq;
+using Newtonsoft.Json.Linq;
 
 
-namespace Admin.NET.Core.Service.ApiJson;
+namespace Admin.NET.Core.Service;
 
 
 /// <summary>
 /// <summary>
-/// 系统数据库管理服务
+/// APIJSON服务
 /// </summary>
 /// </summary>
-[ApiDescriptionSettings(Order = 251)]
-public class ApiJsonService : IDynamicApiController, ITransient
+[ApiDescriptionSettings(Order = 100)]
+public class APIJSONService : IDynamicApiController, ITransient
 {
 {
-    private SelectTable selectTable;
     private readonly ISqlSugarClient _db;
     private readonly ISqlSugarClient _db;
-    private readonly IViewEngine _viewEngine;
-    private readonly CodeGenOptions _codeGenOptions;
-    //private readonly ApiJsnOptions _roles;
-    private readonly IIdentityService _identitySvc;
-    private ITableMapper _tableMapper;
+    private readonly IdentityService _identityService;
+    private readonly TableMapper _tableMapper;
 
 
-    public ApiJsonService(ISqlSugarClient db,
-        IViewEngine viewEngine,
-        IOptions<CodeGenOptions> codeGenOptions,
-        IOptions<ApiJsonOptions> adaOptions,
-        IIdentityService identityService,
-        ITableMapper tableMapper)
+    public APIJSONService(ISqlSugarClient db,
+        IdentityService identityService,
+        TableMapper tableMapper)
     {
     {
         _db = db;
         _db = db;
-        _viewEngine = viewEngine;
-        //_codeGenOptions = codeGenOptions.Value;
-        //_roles = roles.Value;
-
-
         _tableMapper = tableMapper;
         _tableMapper = tableMapper;
-        _identitySvc = identityService;
-        selectTable = new SelectTable(_identitySvc, _tableMapper, _db);
+        _identityService = identityService;
     }
     }
 
 
     /// <summary>
     /// <summary>
-    /// ApiJson 统一入口
+    /// 统一入口
     /// </summary>
     /// </summary>
     /// <param name="jobject"></param>
     /// <param name="jobject"></param>
     /// <returns></returns>
     /// <returns></returns>
     public JObject Post([FromBody] JObject jobject)
     public JObject Post([FromBody] JObject jobject)
     {
     {
-        JObject resultJobj = new SelectTable(_identitySvc, _tableMapper, _db).Query(jobject);
-        return resultJobj;
+        return new SelectTable(_identityService, _tableMapper, _db).Query(jobject);
     }
     }
-
 }
 }

+ 32 - 36
Admin.NET/Admin.NET.Core/Service/ApiJson/FuncList.cs

@@ -1,44 +1,40 @@
-using System;
-using System.Linq;
+namespace Admin.NET.Core.Service;
 
 
-namespace Admin.NET.Core.Service.ApiJson
+/// <summary>
+/// 自定义方法
+/// </summary>
+public class FuncList
 {
 {
     /// <summary>
     /// <summary>
-    /// 自定义方法
+    /// 字符串相加
     /// </summary>
     /// </summary>
-    public class FuncList
+    /// <param name="a"></param>
+    /// <param name="b"></param>
+    /// <returns></returns>
+    public string Merge(object a, object b)
     {
     {
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="a"></param>
-        /// <param name="b"></param>
-        /// <returns></returns>
-        public string Merge(object a, object b)
-        {
-            return a.ToString() + b.ToString();
-        }
+        return a.ToString() + b.ToString();
+    }
 
 
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="a"></param>
-        /// <param name="b"></param>
-        /// <returns></returns>
-        public object MergeObj(object a, object b)
-        {
-            return new { a, b };
-        }
+    /// <summary>
+    /// 对象合并
+    /// </summary>
+    /// <param name="a"></param>
+    /// <param name="b"></param>
+    /// <returns></returns>
+    public object MergeObj(object a, object b)
+    {
+        return new { a, b };
+    }
 
 
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="a"></param>
-        /// <param name="b"></param>
-        /// <returns></returns>
-        public bool isContain(object a, object b)
-        {
-            return a.ToString().Split(',').Contains(b);
-        }
+    /// <summary>
+    /// 是否包含
+    /// </summary>
+    /// <param name="a"></param>
+    /// <param name="b"></param>
+    /// <returns></returns>
+    public bool IsContain(object a, object b)
+    {
+        return a.ToString().Split(',').Contains(b);
     }
     }
-}
+}

+ 0 - 32
Admin.NET/Admin.NET.Core/Service/ApiJson/IIdentityService.cs

@@ -1,32 +0,0 @@
-using System;
-
-namespace Admin.NET.Core.Service.ApiJson
-{
-    public interface IIdentityService
-    {
-        /// <summary>
-        /// 获取当前用户id
-        /// </summary>
-        /// <returns></returns>
-        string GetUserIdentity();
-        /// <summary>
-        /// 获取当前用户权限组名称
-        /// </summary>
-        /// <returns></returns>
-        string GetUserRoleName();
-        /// <summary>
-        /// 获取当前用户权限
-        /// </summary>
-        /// <returns></returns>
-        Role GetRole();
-        /// <summary>
-        /// 获取当前表的可查询字段
-        /// </summary>
-        /// <param name="table"></param>
-        /// <returns></returns>
-        (bool, string) GetSelectRole(string table);
-
-
-        bool ColIsRole(string col, string[] selectrole);
-    }
-}

+ 0 - 12
Admin.NET/Admin.NET.Core/Service/ApiJson/ITableMapper.cs

@@ -1,12 +0,0 @@
-namespace APIJSON.NET.Services
-{
-    public interface ITableMapper
-    {
-        /// <summary>
-        /// 表别名获取
-        /// </summary>
-        /// <param name="oldname"></param>
-        /// <returns></returns>
-          string GetTableName(string oldname);
-    }
-}

+ 77 - 67
Admin.NET/Admin.NET.Core/Service/ApiJson/IdentityService.cs

@@ -1,91 +1,101 @@
 using System.Security.Claims;
 using System.Security.Claims;
 
 
-namespace Admin.NET.Core.Service.ApiJson
+namespace Admin.NET.Core.Service;
+
+public class IdentityService : ITransient
 {
 {
-    public class IdentityService : IIdentityService
+    private readonly IHttpContextAccessor _context;
+    private readonly List<APIJSON_Role> _roles;
+
+    public IdentityService(IHttpContextAccessor context, IOptions<APIJSONOptions> roles)
+    {
+        _context = context ?? throw new ArgumentNullException(nameof(context));
+        _roles = roles.Value.Roles;
+    }
+
+    /// <summary>
+    /// 获取当前用户Id
+    /// </summary>
+    /// <returns></returns>
+    public string GetUserIdentity()
+    {
+        return _context.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
+    }
+
+    /// <summary>
+    /// 获取当前用户权限名称
+    /// </summary>
+    /// <returns></returns>
+    public string GetUserRoleName()
     {
     {
-        private IHttpContextAccessor _context;
-        private List<Role> _roles;
+        return _context.HttpContext.User.FindFirstValue(ClaimTypes.Role);
+    }
 
 
-        public IdentityService(IHttpContextAccessor context, IOptions<ApiJsonOptions> roles)
+    /// <summary>
+    /// 获取当前用户权限
+    /// </summary>
+    /// <returns></returns>
+    public APIJSON_Role GetRole()
+    {
+        var role = new APIJSON_Role();
+        if (string.IsNullOrEmpty(GetUserRoleName())) // 若没登录默认取第一个
         {
         {
-            _context = context ?? throw new ArgumentNullException(nameof(context));
-            //roles = App.GetConfig<List<Role>>("ApiJson:RoleList");
-            _roles = roles.Value.RoleList;
+            role = _roles.FirstOrDefault();
         }
         }
-        public string GetUserIdentity()
+        else
         {
         {
-            return _context.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
+            role = _roles.FirstOrDefault(it => it.RoleName.Equals(GetUserRoleName(), StringComparison.CurrentCultureIgnoreCase));
         }
         }
+        return role;
+    }
 
 
-        public string GetUserRoleName()
+    /// <summary>
+    /// 获取当前表的可查询字段
+    /// </summary>
+    /// <param name="table"></param>
+    /// <returns></returns>
+    public (bool, string) GetSelectRole(string table)
+    {
+        var role = GetRole();
+        if (role == null || role.Select == null || role.Select.Table == null)
         {
         {
-            return _context.HttpContext.User.FindFirstValue(ClaimTypes.Role);
+            return (false, $"appsettings.json权限配置不正确!");
         }
         }
-        public Role GetRole()
-        {
-            var role = new Role();
-            if (string.IsNullOrEmpty(GetUserRoleName()))//没登录默认取第一个
-            {
-                role = _roles.FirstOrDefault();
+        string tablerole = role.Select.Table.FirstOrDefault(it => it == "*" || it.Equals(table, StringComparison.CurrentCultureIgnoreCase));
 
 
-            }
-            else
-            {
-                role = _roles.FirstOrDefault(it => it.Name.Equals(GetUserRoleName(), StringComparison.CurrentCultureIgnoreCase));
-            }
-            return role;
-        }
-        public (bool, string) GetSelectRole(string table)
+        if (string.IsNullOrEmpty(tablerole))
         {
         {
-            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));
+            return (false, $"表名{table}没权限查询!");
+        }
+        int index = Array.IndexOf(role.Select.Table, tablerole);
+        string selectrole = role.Select.Column[index];
+        return (true, selectrole);
+    }
 
 
-            if (string.IsNullOrEmpty(tablerole))
-            {
-                return (false, $"表名{table}没权限查询!");
-            }
-            int index = Array.IndexOf(role.Select.Table, tablerole);
-            string selectrole = role.Select.Column[index];
-            return (true, selectrole);
+    /// <summary>
+    /// 当前列是否在角色里面
+    /// </summary>
+    /// <param name="col"></param>
+    /// <param name="selectrole"></param>
+    /// <returns></returns>
+    public bool ColIsRole(string col, string[] selectrole)
+    {
+        if (selectrole.Contains("*"))
+        {
+            return true;
         }
         }
-        public bool ColIsRole(string col, string[] selectrole)
+        else
         {
         {
-            if (selectrole.Contains("*"))
+            if (col.Contains("(") && col.Contains(")"))
             {
             {
-                return true;
+                Regex reg = new Regex(@"\(([^)]*)\)");
+                Match m = reg.Match(col);
+                return selectrole.Contains(m.Result("$1"), StringComparer.CurrentCultureIgnoreCase);
             }
             }
             else
             else
             {
             {
-                if (col.Contains("(") && col.Contains(")"))
-                {
-                    Regex reg = new Regex(@"\(([^)]*)\)");
-                    Match m = reg.Match(col);
-                    if (selectrole.Contains(m.Result("$1"), StringComparer.CurrentCultureIgnoreCase))
-                    {
-                        return true;
-                    }
-                    else
-                    {
-                        return false;
-                    }
-                }
-                else
-                {
-                    if (selectrole.Contains(col, StringComparer.CurrentCultureIgnoreCase))
-                    {
-                        return true;
-                    }
-                    else
-                    {
-                        return false;
-                    }
-                }
+                return selectrole.Contains(col, StringComparer.CurrentCultureIgnoreCase);
             }
             }
         }
         }
     }
     }
-}
+}

+ 0 - 29
Admin.NET/Admin.NET.Core/Service/ApiJson/Infrastructure/StringExtensions.cs

@@ -1,29 +0,0 @@
-namespace Admin.NET.Core.Service.ApiJson
-{
-    using System;
-    using System.Text.RegularExpressions;
-    public static class StringExtensions
-    {
-       
-        /// <summary>
-        /// 是否有值
-        /// </summary>
-        /// <param name="str"></param>
-        /// <returns></returns>
-        public static bool IsValue(this object str)
-        {
-            return str != null && !string.IsNullOrEmpty(str.ToString());
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="param"></param>
-        /// <returns></returns>
-        public static string GetParamName(this string param)
-        {
-            return param + new Random().Next(1, 100);
-        }
-     
-    }
-}

+ 0 - 19
Admin.NET/Admin.NET.Core/Service/ApiJson/Models/RoleItem.cs

@@ -1,19 +0,0 @@
-namespace Admin.NET.Core.Service.ApiJson
-{
-    public class RoleItem
-    {
-        public string[] Table { get; set; }
-        public string[] Column { get; set; }
-        public string[] Filter { get; set; }
-    }
-    public class Role
-    {
-        public string Name { get; set; }
-        public RoleItem Select { get; set; }
-        public RoleItem Update { get; set; }
-        public RoleItem Insert { get; set; }
-        public RoleItem Delete { get; set; }
-
-    }
-    
-}

+ 661 - 671
Admin.NET/Admin.NET.Core/Service/ApiJson/SelectTable.cs

@@ -1,839 +1,829 @@
-namespace Admin.NET.Core.Service.ApiJson
+namespace Admin.NET.Core.Service;
+
+using AspectCore.Extensions.Reflection;
+using Newtonsoft.Json.Linq;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Dynamic;
+using System.Linq;
+using System.Text.RegularExpressions;
+
+/// <summary>
+///
+/// </summary>
+public class SelectTable : ISingleton
 {
 {
-    using APIJSON.NET.Services;
-    using AspectCore.Extensions.Reflection;
-    using Newtonsoft.Json.Linq;
-    using SqlSugar;
-    using System;
-    using System.Collections.Generic;
-    using System.Dynamic;
-    using System.Linq;
-    using System.Text.RegularExpressions;
+    private readonly IdentityService _identitySvc;
+    private readonly TableMapper _tableMapper;
+    private readonly ISqlSugarClient db;
 
 
     /// <summary>
     /// <summary>
-    /// 
+    ///
     /// </summary>
     /// </summary>
-    public class SelectTable
+    /// <param name="identityService"></param>
+    /// <param name="tableMapper"></param>
+    /// <param name="dbClient"></param>
+    public SelectTable(IdentityService identityService, TableMapper tableMapper, ISqlSugarClient dbClient)
     {
     {
-        private readonly IIdentityService _identitySvc;
-        private readonly ITableMapper _tableMapper;
-        private readonly ISqlSugarClient db;
-
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="identityService"></param>
-        /// <param name="tableMapper"></param>
-        /// <param name="dbClient"></param>
-        public SelectTable(IIdentityService identityService, ITableMapper tableMapper, ISqlSugarClient dbClient)
-        {
-            _identitySvc = identityService;
-            _tableMapper = tableMapper;
-            db = dbClient;
-        }
-        /// <summary>
-        /// 判断表名是否正确
-        /// </summary>
-        /// <param name="table"></param>
-        /// <returns></returns>
-        public bool IsTable(string table)
-        {
-            return db.DbMaintenance.GetTableInfoList().Any(it => it.Name.Equals(table, StringComparison.CurrentCultureIgnoreCase));
-        }
-        /// <summary>
-        /// 判断表的列名是否正确
-        /// </summary>
-        /// <param name="table"></param>
-        /// <param name="col"></param>
-        /// <returns></returns>
-        public bool IsCol(string table, string col)
-        {
-            return db.DbMaintenance.GetColumnInfosByTableName(table).Any(it => it.DbColumnName.Equals(col, StringComparison.CurrentCultureIgnoreCase));
-        }
-        /// <summary>
-        /// 动态调用方法
-        /// </summary>
-        /// <param name="funcname"></param>
-        /// <param name="param"></param>
-        /// <param name="types"></param>
-        /// <returns></returns>
-        public 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;
-        }
-
-        private string ToSql(string subtable, int page, int count, int query, string json)
-        {
-            JObject 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");
-            subtable = _tableMapper.GetTableName(subtable);
-            var tb = sugarQueryable(subtable, "*", values,null);
-            var xx= tb.Skip((page - 1) * count).Take(10).ToSql();
-            return xx.Key;
-        }
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="subtable"></param>
-        /// <param name="page"></param>
-        /// <param name="count"></param>
-        /// <param name="json"></param>
-        /// <param name="dd"></param>
-        /// <returns></returns>
-        public Tuple<dynamic, int> GetTableData(string subtable, int page, int count, int query, string json, JObject dd)
-        {
-
-            var role = _identitySvc.GetSelectRole(subtable);
-            if (!role.Item1)//没有权限返回异常
+        _identitySvc = identityService;
+        _tableMapper = tableMapper;
+        db = dbClient;
+    }
+
+    /// <summary>
+    /// 判断表名是否正确
+    /// </summary>
+    /// <param name="table"></param>
+    /// <returns></returns>
+    public bool IsTable(string table)
+    {
+        return db.DbMaintenance.GetTableInfoList().Any(it => it.Name.Equals(table, StringComparison.CurrentCultureIgnoreCase));
+    }
+
+    /// <summary>
+    /// 判断表的列名是否正确
+    /// </summary>
+    /// <param name="table"></param>
+    /// <param name="col"></param>
+    /// <returns></returns>
+    public bool IsCol(string table, string col)
+    {
+        return db.DbMaintenance.GetColumnInfosByTableName(table).Any(it => it.DbColumnName.Equals(col, StringComparison.CurrentCultureIgnoreCase));
+    }
+
+    /// <summary>
+    /// 动态调用方法
+    /// </summary>
+    /// <param name="funcname"></param>
+    /// <param name="param"></param>
+    /// <param name="types"></param>
+    /// <returns></returns>
+    public 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;
+    }
+
+    private string ToSql(string subtable, int page, int count, int query, string json)
+    {
+        JObject 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");
+        subtable = _tableMapper.GetTableName(subtable);
+        var tb = sugarQueryable(subtable, "*", values, null);
+        var xx = tb.Skip((page - 1) * count).Take(10).ToSql();
+        return xx.Key;
+    }
+
+    /// <summary>
+    ///
+    /// </summary>
+    /// <param name="subtable"></param>
+    /// <param name="page"></param>
+    /// <param name="count"></param>
+    /// <param name="json"></param>
+    /// <param name="dd"></param>
+    /// <returns></returns>
+    public Tuple<dynamic, int> GetTableData(string subtable, int page, int count, int query, string json, JObject dd)
+    {
+        var role = _identitySvc.GetSelectRole(subtable);
+        if (!role.Item1)//没有权限返回异常
+        {
+            throw new Exception(role.Item2);
+        }
+        string selectrole = role.Item2;
+        subtable = _tableMapper.GetTableName(subtable);
+
+        JObject 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-总数
+            return new Tuple<dynamic, int>(new List<object>(), tb.Count());
+        else
+        {
+            if (count > 0)
             {
             {
-                throw new Exception(role.Item2);
+                int total = 0;
+                if (query == 0)//0-对象
+                    return new Tuple<dynamic, int>(tb.ToPageList(page, count), total);
+                else
+                    //2-以上全部
+                    return new Tuple<dynamic, int>(tb.ToPageList(page, count, ref total), total);
             }
             }
-            string selectrole = role.Item2;
-            subtable = _tableMapper.GetTableName(subtable);
-
-            JObject 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-总数
-                return new Tuple<dynamic, int>(new List<object>(), tb.Count());
             else
             else
             {
             {
-                if (count > 0)
-                {
-                    int total = 0;
-                    if (query == 0)//0-对象
-                        return new Tuple<dynamic, int>(tb.ToPageList(page, count), total);
-                    else
-                        //2-以上全部
-                        return new Tuple<dynamic, int>(tb.ToPageList(page, count, ref total), total);
-
-                }
+                if (query == 0)
+                    return new Tuple<dynamic, int>(tb.ToList(), 0);
                 else
                 else
-                {
-                    if (query == 0)
-                        return new Tuple<dynamic, int>(tb.ToList(), 0);
-                    else
-                        return new Tuple<dynamic, int>(tb.ToList(), tb.Count());
-                }
+                    return new Tuple<dynamic, int>(tb.ToList(), tb.Count());
             }
             }
         }
         }
+    }
 
 
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="subtable"></param>
-        /// <param name="json"></param>
-        /// <param name="dd"></param>
-        /// <returns></returns>
-        public dynamic GetFirstData(string subtable, string json, JObject dd)
+    /// <summary>
+    ///
+    /// </summary>
+    /// <param name="subtable"></param>
+    /// <param name="json"></param>
+    /// <param name="dd"></param>
+    /// <returns></returns>
+    public dynamic GetFirstData(string subtable, string json, JObject dd)
+    {
+        var role = _identitySvc.GetSelectRole(subtable);
+        if (!role.Item1)//没有权限返回异常
         {
         {
-
-            var role = _identitySvc.GetSelectRole(subtable);
-            if (!role.Item1)//没有权限返回异常
-            {
-                throw new Exception(role.Item2);
-            }
-            string selectrole = role.Item2;
-            subtable = _tableMapper.GetTableName(subtable);
-            JObject values = JObject.Parse(json);
-            values.Remove("page");
-            values.Remove("count");
-            var tb = sugarQueryable(subtable, selectrole, values, dd).First();
-            var dic = (IDictionary<string, object>)tb;
-            foreach (var item in values.Properties().Where(it => it.Name.EndsWith("()")))
+            throw new Exception(role.Item2);
+        }
+        string selectrole = role.Item2;
+        subtable = _tableMapper.GetTableName(subtable);
+        JObject values = JObject.Parse(json);
+        values.Remove("page");
+        values.Remove("count");
+        var tb = sugarQueryable(subtable, selectrole, values, dd).First();
+        var dic = (IDictionary<string, object>)tb;
+        foreach (var item in values.Properties().Where(it => it.Name.EndsWith("()")))
+        {
+            if (!item.Value.IsNullOrEmpty())
             {
             {
-                if (item.Value.IsValue())
+                string func = item.Value.ToString().Substring(0, item.Value.ToString().IndexOf("("));
+                string 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(','))
                 {
                 {
-                    string func = item.Value.ToString().Substring(0, item.Value.ToString().IndexOf("("));
-                    string 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(','))
-                    {
-                        types.Add(typeof(object));
-                        paramss.Add(tb.Where(it => it.Key.Equals(va)).Select(i => i.Value));
-                    }
-                    dic[item.Name] = ExecFunc(func, paramss.ToArray(), types.ToArray());
+                    types.Add(typeof(object));
+                    paramss.Add(tb.Where(it => it.Key.Equals(va)).Select(i => i.Value));
                 }
                 }
+                dic[item.Name] = ExecFunc(func, paramss.ToArray(), types.ToArray());
             }
             }
+        }
 
 
-            return tb;
+        return tb;
+    }
 
 
-        }
+    /// <summary>
+    /// 解析并查询
+    /// </summary>
+    /// <param name="queryJson"></param>
+    /// <returns></returns>
+    public JObject Query(string queryJson)
+    {
+        JObject resultObj = new JObject();
 
 
-        /// <summary>
-        /// 解析并查询
-        /// </summary>
-        /// <param name="query"></param>
-        /// <returns></returns>
-        public JObject Query(string queryJson)
+        try
         {
         {
-            JObject resultObj = new JObject();
+            JObject queryJobj = JObject.Parse(queryJson);
+            resultObj = Query(queryJobj);
+        }
+        catch (Exception ex)
+        {
+            resultObj.Add("code", "500");
+            resultObj.Add("msg", ex.Message);
+        }
 
 
-            try
+        return resultObj;
+    }
+
+    /// <summary>
+    /// 单表查询
+    /// </summary>
+    /// <param name="queryObj"></param>
+    /// <param name="nodeName">返回数据的节点名称  默认为 infos</param>
+    /// <returns></returns>
+    public JObject QuerySingle(JObject queryObj, string nodeName = "infos")
+    {
+        JObject resultObj = new JObject();
+        resultObj.Add("code", "200");
+        resultObj.Add("msg", "success");
+        try
+        {
+            int total = 0;
+            foreach (var item in queryObj)
             {
             {
-                JObject queryJobj = JObject.Parse(queryJson);
-                resultObj = Query(queryJobj);
+                string key = item.Key.Trim();
+
+                if (key.EndsWith("[]"))
+                {
+                    total = QuerySingleList(resultObj, item, nodeName);
+                }
+                else if (key.Equals("func"))
+                {
+                    ExecFunc(resultObj, item);
+                }
+                else if (key.Equals("total@"))
+                {
+                    resultObj.Add("total", total);
+                }
             }
             }
-            catch (Exception ex)
+        }
+        catch (Exception ex)
+        {
+            resultObj["code"] = "500";
+            resultObj["msg"] = ex.Message;
+        }
+        return resultObj;
+    }
+
+    /// <summary>
+    /// 获取查询语句
+    /// </summary>
+    /// <param name="queryObj"></param>
+    /// <returns></returns>
+    public string ToSql(JObject queryObj)
+    {
+        foreach (var item in queryObj)
+        {
+            string key = item.Key.Trim();
+
+            if (key.EndsWith("[]"))
             {
             {
-                resultObj.Add("code", "500");
-                resultObj.Add("msg", ex.Message);
+                return ToSql(item);
             }
             }
-
-            return resultObj;
         }
         }
+        return string.Empty;
+    }
 
 
-        /// <summary>
-        /// 单表查询
-        /// </summary>
-        /// <param name="queryObj"></param>
-        /// <param name="nodeName">返回数据的节点名称  默认为 infos</param>
-        /// <returns></returns>
-        public JObject QuerySingle(JObject queryObj, string nodeName = "infos")
+    /// <summary>
+    /// 解析并查询
+    /// </summary>
+    /// <param name="queryObj"></param>
+    /// <returns></returns>
+    public JObject Query(JObject queryObj)
+    {
+        JObject resultObj = new JObject();
+        resultObj.Add("code", "200");
+        resultObj.Add("msg", "success");
+        try
         {
         {
-            JObject resultObj = new JObject();
-            resultObj.Add("code", "200");
-            resultObj.Add("msg", "success");
-            try
+            int total = 0;
+            foreach (var item in queryObj)
             {
             {
-                int total = 0;
-                foreach (var item in queryObj)
-                {
-                    string key = item.Key.Trim();
+                string key = item.Key.Trim();
 
 
-                    if (key.EndsWith("[]"))
-                    {
-                        total = QuerySingleList(resultObj, item, nodeName);
-                    }
-                    else if (key.Equals("func"))
-                    {
-                        ExecFunc(resultObj, item);
-                    }
-                    else if (key.Equals("total@"))
+                if (key.Equals("[]"))
+                {
+                    total = QueryMoreList(resultObj, item);
+                }
+                else if (key.EndsWith("[]"))
+                {
+                    total = QuerySingleList(resultObj, item);
+                }
+                else if (key.Equals("func"))
+                {
+                    ExecFunc(resultObj, item);
+                }
+                else if (key.Equals("total@"))
+                {
+                    resultObj.Add("total", total);
+                }
+                else
+                {
+                    var template = GetFirstData(key, item.Value.ToString(), resultObj);
+                    if (template != null)
                     {
                     {
-                        resultObj.Add("total", total);
+                        resultObj.Add(key, JToken.FromObject(template));
                     }
                     }
                 }
                 }
             }
             }
-            catch (Exception ex)
+        }
+        catch (Exception ex)
+        {
+            resultObj["code"] = "500";
+            resultObj["msg"] = ex.Message;
+        }
+        return resultObj;
+    }
+
+    //单表查询,返回的数据在指定的NodeName节点
+    private int QuerySingleList(JObject resultObj, KeyValuePair<string, JToken> item, string nodeName)
+    {
+        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 ? 0 : int.Parse(jb["query"].ToString());
+        int total = 0;
+
+        jb.Remove("page"); jb.Remove("count"); jb.Remove("query");
+
+        var htt = new JArray();
+        foreach (var t in jb)
+        {
+            var datas = GetTableData(t.Key, page, count, query, t.Value.ToString(), null);
+            if (query > 0)
+            {
+                total = datas.Item2;
+            }
+            foreach (var data in datas.Item1)
             {
             {
-                resultObj["code"] = "500";
-                resultObj["msg"] = ex.Message;
+                htt.Add(JToken.FromObject(data));
             }
             }
-            return resultObj;
         }
         }
 
 
-        /// <summary>
-        /// 获取查询语句
-        /// </summary>
-        /// <param name="queryObj"></param>
-        /// <returns></returns>
-        public string ToSql(JObject queryObj)
+        if (!string.IsNullOrEmpty(nodeName))
         {
         {
-            foreach (var item in queryObj)
-            {
-                string key = item.Key.Trim();
+            resultObj.Add(nodeName, htt);
+        }
+        else
+            resultObj.Add(key, htt);
+        return total;
+    }
 
 
-                if (key.EndsWith("[]"))
-                {
-                    return  ToSql(item);
-                }
-            }
-            return string.Empty;
+    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 ? 0 : 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());
         }
         }
 
 
-        /// <summary>
-        /// 解析并查询
-        /// </summary>
-        /// <param name="query"></param>
-        /// <returns></returns>
-        public JObject Query(JObject queryObj)
+        return string.Empty;
+    }
+
+    //单表查询
+    private int QuerySingleList(JObject resultObj, KeyValuePair<string, JToken> item)
+    {
+        string key = item.Key.Trim();
+        return QuerySingleList(resultObj, item, key);
+    }
+
+    //多列表查询
+    private int QueryMoreList(JObject resultObj, KeyValuePair<string, JToken> item)
+    {
+        int total = 0;
+
+        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 ? 0 : 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>();
+        foreach (var t in jb)
+        {
+            tables.Add(t.Key); where.Add(t.Value.ToString());
+        }
+        if (tables.Count > 0)
         {
         {
-            JObject resultObj = new JObject();
-            resultObj.Add("code", "200");
-            resultObj.Add("msg", "success");
-            try
+            string table = tables[0];
+            var temp = GetTableData(table, page, count, query, where[0], null);
+            if (query > 0)
             {
             {
-                int total = 0;
-                foreach (var item in queryObj)
-                {
-                    string key = item.Key.Trim();
+                total = temp.Item2;
+            }
 
 
-                    if (key.Equals("[]"))
-                    {
-                        total = QueryMoreList(resultObj, item);
-                    }
-                    else if (key.EndsWith("[]"))
-                    {
-                        total = QuerySingleList(resultObj, item);
-                    }
-                    else if (key.Equals("func"))
-                    {
-                        ExecFunc(resultObj, item);
-                    }
-                    else if (key.Equals("total@"))
+            foreach (var dd in temp.Item1)
+            {
+                var zht = new JObject();
+                zht.Add(table, JToken.FromObject(dd));
+                for (int i = 1; i < tables.Count; i++)
+                {
+                    string subtable = tables[i];
+                    if (subtable.EndsWith("[]"))
                     {
                     {
-                        resultObj.Add("total", total);
+                        subtable = subtable.TrimEnd("[]".ToCharArray());
+                        var jbb = JObject.Parse(where[i]);
+                        page = jbb["page"] == null ? 0 : int.Parse(jbb["page"].ToString());
+                        count = jbb["count"] == null ? 0 : int.Parse(jbb["count"].ToString());
+
+                        var lt = new JArray();
+                        foreach (var d in GetTableData(subtable, page, count, query, jbb[subtable].ToString(), zht).Item1)
+                        {
+                            lt.Add(JToken.FromObject(d));
+                        }
+                        zht.Add(tables[i], lt);
                     }
                     }
                     else
                     else
                     {
                     {
-                        var template = GetFirstData(key, item.Value.ToString(), resultObj);
-                        if (template != null)
+                        var ddf = GetFirstData(subtable, where[i].ToString(), zht);
+                        if (ddf != null)
                         {
                         {
-                            resultObj.Add(key, JToken.FromObject(template));
+                            zht.Add(subtable, JToken.FromObject(ddf));
                         }
                         }
                     }
                     }
                 }
                 }
+                htt.Add(zht);
             }
             }
-            catch (Exception ex)
-            {
-                resultObj["code"] = "500";
-                resultObj["msg"] = ex.Message;
-            }
-            return resultObj;
         }
         }
-
-        //单表查询,返回的数据在指定的NodeName节点
-        private int QuerySingleList(JObject resultObj, KeyValuePair<string, JToken> item, string nodeName)
+        if (query != 1)
         {
         {
-            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 ? 0 : int.Parse(jb["query"].ToString());
-            int total = 0;
+            resultObj.Add("[]", htt);
+        }
 
 
-            jb.Remove("page"); jb.Remove("count"); jb.Remove("query");
+        return total;
+    }
 
 
-            var htt = new JArray();
-            foreach (var t in jb)
-            {
-                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));
-                }
-            }
+    private void ExecFunc(JObject resultObj, KeyValuePair<string, JToken> item)
+    {
+        JObject jb = JObject.Parse(item.Value.ToString());
+        Type type = typeof(FuncList);
 
 
-            if (!string.IsNullOrEmpty(nodeName))
+        var dataJObj = new JObject();
+        foreach (var f in jb)
+        {
+            var types = new List<Type>();
+            var param = new List<object>();
+            foreach (var va in JArray.Parse(f.Value.ToString()))
             {
             {
-                resultObj.Add(nodeName, htt);
+                types.Add(typeof(object));
+                param.Add(va);
             }
             }
-            else
-                resultObj.Add(key, htt);
-            return total;
+            dataJObj.Add(f.Key, JToken.FromObject(ExecFunc(f.Key, param.ToArray(), types.ToArray())));
         }
         }
+        resultObj.Add("func", dataJObj);
+    }
 
 
-        private string ToSql(KeyValuePair<string, JToken> item)
+    private ISugarQueryable<ExpandoObject> sugarQueryable(string subtable, string selectrole, JObject values, JObject dd)
+    {
+        if (!IsTable(subtable))
         {
         {
-            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 ? 0 : 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());
-            }
+            throw new Exception($"表名{subtable}不正确!");
+        }
+        var tb = db.Queryable(subtable, "tb");
 
 
-            return string.Empty;
+        if (!values["@column"].IsNullOrEmpty())
+        {
+            ProcessColumn(subtable, selectrole, values, tb);
         }
         }
-        //单表查询
-        private int QuerySingleList(JObject resultObj, KeyValuePair<string, JToken> item)
+        else
         {
         {
-            string key = item.Key.Trim();
-            return QuerySingleList(resultObj, item, key);
+            tb.Select(selectrole);
         }
         }
 
 
-        //多列表查询
-        private int QueryMoreList(JObject resultObj, KeyValuePair<string, JToken> item)
+        List<IConditionalModel> conModels = new List<IConditionalModel>();
+        if (!values["identity"].IsNullOrEmpty())
         {
         {
-            int total = 0;
+            conModels.Add(new ConditionalModel() { FieldName = values["identity"].ToString(), ConditionalType = ConditionalType.Equal, FieldValue = _identitySvc.GetUserIdentity() });
+        }
+        foreach (var va in values)
+        {
+            string vakey = va.Key.Trim();
+            string fieldValue = va.Value.ToString();
 
 
-            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 ? 0 : 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>();
-            foreach (var t in jb)
+            if (vakey.EndsWith("$"))//模糊查询
+            {
+                FuzzyQuery(subtable, conModels, va);
+            }
+            else if (vakey.EndsWith("{}"))//逻辑运算
+            {
+                ConditionQuery(subtable, conModels, va);
+            }
+            else if (vakey.EndsWith("%"))//bwtween查询
             {
             {
-                tables.Add(t.Key); where.Add(t.Value.ToString());
+                ConditionBetween(subtable, conModels, va);
             }
             }
-            if (tables.Count > 0)
+            else if (vakey.EndsWith("@") && dd != null) // 关联上一个table
             {
             {
-                string table = tables[0];
-                var temp = GetTableData(table, page, count, query, where[0], null);
-                if (query > 0)
+                string[] str = fieldValue.Split('/');
+                string value = string.Empty;
+                if (str.Length == 3)
                 {
                 {
-                    total = temp.Item2;
+                    value = dd[str[1]][str[2]].ToString();
                 }
                 }
-
-                foreach (var dd in temp.Item1)
+                else if (str.Length == 2)
                 {
                 {
-                    var zht = new JObject();
-                    zht.Add(table, JToken.FromObject(dd));
-                    for (int i = 1; i < tables.Count; i++)
-                    {
-                        string subtable = tables[i];
-                        if (subtable.EndsWith("[]"))
-                        {
-                            subtable = subtable.TrimEnd("[]".ToCharArray());
-                            var jbb = JObject.Parse(where[i]);
-                            page = jbb["page"] == null ? 0 : int.Parse(jbb["page"].ToString());
-                            count = jbb["count"] == null ? 0 : int.Parse(jbb["count"].ToString());
-
-                            var lt = new JArray();
-                            foreach (var d in GetTableData(subtable, page, count, query, jbb[subtable].ToString(), zht).Item1)
-                            {
-                                lt.Add(JToken.FromObject(d));
-                            }
-                            zht.Add(tables[i], lt);
-                        }
-                        else
-                        {
-                            var ddf = GetFirstData(subtable, where[i].ToString(), zht);
-                            if (ddf != null)
-                            {
-                                zht.Add(subtable, JToken.FromObject(ddf));
-
-                            }
-                        }
-                    }
-                    htt.Add(zht);
+                    value = dd[str[0]][str[1]].ToString();
                 }
                 }
 
 
+                conModels.Add(new ConditionalModel() { FieldName = vakey.TrimEnd('@'), ConditionalType = ConditionalType.Equal, FieldValue = value });
             }
             }
-            if (query != 1)
+            else if (IsCol(subtable, vakey)) //其他where条件
             {
             {
-                resultObj.Add("[]", htt);
+                conModels.Add(new ConditionalModel() { FieldName = vakey, ConditionalType = ConditionalType.Equal, FieldValue = fieldValue });
             }
             }
-
-            return total;
         }
         }
+        tb.Where(conModels);
+
+        //排序
+        ProcessOrder(subtable, values, tb);
+
+        //分组
+        PrccessGroup(subtable, values, tb);
+
+        //Having
+        ProcessHaving(values, tb);
+        return tb;
+    }
 
 
-        private void ExecFunc(JObject resultObj, KeyValuePair<string, JToken> item)
+    //处理字段重命名 "@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(','))
         {
         {
-            JObject jb = JObject.Parse(item.Value.ToString());
-            Type type = typeof(FuncList);
+            string[] ziduan = item.Split(':');
+            string colName = ziduan[0];
+            var ma = new Regex(@"\((\w+)\)").Match(colName);
+            //处理max,min这样的函数
+            if (ma.Success && ma.Groups.Count > 1)
+            {
+                colName = ma.Groups[1].Value;
+            }
 
 
-            var dataJObj = new JObject();
-            foreach (var f in jb)
+            //判断列表是否有权限  sum(1),sum(*),Count(1)这样的值直接有效
+            if (colName == "*" || int.TryParse(colName, out int colNumber) || (IsCol(subtable, colName) && _identitySvc.ColIsRole(colName, selectrole.Split(','))))
             {
             {
-                var types = new List<Type>();
-                var param = new List<object>();
-                foreach (var va in JArray.Parse(f.Value.ToString()))
+                if (ziduan.Length > 1)
                 {
                 {
-                    types.Add(typeof(object));
-                    param.Add(va);
+                    if (ziduan[1].Length > 20)
+                    {
+                        throw new Exception("别名不能超过20个字符");
+                    }
+                    str.Append(ziduan[0] + " as " + ReplaceSQLChar(ziduan[1]) + ",");
                 }
                 }
-                dataJObj.Add(f.Key, JToken.FromObject(ExecFunc(f.Key, param.ToArray(), types.ToArray())));
+                else
+                    str.Append(ziduan[0] + ",");
             }
             }
-            resultObj.Add("func", dataJObj);
         }
         }
-
-        private ISugarQueryable<ExpandoObject> sugarQueryable(string subtable, string selectrole, JObject values, JObject dd)
+        if (string.IsNullOrEmpty(str.ToString()))
         {
         {
-            if (!IsTable(subtable))
-            {
-                throw new Exception($"表名{subtable}不正确!");
-            }
-            var tb = db.Queryable(subtable, "tb");
-
+            throw new Exception($"表名{subtable}没有可查询的字段!");
+        }
+        tb.Select(str.ToString().TrimEnd(','));
+    }
 
 
-            if (values["@column"].IsValue())
+    // "@having":"function0(...)?value0;function1(...)?value1;function2(...)?value2...",
+    // SQL函数条件,一般和 @group一起用,函数一般在 @column里声明
+    private void ProcessHaving(JObject values, ISugarQueryable<ExpandoObject> tb)
+    {
+        if (!values["@having"].IsNullOrEmpty())
+        {
+            List<IConditionalModel> hw = new List<IConditionalModel>();
+            List<string> havingItems = new List<string>();
+            if (values["@having"].HasValues)
             {
             {
-                ProcessColumn(subtable, selectrole, values, tb);
+                havingItems = values["@having"].Select(p => p.ToString()).ToList();
             }
             }
             else
             else
             {
             {
-                tb.Select(selectrole);
+                havingItems.Add(values["@having"].ToString());
             }
             }
-
-            List<IConditionalModel> conModels = new List<IConditionalModel>();
-            if (values["identity"].IsValue())
-            {
-                conModels.Add(new ConditionalModel() { FieldName = values["identity"].ToString(), ConditionalType = ConditionalType.Equal, FieldValue = _identitySvc.GetUserIdentity() });
-            }
-            foreach (var va in values)
+            foreach (var item in havingItems)
             {
             {
-                string vakey = va.Key.Trim();
-                string fieldValue = va.Value.ToString();
-
-                if (vakey.EndsWith("$"))//模糊查询
+                string and = item.ToString();
+                var model = new ConditionalModel();
+                if (and.Contains(">="))
                 {
                 {
-                    FuzzyQuery(subtable, conModels, va);
+                    model.FieldName = and.Split(new string[] { ">=" }, StringSplitOptions.RemoveEmptyEntries)[0];
+                    model.ConditionalType = ConditionalType.GreaterThanOrEqual;
+                    model.FieldValue = and.Split(new string[] { ">=" }, StringSplitOptions.RemoveEmptyEntries)[1];
                 }
                 }
-                else if (vakey.EndsWith("{}"))//逻辑运算
+                else if (and.Contains("<="))
                 {
                 {
-                    ConditionQuery(subtable, conModels, va);
+                    model.FieldName = and.Split(new string[] { "<=" }, StringSplitOptions.RemoveEmptyEntries)[0];
+                    model.ConditionalType = ConditionalType.LessThanOrEqual;
+                    model.FieldValue = and.Split(new string[] { "<=" }, StringSplitOptions.RemoveEmptyEntries)[1];
                 }
                 }
-                else if (vakey.EndsWith("%"))//bwtween查询
+                else if (and.Contains(">"))
                 {
                 {
-                    ConditionBetween(subtable, conModels, va);
+                    model.FieldName = and.Split(new string[] { ">" }, StringSplitOptions.RemoveEmptyEntries)[0];
+                    model.ConditionalType = ConditionalType.GreaterThan;
+                    model.FieldValue = and.Split(new string[] { ">" }, StringSplitOptions.RemoveEmptyEntries)[1];
                 }
                 }
-                else if (vakey.EndsWith("@") && dd != null) // 关联上一个table
+                else if (and.Contains("<"))
                 {
                 {
-                    string[] str = fieldValue.Split('/');
-                    string value = string.Empty;
-                    if (str.Length == 3)
-                    {
-                        value = dd[str[1]][str[2]].ToString();
-                    }
-                    else if (str.Length == 2)
-                    {
-                        value = dd[str[0]][str[1]].ToString();
-                    }
-
-                    conModels.Add(new ConditionalModel() { FieldName = vakey.TrimEnd('@'), ConditionalType = ConditionalType.Equal, FieldValue = value });
-
+                    model.FieldName = and.Split(new string[] { "<" }, StringSplitOptions.RemoveEmptyEntries)[0];
+                    model.ConditionalType = ConditionalType.LessThan;
+                    model.FieldValue = and.Split(new string[] { "<" }, StringSplitOptions.RemoveEmptyEntries)[1];
                 }
                 }
-                else if (IsCol(subtable, vakey)) //其他where条件
+                else if (and.Contains("!="))
                 {
                 {
-                    conModels.Add(new ConditionalModel() { FieldName = vakey, ConditionalType = ConditionalType.Equal, FieldValue = fieldValue });
+                    model.FieldName = and.Split(new string[] { "!=" }, StringSplitOptions.RemoveEmptyEntries)[0];
+                    model.ConditionalType = ConditionalType.NoEqual;
+                    model.FieldValue = and.Split(new string[] { "!=" }, StringSplitOptions.RemoveEmptyEntries)[1];
                 }
                 }
+                else if (and.Contains("="))
+                {
+                    model.FieldName = and.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries)[0];
+                    model.ConditionalType = ConditionalType.Equal;
+                    model.FieldValue = and.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries)[1];
+                }
+                hw.Add(model);
             }
             }
-            tb.Where(conModels);
-
-            //排序
-            ProcessOrder(subtable, values, tb);
 
 
-            //分组
-            PrccessGroup(subtable, values, tb);
-
-            //Having
-            ProcessHaving(values, tb);
-            return tb;
+            tb.Having(string.Join(",", havingItems));
         }
         }
+    }
 
 
-        //处理字段重命名 "@column":"toId:parentId",对应SQL是toId AS parentId,将查询的字段toId变为parentId返回
-        private void ProcessColumn(string subtable, string selectrole, JObject values, ISugarQueryable<ExpandoObject> tb)
+    //"@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"].IsNullOrEmpty())
         {
         {
             var str = new System.Text.StringBuilder(100);
             var str = new System.Text.StringBuilder(100);
-            foreach (var item in values["@column"].ToString().Split(','))
+            foreach (var and in values["@group"].ToString().Split(','))
             {
             {
-                string[] ziduan = item.Split(':');
-                string colName = ziduan[0];
-                var ma = new Regex(@"\((\w+)\)").Match(colName);
-                //处理max,min这样的函数
-                if (ma.Success && ma.Groups.Count > 1)
+                if (IsCol(subtable, and))
                 {
                 {
-                    colName = ma.Groups[1].Value;
-                }
-
-                //判断列表是否有权限  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]) + ",");
-                    }
-                    else
-                        str.Append(ziduan[0] + ",");
-
+                    str.Append(and + ",");
                 }
                 }
             }
             }
-            if (string.IsNullOrEmpty(str.ToString()))
-            {
-                throw new Exception($"表名{subtable}没有可查询的字段!");
-            }
-            tb.Select(str.ToString().TrimEnd(','));
+            tb.GroupBy(str.ToString().TrimEnd(','));
         }
         }
+    }
 
 
-        // "@having":"function0(...)?value0;function1(...)?value1;function2(...)?value2...",
-        // SQL函数条件,一般和 @group一起用,函数一般在 @column里声明
-        private void ProcessHaving(JObject values, ISugarQueryable<ExpandoObject> tb)
+    //处理排序 "@order":"name-,id"查询按 name降序、id默认顺序 排序的User数组
+    private void ProcessOrder(string subtable, JObject values, ISugarQueryable<ExpandoObject> tb)
+    {
+        if (!values["@order"].IsNullOrEmpty())
         {
         {
-            if (values["@having"].IsValue())
+            foreach (var item in values["@order"].ToString().Split(','))
             {
             {
-                List<IConditionalModel> hw = new List<IConditionalModel>();
-                List<string> havingItems = new List<string>();
-                if (values["@having"].HasValues)
-                {
-                    havingItems = values["@having"].Select(p => p.ToString()).ToList();
-                }
-                else
-                {
-                    havingItems.Add(values["@having"].ToString());
-                }
-                foreach (var item in havingItems)
+                string col = item.Replace("-", "").Replace("+", "");
+                if (IsCol(subtable, col))
                 {
                 {
-                    string and = item.ToString();
-                    var model = new ConditionalModel();
-                    if (and.Contains(">="))
+                    if (item.EndsWith("-"))
                     {
                     {
-                        model.FieldName = and.Split(new string[] { ">=" }, StringSplitOptions.RemoveEmptyEntries)[0];
-                        model.ConditionalType = ConditionalType.GreaterThanOrEqual;
-                        model.FieldValue = and.Split(new string[] { ">=" }, StringSplitOptions.RemoveEmptyEntries)[1];
+                        tb.OrderBy($"{col} desc");
                     }
                     }
-                    else if (and.Contains("<="))
+                    else if (item.EndsWith("+"))
                     {
                     {
-
-                        model.FieldName = and.Split(new string[] { "<=" }, StringSplitOptions.RemoveEmptyEntries)[0];
-                        model.ConditionalType = ConditionalType.LessThanOrEqual;
-                        model.FieldValue = and.Split(new string[] { "<=" }, StringSplitOptions.RemoveEmptyEntries)[1];
+                        tb.OrderBy($"{col} asc");
                     }
                     }
-                    else if (and.Contains(">"))
-                    {
-                        model.FieldName = and.Split(new string[] { ">" }, StringSplitOptions.RemoveEmptyEntries)[0];
-                        model.ConditionalType = ConditionalType.GreaterThan;
-                        model.FieldValue = and.Split(new string[] { ">" }, StringSplitOptions.RemoveEmptyEntries)[1];
-                    }
-                    else if (and.Contains("<"))
-                    {
-                        model.FieldName = and.Split(new string[] { "<" }, StringSplitOptions.RemoveEmptyEntries)[0];
-                        model.ConditionalType = ConditionalType.LessThan;
-                        model.FieldValue = and.Split(new string[] { "<" }, StringSplitOptions.RemoveEmptyEntries)[1];
-                    }
-                    else if (and.Contains("!="))
-                    {
-                        model.FieldName = and.Split(new string[] { "!=" }, StringSplitOptions.RemoveEmptyEntries)[0];
-                        model.ConditionalType = ConditionalType.NoEqual;
-                        model.FieldValue = and.Split(new string[] { "!=" }, StringSplitOptions.RemoveEmptyEntries)[1];
-                    }
-                    else if (and.Contains("="))
+                    else
                     {
                     {
-                        model.FieldName = and.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries)[0];
-                        model.ConditionalType = ConditionalType.Equal;
-                        model.FieldValue = and.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries)[1];
+                        tb.OrderBy($"{col}");
                     }
                     }
-                    hw.Add(model);
                 }
                 }
-               
-              
-                tb.Having(string.Join(",", havingItems));
             }
             }
         }
         }
+    }
 
 
-        //"@group":"column0,column1...",分组方式。如果 @column里声明了Table的id,则id也必须在 @group中声明;其它情况下必须满足至少一个条件:
-        //1.分组的key在 @column里声明
-        //2.Table主键在 @group中声明
-        private void PrccessGroup(string subtable, JObject values, ISugarQueryable<ExpandoObject> tb)
+    //条件查询 "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());
+        if (va.Value.HasValues)
         {
         {
-            if (values["@group"].IsValue())
+            List<string> inValues = new List<string>();
+            foreach (var cm in va.Value)
             {
             {
-                var str = new System.Text.StringBuilder(100);
-                foreach (var and in values["@group"].ToString().Split(','))
-                {
-                    if (IsCol(subtable, and))
-                    {
-                        str.Append(and + ",");
-                    }
-                }
-                tb.GroupBy(str.ToString().TrimEnd(','));
+                inValues.Add(cm.ToString());
             }
             }
-        }
 
 
-        //处理排序 "@order":"name-,id"查询按 name降序、id默认顺序 排序的User数组
-        private void ProcessOrder(string subtable, JObject values, ISugarQueryable<ExpandoObject> tb)
+            conModels.Add(new ConditionalModel() { FieldName = field, ConditionalType = field.EndsWith("!") ? ConditionalType.NotIn : ConditionalType.In, FieldValue = string.Join(",", inValues) });
+        }
+        else
         {
         {
-            if (values["@order"].IsValue())
+            var ddt = new List<KeyValuePair<WhereType, ConditionalModel>>();
+            foreach (var and in va.Value.ToString().Split(','))
             {
             {
-                foreach (var item in values["@order"].ToString().Split(','))
+                var model = new ConditionalModel();
+                model.FieldName = field.TrimEnd("&".ToCharArray());//处理&()的查询方式
+                if (and.StartsWith(">="))
                 {
                 {
-                    string col = item.Replace("-", "").Replace("+", "");
-                    if (IsCol(subtable, col))
-                    {
-                        if (item.EndsWith("-"))
-                        {
-                            tb.OrderBy($"{col} desc");
-                        }
-                        else if (item.EndsWith("+"))
-                        {
-                            tb.OrderBy($"{col} asc");
-                        }
-                        else
-                        {
-                            tb.OrderBy($"{col}");
-                        }
-                    }
+                    model.ConditionalType = ConditionalType.GreaterThanOrEqual;
+                    model.FieldValue = and.TrimStart(">=".ToCharArray());
+                }
+                else if (and.StartsWith("<="))
+                {
+                    model.ConditionalType = ConditionalType.LessThanOrEqual;
+                    model.FieldValue = and.TrimStart("<=".ToCharArray());
+                }
+                else if (and.StartsWith(">"))
+                {
+                    model.ConditionalType = ConditionalType.GreaterThan;
+                    model.FieldValue = and.TrimStart('>');
                 }
                 }
+                else if (and.StartsWith("<"))
+                {
+                    model.ConditionalType = ConditionalType.LessThan;
+                    model.FieldValue = and.TrimStart('<');
+                }
+                ddt.Add(new KeyValuePair<WhereType, ConditionalModel>((field.EndsWith("&") ? WhereType.And : WhereType.Or), model));
             }
             }
+            conModels.Add(new ConditionalCollections() { ConditionalList = ddt });
         }
         }
+    }
+
+    //"key%":"start,end" => "key%":["start,end"],其中 start 和 end 都只能为 Boolean, Number, String 中的一种,如 "2017-01-01,2019-01-01" ,["1,90000", "82001,100000"] ,可用于连续范围内的筛选
+    private void ConditionBetween(string subtable, List<IConditionalModel> conModels, KeyValuePair<string, JToken> va)
+    {
+        string vakey = va.Key.Trim();
+        string field = vakey.TrimEnd("%".ToCharArray());
+        List<string> inValues = new List<string>();
 
 
-        //条件查询 "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)
+        if (va.Value.HasValues)
         {
         {
-            string vakey = va.Key.Trim();
-            string field = vakey.TrimEnd("{}".ToCharArray());
-            if (va.Value.HasValues)
+            foreach (var cm in va.Value)
             {
             {
-                List<string> inValues = new List<string>();
-                foreach (var cm in va.Value)
-                {
-                    inValues.Add(cm.ToString());
-                }
-
-                conModels.Add(new ConditionalModel() { FieldName = field, ConditionalType = field.EndsWith("!") ? ConditionalType.NotIn : ConditionalType.In, FieldValue = string.Join(",", inValues) });
-
+                inValues.Add(cm.ToString());
             }
             }
-            else
+        }
+        else
+        {
+            inValues.Add(va.Value.ToString());
+        }
+        for (var i = 0; i < inValues.Count; i++)
+        {
+            var fileds = inValues[i].Split(',');
+            if (fileds.Length == 2)
             {
             {
                 var ddt = new List<KeyValuePair<WhereType, ConditionalModel>>();
                 var ddt = new List<KeyValuePair<WhereType, ConditionalModel>>();
-                foreach (var and in va.Value.ToString().Split(','))
+
+                var leftCondition = new ConditionalModel()
                 {
                 {
-                    var model = new ConditionalModel();
-                    model.FieldName = field.TrimEnd("&".ToCharArray());//处理&()的查询方式
-                    if (and.StartsWith(">="))
-                    {
-                        model.ConditionalType = ConditionalType.GreaterThanOrEqual;
-                        model.FieldValue = and.TrimStart(">=".ToCharArray());
-                    }
-                    else if (and.StartsWith("<="))
-                    {
+                    FieldName = field,
+                    ConditionalType = ConditionalType.GreaterThanOrEqual,
+                    FieldValue = fileds[0]
+                };
+                ddt.Add(new KeyValuePair<WhereType, ConditionalModel>(i == 0 ? WhereType.And : WhereType.Or, leftCondition));
+                var rightCondition = new ConditionalModel()
+                {
+                    FieldName = field,
+                    ConditionalType = ConditionalType.LessThanOrEqual,
+                    FieldValue = fileds[1]
+                };
+                ddt.Add(new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, rightCondition));
 
 
-                        model.ConditionalType = ConditionalType.LessThanOrEqual;
-                        model.FieldValue = and.TrimStart("<=".ToCharArray());
-                    }
-                    else if (and.StartsWith(">"))
-                    {
-                        model.ConditionalType = ConditionalType.GreaterThan;
-                        model.FieldValue = and.TrimStart('>');
-                    }
-                    else if (and.StartsWith("<"))
-                    {
-                        model.ConditionalType = ConditionalType.LessThan;
-                        model.FieldValue = and.TrimStart('<');
-                    }
-                    ddt.Add(new KeyValuePair<WhereType, ConditionalModel>((field.EndsWith("&") ? WhereType.And : WhereType.Or), model));
-                }
                 conModels.Add(new ConditionalCollections() { ConditionalList = ddt });
                 conModels.Add(new ConditionalCollections() { ConditionalList = ddt });
             }
             }
         }
         }
+    }
 
 
-        //"key%":"start,end" => "key%":["start,end"],其中 start 和 end 都只能为 Boolean, Number, String 中的一种,如 "2017-01-01,2019-01-01" ,["1,90000", "82001,100000"] ,可用于连续范围内的筛选
-        private void ConditionBetween(string subtable, List<IConditionalModel> conModels, KeyValuePair<string, JToken> va)
+    //模糊搜索	"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 conditionalType = ConditionalType.Like;
+        if (IsCol(subtable, vakey.TrimEnd('$')))
         {
         {
-            string vakey = va.Key.Trim();
-            string field = vakey.TrimEnd("%".ToCharArray());
-            List<string> inValues = new List<string>();
-
-            if (va.Value.HasValues)
+            //支持三种like查询
+            if (fieldValue.StartsWith("%") && fieldValue.EndsWith("%"))
             {
             {
-                foreach (var cm in va.Value)
-                {
-                    inValues.Add(cm.ToString());
-                }
+                conditionalType = ConditionalType.Like;
             }
             }
-            else
+            else if (fieldValue.StartsWith("%"))
             {
             {
-                inValues.Add(va.Value.ToString());
+                conditionalType = ConditionalType.LikeRight;
             }
             }
-            for (var i = 0; i < inValues.Count; i++)
+            else if (fieldValue.EndsWith("%"))
             {
             {
-                var fileds = inValues[i].Split(',');
-                if (fileds.Length == 2)
-                {
-                    var ddt = new List<KeyValuePair<WhereType, ConditionalModel>>();
-
-                    var leftCondition = new ConditionalModel()
-                    {
-                        FieldName = field,
-                        ConditionalType = ConditionalType.GreaterThanOrEqual,
-                        FieldValue = fileds[0]
-                    };
-                    ddt.Add(new KeyValuePair<WhereType, ConditionalModel>(i == 0 ? WhereType.And : WhereType.Or, leftCondition));
-                    var rightCondition = new ConditionalModel()
-                    {
-                        FieldName = field,
-                        ConditionalType = ConditionalType.LessThanOrEqual,
-                        FieldValue = fileds[1]
-                    };
-                    ddt.Add(new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, rightCondition));
-
-                    conModels.Add(new ConditionalCollections() { ConditionalList = ddt });
-                }
-            }
-        }
-
-        //模糊搜索	"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 conditionalType = ConditionalType.Like;
-            if (IsCol(subtable, vakey.TrimEnd('$')))
-            {
-                //支持三种like查询
-                if (fieldValue.StartsWith("%") && fieldValue.EndsWith("%"))
-                {
-                    conditionalType = ConditionalType.Like;
-                }
-                else if (fieldValue.StartsWith("%"))
-                {
-                    conditionalType = ConditionalType.LikeRight;
-                }
-                else if (fieldValue.EndsWith("%"))
-                {
-                    conditionalType = ConditionalType.LikeLeft;
-                }
-                conModels.Add(new ConditionalModel() { FieldName = vakey.TrimEnd('$'), ConditionalType = conditionalType, FieldValue = fieldValue.TrimEnd("%".ToArray()).TrimStart("%".ToArray()) });
+                conditionalType = ConditionalType.LikeLeft;
             }
             }
+            conModels.Add(new ConditionalModel() { FieldName = vakey.TrimEnd('$'), ConditionalType = conditionalType, FieldValue = fieldValue.TrimEnd("%".ToArray()).TrimStart("%".ToArray()) });
         }
         }
+    }
 
 
-        public string ReplaceSQLChar(string str)
-        {
-            if (str == String.Empty)
-                return String.Empty;
-            str = str.Replace("'", "");
-            str = str.Replace(";", "");
-            str = str.Replace(",", "");
-            str = str.Replace("?", "");
-            str = str.Replace("<", "");
-            str = str.Replace(">", "");
-            str = str.Replace("(", "");
-            str = str.Replace(")", "");
-            str = str.Replace("@", "");
-            str = str.Replace("=", "");
-            str = str.Replace("+", "");
-            str = str.Replace("*", "");
-            str = str.Replace("&", "");
-            str = str.Replace("#", "");
-            str = str.Replace("%", "");
-            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);
-            str = Regex.Replace(str, "xp_cmdshell", "", RegexOptions.IgnoreCase);
-            str = Regex.Replace(str, "exec master", "", RegexOptions.IgnoreCase);
-            str = Regex.Replace(str, "net localgroup administrators", "", RegexOptions.IgnoreCase);
-            str = Regex.Replace(str, "net user", "", RegexOptions.IgnoreCase);
-            str = Regex.Replace(str, "-", "", RegexOptions.IgnoreCase);
-            str = Regex.Replace(str, "truncate", "", RegexOptions.IgnoreCase);
-            return str;
-        }
+    public string ReplaceSQLChar(string str)
+    {
+        if (str == String.Empty)
+            return String.Empty;
+        str = str.Replace("'", "");
+        str = str.Replace(";", "");
+        str = str.Replace(",", "");
+        str = str.Replace("?", "");
+        str = str.Replace("<", "");
+        str = str.Replace(">", "");
+        str = str.Replace("(", "");
+        str = str.Replace(")", "");
+        str = str.Replace("@", "");
+        str = str.Replace("=", "");
+        str = str.Replace("+", "");
+        str = str.Replace("*", "");
+        str = str.Replace("&", "");
+        str = str.Replace("#", "");
+        str = str.Replace("%", "");
+        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);
+        str = Regex.Replace(str, "xp_cmdshell", "", RegexOptions.IgnoreCase);
+        str = Regex.Replace(str, "exec master", "", RegexOptions.IgnoreCase);
+        str = Regex.Replace(str, "net localgroup administrators", "", RegexOptions.IgnoreCase);
+        str = Regex.Replace(str, "net user", "", RegexOptions.IgnoreCase);
+        str = Regex.Replace(str, "-", "", RegexOptions.IgnoreCase);
+        str = Regex.Replace(str, "truncate", "", RegexOptions.IgnoreCase);
+        return str;
     }
     }
-}
+}

+ 23 - 18
Admin.NET/Admin.NET.Core/Service/ApiJson/TableMapper.cs

@@ -1,26 +1,31 @@
-using Microsoft.Extensions.Options;
-using System;
-using System.Collections.Generic;
+namespace Admin.NET.Core.Service;
 
 
-namespace APIJSON.NET.Services
+/// <summary>
+/// 表名映射
+/// </summary>
+public class TableMapper : ITransient
 {
 {
-    public class TableMapper : ITableMapper
+    private readonly Dictionary<string, string> _options = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+
+    public TableMapper(IOptions<Dictionary<string, string>> options)
     {
     {
-        private readonly Dictionary<string, string> _options= new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
-        public TableMapper(IOptions<Dictionary<string, string>> options)
+        foreach (var item in options.Value)
         {
         {
-            foreach (var item in options.Value)
-            {
-                _options.Add(item.Key, item.Value);
-            }
+            _options.Add(item.Key, item.Value);
         }
         }
-        public string GetTableName(string oldname)
+    }
+
+    /// <summary>
+    /// 获取表别名
+    /// </summary>
+    /// <param name="oldname"></param>
+    /// <returns></returns>
+    public string GetTableName(string oldname)
+    {
+        if (_options.ContainsKey(oldname))
         {
         {
-            if (_options.ContainsKey(oldname))
-            {
-                return _options[oldname];
-            }
-            return oldname;
+            return _options[oldname];
         }
         }
+        return oldname;
     }
     }
-}
+}

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

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

+ 0 - 45
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -1,27 +1,20 @@
 using Admin.NET.Core;
 using Admin.NET.Core;
 using Admin.NET.Core.Service;
 using Admin.NET.Core.Service;
-using Admin.NET.Core.Service.ApiJson;
-using APIJSON.NET.Services;
 using AspNetCoreRateLimit;
 using AspNetCoreRateLimit;
 using Furion;
 using Furion;
 using Furion.SpecificationDocument;
 using Furion.SpecificationDocument;
 using IGeekFan.AspNetCore.Knife4jUI;
 using IGeekFan.AspNetCore.Knife4jUI;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.HttpOverrides;
 using Microsoft.AspNetCore.HttpOverrides;
-using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
 using Microsoft.Extensions.Hosting;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Logging;
-using Microsoft.IdentityModel.Tokens;
-using Microsoft.OpenApi.Models;
 using NewLife.Model;
 using NewLife.Model;
 using Newtonsoft.Json;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Serialization;
 using Newtonsoft.Json.Serialization;
 using OnceMi.AspNetCore.OSS;
 using OnceMi.AspNetCore.OSS;
 using System;
 using System;
-using System.Collections.Generic;
 using System.IO;
 using System.IO;
 using System.Net;
 using System.Net;
 using System.Net.Mail;
 using System.Net.Mail;
@@ -188,44 +181,6 @@ public class Startup : AppStartup
 
 
         // 验证码
         // 验证码
         services.AddLazyCaptcha();
         services.AddLazyCaptcha();
-
-        #region ApiJson
-        //services.Configure<List<Role>>(App.GetConfig<List<Role>>("ApiJson:RoleList"));
-        //services.Configure<Dictionary<string, string>>(Configuration.GetSection("tablempper"));
-        //services.Configure<TokenAuthConfiguration>(tokenAuthConfig =>
-        //{
-        //    tokenAuthConfig.SecurityKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Authentication:JwtBearer:SecurityKey"]));
-        //    tokenAuthConfig.Issuer = Configuration["Authentication:JwtBearer:Issuer"];
-        //    tokenAuthConfig.Audience = Configuration["Authentication:JwtBearer:Audience"];
-        //    tokenAuthConfig.SigningCredentials = new SigningCredentials(tokenAuthConfig.SecurityKey, SecurityAlgorithms.HmacSha256);
-        //    tokenAuthConfig.Expiration = TimeSpan.FromDays(1);
-        //});
-        //AuthConfigurer.Configure(services, Configuration);
-
-        //var origins = Configuration.GetSection("CorsUrls").Value.Split(",");
-        //services.AddCors(options => options.AddPolicy(_defaultCorsPolicyName,
-        //   builder =>
-        //   builder.WithOrigins(origins)
-        //     .AllowAnyHeader()
-        //     .AllowAnyMethod().AllowCredentials()
-        //     ));
-        //services.AddControllers()
-        //    .AddNewtonsoftJson(options =>
-        //    {
-        //        options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
-        //        options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
-        //    }); ;
-        //services.AddSwaggerGen(c =>
-        //{
-        //    c.SwaggerDoc("v1", new OpenApiInfo { Title = "APIJSON.NET", Version = "v1" });
-        //});
-        //services.AddSingleton<DbContext>();
-        services.AddSingleton<SelectTable>();
-        //services.AddSingleton<TokenAuthConfiguration>();
-        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
-        services.AddTransient<IIdentityService, IdentityService>();
-        services.AddTransient<ITableMapper, TableMapper>();
-        #endregion
     }
     }
 
 
     public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
     public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

+ 1 - 1
Admin.NET/Admin.NET.Web.Entry/appsettings.json

@@ -1,5 +1,5 @@
 {
 {
     "$schema": "https://gitee.com/dotnetchina/Furion/raw/net6/schemas/v3/furion-schema.json",
     "$schema": "https://gitee.com/dotnetchina/Furion/raw/net6/schemas/v3/furion-schema.json",
 
 
-    "ConfigurationScanDirectories": [ "Configuration", "" ]// 扫描配置文件.json的文件夹,配置.json文件在此文件夹下即被扫描合并。
+    "ConfigurationScanDirectories": [ "Configuration", "" ] // 扫描配置文件json文件夹(自动合并该文件夹里面所有json文件)
 }
 }