From 527b94159f696778b582e5c0f11b040d7f5caf87 Mon Sep 17 00:00:00 2001 From: "cd\\zhuzhiqing" Date: Thu, 20 Dec 2018 18:21:28 +0800 Subject: [PATCH 01/31] =?UTF-8?q?=E6=8F=90=E5=87=BAcommon=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSON.NET.sln | 6 + APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj | 2 +- .../APIJSON.NET/Controllers/JsonController.cs | 85 ++- APIJSON.NET/APIJSON.NET/Program.cs | 4 +- .../APIJSON.NET/Services/IdentityService.cs | 2 +- .../APIJSON.NET/Services/TableMapper.cs | 2 +- APIJSON.NET/APIJSON.NET/Startup.cs | 1 - APIJSON.NET/APIJSON.NET/appsettings.json | 11 +- APIJSON.NET/APIJSON.NET/wwwroot/js/main.js | 3 +- .../APIJSONCommon/ApiJson.Common.csproj | 13 + APIJSON.NET/APIJSONCommon/FuncList.cs | 24 + .../Infrastructure/StringExtensions.cs | 16 + APIJSON.NET/APIJSONCommon/Models/DbOptions.cs | 9 + APIJSON.NET/APIJSONCommon/Models/RoleItem.cs | 19 + APIJSON.NET/APIJSONCommon/SelectTable.cs | 502 ++++++++++++++++++ .../Services/IIdentityService.cs | 32 ++ .../APIJSONCommon/Services/ITableMapper.cs | 12 + .../APIJSONCommon/Services/TableMapper.cs | 26 + 18 files changed, 742 insertions(+), 27 deletions(-) create mode 100644 APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj create mode 100644 APIJSON.NET/APIJSONCommon/FuncList.cs create mode 100644 APIJSON.NET/APIJSONCommon/Infrastructure/StringExtensions.cs create mode 100644 APIJSON.NET/APIJSONCommon/Models/DbOptions.cs create mode 100644 APIJSON.NET/APIJSONCommon/Models/RoleItem.cs create mode 100644 APIJSON.NET/APIJSONCommon/SelectTable.cs create mode 100644 APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs create mode 100644 APIJSON.NET/APIJSONCommon/Services/ITableMapper.cs create mode 100644 APIJSON.NET/APIJSONCommon/Services/TableMapper.cs diff --git a/APIJSON.NET/APIJSON.NET.sln b/APIJSON.NET/APIJSON.NET.sln index bf956bf..6bf372d 100644 --- a/APIJSON.NET/APIJSON.NET.sln +++ b/APIJSON.NET/APIJSON.NET.sln @@ -7,6 +7,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APIJSON.NET", "APIJSON.NET\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APIJSON.NET.Test", "APIJSON.NET.Test\APIJSON.NET.Test.csproj", "{0828346E-207E-49F8-AD57-E1AB6B6E4077}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApiJson.Common", "APIJSONCommon\ApiJson.Common.csproj", "{D0DF93E9-DD06-425B-96FE-935E9A82D327}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,10 @@ Global {0828346E-207E-49F8-AD57-E1AB6B6E4077}.Debug|Any CPU.Build.0 = Debug|Any CPU {0828346E-207E-49F8-AD57-E1AB6B6E4077}.Release|Any CPU.ActiveCfg = Release|Any CPU {0828346E-207E-49F8-AD57-E1AB6B6E4077}.Release|Any CPU.Build.0 = Release|Any CPU + {D0DF93E9-DD06-425B-96FE-935E9A82D327}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D0DF93E9-DD06-425B-96FE-935E9A82D327}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D0DF93E9-DD06-425B-96FE-935E9A82D327}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D0DF93E9-DD06-425B-96FE-935E9A82D327}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj index ade59f1..9ac26fb 100644 --- a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj +++ b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj @@ -16,7 +16,7 @@ - + diff --git a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs index 4f11e5a..4ae6839 100644 --- a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs +++ b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs @@ -1,17 +1,18 @@ namespace APIJSON.NET.Controllers { - using System; - using System.Collections.Generic; - using System.Web; - using APIJSON.NET.Models; + using APIJSON.NET.Services; + using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Mvc; - using Microsoft.Extensions.Options; using Newtonsoft.Json.Linq; using SqlSugar; + using System; + using System.Collections.Generic; + using System.IO; using System.Linq; - using APIJSON.NET.Services; - using System.Reflection; - using Microsoft.AspNetCore.Cors; + using System.Net.Http; + using System.Text; + using System.Threading.Tasks; + using System.Web; [Route("api/[controller]")] [ApiController] @@ -22,14 +23,63 @@ public class JsonController : ControllerBase private SelectTable selectTable; private DbContext db; private readonly IIdentityService _identitySvc; - public JsonController(SelectTable _selectTable, DbContext _db,IIdentityService identityService) + public JsonController(SelectTable _selectTable, DbContext _db, IIdentityService identityService) { selectTable = _selectTable; db = _db; _identitySvc = identityService; } - + + /// + /// + /// + /// + public ActionResult Test() + { + string str = "{\"page\":1,\"count\":3,\"query\":2,\"Org\":{\"@column\":\"Id,Name\"}}"; + var content = new StringContent(str); + + HttpClient hc = new HttpClient(); + var response = hc.PostAsync("http://localhost:89/api/json/org", content).Result; + string result = (response.Content.ReadAsStringAsync().Result);//result就是返回的结果。 + return Content(result); + } + + [HttpPost("{table}")] + + public async Task Query1([FromRoute]string table) + { + + string json = string.Empty; + using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8)) + { + json= await reader.ReadToEndAsync(); + } + + json = HttpUtility.UrlDecode(json); + JObject ht = new JObject(); + + JObject jobject = JObject.Parse(json); + ht.Add(table + "[]", jobject); + ht.Add("total@", ""); + + bool hasTableKey = false; + foreach (var item in jobject) + { + if (item.Key.Equals(table, StringComparison.CurrentCultureIgnoreCase)) + { + hasTableKey = true; + break; + } + } + if (!hasTableKey) + { + jobject.Add(table,new JObject()); + } + var newJson = Newtonsoft.Json.JsonConvert.SerializeObject(ht); + return Query(newJson); + } /// /// 查询 /// @@ -123,7 +173,12 @@ public ActionResult Query([FromBody]string json) var htt = new JArray(); foreach (var t in jb) { - foreach (var d in selectTable.GetTableData(t.Key, page, count, t.Value.ToString(), null).Item1) + var temp = selectTable.GetTableData(t.Key, page, count, t.Value.ToString(), null); + if (query > 0) + { + total = temp.Item2; + } + foreach (var d in temp.Item1) { htt.Add(JToken.FromObject(d)); } @@ -145,7 +200,7 @@ public ActionResult Query([FromBody]string json) types.Add(typeof(object)); param.Add(va); } - bb.Add(f.Key, JToken.FromObject(selectTable.ExecFunc(f.Key,param.ToArray(), types.ToArray()))); + bb.Add(f.Key, JToken.FromObject(selectTable.ExecFunc(f.Key, param.ToArray(), types.ToArray()))); } ht.Add("func", bb); } @@ -254,7 +309,7 @@ public ActionResult Edit([FromBody]string json) dt.Add("id", value["id"].ToString()); foreach (var f in value) { - if (f.Key.ToLower() != "id"&& selectTable.IsCol(key,f.Key) && (role.Update.Column.Contains ("*")||role.Update.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) + if (f.Key.ToLower() != "id" && selectTable.IsCol(key, f.Key) && (role.Update.Column.Contains("*") || role.Update.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) { dt.Add(f.Key, f.Value); } @@ -293,13 +348,13 @@ public ActionResult Remove([FromBody]string json) var value = JObject.Parse(item.Value.ToString()); var sb = new System.Text.StringBuilder(100); sb.Append($"delete FROM {key} where "); - if (role.Delete==null||role.Delete.Table==null) + if (role.Delete == null || role.Delete.Table == null) { ht["code"] = "500"; ht["msg"] = "delete权限未配置"; break; } - if (!role.Delete.Table.Contains(key,StringComparer.CurrentCultureIgnoreCase)) + if (!role.Delete.Table.Contains(key, StringComparer.CurrentCultureIgnoreCase)) { ht["code"] = "500"; ht["msg"] = $"没权限删除{key}"; diff --git a/APIJSON.NET/APIJSON.NET/Program.cs b/APIJSON.NET/APIJSON.NET/Program.cs index 2fa47dc..ec500ca 100644 --- a/APIJSON.NET/APIJSON.NET/Program.cs +++ b/APIJSON.NET/APIJSON.NET/Program.cs @@ -13,7 +13,9 @@ public static void Main(string[] args) public static IWebHostBuilder CreateWebHostBuilder(string[] args) { - return WebHost.CreateDefaultBuilder(args).UseStartup(); + return WebHost.CreateDefaultBuilder(args) + .UseUrls("http://*:89/") + .UseStartup(); } } } diff --git a/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs b/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs index ea2f65d..f2bfea1 100644 --- a/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs +++ b/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs @@ -50,7 +50,7 @@ public Role GetRole() { return (false, $"appsettings.json权限配置不正确!"); } - string tablerole = role.Select.Table.FirstOrDefault(it => it.Equals(table, StringComparison.CurrentCultureIgnoreCase)); + string tablerole = role.Select.Table.FirstOrDefault(it => it.Equals(table, StringComparison.CurrentCultureIgnoreCase) || it=="*"); if (string.IsNullOrEmpty(tablerole)) { diff --git a/APIJSON.NET/APIJSON.NET/Services/TableMapper.cs b/APIJSON.NET/APIJSON.NET/Services/TableMapper.cs index 51b6e60..9613fd0 100644 --- a/APIJSON.NET/APIJSON.NET/Services/TableMapper.cs +++ b/APIJSON.NET/APIJSON.NET/Services/TableMapper.cs @@ -6,7 +6,7 @@ namespace APIJSON.NET.Services { public class TableMapper : ITableMapper { - private readonly Dictionary _options= new Dictionary(StringComparer.OrdinalIgnoreCase); + private readonly Dictionary _options = new Dictionary(StringComparer.OrdinalIgnoreCase); public TableMapper(IOptions> options) { foreach (var item in options.Value) diff --git a/APIJSON.NET/APIJSON.NET/Startup.cs b/APIJSON.NET/APIJSON.NET/Startup.cs index 84a7dd2..24d6731 100644 --- a/APIJSON.NET/APIJSON.NET/Startup.cs +++ b/APIJSON.NET/APIJSON.NET/Startup.cs @@ -85,7 +85,6 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) }); app.UseJwtTokenMiddleware(); - DbInit.Initialize(app); } } } diff --git a/APIJSON.NET/APIJSON.NET/appsettings.json b/APIJSON.NET/APIJSON.NET/appsettings.json index 57a7a3f..71cd267 100644 --- a/APIJSON.NET/APIJSON.NET/appsettings.json +++ b/APIJSON.NET/APIJSON.NET/appsettings.json @@ -1,7 +1,7 @@ { "ConnectionStrings": { - "DbType": 1, //0:MySql,1:SqlServer,2:Sqlite - "ConnectionString": "Server=liaozengbo\\sql2018; Database=Sample; User Id=sa;Password=sa123;" + "DbType": 0, //0:MySql,1:SqlServer,2:Sqlite + "ConnectionString": "Server=192.168.2.25;Database=yunwei;Uid=root;Pwd=xmjk;Port=3306;Character Set=utf8;" //"ConnectionString": "Server=119.29.9.25;Port=3306;Database=test;Uid=root;Pwd=1q,2w.3e?;CharSet=UTF8;" }, "Authentication": { @@ -16,8 +16,8 @@ { "name": "role1", //Ȩ������ Ψһ "select": { //��ѯȨ�� - "table": [ "moment", "User", "Comment" ], //�ɲ����ı� - "column": [ "*", "*", "*" ], //�ɲ������ֶ� + "table": [ "*" ], //�ɲ����ı� + "column": [ "*" ], //�ɲ������ֶ� "where": [] }, "update": { //�޸�Ȩ�� @@ -42,7 +42,8 @@ ], "tablempper": //������ӳ�� { - "user": "apijson_user" + "user": "apijson_user", + "org": "web_organization" } } diff --git a/APIJSON.NET/APIJSON.NET/wwwroot/js/main.js b/APIJSON.NET/APIJSON.NET/wwwroot/js/main.js index 829ccae..6642f77 100644 --- a/APIJSON.NET/APIJSON.NET/wwwroot/js/main.js +++ b/APIJSON.NET/APIJSON.NET/wwwroot/js/main.js @@ -142,12 +142,11 @@ }, methods: { hpost: function () { - $.ajax({ url: $('#rest-url').val(), type: "POST", dataType: "json", contentType: "application/json;charset=utf-8", - data: JSON.stringify($('#vInput').val()), + data: $('#vInput').val(),//JSON.stringify($('#vInput').val()), success: function (data) { App.jsonhtml = data; diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj new file mode 100644 index 0000000..be36502 --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj @@ -0,0 +1,13 @@ + + + + netstandard2.0 + + + + + + + + + diff --git a/APIJSON.NET/APIJSONCommon/FuncList.cs b/APIJSON.NET/APIJSONCommon/FuncList.cs new file mode 100644 index 0000000..7a0216a --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/FuncList.cs @@ -0,0 +1,24 @@ +using System; +using System.Linq; + +namespace ApiJson.Common +{ + /// + /// 自定义方法 + /// + public class FuncList + { + public string Merge(object a, object b) + { + return a.ToString() + b.ToString(); + } + public object MergeObj(object a, object b) + { + return new { a, b }; + } + public bool isContain(object a, object b) + { + return a.ToString().Split(',').Contains(b); + } + } +} diff --git a/APIJSON.NET/APIJSONCommon/Infrastructure/StringExtensions.cs b/APIJSON.NET/APIJSONCommon/Infrastructure/StringExtensions.cs new file mode 100644 index 0000000..e7569cb --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/Infrastructure/StringExtensions.cs @@ -0,0 +1,16 @@ +namespace ApiJson.Common +{ + public static class StringExtensions + { + + /// + /// 是否有值 + /// + /// + /// + public static bool IsValue(this object str) + { + return str != null && !string.IsNullOrEmpty(str.ToString()); + } + } +} \ No newline at end of file diff --git a/APIJSON.NET/APIJSONCommon/Models/DbOptions.cs b/APIJSON.NET/APIJSONCommon/Models/DbOptions.cs new file mode 100644 index 0000000..3788e45 --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/Models/DbOptions.cs @@ -0,0 +1,9 @@ +namespace ApiJson.Common +{ + using SqlSugar; + public class DbOptions + { + public DbType DbType { get; set; } + public string ConnectionString { get; set; } + } +} diff --git a/APIJSON.NET/APIJSONCommon/Models/RoleItem.cs b/APIJSON.NET/APIJSONCommon/Models/RoleItem.cs new file mode 100644 index 0000000..c892da4 --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/Models/RoleItem.cs @@ -0,0 +1,19 @@ +namespace ApiJson.Common.Models +{ + 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; } + + } + +} diff --git a/APIJSON.NET/APIJSONCommon/SelectTable.cs b/APIJSON.NET/APIJSONCommon/SelectTable.cs new file mode 100644 index 0000000..e3bd6a2 --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/SelectTable.cs @@ -0,0 +1,502 @@ +using ApiJson.Common.Services; +using AspectCore.Extensions.Reflection; +using Newtonsoft.Json.Linq; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; + +namespace ApiJson.Common +{ + public class SelectTable + { + private readonly IIdentityService _identitySvc; + private readonly ITableMapper _tableMapper; + private readonly SqlSugarClient db; + + public SelectTable(IIdentityService identityService, ITableMapper tableMapper, SqlSugarClient dbClient) + { + _identitySvc = identityService; + _tableMapper = tableMapper; + db = dbClient; + } + /// + /// 判断表名是否正确 + /// + /// + /// + public bool IsTable(string table) + { + return db.DbMaintenance.GetTableInfoList().Any(it => it.Name.Equals(table, StringComparison.CurrentCultureIgnoreCase)); + } + /// + /// 判断表的列名是否正确 + /// + /// + /// + /// + public bool IsCol(string table, string col) + { + return db.DbMaintenance.GetColumnInfosByTableName(table).Any(it => it.DbColumnName.Equals(col, StringComparison.CurrentCultureIgnoreCase)); + } + + /// + /// 动态调用方法 + /// + /// + /// + /// + /// + 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; + } + + public (dynamic, int) GetTableData(string subtable, int page, int count, 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()); + values.Remove("page"); + values.Remove("count"); + var tb = SugarQueryable(subtable, selectrole, values, dd); + if (count > 0) + { + int total = 0; + return (tb.ToPageList(page, count, ref total), total); + } + else + { + return (tb.ToList(), tb.Count()); + } + } + + /// + /// 解析并查询 + /// + /// + /// + public JObject Query(JObject queryObj) + { + JObject resultObj = new JObject(); + resultObj.Add("code", "200"); + resultObj.Add("msg", "success"); + try + { + int total = 0; + foreach (var item in queryObj) + { + string key = item.Key.Trim(); + + 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(key, JToken.FromObject(template)); + } + } + } + } + catch (Exception ex) + { + resultObj["code"] = "500"; + resultObj["msg"] = ex.Message; + } + return resultObj; + } + + private void ExecFunc(JObject resultObj, KeyValuePair item) + { + JObject jb = JObject.Parse(item.Value.ToString()); + Type type = typeof(FuncList); + + var dataJObj = new JObject(); + foreach (var f in jb) + { + var types = new List(); + var param = new List(); + foreach (var va in JArray.Parse(f.Value.ToString())) + { + types.Add(typeof(object)); + param.Add(va); + } + dataJObj.Add(f.Key, JToken.FromObject(ExecFunc(f.Key, param.ToArray(), types.ToArray()))); + } + resultObj.Add("func", dataJObj); + } + + //单表查询 + private int QuerySingleList(JObject resultObj, KeyValuePair 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 ? 1 : int.Parse(jb["count"].ToString()); + int query = jb["query"] == null ? 2 : 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, t.Value.ToString(), null); + if (query > 0) + { + total = datas.Item2; + } + foreach (var data in datas.Item1) + { + htt.Add(JToken.FromObject(data)); + } + } + resultObj.Add(key, htt); + return total; + } + + //多列表查询 + private int QueryMoreList(JObject resultObj, KeyValuePair item) + { + var jb = JObject.Parse(item.Value.ToString()); + int page = jb["page"] == null ? 0 : int.Parse(jb["page"].ToString()); + int count = jb["count"] == null ? 0 : 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(); + + List tables = new List(), where = new List(); + foreach (var t in jb) + { + tables.Add(t.Key); + where.Add(t.Value.ToString()); + } + + if (tables.Count > 0) + { + string table = tables[0]; + //查询主表数据 + var datas = GetTableData(table, page, count, where[0], null); + if (query > 0) + { + total = datas.Item2; + } + + foreach (var data in datas.Item1) + { + var zht = new JObject + { + { table, JToken.FromObject(data) } + }; + + 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, 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); + } + + } + if (query != 1) + { + resultObj.Add("[]", htt); + } + + return total; + } + + public dynamic GetFirstData(string subtable, 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); + values.Remove("page"); + values.Remove("count"); + var tb = SugarQueryable(subtable, selectrole, values, dd).First(); + var dic = (IDictionary)tb; + foreach (var item in values.Properties().Where(it => it.Name.EndsWith("()"))) + { + 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(); + var paramss = new List(); + 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()); + } + } + + return tb; + + } + + private ISugarQueryable SugarQueryable(string subtable, string selectrole, JObject values, JObject dd) + { + if (!IsTable(subtable)) + { + throw new Exception($"表名{subtable}不正确!"); + } + var tb = db.Queryable(subtable, "tb"); + + + if (values["@column"].IsValue()) + { + var str = new System.Text.StringBuilder(100); + foreach (var item in values["@column"].ToString().Split(',')) + { + string[] ziduan = item.Split(','); + if (ziduan.Length > 1) + { + if (IsCol(subtable, ziduan[0]) && _identitySvc.ColIsRole(ziduan[0], selectrole.Split(','))) + { + + str.Append(ziduan[0] + " as " + ziduan[1] + ","); + } + } + else + { + if (IsCol(subtable, item) && _identitySvc.ColIsRole(item, selectrole.Split(','))) + { + str.Append(item + ","); + } + } + } + if (string.IsNullOrEmpty(str.ToString())) + { + throw new Exception($"表名{subtable}没有可查询的字段!"); + } + tb.Select(str.ToString().TrimEnd(',')); + } + else + { + tb.Select(selectrole); + } + + List conModels = new List(); + if (values["identity"].IsValue()) + { + conModels.Add(new ConditionalModel() { FieldName = values["identity"].ToString(), ConditionalType = ConditionalType.Equal, FieldValue = _identitySvc.GetUserIdentity() }); + } + foreach (var va in values) + { + string vakey = va.Key.Trim(); + if (vakey.EndsWith("$"))//模糊查询 + { + if (IsCol(subtable, vakey.TrimEnd('$'))) + { + conModels.Add(new ConditionalModel() { FieldName = vakey.TrimEnd('$'), ConditionalType = ConditionalType.Like, FieldValue = va.Value.ToString() }); + } + } + else if (vakey.EndsWith("{}"))//逻辑运算 + { + string field = vakey.TrimEnd("{}".ToCharArray()); + if (va.Value.HasValues) + { + conModels.Add(new ConditionalModel() { FieldName = field, ConditionalType = field.EndsWith("!") ? ConditionalType.NotIn : ConditionalType.In, FieldValue = va.Value.ToString() }); + } + else + { + var ddt = new List>(); + foreach (var and in va.Value.ToString().Split(',')) + { + var model = new ConditionalModel(); + model.FieldName = field; + if (and.StartsWith(">=")) + { + 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((field.EndsWith("&") ? WhereType.And : WhereType.Or), model)); + } + conModels.Add(new ConditionalCollections() { ConditionalList = ddt }); + } + } + else if (vakey.EndsWith("@") && dd != null) // 关联上一个table + { + string[] str = va.Value.ToString().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 }); + + } + else if (IsCol(subtable, vakey)) //其他where条件 + { + conModels.Add(new ConditionalModel() { FieldName = vakey, ConditionalType = ConditionalType.Equal, FieldValue = va.Value.ToString() }); + } + } + tb.Where(conModels); + + //排序 + if (values["@order"].IsValue()) + { + foreach (var item in values["@order"].ToString().Split(',')) + { + if (IsCol(subtable, item.Replace("-", ""))) + { + if (item.EndsWith("-")) + { + tb.OrderBy($"{item.Replace("-", " desc")}"); + } + else + { + tb.OrderBy($"{item.ToString()}"); + } + } + } + } + + if (values["@group"].IsValue()) + { + 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(',')); + } + if (values["@having"].IsValue()) + { + List hw = new List(); + JArray jArray = JArray.Parse(values["@having"].ToString()); + foreach (var item in jArray) + { + string and = item.ToString(); + var model = new ConditionalModel(); + if (and.Contains(">=")) + { + model.FieldName = and.Split(new string[] { ">=" }, StringSplitOptions.RemoveEmptyEntries)[0]; + model.ConditionalType = ConditionalType.GreaterThanOrEqual; + 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.LessThanOrEqual; + 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.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("=")) + { + 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); + } + + var d = db.Context.Utilities.ConditionalModelToSql(hw); + tb.Having(d.Key, d.Value); + } + return tb; + } + } +} diff --git a/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs b/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs new file mode 100644 index 0000000..07573db --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs @@ -0,0 +1,32 @@ +using ApiJson.Common.Models; + +namespace ApiJson.Common.Services +{ + public interface IIdentityService + { + /// + /// 获取当前用户id + /// + /// + string GetUserIdentity(); + /// + /// 获取当前用户权限组名称 + /// + /// + string GetUserRoleName(); + /// + /// 获取当前用户权限 + /// + /// + Role GetRole(); + /// + /// 获取当前表的可查询字段 + /// + /// + /// + (bool, string) GetSelectRole(string table); + + + bool ColIsRole(string col, string[] selectrole); + } +} diff --git a/APIJSON.NET/APIJSONCommon/Services/ITableMapper.cs b/APIJSON.NET/APIJSONCommon/Services/ITableMapper.cs new file mode 100644 index 0000000..fa79a52 --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/Services/ITableMapper.cs @@ -0,0 +1,12 @@ +namespace ApiJson.Common.Services +{ + public interface ITableMapper + { + /// + /// 表别名获取 + /// + /// + /// + string GetTableName(string oldname); + } +} diff --git a/APIJSON.NET/APIJSONCommon/Services/TableMapper.cs b/APIJSON.NET/APIJSONCommon/Services/TableMapper.cs new file mode 100644 index 0000000..3c2d8a9 --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/Services/TableMapper.cs @@ -0,0 +1,26 @@ +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; + +namespace ApiJson.Common.Services +{ + public class TableMapper : ITableMapper + { + private readonly Dictionary _options = new Dictionary(StringComparer.OrdinalIgnoreCase); + public TableMapper(IOptions> options) + { + foreach (var item in options.Value) + { + _options.Add(item.Key, item.Value); + } + } + public string GetTableName(string oldname) + { + if (_options.ContainsKey(oldname)) + { + return _options[oldname]; + } + return oldname; + } + } +} From 3ad195dfa34cf62d9541560f1c58b8dfb953f663 Mon Sep 17 00:00:00 2001 From: zhuzhiqing Date: Fri, 18 Jan 2019 19:58:20 +0800 Subject: [PATCH 02/31] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E7=9A=84API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj | 19 +- .../APIJSON.NET/Controllers/JsonController.cs | 177 +++--------------- .../APIJSON.NET/Services/IdentityService.cs | 4 +- APIJSON.NET/APIJSON.NET/Startup.cs | 34 ++-- APIJSON.NET/APIJSONCommon/SelectTable.cs | 23 +++ 5 files changed, 82 insertions(+), 175 deletions(-) diff --git a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj index 9ac26fb..3f1a2fa 100644 --- a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj +++ b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj @@ -4,6 +4,17 @@ netcoreapp2.1 + + + + + + + + + + + @@ -16,7 +27,7 @@ - + @@ -26,12 +37,16 @@ - + + + + + diff --git a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs index 4ae6839..fd5a143 100644 --- a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs +++ b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs @@ -1,6 +1,7 @@ namespace APIJSON.NET.Controllers { - using APIJSON.NET.Services; + using ApiJson.Common; + using ApiJson.Common.Services; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json.Linq; @@ -20,15 +21,16 @@ public class JsonController : ControllerBase { - private SelectTable selectTable; - private DbContext db; + private SelectTable _selectTable; + private DbContext _db; private readonly IIdentityService _identitySvc; - public JsonController(SelectTable _selectTable, DbContext _db, IIdentityService identityService) + private ITableMapper _tableMapper; + public JsonController(ITableMapper tableMapper, DbContext db, IIdentityService identityService) { - - selectTable = _selectTable; - db = _db; + _db = db; _identitySvc = identityService; + _tableMapper = tableMapper; + _selectTable = new SelectTable(_identitySvc, _tableMapper, _db.Db); } /// @@ -39,7 +41,7 @@ public ActionResult Test() { string str = "{\"page\":1,\"count\":3,\"query\":2,\"Org\":{\"@column\":\"Id,Name\"}}"; var content = new StringContent(str); - + HttpClient hc = new HttpClient(); var response = hc.PostAsync("http://localhost:89/api/json/org", content).Result; string result = (response.Content.ReadAsStringAsync().Result);//result就是返回的结果。 @@ -50,11 +52,10 @@ public ActionResult Test() public async Task Query1([FromRoute]string table) { - string json = string.Empty; using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8)) { - json= await reader.ReadToEndAsync(); + json = await reader.ReadToEndAsync(); } json = HttpUtility.UrlDecode(json); @@ -75,11 +76,13 @@ public async Task Query1([FromRoute]string table) } if (!hasTableKey) { - jobject.Add(table,new JObject()); + jobject.Add(table, new JObject()); } - var newJson = Newtonsoft.Json.JsonConvert.SerializeObject(ht); - return Query(newJson); + + JObject resultJobj = new SelectTable(_identitySvc, _tableMapper, _db.Db).Query(ht); + return Ok(resultJobj); } + /// /// 查询 /// @@ -90,142 +93,8 @@ public async Task Query1([FromRoute]string table) public ActionResult Query([FromBody]string json) { json = HttpUtility.UrlDecode(json); - JObject ht = new JObject(); - ht.Add("code", "200"); - ht.Add("msg", "success"); - try - { - JObject jobject = JObject.Parse(json); - int page = 0, count = 0, query = 0, total = 0; - foreach (var item in jobject) - { - string key = item.Key.Trim(); - JObject jb; - if (key.Equals("[]")) - { - jb = JObject.Parse(item.Value.ToString()); - page = jb["page"] == null ? 0 : int.Parse(jb["page"].ToString()); - count = jb["count"] == null ? 0 : int.Parse(jb["count"].ToString()); - query = jb["query"] == null ? 0 : int.Parse(jb["query"].ToString()); - jb.Remove("page"); jb.Remove("count"); jb.Remove("query"); - var htt = new JArray(); - List tables = new List(), where = new List(); - foreach (var t in jb) - { - tables.Add(t.Key); where.Add(t.Value.ToString()); - } - if (tables.Count > 0) - { - string table = tables[0]; - var temp = selectTable.GetTableData(table, page, count, where[0], null); - if (query > 0) - { - total = temp.Item2; - } - - foreach (var dd in temp.Item1) - { - var zht = new JObject(); - zht.Add(table, JToken.FromObject(dd)); - for (int i = 1; i < tables.Count; i++) - { - 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 selectTable.GetTableData(subtable, page, count, jbb[subtable].ToString(), zht).Item1) - { - lt.Add(JToken.FromObject(d)); - } - zht.Add(tables[i], lt); - } - else - { - var ddf = selectTable.GetFirstData(subtable, where[i].ToString(), zht); - if (ddf != null) - { - zht.Add(subtable, JToken.FromObject(ddf)); - - } - } - } - htt.Add(zht); - } - - } - if (query != 1) - { - ht.Add("[]", htt); - } - } - else if (key.EndsWith("[]")) - { - jb = JObject.Parse(item.Value.ToString()); - page = jb["page"] == null ? 0 : int.Parse(jb["page"].ToString()); - count = jb["count"] == null ? 0 : int.Parse(jb["count"].ToString()); - 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) - { - var temp = selectTable.GetTableData(t.Key, page, count, t.Value.ToString(), null); - if (query > 0) - { - total = temp.Item2; - } - foreach (var d in temp.Item1) - { - htt.Add(JToken.FromObject(d)); - } - } - ht.Add(key, htt); - } - else if (key.Equals("func")) - { - jb = JObject.Parse(item.Value.ToString()); - Type type = typeof(FuncList); - Object obj = Activator.CreateInstance(type); - var bb = new JObject(); - foreach (var f in jb) - { - var types = new List(); - var param = new List(); - foreach (var va in JArray.Parse(f.Value.ToString())) - { - types.Add(typeof(object)); - param.Add(va); - } - bb.Add(f.Key, JToken.FromObject(selectTable.ExecFunc(f.Key, param.ToArray(), types.ToArray()))); - } - ht.Add("func", bb); - } - else if (key.Equals("total@")) - { - ht.Add("total", total); - } - else - { - var template = selectTable.GetFirstData(key, item.Value.ToString(), ht); - if (template != null) - { - ht.Add(key, JToken.FromObject(template)); - } - } - - } - } - catch (Exception ex) - { - ht["code"] = "500"; - ht["msg"] = ex.Message; - - } - return Ok(ht); + JObject resultJobj = new SelectTable(_identitySvc, _tableMapper, _db.Db).Query(json); + return Ok(resultJobj); } /// /// 新增 @@ -257,10 +126,10 @@ public ActionResult Add([FromBody]string json) var dt = new Dictionary(); foreach (var f in JObject.Parse(item.Value.ToString())) { - if (f.Key.ToLower() != "id" && selectTable.IsCol(key, f.Key) && (role.Insert.Column.Contains("*") || role.Insert.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) + if (f.Key.ToLower() != "id" && _selectTable.IsCol(key, f.Key) && (role.Insert.Column.Contains("*") || role.Insert.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) dt.Add(f.Key, f.Value); } - int id = db.Db.Insertable(dt).AS(key).ExecuteReturnIdentity(); + int id = _db.Db.Insertable(dt).AS(key).ExecuteReturnIdentity(); ht.Add(key, JToken.FromObject(new { code = 200, msg = "success", id })); } } @@ -309,12 +178,12 @@ public ActionResult Edit([FromBody]string json) dt.Add("id", value["id"].ToString()); foreach (var f in value) { - if (f.Key.ToLower() != "id" && selectTable.IsCol(key, f.Key) && (role.Update.Column.Contains("*") || role.Update.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) + if (f.Key.ToLower() != "id" && _selectTable.IsCol(key, f.Key) && (role.Update.Column.Contains("*") || role.Update.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) { dt.Add(f.Key, f.Value); } } - db.Db.Updateable(dt).AS(key).ExecuteCommand(); + _db.Db.Updateable(dt).AS(key).ExecuteCommand(); ht.Add(key, JToken.FromObject(new { code = 200, msg = "success", id = value["id"].ToString() })); } } @@ -373,7 +242,7 @@ public ActionResult Remove([FromBody]string json) p.Add(new SugarParameter($"@{f.Key}", f.Value.ToString())); } string sql = sb.ToString().TrimEnd(','); - db.Db.Ado.ExecuteCommand(sql, p); + _db.Db.Ado.ExecuteCommand(sql, p); ht.Add(key, JToken.FromObject(new { code = 200, msg = "success", id = value["id"].ToString() })); } diff --git a/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs b/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs index f2bfea1..871d47d 100644 --- a/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs +++ b/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs @@ -1,4 +1,6 @@ -using APIJSON.NET.Models; +using ApiJson.Common.Models; +using ApiJson.Common.Services; +using APIJSON.NET.Models; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Options; using System; diff --git a/APIJSON.NET/APIJSON.NET/Startup.cs b/APIJSON.NET/APIJSON.NET/Startup.cs index 24d6731..1b3daed 100644 --- a/APIJSON.NET/APIJSON.NET/Startup.cs +++ b/APIJSON.NET/APIJSON.NET/Startup.cs @@ -1,9 +1,8 @@ namespace APIJSON.NET { - using System; - using System.Collections.Generic; - using System.Text; - using APIJSON.NET.Models; + using ApiJson.Common; + using ApiJson.Common.Models; + using ApiJson.Common.Services; using APIJSON.NET.Services; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -12,10 +11,10 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; - using SqlKata.Execution; using Swashbuckle.AspNetCore.Swagger; - using MySql.Data.MySqlClient; - using SqlKata.Compilers; + using System; + using System.Collections.Generic; + using System.Text; public class Startup { @@ -30,9 +29,9 @@ public Startup(IConfiguration configuration) // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { - + services.Configure>(Configuration.GetSection("RoleList")); - services.Configure>(Configuration.GetSection("tablempper")); + services.Configure>(Configuration.GetSection("tablempper")); services.Configure(tokenAuthConfig => { tokenAuthConfig.SecurityKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Authentication:JwtBearer:SecurityKey"])); @@ -43,19 +42,18 @@ public void ConfigureServices(IServiceCollection services) }); AuthConfigurer.Configure(services, Configuration); - services.AddCors( options => options.AddPolicy( _defaultCorsPolicyName, - builder => - builder.AllowAnyOrigin() - .AllowAnyHeader() - .AllowAnyMethod().AllowCredentials() - )); + services.AddCors(options => options.AddPolicy(_defaultCorsPolicyName, + builder => + builder.AllowAnyOrigin() + .AllowAnyHeader() + .AllowAnyMethod().AllowCredentials() + )); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Info { Title = "APIJSON.NET", Version = "v1" }); }); services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddTransient(); @@ -81,9 +79,9 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); - + }); - + app.UseJwtTokenMiddleware(); } } diff --git a/APIJSON.NET/APIJSONCommon/SelectTable.cs b/APIJSON.NET/APIJSONCommon/SelectTable.cs index e3bd6a2..df15c18 100644 --- a/APIJSON.NET/APIJSONCommon/SelectTable.cs +++ b/APIJSON.NET/APIJSONCommon/SelectTable.cs @@ -85,6 +85,29 @@ public object ExecFunc(string funcname, object[] param, Type[] types) } } + /// + /// 解析并查询 + /// + /// + /// + public JObject Query(string queryJson) + { + JObject resultObj = new JObject(); + + try + { + JObject queryJobj = JObject.Parse(queryJson); + resultObj = Query(queryJobj); + } + catch (Exception ex) + { + resultObj.Add("code", "500"); + resultObj.Add("msg", ex.Message); + } + + return resultObj; + } + /// /// 解析并查询 /// From d0c716cd6011ee0c749d9ac6ac999e905fd13657 Mon Sep 17 00:00:00 2001 From: xiaobo <635990945@qq.com> Date: Thu, 14 Mar 2019 13:59:24 +0800 Subject: [PATCH 03/31] =?UTF-8?q?#=E6=9B=B4=E6=96=B0sdk#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../APIJSON.NET.Test/APIJSON.NET.Test.csproj | 2 +- APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj | 32 +++++++++---------- .../APIJSON.NET/Controllers/JsonController.cs | 5 ++- APIJSON.NET/APIJSON.NET/Data/DbContext.cs | 5 ++- APIJSON.NET/APIJSON.NET/appsettings.json | 2 +- 5 files changed, 22 insertions(+), 24 deletions(-) diff --git a/APIJSON.NET/APIJSON.NET.Test/APIJSON.NET.Test.csproj b/APIJSON.NET/APIJSON.NET.Test/APIJSON.NET.Test.csproj index 50ab43e..7a13087 100644 --- a/APIJSON.NET/APIJSON.NET.Test/APIJSON.NET.Test.csproj +++ b/APIJSON.NET/APIJSON.NET.Test/APIJSON.NET.Test.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.1 + netcoreapp2.2 diff --git a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj index ade59f1..f7bd43b 100644 --- a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj +++ b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj @@ -1,7 +1,7 @@  - netcoreapp2.1 + netcoreapp2.2 @@ -15,21 +15,21 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs index 4f11e5a..6590965 100644 --- a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs +++ b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs @@ -251,15 +251,14 @@ public ActionResult Edit([FromBody]string json) } var dt = new Dictionary(); - dt.Add("id", value["id"].ToString()); foreach (var f in value) { if (f.Key.ToLower() != "id"&& selectTable.IsCol(key,f.Key) && (role.Update.Column.Contains ("*")||role.Update.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) { - dt.Add(f.Key, f.Value); + dt.Add(f.Key, f.Value.ToString()); } } - db.Db.Updateable(dt).AS(key).ExecuteCommand(); + db.Db.Updateable(dt).AS(key).Where("id=@id" ,new { id= value["id"].ToString() }).ExecuteCommand(); ht.Add(key, JToken.FromObject(new { code = 200, msg = "success", id = value["id"].ToString() })); } } diff --git a/APIJSON.NET/APIJSON.NET/Data/DbContext.cs b/APIJSON.NET/APIJSON.NET/Data/DbContext.cs index 07eb061..d3c8754 100644 --- a/APIJSON.NET/APIJSON.NET/Data/DbContext.cs +++ b/APIJSON.NET/APIJSON.NET/Data/DbContext.cs @@ -14,9 +14,8 @@ public DbContext(IConfiguration options) Db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = options.GetConnectionString("ConnectionString"), - DbType = (DbType)Enum.Parse(typeof(SqlSugar.DbType), options.GetConnectionString("DbType")), - IsAutoCloseConnection = true, - InitKeyType= InitKeyType.Attribute + DbType = (DbType)Enum.Parse(typeof(SqlSugar.DbType), options.GetConnectionString("DbType")), InitKeyType= InitKeyType.Attribute, + IsAutoCloseConnection = true }); Db.Aop.OnLogExecuted = (sql, pars) => //SQL执行完事件 { diff --git a/APIJSON.NET/APIJSON.NET/appsettings.json b/APIJSON.NET/APIJSON.NET/appsettings.json index 57a7a3f..6e284d5 100644 --- a/APIJSON.NET/APIJSON.NET/appsettings.json +++ b/APIJSON.NET/APIJSON.NET/appsettings.json @@ -1,7 +1,7 @@ { "ConnectionStrings": { "DbType": 1, //0:MySql,1:SqlServer,2:Sqlite - "ConnectionString": "Server=liaozengbo\\sql2018; Database=Sample; User Id=sa;Password=sa123;" + "ConnectionString": "Server=LIAOZENGBO\\SQL2012; Database=Testdb; User Id=sa;Password=sa123;" //"ConnectionString": "Server=119.29.9.25;Port=3306;Database=test;Uid=root;Pwd=1q,2w.3e?;CharSet=UTF8;" }, "Authentication": { From 991d8012c2f6d805467f516e14dfd8669e5f053c Mon Sep 17 00:00:00 2001 From: JerryMouseLi <13737732703@163.com> Date: Wed, 27 Mar 2019 11:55:43 +0800 Subject: [PATCH 04/31] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E7=94=9F?= =?UTF-8?q?=E5=91=BD=E5=91=A8=E6=9C=9F=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 数据库生命周期更改成每一次请求就结束,而不是应用程序的整个生命周期 --- Startup.cs | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 Startup.cs diff --git a/Startup.cs b/Startup.cs new file mode 100644 index 0000000..6c04520 --- /dev/null +++ b/Startup.cs @@ -0,0 +1,94 @@ +namespace APIJSON.NET +{ + using System; + using System.Collections.Generic; + using System.Text; + using APIJSON.NET.Models; + using APIJSON.NET.Services; + using Microsoft.AspNetCore.Builder; + using Microsoft.AspNetCore.Hosting; + using Microsoft.AspNetCore.Http; + using Microsoft.AspNetCore.Mvc; + using Microsoft.Extensions.Configuration; + using Microsoft.Extensions.DependencyInjection; + using Microsoft.IdentityModel.Tokens; + using SqlKata.Execution; + using Swashbuckle.AspNetCore.Swagger; + using MySql.Data.MySqlClient; + using SqlKata.Compilers; + + public class Startup + { + private const string _defaultCorsPolicyName = "localhost"; + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + + services.Configure>(Configuration.GetSection("RoleList")); + services.Configure>(Configuration.GetSection("tablempper")); + services.Configure(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); + + services.AddCors( options => options.AddPolicy( _defaultCorsPolicyName, + builder => + builder.AllowAnyOrigin() + .AllowAnyHeader() + .AllowAnyMethod().AllowCredentials() + )); + services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); + services.AddSwaggerGen(c => + { + c.SwaggerDoc("v1", new Info { Title = "APIJSON.NET", Version = "v1" }); + }); + // services.AddSingleton(); + //services.AddSingleton(); + services.AddScoped(); + services.AddScoped(); + + services.AddSingleton(); + services.AddSingleton(); + services.AddTransient(); + services.AddTransient(); + + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env) + { + + app.UseAuthentication(); + + app.UseMvc(routes => + { + routes.MapRoute( + name: "default", + template: "{controller=Home}/{action=Index}/{id?}"); + }); + app.UseStaticFiles(); + app.UseCors(_defaultCorsPolicyName); + app.UseSwagger(); + app.UseSwaggerUI(c => + { + c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); + + }); + + app.UseJwtTokenMiddleware(); + DbInit.Initialize(app); + } + } +} From 41cd15f536de58bec938cc377e6d9a6a5517c037 Mon Sep 17 00:00:00 2001 From: xiaobo <635990945@qq.com> Date: Wed, 10 Apr 2019 10:41:00 +0800 Subject: [PATCH 05/31] =?UTF-8?q?#=E4=BC=98=E5=8C=96=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E4=BC=A0=E5=85=A5=20#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj | 8 +++---- .../APIJSON.NET/Controllers/JsonController.cs | 21 +++++++------------ APIJSON.NET/APIJSON.NET/Startup.cs | 3 --- APIJSON.NET/APIJSON.NET/wwwroot/js/main.js | 2 +- 4 files changed, 11 insertions(+), 23 deletions(-) diff --git a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj index f7bd43b..01fe4ec 100644 --- a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj +++ b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj @@ -16,17 +16,15 @@ - + - - - - + + diff --git a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs index 6590965..709aa4a 100644 --- a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs +++ b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs @@ -37,15 +37,13 @@ public JsonController(SelectTable _selectTable, DbContext _db,IIdentityService i /// [HttpPost("/get")] - public ActionResult Query([FromBody]string json) + public ActionResult Query([FromBody] JObject jobject) { - json = HttpUtility.UrlDecode(json); JObject ht = new JObject(); ht.Add("code", "200"); ht.Add("msg", "success"); try { - JObject jobject = JObject.Parse(json); int page = 0, count = 0, query = 0, total = 0; foreach (var item in jobject) { @@ -178,16 +176,16 @@ public ActionResult Query([FromBody]string json) /// /// [HttpPost("/add")] - public ActionResult Add([FromBody]string json) + public ActionResult Add([FromBody]JObject jobject) { - json = HttpUtility.UrlDecode(json); + JObject ht = new JObject(); ht.Add("code", "200"); ht.Add("msg", "success"); try { - JObject jobject = JObject.Parse(json); - var sb = new System.Text.StringBuilder(100); + + foreach (var item in jobject) { @@ -222,16 +220,13 @@ public ActionResult Add([FromBody]string json) /// /// [HttpPost("/edit")] - public ActionResult Edit([FromBody]string json) + public ActionResult Edit([FromBody]JObject jobject) { - json = HttpUtility.UrlDecode(json); JObject ht = new JObject(); ht.Add("code", "200"); ht.Add("msg", "success"); try { - JObject jobject = JObject.Parse(json); - foreach (var item in jobject) { string key = item.Key.Trim(); @@ -276,16 +271,14 @@ public ActionResult Edit([FromBody]string json) /// /// [HttpPost("/remove")] - public ActionResult Remove([FromBody]string json) + public ActionResult Remove([FromBody]JObject jobject) { - json = HttpUtility.UrlDecode(json); JObject ht = new JObject(); ht.Add("code", "200"); ht.Add("msg", "success"); try { var role = _identitySvc.GetRole(); - JObject jobject = JObject.Parse(json); foreach (var item in jobject) { string key = item.Key.Trim(); diff --git a/APIJSON.NET/APIJSON.NET/Startup.cs b/APIJSON.NET/APIJSON.NET/Startup.cs index 84a7dd2..15d9b6c 100644 --- a/APIJSON.NET/APIJSON.NET/Startup.cs +++ b/APIJSON.NET/APIJSON.NET/Startup.cs @@ -12,10 +12,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; - using SqlKata.Execution; using Swashbuckle.AspNetCore.Swagger; - using MySql.Data.MySqlClient; - using SqlKata.Compilers; public class Startup { diff --git a/APIJSON.NET/APIJSON.NET/wwwroot/js/main.js b/APIJSON.NET/APIJSON.NET/wwwroot/js/main.js index 829ccae..7f32e28 100644 --- a/APIJSON.NET/APIJSON.NET/wwwroot/js/main.js +++ b/APIJSON.NET/APIJSON.NET/wwwroot/js/main.js @@ -147,7 +147,7 @@ url: $('#rest-url').val(), type: "POST", dataType: "json", contentType: "application/json;charset=utf-8", - data: JSON.stringify($('#vInput').val()), + data: $('#vInput').val(), success: function (data) { App.jsonhtml = data; From 488b8d2cb441e5147c42ac130aa2f760f5a69700 Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Thu, 11 Apr 2019 00:20:13 +0800 Subject: [PATCH 06/31] Update README.md --- README.md | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 165 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ef60400..33f85ef 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,167 @@ # APIJSON.NET -后端接口自动化 .NET CORE版本 +这是 APIJSON 的 C# .NET CORE 版后端实现。 -文档详见:https://github.com/TommyLemon/APIJSON +

+ APIJSON +

+ +

🏆码云最有价值开源项目
🚀后端接口和文档自动化,前端(客户端) 定制返回JSON的数据和结构!

+ +

+ +   +   + +

+

+ + + +   +   +

+

+ +   +   +

+

+ English +  通用文档 + 视频教程 + 在线工具 +

+ +

+ +

+ +--- + + +APIJSON是一种为API而生的JSON网络传输协议。
+为 简单的增删改查、复杂的查询、简单的事务操作 提供了完全自动化的API。
+能大幅降低开发和沟通成本,简化开发流程,缩短开发周期。
+适合中小型前后端分离的项目,尤其是互联网创业项目和企业自用项目。
+ +通过自动化API,前端可以定制任何数据、任何结构!
+大部分HTTP请求后端再也不用写接口了,更不用写文档了!
+前端再也不用和后端沟通接口或文档问题了!再也不会被文档各种错误坑了!
+后端再也不用为了兼容旧接口写新版接口和文档了!再也不会被前端随时随地没完没了地烦了! + +

+ +

+ +### 特点功能 + +#### 在线解析 +* 自动生成接口文档,清晰可读永远最新 +* 自动生成请求代码,支持Android和iOS +* 自动生成JavaBean文件,一键下载 +* 自动管理与测试接口用例,一键共享 +* 自动校验与格式化JSON,支持高亮和收展 + +#### 对于前端 +* 不用再向后端催接口、求文档 +* 数据和结构完全定制,要啥有啥 +* 看请求知结果,所求即所得 +* 可一次获取任何数据、任何结构 +* 能去除重复数据,节省流量提高速度 + +#### 对于后端 +* 提供通用接口,大部分API不用再写 +* 自动生成文档,不用再编写和维护 +* 自动校验权限、自动管理版本、自动防SQL注入 +* 开放API无需划分版本,始终保持兼容 +* 支持增删改查、模糊搜索、正则匹配、远程函数等 + +
+ +![](https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON_Auto_get.jpg) +

+ 多表关联查询、结构自由组合、多个测试账号、一键共享测试用例 +

+ +![](https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON_Auto_code.jpg) +

+ 自动生成封装请求JSON的Android与iOS代码、一键自动生成JavaBean或解析Response的代码 +

+ +![](https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON_Auto_doc.jpg) +

+ 自动保存请求记录、自动生成接口文档,可添加常用请求、快捷查看一键恢复 +

+ +![](https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON_Auto_test.jpg) +

+ 一键自动接口回归测试,不需要写任何代码(注解、注释等全都不要) +

+ +

+[以下Gif图看起来比较卡,实际在手机上App运行很流畅] +
+![](https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON_App_MomentList_Circle.gif) +![](https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON_App_Moment_Name.gif) +![](https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON_App_Moment_Comment.gif) + +
+ +### 为什么要用APIJSON? +[前后端10大痛点解析](https://github.com/TommyLemon/APIJSON/wiki) + +### 快速上手 +https://github.com/liaozb/APIJSON.NET/tree/master/APIJSON.NET + +### 下载客户端App + +仿微信朋友圈动态实战项目
+[APIJSONApp.apk](http://files.cnblogs.com/files/tommylemon/APIJSONApp.apk) + +测试及自动生成代码工具
+[APIJSONTest.apk](http://files.cnblogs.com/files/tommylemon/APIJSONTest.apk) + + +### 技术交流 +如果有什么问题或建议可以 [提ISSUE](https://github.com/liaozb/APIJSON.NET/issues) 或 [加群](https://github.com/TommyLemon/APIJSON#%E6%8A%80%E6%9C%AF%E4%BA%A4%E6%B5%81),交流技术,分享经验。
+如果你解决了某些bug,或者新增了一些功能,欢迎 [贡献代码](https://github.com/liaozb/APIJSON.NET/pulls),感激不尽~ + +### 贡献者们 +
+ + +
+
+感谢大家的贡献。 + +### 相关推荐 +[APIJSON, 让接口和文档见鬼去吧!](https://my.oschina.net/tommylemon/blog/805459) + +[仿QQ空间和微信朋友圈,高解耦高复用高灵活](https://my.oschina.net/tommylemon/blog/885787) + +[后端开挂:3行代码写出8个接口!](https://my.oschina.net/tommylemon/blog/1574430) + +[后端自动化版本管理,再也不用改URL了!](https://my.oschina.net/tommylemon/blog/1576587) + +[3步创建APIJSON后端新表及配置](https://my.oschina.net/tommylemon/blog/889074) + + +### 其它项目 +[APIJSON](https://github.com/TommyLemon/APIJSON) 码云最有价值项目:后端接口和文档自动化,前端(客户端) 定制返回JSON的数据和结构 + +[APIJSONAuto](https://github.com/TommyLemon/APIJSONAuto) 自动化接口管理工具,自动生成文档与注释、自动生成代码、自动化回归测试、自动静态检查等 + +[APIJSON-Android-RxJava](https://github.com/TommyLemon/APIJSON-Android-RxJava) 仿微信朋友圈动态实战项目,ZBLibrary(UI) + APIJSON(HTTP) + RxJava(Data) + +[Android-ZBLibrary](https://github.com/TommyLemon/Android-ZBLibrary) Android MVP快速开发框架,Demo全面,注释详细,使用简单,代码严谨 + +感谢热心的作者们的贡献,点 ⭐Star 支持下他们吧。 + +### 持续更新 +https://github.com/liaozb/APIJSON.NET/commits/master + +### 码云主页 +https://gitee.com/liaozb/APIJSON.NET + +### 我要赞赏 +如果你喜欢 uliweb-apijson,感觉它帮助到了你,可以点右上角 ⭐Star 支持一下,谢谢 ^_^ From a787d9ed76e3c4700d84305943e35573d7b49bc7 Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Thu, 11 Apr 2019 00:23:20 +0800 Subject: [PATCH 07/31] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 33f85ef..d95b6eb 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ https://github.com/liaozb/APIJSON.NET/tree/master/APIJSON.NET ### 贡献者们
- +

感谢大家的贡献。 From fac0f5f3b78a5fdfe073e34307821563dd5b0ef4 Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Thu, 11 Apr 2019 23:51:17 +0800 Subject: [PATCH 08/31] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=80=E4=BD=8D?= =?UTF-8?q?=E8=B4=A1=E7=8C=AE=E8=80=85=EF=BC=9B=E4=BF=AE=E6=AD=A3=E5=BA=95?= =?UTF-8?q?=E9=83=A8=E9=A1=B9=E7=9B=AE=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d95b6eb..8bb8849 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,7 @@ https://github.com/liaozb/APIJSON.NET/tree/master/APIJSON.NET ### 贡献者们
+

@@ -164,4 +165,4 @@ https://github.com/liaozb/APIJSON.NET/commits/master https://gitee.com/liaozb/APIJSON.NET ### 我要赞赏 -如果你喜欢 uliweb-apijson,感觉它帮助到了你,可以点右上角 ⭐Star 支持一下,谢谢 ^_^ +如果你喜欢 APIJSON.NET,感觉它帮助到了你,可以点右上角 ⭐Star 支持一下,谢谢 ^_^ From 2e830c4d83e0e176ac3f4832e7f560e6f83fcfef Mon Sep 17 00:00:00 2001 From: haptear Date: Fri, 10 May 2019 13:07:45 +0800 Subject: [PATCH 09/31] =?UTF-8?q?=E6=8F=90=E5=87=BAAPIJOSNCommon=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSON.NET.sln | 10 +- APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj | 11 +- .../APIJSON.NET/Controllers/JsonController.cs | 188 +++++---------- APIJSON.NET/APIJSON.NET/appsettings.json | 8 +- APIJSON.NET/APIJSON.NET/wwwroot/index.html | 11 +- .../APIJSONCommon/ApiJson.Common.csproj | 17 ++ .../FuncList.cs | 0 .../Infrastructure/StringExtensions.cs | 0 .../Models/DbOptions.cs | 0 .../Models/RoleItem.cs | 0 .../SelectTable.cs | 228 ++++++++++++++++-- .../Services/IIdentityService.cs | 0 .../Services/ITableMapper.cs | 0 .../Services/TableMapper.cs | 2 +- 14 files changed, 311 insertions(+), 164 deletions(-) create mode 100644 APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj rename APIJSON.NET/{APIJSON.NET => APIJSONCommon}/FuncList.cs (100%) rename APIJSON.NET/{APIJSON.NET => APIJSONCommon}/Infrastructure/StringExtensions.cs (100%) rename APIJSON.NET/{APIJSON.NET => APIJSONCommon}/Models/DbOptions.cs (100%) rename APIJSON.NET/{APIJSON.NET => APIJSONCommon}/Models/RoleItem.cs (100%) rename APIJSON.NET/{APIJSON.NET => APIJSONCommon}/SelectTable.cs (63%) rename APIJSON.NET/{APIJSON.NET => APIJSONCommon}/Services/IIdentityService.cs (100%) rename APIJSON.NET/{APIJSON.NET => APIJSONCommon}/Services/ITableMapper.cs (100%) rename APIJSON.NET/{APIJSON.NET => APIJSONCommon}/Services/TableMapper.cs (92%) diff --git a/APIJSON.NET/APIJSON.NET.sln b/APIJSON.NET/APIJSON.NET.sln index bf956bf..4c1e774 100644 --- a/APIJSON.NET/APIJSON.NET.sln +++ b/APIJSON.NET/APIJSON.NET.sln @@ -1,12 +1,14 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27703.2035 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28803.202 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APIJSON.NET", "APIJSON.NET\APIJSON.NET.csproj", "{FF647576-A104-4D54-954D-3547B4FDCDB2}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APIJSON.NET.Test", "APIJSON.NET.Test\APIJSON.NET.Test.csproj", "{0828346E-207E-49F8-AD57-E1AB6B6E4077}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApiJson.Common", "APIJSONCommon\ApiJson.Common.csproj", "{3B79D4FD-0BC7-49FD-A3DD-E514433B4B35}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,10 @@ Global {0828346E-207E-49F8-AD57-E1AB6B6E4077}.Debug|Any CPU.Build.0 = Debug|Any CPU {0828346E-207E-49F8-AD57-E1AB6B6E4077}.Release|Any CPU.ActiveCfg = Release|Any CPU {0828346E-207E-49F8-AD57-E1AB6B6E4077}.Release|Any CPU.Build.0 = Release|Any CPU + {3B79D4FD-0BC7-49FD-A3DD-E514433B4B35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B79D4FD-0BC7-49FD-A3DD-E514433B4B35}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B79D4FD-0BC7-49FD-A3DD-E514433B4B35}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B79D4FD-0BC7-49FD-A3DD-E514433B4B35}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj index 01fe4ec..634243e 100644 --- a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj +++ b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj @@ -4,6 +4,10 @@ netcoreapp2.2 + + + + @@ -16,7 +20,7 @@ - + @@ -24,12 +28,15 @@ - + + + +
diff --git a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs index 709aa4a..3d775ac 100644 --- a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs +++ b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs @@ -12,6 +12,10 @@ using APIJSON.NET.Services; using System.Reflection; using Microsoft.AspNetCore.Cors; + using System.Threading.Tasks; + using System.IO; + using System.Text; + using System.Net.Http; [Route("api/[controller]")] [ApiController] @@ -22,14 +26,28 @@ public class JsonController : ControllerBase private SelectTable selectTable; private DbContext db; private readonly IIdentityService _identitySvc; - public JsonController(SelectTable _selectTable, DbContext _db,IIdentityService identityService) - { + private ITableMapper _tableMapper; + public JsonController(SelectTable _selectTable, DbContext _db, IIdentityService identityService, ITableMapper tableMapper) + { selectTable = _selectTable; db = _db; + _tableMapper = tableMapper; _identitySvc = identityService; } - + + /// + /// + /// + /// + [HttpGet("/test")] + public ActionResult Test() + { + string str = "{\"page\":1,\"count\":3,\"query\":2,\"Org\":{\"@column\":\"Id,Name\"}}"; + var content = new StringContent(str); + return Ok(content); + } + /// /// 查询 /// @@ -39,136 +57,42 @@ public JsonController(SelectTable _selectTable, DbContext _db,IIdentityService i public ActionResult Query([FromBody] JObject jobject) { - JObject ht = new JObject(); - ht.Add("code", "200"); - ht.Add("msg", "success"); - try - { - int page = 0, count = 0, query = 0, total = 0; - foreach (var item in jobject) - { - string key = item.Key.Trim(); - JObject jb; - if (key.Equals("[]")) - { - jb = JObject.Parse(item.Value.ToString()); - page = jb["page"] == null ? 0 : int.Parse(jb["page"].ToString()); - count = jb["count"] == null ? 0 : int.Parse(jb["count"].ToString()); - query = jb["query"] == null ? 0 : int.Parse(jb["query"].ToString()); - jb.Remove("page"); jb.Remove("count"); jb.Remove("query"); - var htt = new JArray(); - List tables = new List(), where = new List(); - foreach (var t in jb) - { - tables.Add(t.Key); where.Add(t.Value.ToString()); - } - if (tables.Count > 0) - { - string table = tables[0]; - var temp = selectTable.GetTableData(table, page, count, where[0], null); - if (query > 0) - { - total = temp.Item2; - } - - foreach (var dd in temp.Item1) - { - var zht = new JObject(); - zht.Add(table, JToken.FromObject(dd)); - for (int i = 1; i < tables.Count; i++) - { - 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()); + JObject resultJobj = new SelectTable(_identitySvc, _tableMapper, db.Db).Query(jobject); + return Ok(resultJobj); + } - var lt = new JArray(); - foreach (var d in selectTable.GetTableData(subtable, page, count, jbb[subtable].ToString(), zht).Item1) - { - lt.Add(JToken.FromObject(d)); - } - zht.Add(tables[i], lt); - } - else - { - var ddf = selectTable.GetFirstData(subtable, where[i].ToString(), zht); - if (ddf != null) - { - zht.Add(subtable, JToken.FromObject(ddf)); + [HttpPost("/{table}")] + public async Task QueryByTable([FromRoute]string table) + { + string json = string.Empty; + using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8)) + { + json = await reader.ReadToEndAsync(); + } - } - } - } - htt.Add(zht); - } + json = HttpUtility.UrlDecode(json); + JObject ht = new JObject(); - } - if (query != 1) - { - ht.Add("[]", htt); - } - } - else if (key.EndsWith("[]")) - { - jb = JObject.Parse(item.Value.ToString()); - page = jb["page"] == null ? 0 : int.Parse(jb["page"].ToString()); - count = jb["count"] == null ? 0 : int.Parse(jb["count"].ToString()); - 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) - { - foreach (var d in selectTable.GetTableData(t.Key, page, count, t.Value.ToString(), null).Item1) - { - htt.Add(JToken.FromObject(d)); - } - } - ht.Add(key, htt); - } - else if (key.Equals("func")) - { - jb = JObject.Parse(item.Value.ToString()); - Type type = typeof(FuncList); - Object obj = Activator.CreateInstance(type); - var bb = new JObject(); - foreach (var f in jb) - { - var types = new List(); - var param = new List(); - foreach (var va in JArray.Parse(f.Value.ToString())) - { - types.Add(typeof(object)); - param.Add(va); - } - bb.Add(f.Key, JToken.FromObject(selectTable.ExecFunc(f.Key,param.ToArray(), types.ToArray()))); - } - ht.Add("func", bb); - } - else if (key.Equals("total@")) - { - ht.Add("total", total); - } - else - { - var template = selectTable.GetFirstData(key, item.Value.ToString(), ht); - if (template != null) - { - ht.Add(key, JToken.FromObject(template)); - } - } + JObject jobject = JObject.Parse(json); + ht.Add(table + "[]", jobject); + ht.Add("total@", ""); + bool hasTableKey = false; + foreach (var item in jobject) + { + if (item.Key.Equals(table, StringComparison.CurrentCultureIgnoreCase)) + { + hasTableKey = true; + break; } } - catch (Exception ex) + if (!hasTableKey) { - ht["code"] = "500"; - ht["msg"] = ex.Message; - + jobject.Add(table, new JObject()); } - return Ok(ht); + + JObject resultJobj = new SelectTable(_identitySvc, _tableMapper, db.Db).Query(ht); + return Ok(resultJobj); } /// /// 新增 @@ -178,14 +102,14 @@ public ActionResult Query([FromBody] JObject jobject) [HttpPost("/add")] public ActionResult Add([FromBody]JObject jobject) { - + JObject ht = new JObject(); ht.Add("code", "200"); ht.Add("msg", "success"); try { - - + + foreach (var item in jobject) { @@ -248,12 +172,12 @@ public ActionResult Edit([FromBody]JObject jobject) var dt = new Dictionary(); foreach (var f in value) { - if (f.Key.ToLower() != "id"&& selectTable.IsCol(key,f.Key) && (role.Update.Column.Contains ("*")||role.Update.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) + if (f.Key.ToLower() != "id" && selectTable.IsCol(key, f.Key) && (role.Update.Column.Contains("*") || role.Update.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) { dt.Add(f.Key, f.Value.ToString()); } } - db.Db.Updateable(dt).AS(key).Where("id=@id" ,new { id= value["id"].ToString() }).ExecuteCommand(); + db.Db.Updateable(dt).AS(key).Where("id=@id", new { id = value["id"].ToString() }).ExecuteCommand(); ht.Add(key, JToken.FromObject(new { code = 200, msg = "success", id = value["id"].ToString() })); } } @@ -285,13 +209,13 @@ public ActionResult Remove([FromBody]JObject jobject) var value = JObject.Parse(item.Value.ToString()); var sb = new System.Text.StringBuilder(100); sb.Append($"delete FROM {key} where "); - if (role.Delete==null||role.Delete.Table==null) + if (role.Delete == null || role.Delete.Table == null) { ht["code"] = "500"; ht["msg"] = "delete权限未配置"; break; } - if (!role.Delete.Table.Contains(key,StringComparer.CurrentCultureIgnoreCase)) + if (!role.Delete.Table.Contains(key, StringComparer.CurrentCultureIgnoreCase)) { ht["code"] = "500"; ht["msg"] = $"没权限删除{key}"; diff --git a/APIJSON.NET/APIJSON.NET/appsettings.json b/APIJSON.NET/APIJSON.NET/appsettings.json index 6e284d5..da52e61 100644 --- a/APIJSON.NET/APIJSON.NET/appsettings.json +++ b/APIJSON.NET/APIJSON.NET/appsettings.json @@ -1,7 +1,7 @@ { "ConnectionStrings": { - "DbType": 1, //0:MySql,1:SqlServer,2:Sqlite - "ConnectionString": "Server=LIAOZENGBO\\SQL2012; Database=Testdb; User Id=sa;Password=sa123;" + "DbType": 0, //0:MySql,1:SqlServer,2:Sqlite + "ConnectionString": "Server=192.168.2.25;Database=yunwei;Uid=root;Pwd=xmjk;Port=3306;Character Set=utf8;" //"ConnectionString": "Server=119.29.9.25;Port=3306;Database=test;Uid=root;Pwd=1q,2w.3e?;CharSet=UTF8;" }, "Authentication": { @@ -42,7 +42,7 @@ ], "tablempper": //������ӳ�� { - "user": "apijson_user" + "user": "apijson_user", + "org": "web_organization" } - } diff --git a/APIJSON.NET/APIJSON.NET/wwwroot/index.html b/APIJSON.NET/APIJSON.NET/wwwroot/index.html index 25b5f98..cc5fde7 100644 --- a/APIJSON.NET/APIJSON.NET/wwwroot/index.html +++ b/APIJSON.NET/APIJSON.NET/wwwroot/index.html @@ -31,11 +31,12 @@
diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj new file mode 100644 index 0000000..982e808 --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj @@ -0,0 +1,17 @@ + + + + netstandard2.0 + + + + + + + + + + + + + diff --git a/APIJSON.NET/APIJSON.NET/FuncList.cs b/APIJSON.NET/APIJSONCommon/FuncList.cs similarity index 100% rename from APIJSON.NET/APIJSON.NET/FuncList.cs rename to APIJSON.NET/APIJSONCommon/FuncList.cs diff --git a/APIJSON.NET/APIJSON.NET/Infrastructure/StringExtensions.cs b/APIJSON.NET/APIJSONCommon/Infrastructure/StringExtensions.cs similarity index 100% rename from APIJSON.NET/APIJSON.NET/Infrastructure/StringExtensions.cs rename to APIJSON.NET/APIJSONCommon/Infrastructure/StringExtensions.cs diff --git a/APIJSON.NET/APIJSON.NET/Models/DbOptions.cs b/APIJSON.NET/APIJSONCommon/Models/DbOptions.cs similarity index 100% rename from APIJSON.NET/APIJSON.NET/Models/DbOptions.cs rename to APIJSON.NET/APIJSONCommon/Models/DbOptions.cs diff --git a/APIJSON.NET/APIJSON.NET/Models/RoleItem.cs b/APIJSON.NET/APIJSONCommon/Models/RoleItem.cs similarity index 100% rename from APIJSON.NET/APIJSON.NET/Models/RoleItem.cs rename to APIJSON.NET/APIJSONCommon/Models/RoleItem.cs diff --git a/APIJSON.NET/APIJSON.NET/SelectTable.cs b/APIJSON.NET/APIJSONCommon/SelectTable.cs similarity index 63% rename from APIJSON.NET/APIJSON.NET/SelectTable.cs rename to APIJSON.NET/APIJSONCommon/SelectTable.cs index e438c02..eea719c 100644 --- a/APIJSON.NET/APIJSON.NET/SelectTable.cs +++ b/APIJSON.NET/APIJSONCommon/SelectTable.cs @@ -15,12 +15,13 @@ public class SelectTable { private readonly IIdentityService _identitySvc; private readonly ITableMapper _tableMapper; - private readonly DbContext db; - public SelectTable(IIdentityService identityService, ITableMapper tableMapper, DbContext _db) + private readonly SqlSugarClient db; + + public SelectTable(IIdentityService identityService, ITableMapper tableMapper, SqlSugarClient dbClient) { _identitySvc = identityService; _tableMapper = tableMapper; - db = _db; + db = dbClient; } /// /// 判断表名是否正确 @@ -29,7 +30,7 @@ public SelectTable(IIdentityService identityService, ITableMapper tableMapper, D /// public bool IsTable(string table) { - return db.Db.DbMaintenance.GetTableInfoList().Any(it => it.Name.Equals(table, StringComparison.CurrentCultureIgnoreCase)); + return db.DbMaintenance.GetTableInfoList().Any(it => it.Name.Equals(table, StringComparison.CurrentCultureIgnoreCase)); } /// /// 判断表的列名是否正确 @@ -39,7 +40,7 @@ public bool IsTable(string table) /// public bool IsCol(string table, string col) { - return db.Db.DbMaintenance.GetColumnInfosByTableName(table).Any(it => it.DbColumnName.Equals(col, StringComparison.CurrentCultureIgnoreCase)); + return db.DbMaintenance.GetColumnInfosByTableName(table).Any(it => it.DbColumnName.Equals(col, StringComparison.CurrentCultureIgnoreCase)); } /// /// 动态调用方法 @@ -107,7 +108,7 @@ public dynamic GetFirstData(string subtable, string json, JObject dd) string param = item.Value.ToString().Substring(item.Value.ToString().IndexOf("(") + 1).TrimEnd(')') ; var types = new List(); var paramss = new List(); - foreach (var va in param.Split(",")) + foreach (var va in param.Split(',')) { types.Add(typeof(object)); paramss.Add(tb.Where(it => it.Key.Equals(va)).Select(i => i.Value)); @@ -119,24 +120,215 @@ public dynamic GetFirstData(string subtable, string json, JObject dd) return tb; } + + /// + /// 解析并查询 + /// + /// + /// + public JObject Query(string queryJson) + { + JObject resultObj = new JObject(); + + try + { + JObject queryJobj = JObject.Parse(queryJson); + resultObj = Query(queryJobj); + } + catch (Exception ex) + { + resultObj.Add("code", "500"); + resultObj.Add("msg", ex.Message); + } + + return resultObj; + } + + /// + /// 解析并查询 + /// + /// + /// + public JObject Query(JObject queryObj) + { + JObject resultObj = new JObject(); + resultObj.Add("code", "200"); + resultObj.Add("msg", "success"); + try + { + int total = 0; + foreach (var item in queryObj) + { + string key = item.Key.Trim(); + + 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(key, JToken.FromObject(template)); + } + } + } + } + catch (Exception ex) + { + resultObj["code"] = "500"; + resultObj["msg"] = ex.Message; + } + return resultObj; + } + + //单表查询 + private int QuerySingleList(JObject resultObj, KeyValuePair 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 ? 1 : int.Parse(jb["count"].ToString()); + int query = jb["query"] == null ? 2 : 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, t.Value.ToString(), null); + if (query > 0) + { + total = datas.Item2; + } + foreach (var data in datas.Item1) + { + htt.Add(JToken.FromObject(data)); + } + } + resultObj.Add(key, htt); + return total; + } + + //多列表查询 + private int QueryMoreList(JObject resultObj, KeyValuePair 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 ? 0 : 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 tables = new List(), where = new List(); + foreach (var t in jb) + { + tables.Add(t.Key); where.Add(t.Value.ToString()); + } + if (tables.Count > 0) + { + string table = tables[0]; + var temp = GetTableData(table, page, count, where[0], null); + if (query > 0) + { + total = temp.Item2; + } + + foreach (var dd in temp.Item1) + { + var zht = new JObject(); + zht.Add(table, JToken.FromObject(dd)); + for (int i = 1; i < tables.Count; i++) + { + 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, 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); + } + + } + if (query != 1) + { + resultObj.Add("[]", htt); + } + + return total; + } + + private void ExecFunc(JObject resultObj, KeyValuePair item) + { + JObject jb = JObject.Parse(item.Value.ToString()); + Type type = typeof(FuncList); + + var dataJObj = new JObject(); + foreach (var f in jb) + { + var types = new List(); + var param = new List(); + foreach (var va in JArray.Parse(f.Value.ToString())) + { + types.Add(typeof(object)); + param.Add(va); + } + dataJObj.Add(f.Key, JToken.FromObject(ExecFunc(f.Key, param.ToArray(), types.ToArray()))); + } + resultObj.Add("func", dataJObj); + } + private ISugarQueryable sugarQueryable(string subtable, string selectrole, JObject values, JObject dd) { if (!IsTable(subtable)) { throw new Exception($"表名{subtable}不正确!"); } - var tb = db.Db.Queryable(subtable, "tb"); - - + var tb = db.Queryable(subtable, "tb"); + + if (values["@column"].IsValue()) { var str = new System.Text.StringBuilder(100); - foreach (var item in values["@column"].ToString().Split(",")) + foreach (var item in values["@column"].ToString().Split(',')) { - string[] ziduan = item.Split(":"); + string[] ziduan = item.Split(':'); if (ziduan.Length > 1) { - if (IsCol(subtable,ziduan[0]) &&_identitySvc.ColIsRole(ziduan[0], selectrole.Split(","))) + if (IsCol(subtable,ziduan[0]) &&_identitySvc.ColIsRole(ziduan[0], selectrole.Split(','))) { str.Append(ziduan[0] + " as " + ziduan[1] + ","); @@ -144,7 +336,7 @@ private ISugarQueryable sugarQueryable(string subtable, string se } else { - if (IsCol(subtable, item) && _identitySvc.ColIsRole(item, selectrole.Split(","))) + if (IsCol(subtable, item) && _identitySvc.ColIsRole(item, selectrole.Split(','))) { str.Append(item + ","); } @@ -218,7 +410,7 @@ private ISugarQueryable sugarQueryable(string subtable, string se } else if (vakey.EndsWith("@") && dd != null) // 关联上一个table { - string[] str = va.Value.ToString().Split("/"); + string[] str = va.Value.ToString().Split('/'); string value = string.Empty; if (str.Length == 3) { @@ -242,7 +434,7 @@ private ISugarQueryable sugarQueryable(string subtable, string se //排序 if (values["@order"].IsValue()) { - foreach (var item in values["@order"].ToString().Split(",")) + foreach (var item in values["@order"].ToString().Split(',')) { if (IsCol(subtable,item.Replace("-", ""))) { @@ -317,9 +509,9 @@ private ISugarQueryable sugarQueryable(string subtable, string se } hw.Add(model); } - - var d=db.Db.Context.Utilities.ConditionalModelToSql(hw); - tb.Having(d.Key,d.Value); + + var d = db.Context.Utilities.ConditionalModelToSql(hw); + tb.Having(d.Key, d.Value); } return tb; } diff --git a/APIJSON.NET/APIJSON.NET/Services/IIdentityService.cs b/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs similarity index 100% rename from APIJSON.NET/APIJSON.NET/Services/IIdentityService.cs rename to APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs diff --git a/APIJSON.NET/APIJSON.NET/Services/ITableMapper.cs b/APIJSON.NET/APIJSONCommon/Services/ITableMapper.cs similarity index 100% rename from APIJSON.NET/APIJSON.NET/Services/ITableMapper.cs rename to APIJSON.NET/APIJSONCommon/Services/ITableMapper.cs diff --git a/APIJSON.NET/APIJSON.NET/Services/TableMapper.cs b/APIJSON.NET/APIJSONCommon/Services/TableMapper.cs similarity index 92% rename from APIJSON.NET/APIJSON.NET/Services/TableMapper.cs rename to APIJSON.NET/APIJSONCommon/Services/TableMapper.cs index 51b6e60..d236cd5 100644 --- a/APIJSON.NET/APIJSON.NET/Services/TableMapper.cs +++ b/APIJSON.NET/APIJSONCommon/Services/TableMapper.cs @@ -18,7 +18,7 @@ public string GetTableName(string oldname) { if (_options.ContainsKey(oldname)) { - return _options.GetValueOrDefault(oldname); + return _options[oldname]; } return oldname; } From 2212822a6641db79b8f75cfe8143179dfeff58d1 Mon Sep 17 00:00:00 2001 From: haptear Date: Mon, 13 May 2019 10:44:28 +0800 Subject: [PATCH 10/31] =?UTF-8?q?1=EF=BC=9A=E5=A2=9E=E5=8A=A0=E5=AF=B9?= =?UTF-8?q?=E6=89=80=E6=9C=89=E8=A1=A8=E2=80=9C*=E2=80=9D=E7=9A=84?= =?UTF-8?q?=E6=94=AF=E6=8C=81=202=EF=BC=9A=E6=B7=BB=E5=8A=A0/{table}=20?= =?UTF-8?q?=E5=8D=95=E8=A1=A8=E6=9F=A5=E8=AF=A2=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs | 9 ++++----- APIJSON.NET/APIJSON.NET/Services/IdentityService.cs | 6 +++--- APIJSON.NET/APIJSON.NET/wwwroot/index.html | 10 +++++----- APIJSON.NET/APIJSONCommon/SelectTable.cs | 6 +++--- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs index 3d775ac..1fd8d2e 100644 --- a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs +++ b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs @@ -28,12 +28,12 @@ public class JsonController : ControllerBase private readonly IIdentityService _identitySvc; private ITableMapper _tableMapper; - public JsonController(SelectTable _selectTable, DbContext _db, IIdentityService identityService, ITableMapper tableMapper) + public JsonController(IIdentityService identityService, ITableMapper tableMapper, DbContext _db) { - selectTable = _selectTable; db = _db; _tableMapper = tableMapper; _identitySvc = identityService; + selectTable = new SelectTable(_identitySvc, _tableMapper, _db.Db); } /// @@ -55,7 +55,7 @@ public ActionResult Test() /// [HttpPost("/get")] - public ActionResult Query([FromBody] JObject jobject) + public async Task Query([FromBody] JObject jobject) { JObject resultJobj = new SelectTable(_identitySvc, _tableMapper, db.Db).Query(jobject); return Ok(resultJobj); @@ -91,8 +91,7 @@ public async Task QueryByTable([FromRoute]string table) jobject.Add(table, new JObject()); } - JObject resultJobj = new SelectTable(_identitySvc, _tableMapper, db.Db).Query(ht); - return Ok(resultJobj); + return await Query(ht); } /// /// 新增 diff --git a/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs b/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs index ea2f65d..dce67b4 100644 --- a/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs +++ b/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs @@ -15,7 +15,7 @@ public class IdentityService : IIdentityService private IHttpContextAccessor _context; private List roles; - public IdentityService(IHttpContextAccessor context,IOptions> _roles) + public IdentityService(IHttpContextAccessor context, IOptions> _roles) { _context = context ?? throw new ArgumentNullException(nameof(context)); roles = _roles.Value; @@ -24,7 +24,7 @@ public string GetUserIdentity() { return _context.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier); } - + public string GetUserRoleName() { return _context.HttpContext.User.FindFirstValue(ClaimTypes.Role); @@ -50,7 +50,7 @@ public Role GetRole() { return (false, $"appsettings.json权限配置不正确!"); } - string tablerole = role.Select.Table.FirstOrDefault(it => it.Equals(table, StringComparison.CurrentCultureIgnoreCase)); + string tablerole = role.Select.Table.FirstOrDefault(it => it == "*" || it.Equals(table, StringComparison.CurrentCultureIgnoreCase)); if (string.IsNullOrEmpty(tablerole)) { diff --git a/APIJSON.NET/APIJSON.NET/wwwroot/index.html b/APIJSON.NET/APIJSON.NET/wwwroot/index.html index cc5fde7..4c8f534 100644 --- a/APIJSON.NET/APIJSON.NET/wwwroot/index.html +++ b/APIJSON.NET/APIJSON.NET/wwwroot/index.html @@ -31,11 +31,11 @@
diff --git a/APIJSON.NET/APIJSONCommon/SelectTable.cs b/APIJSON.NET/APIJSONCommon/SelectTable.cs index eea719c..502e687 100644 --- a/APIJSON.NET/APIJSONCommon/SelectTable.cs +++ b/APIJSON.NET/APIJSONCommon/SelectTable.cs @@ -201,8 +201,8 @@ private int QuerySingleList(JObject resultObj, KeyValuePair 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 ? 1 : int.Parse(jb["count"].ToString()); - int query = jb["query"] == null ? 2 : int.Parse(jb["query"].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"); @@ -230,7 +230,7 @@ private int QueryMoreList(JObject resultObj, KeyValuePair item) var jb = JObject.Parse(item.Value.ToString()); var page = jb["page"] == null ? 0 : int.Parse(jb["page"].ToString()); - var count = jb["count"] == null ? 0 : int.Parse(jb["count"].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(); From 4528b52834c169294d51b32f380688af4b7f2dbb Mon Sep 17 00:00:00 2001 From: haptear Date: Fri, 24 May 2019 17:59:05 +0800 Subject: [PATCH 11/31] =?UTF-8?q?1=EF=BC=9A=E5=A2=9E=E5=8A=A0FrameWork461?= =?UTF-8?q?=E7=9A=84=E8=A7=A3=E5=86=B3=E6=96=B9=E6=A1=88=202=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8D=95=E8=A1=A8=E6=9F=A5=E8=AF=A2=EF=BC=8C?= =?UTF-8?q?=E5=8D=95=E8=A1=A8=E6=9F=A5=E8=AF=A2=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=94=BE=E5=9B=9E=E5=88=97=E5=9B=BA=E5=AE=9A=E4=B8=BAInfos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../APIJSONCommon/ApiJson.Common.csproj | 2 + .../APIJSONCommon/ApiJson.Common_461.csproj | 97 +++++++++++++ .../APIJSONCommon/ApiJson.Common_461.sln | 25 ++++ APIJSON.NET/APIJSONCommon/FuncList.cs | 20 +++ .../Infrastructure/StringExtensions.cs | 6 + APIJSON.NET/APIJSONCommon/Models/DbOptions.cs | 7 + APIJSON.NET/APIJSONCommon/SelectTable.cs | 130 ++++++++++++++---- .../Services/IIdentityService.cs | 3 +- 8 files changed, 262 insertions(+), 28 deletions(-) create mode 100644 APIJSON.NET/APIJSONCommon/ApiJson.Common_461.csproj create mode 100644 APIJSON.NET/APIJSONCommon/ApiJson.Common_461.sln diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj index 982e808..66d75af 100644 --- a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj +++ b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj @@ -2,6 +2,8 @@ netstandard2.0 + 0.0.1 + 通用查询组件 diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.csproj b/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.csproj new file mode 100644 index 0000000..ef2a11b --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.csproj @@ -0,0 +1,97 @@ + + + + + Debug + AnyCPU + {DC07586E-7241-4BB5-9200-CE57A81C5E27} + Library + Properties + APIJSON.NET + ApiJson.Common + v4.6.1 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + packages\AspectCore.Extensions.Reflection.1.2.0\lib\net45\AspectCore.Extensions.Reflection.dll + + + + packages\Microsoft.Extensions.DependencyInjection.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + + packages\Microsoft.Extensions.Options.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Options.dll + + + packages\Microsoft.Extensions.Primitives.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll + + + packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll + + + packages\sqlSugar.4.9.9.10\lib\SqlSugar.dll + + + + packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll + + + packages\System.ComponentModel.Annotations.4.5.0\lib\net461\System.ComponentModel.Annotations.dll + + + + + packages\System.Memory.4.5.1\lib\netstandard2.0\System.Memory.dll + + + + packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll + + + packages\System.Runtime.CompilerServices.Unsafe.4.5.1\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.sln b/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.sln new file mode 100644 index 0000000..551c233 --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28803.202 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApiJson.Common_461", "ApiJson.Common_461.csproj", "{DC07586E-7241-4BB5-9200-CE57A81C5E27}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DC07586E-7241-4BB5-9200-CE57A81C5E27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC07586E-7241-4BB5-9200-CE57A81C5E27}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC07586E-7241-4BB5-9200-CE57A81C5E27}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC07586E-7241-4BB5-9200-CE57A81C5E27}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {53F36702-3FD9-4AF5-A4C3-E3C30C943492} + EndGlobalSection +EndGlobal diff --git a/APIJSON.NET/APIJSONCommon/FuncList.cs b/APIJSON.NET/APIJSONCommon/FuncList.cs index 59d5a45..a92f653 100644 --- a/APIJSON.NET/APIJSONCommon/FuncList.cs +++ b/APIJSON.NET/APIJSONCommon/FuncList.cs @@ -8,14 +8,34 @@ namespace APIJSON.NET ///
public class FuncList { + /// + /// + /// + /// + /// + /// public string Merge(object a, object b) { return a.ToString() + b.ToString(); } + + /// + /// + /// + /// + /// + /// public object MergeObj(object a, object b) { return new { a, b }; } + + /// + /// + /// + /// + /// + /// public bool isContain(object a, object b) { return a.ToString().Split(',').Contains(b); diff --git a/APIJSON.NET/APIJSONCommon/Infrastructure/StringExtensions.cs b/APIJSON.NET/APIJSONCommon/Infrastructure/StringExtensions.cs index ee7d149..e806081 100644 --- a/APIJSON.NET/APIJSONCommon/Infrastructure/StringExtensions.cs +++ b/APIJSON.NET/APIJSONCommon/Infrastructure/StringExtensions.cs @@ -14,6 +14,12 @@ public static bool IsValue(this object str) { return str != null && !string.IsNullOrEmpty(str.ToString()); } + + /// + /// + /// + /// + /// public static string GetParamName(this string param) { return param + new Random().Next(1, 100); diff --git a/APIJSON.NET/APIJSONCommon/Models/DbOptions.cs b/APIJSON.NET/APIJSONCommon/Models/DbOptions.cs index 0fe7840..8d4c3a3 100644 --- a/APIJSON.NET/APIJSONCommon/Models/DbOptions.cs +++ b/APIJSON.NET/APIJSONCommon/Models/DbOptions.cs @@ -3,7 +3,14 @@ using SqlSugar; public class DbOptions { + /// + /// + /// public DbType DbType { get; set; } + + /// + /// + /// public string ConnectionString { get; set; } } } diff --git a/APIJSON.NET/APIJSONCommon/SelectTable.cs b/APIJSON.NET/APIJSONCommon/SelectTable.cs index 502e687..1994b14 100644 --- a/APIJSON.NET/APIJSONCommon/SelectTable.cs +++ b/APIJSON.NET/APIJSONCommon/SelectTable.cs @@ -1,22 +1,29 @@ namespace APIJSON.NET { using APIJSON.NET.Services; - using Microsoft.Extensions.Options; + using AspectCore.Extensions.Reflection; using Newtonsoft.Json.Linq; using SqlSugar; using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; - using AspectCore.Extensions.Reflection; - using System.Text.RegularExpressions; + /// + /// + /// public class SelectTable { private readonly IIdentityService _identitySvc; private readonly ITableMapper _tableMapper; private readonly SqlSugarClient db; + /// + /// + /// + /// + /// + /// public SelectTable(IIdentityService identityService, ITableMapper tableMapper, SqlSugarClient dbClient) { _identitySvc = identityService; @@ -49,18 +56,27 @@ public bool IsCol(string table, string col) /// /// /// - public object ExecFunc(string funcname,object[] param, Type[] types) + 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; } - public (dynamic,int) GetTableData(string subtable, int page, int count, string json, JObject dd) - { - + /// + /// + /// + /// + /// + /// + /// + /// + /// + public Tuple GetTableData(string subtable, int page, int count, string json, JObject dd) + { + var role = _identitySvc.GetSelectRole(subtable); if (!role.Item1)//没有权限返回异常 { @@ -68,7 +84,7 @@ public object ExecFunc(string funcname,object[] param, Type[] types) } 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()); @@ -78,16 +94,24 @@ public object ExecFunc(string funcname,object[] param, Type[] types) if (count > 0) { int total = 0; - return (tb.ToPageList(page, count,ref total),total); + return new Tuple(tb.ToPageList(page, count, ref total), total); } else { - return (tb.ToList(),tb.Count()); + return new Tuple(tb.ToList(), tb.Count()); } } - public dynamic GetFirstData(string subtable, string json, JObject dd) + + /// + /// + /// + /// + /// + /// + /// + public dynamic GetFirstData(string subtable, string json, JObject dd) { - + var role = _identitySvc.GetSelectRole(subtable); if (!role.Item1)//没有权限返回异常 { @@ -105,7 +129,7 @@ public dynamic GetFirstData(string subtable, string json, JObject dd) 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(')') ; + string param = item.Value.ToString().Substring(item.Value.ToString().IndexOf("(") + 1).TrimEnd(')'); var types = new List(); var paramss = new List(); foreach (var va in param.Split(',')) @@ -113,12 +137,12 @@ public dynamic GetFirstData(string subtable, string json, JObject dd) 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()); + dic[item.Name] = ExecFunc(func, paramss.ToArray(), types.ToArray()); } } - + return tb; - + } /// @@ -144,6 +168,45 @@ public JObject Query(string queryJson) return resultObj; } + /// + /// 单表查询 + /// + /// + /// + public JObject QuerySingle(JObject queryObj) + { + JObject resultObj = new JObject(); + resultObj.Add("code", "200"); + resultObj.Add("msg", "success"); + try + { + int total = 0; + foreach (var item in queryObj) + { + string key = item.Key.Trim(); + + if (key.EndsWith("[]")) + { + total = QuerySingleList(resultObj, item,"Infos"); + } + else if (key.Equals("func")) + { + ExecFunc(resultObj, item); + } + else if (key.Equals("total@")) + { + resultObj.Add("total", total); + } + } + } + catch (Exception ex) + { + resultObj["code"] = "500"; + resultObj["msg"] = ex.Message; + } + return resultObj; + } + /// /// 解析并查询 /// @@ -195,14 +258,14 @@ public JObject Query(JObject queryObj) return resultObj; } - //单表查询 - private int QuerySingleList(JObject resultObj, KeyValuePair item) + //单表查询,返回的数据在指定的NodeName节点 + private int QuerySingleList(JObject resultObj, KeyValuePair 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 query = jb["query"] == null ? 1 : int.Parse(jb["query"].ToString()); int total = 0; jb.Remove("page"); jb.Remove("count"); jb.Remove("query"); @@ -219,10 +282,23 @@ private int QuerySingleList(JObject resultObj, KeyValuePair item htt.Add(JToken.FromObject(data)); } } - resultObj.Add(key, htt); + + if (!string.IsNullOrEmpty(nodeName)) + { + resultObj.Add(nodeName, htt); + } + else + resultObj.Add(key, htt); return total; } + //单表查询 + private int QuerySingleList(JObject resultObj, KeyValuePair item) + { + string key = item.Key.Trim(); + return QuerySingleList(resultObj, item, key); + } + //多列表查询 private int QueryMoreList(JObject resultObj, KeyValuePair item) { @@ -328,7 +404,7 @@ private ISugarQueryable sugarQueryable(string subtable, string se string[] ziduan = item.Split(':'); if (ziduan.Length > 1) { - if (IsCol(subtable,ziduan[0]) &&_identitySvc.ColIsRole(ziduan[0], selectrole.Split(','))) + if (IsCol(subtable, ziduan[0]) && _identitySvc.ColIsRole(ziduan[0], selectrole.Split(','))) { str.Append(ziduan[0] + " as " + ziduan[1] + ","); @@ -352,7 +428,7 @@ private ISugarQueryable sugarQueryable(string subtable, string se { tb.Select(selectrole); } - + List conModels = new List(); if (values["identity"].IsValue()) { @@ -363,7 +439,7 @@ private ISugarQueryable sugarQueryable(string subtable, string se string vakey = va.Key.Trim(); if (vakey.EndsWith("$"))//模糊查询 { - if (IsCol(subtable,vakey.TrimEnd('$'))) + if (IsCol(subtable, vakey.TrimEnd('$'))) { conModels.Add(new ConditionalModel() { FieldName = vakey.TrimEnd('$'), ConditionalType = ConditionalType.Like, FieldValue = va.Value.ToString() }); } @@ -424,7 +500,7 @@ private ISugarQueryable sugarQueryable(string subtable, string se conModels.Add(new ConditionalModel() { FieldName = vakey.TrimEnd('@'), ConditionalType = ConditionalType.Equal, FieldValue = value }); } - else if (IsCol(subtable,vakey)) //其他where条件 + else if (IsCol(subtable, vakey)) //其他where条件 { conModels.Add(new ConditionalModel() { FieldName = vakey, ConditionalType = ConditionalType.Equal, FieldValue = va.Value.ToString() }); } @@ -436,7 +512,7 @@ private ISugarQueryable sugarQueryable(string subtable, string se { foreach (var item in values["@order"].ToString().Split(',')) { - if (IsCol(subtable,item.Replace("-", ""))) + if (IsCol(subtable, item.Replace("-", ""))) { if (item.EndsWith("-")) { @@ -478,7 +554,7 @@ private ISugarQueryable sugarQueryable(string subtable, string se } else if (and.Contains("<=")) { - + model.FieldName = and.Split(new string[] { "<=" }, StringSplitOptions.RemoveEmptyEntries)[0]; model.ConditionalType = ConditionalType.LessThanOrEqual; model.FieldValue = and.Split(new string[] { "<=" }, StringSplitOptions.RemoveEmptyEntries)[1]; diff --git a/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs b/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs index d34d26e..d911702 100644 --- a/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs +++ b/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs @@ -1,4 +1,5 @@ using APIJSON.NET.Models; +using System; namespace APIJSON.NET.Services { @@ -24,7 +25,7 @@ public interface IIdentityService /// /// /// - (bool, string) GetSelectRole(string table); + Tuple GetSelectRole(string table); bool ColIsRole(string col, string[] selectrole); From 075d6f104cee21a339f903852b8fcd0e92b7fc91 Mon Sep 17 00:00:00 2001 From: haptear Date: Sun, 26 May 2019 20:18:49 +0800 Subject: [PATCH 12/31] =?UTF-8?q?1.=20=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=202.=20=E5=AE=8C=E6=88=90=E6=94=AF=E6=8C=81=20&=20=E6=A8=A1?= =?UTF-8?q?=E7=B3=8A=E6=9F=A5=E8=AF=A2=20=20%=20=E8=8C=83=E5=9B=B4?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=BD=A0=20query=20=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=20group=20=E6=AD=A3=E5=BA=8F=20=E5=80=92?= =?UTF-8?q?=E5=BA=8F=20having=203.=20@column=E5=9C=A8=E5=88=86=E7=BB=84?= =?UTF-8?q?=E6=97=B6=E5=AF=B9=E8=AE=A1=E7=AE=97=E5=87=BD=E6=95=B0=E7=9A=84?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20sum=20max=20min=20count=E7=AD=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../APIJSONCommon/ApiJson.Common_461.sln | 6 + .../APIJSONCommon/Properties/AssemblyInfo.cs | 36 ++ APIJSON.NET/APIJSONCommon/SelectTable.cs | 367 +++++++++++++----- APIJSON.NET/APIJSONCommon/app.config | 11 + APIJSON.NET/APIJSONCommon/packages.config | 17 + 5 files changed, 330 insertions(+), 107 deletions(-) create mode 100644 APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs create mode 100644 APIJSON.NET/APIJSONCommon/app.config create mode 100644 APIJSON.NET/APIJSONCommon/packages.config diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.sln b/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.sln index 551c233..9689606 100644 --- a/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.sln +++ b/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 16.0.28803.202 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApiJson.Common_461", "ApiJson.Common_461.csproj", "{DC07586E-7241-4BB5-9200-CE57A81C5E27}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APIJSON.NET.Test", "..\APIJSON.NET.Test\APIJSON.NET.Test.csproj", "{3F99B6A8-3A58-4714-A0FF-186BE2874A68}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,6 +17,10 @@ Global {DC07586E-7241-4BB5-9200-CE57A81C5E27}.Debug|Any CPU.Build.0 = Debug|Any CPU {DC07586E-7241-4BB5-9200-CE57A81C5E27}.Release|Any CPU.ActiveCfg = Release|Any CPU {DC07586E-7241-4BB5-9200-CE57A81C5E27}.Release|Any CPU.Build.0 = Release|Any CPU + {3F99B6A8-3A58-4714-A0FF-186BE2874A68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3F99B6A8-3A58-4714-A0FF-186BE2874A68}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F99B6A8-3A58-4714-A0FF-186BE2874A68}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3F99B6A8-3A58-4714-A0FF-186BE2874A68}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs b/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b890e44 --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("ApiJson.Common")] +[assembly: AssemblyDescription("单表查询的返回节点指定为Infos")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ApiJson.Common")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("dc07586e-7241-4bb5-9200-ce57a81c5e27")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("0.0.4.0")] +[assembly: AssemblyFileVersion("0.0.4.0")] diff --git a/APIJSON.NET/APIJSONCommon/SelectTable.cs b/APIJSON.NET/APIJSONCommon/SelectTable.cs index 1994b14..4e76118 100644 --- a/APIJSON.NET/APIJSONCommon/SelectTable.cs +++ b/APIJSON.NET/APIJSONCommon/SelectTable.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; using System.Dynamic; using System.Linq; + using System.Text.RegularExpressions; /// /// @@ -74,7 +75,7 @@ public object ExecFunc(string funcname, object[] param, Type[] types) /// /// /// - public Tuple GetTableData(string subtable, int page, int count, string json, JObject dd) + public Tuple GetTableData(string subtable, int page, int count, int query, string json, JObject dd) { var role = _identitySvc.GetSelectRole(subtable); @@ -88,17 +89,31 @@ public Tuple GetTableData(string subtable, int page, int count, st 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 (count > 0) - { - int total = 0; - return new Tuple(tb.ToPageList(page, count, ref total), total); - } + if (query == 1)//1-总数 + return new Tuple(new List(), tb.Count()); else { - return new Tuple(tb.ToList(), tb.Count()); + if (count > 0) + { + int total = 0; + if (query == 0)//0-对象 + return new Tuple(tb.ToPageList(page, count), total); + else + //2-以上全部 + return new Tuple(tb.ToPageList(page, count, ref total), total); + + } + else + { + if (query == 0) + return new Tuple(tb.ToList(), 0); + else + return new Tuple(tb.ToList(), tb.Count()); + } } } @@ -187,7 +202,7 @@ public JObject QuerySingle(JObject queryObj) if (key.EndsWith("[]")) { - total = QuerySingleList(resultObj, item,"Infos"); + total = QuerySingleList(resultObj, item, "Infos"); } else if (key.Equals("func")) { @@ -265,14 +280,14 @@ private int QuerySingleList(JObject resultObj, KeyValuePair item 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 ? 1 : int.Parse(jb["query"].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, t.Value.ToString(), null); + var datas = GetTableData(t.Key, page, count, query, t.Value.ToString(), null); if (query > 0) { total = datas.Item2; @@ -318,7 +333,7 @@ private int QueryMoreList(JObject resultObj, KeyValuePair item) if (tables.Count > 0) { string table = tables[0]; - var temp = GetTableData(table, page, count, where[0], null); + var temp = GetTableData(table, page, count, query, where[0], null); if (query > 0) { total = temp.Item2; @@ -339,7 +354,7 @@ private int QueryMoreList(JObject resultObj, KeyValuePair item) count = jbb["count"] == null ? 0 : int.Parse(jbb["count"].ToString()); var lt = new JArray(); - foreach (var d in GetTableData(subtable, page, count, jbb[subtable].ToString(), zht).Item1) + foreach (var d in GetTableData(subtable, page, count, query, jbb[subtable].ToString(), zht).Item1) { lt.Add(JToken.FromObject(d)); } @@ -398,31 +413,7 @@ private ISugarQueryable sugarQueryable(string subtable, string se if (values["@column"].IsValue()) { - var str = new System.Text.StringBuilder(100); - foreach (var item in values["@column"].ToString().Split(',')) - { - string[] ziduan = item.Split(':'); - if (ziduan.Length > 1) - { - if (IsCol(subtable, ziduan[0]) && _identitySvc.ColIsRole(ziduan[0], selectrole.Split(','))) - { - - str.Append(ziduan[0] + " as " + ziduan[1] + ","); - } - } - else - { - if (IsCol(subtable, item) && _identitySvc.ColIsRole(item, selectrole.Split(','))) - { - str.Append(item + ","); - } - } - } - if (string.IsNullOrEmpty(str.ToString())) - { - throw new Exception($"表名{subtable}没有可查询的字段!"); - } - tb.Select(str.ToString().TrimEnd(',')); + ProcessColumn(subtable, selectrole, values, tb); } else { @@ -437,56 +428,23 @@ private ISugarQueryable sugarQueryable(string subtable, string se foreach (var va in values) { string vakey = va.Key.Trim(); + string fieldValue = va.Value.ToString(); + if (vakey.EndsWith("$"))//模糊查询 { - if (IsCol(subtable, vakey.TrimEnd('$'))) - { - conModels.Add(new ConditionalModel() { FieldName = vakey.TrimEnd('$'), ConditionalType = ConditionalType.Like, FieldValue = va.Value.ToString() }); - } + FuzzyQuery(subtable, conModels, va); } else if (vakey.EndsWith("{}"))//逻辑运算 { - string field = vakey.TrimEnd("{}".ToCharArray()); - if (va.Value.HasValues) - { - conModels.Add(new ConditionalModel() { FieldName = field, ConditionalType = field.EndsWith("!") ? ConditionalType.NotIn : ConditionalType.In, FieldValue = va.Value.ToString() }); - } - else - { - var ddt = new List>(); - foreach (var and in va.Value.ToString().Split(',')) - { - var model = new ConditionalModel(); - model.FieldName = field; - if (and.StartsWith(">=")) - { - 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((field.EndsWith("&") ? WhereType.And : WhereType.Or), model)); - } - conModels.Add(new ConditionalCollections() { ConditionalList = ddt }); - } + ConditionQuery(subtable, conModels, va); + } + else if (vakey.EndsWith("%"))//bwtween查询 + { + ConditionBetween(subtable, conModels, va); } else if (vakey.EndsWith("@") && dd != null) // 关联上一个table { - string[] str = va.Value.ToString().Split('/'); + string[] str = fieldValue.Split('/'); string value = string.Empty; if (str.Length == 3) { @@ -502,47 +460,71 @@ private ISugarQueryable sugarQueryable(string subtable, string se } else if (IsCol(subtable, vakey)) //其他where条件 { - conModels.Add(new ConditionalModel() { FieldName = vakey, ConditionalType = ConditionalType.Equal, FieldValue = va.Value.ToString() }); + conModels.Add(new ConditionalModel() { FieldName = vakey, ConditionalType = ConditionalType.Equal, FieldValue = fieldValue }); } } tb.Where(conModels); //排序 - if (values["@order"].IsValue()) + ProcessOrder(subtable, values, tb); + + //分组 + PrccessGroup(subtable, values, tb); + + //Having + ProcessHaving(values, tb); + return tb; + } + + //处理字段重命名 "@column":"toId:parentId",对应SQL是toId AS parentId,将查询的字段toId变为parentId返回 + private void ProcessColumn(string subtable, string selectrole, JObject values, ISugarQueryable tb) + { + var str = new System.Text.StringBuilder(100); + foreach (var item in values["@column"].ToString().Split(',')) { - foreach (var item in values["@order"].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, item.Replace("-", ""))) - { - if (item.EndsWith("-")) - { - tb.OrderBy($"{item.Replace("-", " desc")}"); - } - else - { - tb.OrderBy($"{item.ToString()}"); - } - } + colName = ma.Groups[1].Value; } - } - if (values["@group"].IsValue()) - { - var str = new System.Text.StringBuilder(100); - foreach (var and in values["@group"].ToString().Split(',')) + //判断列表是否有权限 sum(1),sum(*),Count(1)这样的值直接有效 + if (colName == "*" || int.TryParse(colName, out int colNumber) || (IsCol(subtable, colName) && _identitySvc.ColIsRole(colName, selectrole.Split(',')))) { - if (IsCol(subtable, and)) - { - str.Append(and + ","); - } + if (ziduan.Length > 1) + str.Append(ziduan[0] + " as " + ziduan[1] + ","); + else + str.Append(ziduan[0] + ","); + } - tb.GroupBy(str.ToString().TrimEnd(',')); } + if (string.IsNullOrEmpty(str.ToString())) + { + throw new Exception($"表名{subtable}没有可查询的字段!"); + } + tb.Select(str.ToString().TrimEnd(',')); + } + + // "@having":"function0(...)?value0;function1(...)?value1;function2(...)?value2...", + // SQL函数条件,一般和 @group一起用,函数一般在 @column里声明 + private void ProcessHaving(JObject values, ISugarQueryable tb) + { if (values["@having"].IsValue()) { List hw = new List(); - JArray jArray = JArray.Parse(values["@having"].ToString()); - foreach (var item in jArray) + List havingItems = new List(); + if (values["@having"].HasValues) + { + havingItems = values["@having"].Select(p => p.ToString()).ToList(); + } + else + { + havingItems.Add(values["@having"].ToString()); + } + foreach (var item in havingItems) { string and = item.ToString(); var model = new ConditionalModel(); @@ -587,9 +569,180 @@ private ISugarQueryable sugarQueryable(string subtable, string se } var d = db.Context.Utilities.ConditionalModelToSql(hw); - tb.Having(d.Key, d.Value); + //tb.Having(d.Key, d.Value); + tb.Having(string.Join(",", havingItems)); + } + } + + //"@group":"column0,column1...",分组方式。如果 @column里声明了Table的id,则id也必须在 @group中声明;其它情况下必须满足至少一个条件: + //1.分组的key在 @column里声明 + //2.Table主键在 @group中声明 + private void PrccessGroup(string subtable, JObject values, ISugarQueryable tb) + { + if (values["@group"].IsValue()) + { + 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(',')); + } + } + + //处理排序 "@order":"name-,id"查询按 name降序、id默认顺序 排序的User数组 + private void ProcessOrder(string subtable, JObject values, ISugarQueryable tb) + { + if (values["@order"].IsValue()) + { + foreach (var item in values["@order"].ToString().Split(',')) + { + 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}"); + } + } + } + } + } + + //条件查询 "key{}":"条件0,条件1...",条件为任意SQL比较表达式字符串,非Number类型必须用''包含条件的值,如'a' + //&, |, ! 逻辑运算符,对应数据库 SQL 中的 AND, OR, NOT。 + // 横或纵与:同一字段的值内条件默认 | 或连接,不同字段的条件默认 & 与连接。 + // ① & 可用于"key&{}":"条件"等 + // ② | 可用于"key|{}":"条件", "key|{}":[] 等,一般可省略 + // ③ ! 可单独使用,如"key!":Object,也可像&,|一样配合其他功能符使用 + private void ConditionQuery(string subtable, List conModels, KeyValuePair va) + { + string vakey = va.Key.Trim(); + string field = vakey.TrimEnd("{}".ToCharArray()); + if (va.Value.HasValues) + { + List inValues = new List(); + 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) }); + + } + else + { + var ddt = new List>(); + foreach (var and in va.Value.ToString().Split(',')) + { + 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("<=")) + { + + 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((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 conModels, KeyValuePair va) + { + string vakey = va.Key.Trim(); + string field = vakey.TrimEnd("%".ToCharArray()); + List inValues = new List(); + + if (va.Value.HasValues) + { + foreach (var cm in va.Value) + { + inValues.Add(cm.ToString()); + } + } + 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>(); + + var leftCondition = new ConditionalModel() + { + FieldName = field, + ConditionalType = ConditionalType.GreaterThanOrEqual, + FieldValue = fileds[0] + }; + ddt.Add(new KeyValuePair(i == 0 ? WhereType.And : WhereType.Or, leftCondition)); + var rightCondition = new ConditionalModel() + { + FieldName = field, + ConditionalType = ConditionalType.LessThanOrEqual, + FieldValue = fileds[1] + }; + ddt.Add(new KeyValuePair(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 conModels, KeyValuePair 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()) }); } - return tb; } } } diff --git a/APIJSON.NET/APIJSONCommon/app.config b/APIJSON.NET/APIJSONCommon/app.config new file mode 100644 index 0000000..2bbe771 --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/app.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/APIJSON.NET/APIJSONCommon/packages.config b/APIJSON.NET/APIJSONCommon/packages.config new file mode 100644 index 0000000..deca899 --- /dev/null +++ b/APIJSON.NET/APIJSONCommon/packages.config @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file From 0275e34067b7bcfe8b50c70706402f7cf152e67a Mon Sep 17 00:00:00 2001 From: haptear Date: Thu, 30 May 2019 17:09:36 +0800 Subject: [PATCH 13/31] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ToSql=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E5=A4=84=E7=90=86@column=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E5=88=97=E5=90=8D=E6=97=B6=E7=9A=84sql=E6=B3=A8=E5=85=A5?= =?UTF-8?q?=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../APIJSONCommon/Properties/AssemblyInfo.cs | 6 +- APIJSON.NET/APIJSONCommon/SelectTable.cs | 98 ++++++++++++++++++- 2 files changed, 98 insertions(+), 6 deletions(-) diff --git a/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs b/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs index b890e44..12c27cf 100644 --- a/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs +++ b/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs @@ -6,7 +6,7 @@ // 控制。更改这些特性值可修改 // 与程序集关联的信息。 [assembly: AssemblyTitle("ApiJson.Common")] -[assembly: AssemblyDescription("单表查询的返回节点指定为Infos")] +[assembly: AssemblyDescription("增加ToSql接口,处理sql注入的情况")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ApiJson.Common")] @@ -32,5 +32,5 @@ //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 //通过使用 "*",如下所示: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.0.4.0")] -[assembly: AssemblyFileVersion("0.0.4.0")] +[assembly: AssemblyVersion("0.0.6.0")] +[assembly: AssemblyFileVersion("0.0.6.0")] diff --git a/APIJSON.NET/APIJSONCommon/SelectTable.cs b/APIJSON.NET/APIJSONCommon/SelectTable.cs index 4e76118..de56221 100644 --- a/APIJSON.NET/APIJSONCommon/SelectTable.cs +++ b/APIJSON.NET/APIJSONCommon/SelectTable.cs @@ -66,6 +66,19 @@ public object ExecFunc(string funcname, object[] param, Type[] types) 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; + } /// /// /// @@ -187,8 +200,9 @@ public JObject Query(string queryJson) /// 单表查询 /// /// + /// 返回数据的节点名称 默认为 infos /// - public JObject QuerySingle(JObject queryObj) + public JObject QuerySingle(JObject queryObj, string nodeName = "infos") { JObject resultObj = new JObject(); resultObj.Add("code", "200"); @@ -202,7 +216,7 @@ public JObject QuerySingle(JObject queryObj) if (key.EndsWith("[]")) { - total = QuerySingleList(resultObj, item, "Infos"); + total = QuerySingleList(resultObj, item, nodeName); } else if (key.Equals("func")) { @@ -222,6 +236,25 @@ public JObject QuerySingle(JObject queryObj) return resultObj; } + /// + /// 获取查询语句 + /// + /// + /// + public string ToSql(JObject queryObj) + { + foreach (var item in queryObj) + { + string key = item.Key.Trim(); + + if (key.EndsWith("[]")) + { + return ToSql(item); + } + } + return string.Empty; + } + /// /// 解析并查询 /// @@ -284,6 +317,7 @@ private int QuerySingleList(JObject resultObj, KeyValuePair item int total = 0; jb.Remove("page"); jb.Remove("count"); jb.Remove("query"); + var htt = new JArray(); foreach (var t in jb) { @@ -307,6 +341,23 @@ private int QuerySingleList(JObject resultObj, KeyValuePair item return total; } + private string ToSql(KeyValuePair 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()); + } + + return string.Empty; + } //单表查询 private int QuerySingleList(JObject resultObj, KeyValuePair item) { @@ -495,7 +546,13 @@ private void ProcessColumn(string subtable, string selectrole, JObject values, I if (colName == "*" || int.TryParse(colName, out int colNumber) || (IsCol(subtable, colName) && _identitySvc.ColIsRole(colName, selectrole.Split(',')))) { if (ziduan.Length > 1) - str.Append(ziduan[0] + " as " + ziduan[1] + ","); + { + if (ziduan[1].Length > 20) + { + throw new Exception("别名不能超过20个字符"); + } + str.Append(ziduan[0] + " as " + ReplaceSQLChar(ziduan[1]) + ","); + } else str.Append(ziduan[0] + ","); @@ -744,5 +801,40 @@ private void FuzzyQuery(string subtable, List conModels, KeyV 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; + } } } From dab0e09bd36cde1c237b6c304fe735b211a5a9ee Mon Sep 17 00:00:00 2001 From: haptear Date: Thu, 18 Jul 2019 18:20:31 +0800 Subject: [PATCH 14/31] =?UTF-8?q?sqlSugarCore=E5=8D=87=E7=BA=A7=E5=88=B05.?= =?UTF-8?q?0.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj | 14 +++++++++++--- APIJSON.NET/APIJSONCommon/SelectTable.cs | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj index 66d75af..95a2c55 100644 --- a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj +++ b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj @@ -2,18 +2,26 @@ netstandard2.0 - 0.0.1 - 通用查询组件 + 0.0.6 + 0.0.6 增加ToSql接口,处理sql注入的情况 +通用查询组件 + ApiJson.Common.Core + true + - + + + + + diff --git a/APIJSON.NET/APIJSONCommon/SelectTable.cs b/APIJSON.NET/APIJSONCommon/SelectTable.cs index de56221..42c5014 100644 --- a/APIJSON.NET/APIJSONCommon/SelectTable.cs +++ b/APIJSON.NET/APIJSONCommon/SelectTable.cs @@ -625,7 +625,7 @@ private void ProcessHaving(JObject values, ISugarQueryable tb) hw.Add(model); } - var d = db.Context.Utilities.ConditionalModelToSql(hw); + //var d = db.Context.Utilities.ConditionalModelToSql(hw); //tb.Having(d.Key, d.Value); tb.Having(string.Join(",", havingItems)); } From 5a3f25c2e56d5419d22eaef29f8fd16a8de061ee Mon Sep 17 00:00:00 2001 From: lzb <635990945@qq.com> Date: Mon, 22 Jul 2019 11:08:23 +0800 Subject: [PATCH 15/31] =?UTF-8?q?#=E4=BF=AE=E5=A4=8D=E7=94=9F=E6=88=90?= =?UTF-8?q?=E9=94=99=E8=AF=AF#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj | 2 +- APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj | 3 ++- APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs | 1 - APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj index 634243e..d4d0dd7 100644 --- a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj +++ b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj @@ -20,7 +20,7 @@ - + diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj index 66d75af..e89cd9f 100644 --- a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj +++ b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj @@ -1,9 +1,10 @@ - + netstandard2.0 0.0.1 通用查询组件 + false diff --git a/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs b/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs index 12c27cf..fbcdc6a 100644 --- a/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs +++ b/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // 有关程序集的一般信息由以下 diff --git a/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs b/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs index d911702..db6c8ce 100644 --- a/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs +++ b/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs @@ -25,7 +25,7 @@ public interface IIdentityService /// /// /// - Tuple GetSelectRole(string table); + (bool, string) GetSelectRole(string table); bool ColIsRole(string col, string[] selectrole); From cf41a26c6d0fea7ae753a24a19e05a64e750e626 Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Sun, 1 Sep 2019 16:36:23 +0800 Subject: [PATCH 16/31] Update README.md --- README.md | 79 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 8bb8849..081c094 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # APIJSON.NET 这是 APIJSON 的 C# .NET CORE 版后端实现。 +

APIJSON

@@ -14,11 +15,12 @@

- +   -     + +

@@ -29,7 +31,7 @@ English  通用文档 视频教程 - 在线工具 + 在线工具

@@ -39,7 +41,7 @@ --- -APIJSON是一种为API而生的JSON网络传输协议。
+APIJSON是一种专为API而生的 JSON网络传输协议 以及 基于这套协议实现的ORM库。
为 简单的增删改查、复杂的查询、简单的事务操作 提供了完全自动化的API。
能大幅降低开发和沟通成本,简化开发流程,缩短开发周期。
适合中小型前后端分离的项目,尤其是互联网创业项目和企业自用项目。
@@ -57,10 +59,10 @@ APIJSON是一种为API而生的JSON网络传输协议。
#### 在线解析 * 自动生成接口文档,清晰可读永远最新 -* 自动生成请求代码,支持Android和iOS -* 自动生成JavaBean文件,一键下载 +* 自动校验与格式化,支持高亮和收展 +* 自动生成各种语言代码,一键下载 * 自动管理与测试接口用例,一键共享 -* 自动校验与格式化JSON,支持高亮和收展 +* 自动给请求JSON加注释,一键切换 #### 对于前端 * 不用再向后端催接口、求文档 @@ -108,10 +110,17 @@ APIJSON是一种为API而生的JSON网络传输协议。

### 为什么要用APIJSON? -[前后端10大痛点解析](https://github.com/TommyLemon/APIJSON/wiki) +[前后端 关于接口的 沟通、文档、联调 等 10 大痛点解析](https://github.com/TommyLemon/APIJSON/wiki) ### 快速上手 -https://github.com/liaozb/APIJSON.NET/tree/master/APIJSON.NET + +#### 1.后端部署 +可以跳过这个步骤,直接用APIJSON服务器IP地址 apijson.cn:8080 来测试接口。
+见  [APIJSON后端部署 - Java](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-Java-Server)
+ +#### 2.前端部署 +可以跳过这个步骤,直接使用 [APIAuto-自动化接口管理工具](https://github.com/TommyLemon/APIAuto) 或 下载客户端App。
+见  [Android](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-Android)  或  [iOS](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-iOS)  或  [JavaScript](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-JavaScript)
### 下载客户端App @@ -121,6 +130,22 @@ https://github.com/liaozb/APIJSON.NET/tree/master/APIJSON.NET 测试及自动生成代码工具
[APIJSONTest.apk](http://files.cnblogs.com/files/tommylemon/APIJSONTest.apk) +### 使用登记 +

+ + + + + + + + + +
+
+ +[您在使用APIJSON吗?](https://github.com/TommyLemon/APIJSON/issues/73) + ### 技术交流 如果有什么问题或建议可以 [提ISSUE](https://github.com/liaozb/APIJSON.NET/issues) 或 [加群](https://github.com/TommyLemon/APIJSON#%E6%8A%80%E6%9C%AF%E4%BA%A4%E6%B5%81),交流技术,分享经验。
@@ -129,12 +154,17 @@ https://github.com/liaozb/APIJSON.NET/tree/master/APIJSON.NET ### 贡献者们
+ +
+ +
感谢大家的贡献。 + ### 相关推荐 [APIJSON, 让接口和文档见鬼去吧!](https://my.oschina.net/tommylemon/blog/805459) @@ -146,16 +176,40 @@ https://github.com/liaozb/APIJSON.NET/tree/master/APIJSON.NET [3步创建APIJSON后端新表及配置](https://my.oschina.net/tommylemon/blog/889074) +[APIJSON 自动化接口和文档的快速开发神器 (一)](https://blog.csdn.net/qq_41829492/article/details/88670940) -### 其它项目 -[APIJSON](https://github.com/TommyLemon/APIJSON) 码云最有价值项目:后端接口和文档自动化,前端(客户端) 定制返回JSON的数据和结构 +### 生态项目 +[APIAuto](https://github.com/TommyLemon/APIAuto) 自动化接口管理工具,自动生成文档与注释、自动生成代码、自动化回归测试、自动静态检查等 -[APIJSONAuto](https://github.com/TommyLemon/APIJSONAuto) 自动化接口管理工具,自动生成文档与注释、自动生成代码、自动化回归测试、自动静态检查等 +[apijson-doc](https://github.com/vincentCheng/apijson-doc) APIJSON 官方文档,提供排版清晰、搜索方便的文档内容展示,包括设计规范、图文教程等 + +[apijson.org](https://github.com/APIJSON/apijson.org) APIJSON 官方网站,提供 APIJSON 的 功能简介、登记用户、作者与贡献者、相关链接 等 + +[APIJSON](https://github.com/APIJSON/APIJSON) Java 版 APIJSON ,支持 MySQL, PostgreSQL, Oracle, TiDB + +[apijson-php](https://github.com/qq547057827/apijson-php) PHP 版 APIJSON,基于 ThinkPHP,支持 MySQL, PostgreSQL, MS SQL Server, Oracle 等 + +[apijson](https://github.com/TEsTsLA/apijson) Node.ts 版 APIJSON,支持 MySQL, PostgreSQL, MS SQL Server, Oracle, SQLite, MariaDB, WebSQL + +[uliweb-apijson](https://github.com/zhangchunlin/uliweb-apijson) Python 版 APIJSON,支持 MySQL, PostgreSQL, MS SQL Server, Oracle, SQLite 等 + +[APIJSON](https://github.com/crazytaxi824/APIJSON) Go 版 APIJSON,功能开发中... + +[APIJSONKOTLIN](https://github.com/luckyxiaomo/APIJSONKOTLIN) Kotlin 版 APIJSON,基础框架搭建中... + +[APIJSONParser](https://github.com/Zerounary/APIJSONParser) 第三方 APIJSON 解析器,将 JSON 动态解析成 SQL + +[ApiJsonByJFinal](https://gitee.com/zhiyuexin/ApiJsonByJFinal) 整合 APIJSON 和 JFinal 的 Demo + +[SpringServer1.2-APIJSON](https://github.com/Airforce-1/SpringServer1.2-APIJSON) 智慧党建服务器端,提供 上传 和 下载 文件的接口 + +[AbsGrade](https://github.com/APIJSON/AbsGrade) 抽象列表分级工具,支持微信朋友圈单层评论、QQ空间双层评论、百度网盘多层(无限层)文件夹等 [APIJSON-Android-RxJava](https://github.com/TommyLemon/APIJSON-Android-RxJava) 仿微信朋友圈动态实战项目,ZBLibrary(UI) + APIJSON(HTTP) + RxJava(Data) [Android-ZBLibrary](https://github.com/TommyLemon/Android-ZBLibrary) Android MVP快速开发框架,Demo全面,注释详细,使用简单,代码严谨 + 感谢热心的作者们的贡献,点 ⭐Star 支持下他们吧。 ### 持续更新 @@ -166,3 +220,4 @@ https://gitee.com/liaozb/APIJSON.NET ### 我要赞赏 如果你喜欢 APIJSON.NET,感觉它帮助到了你,可以点右上角 ⭐Star 支持一下,谢谢 ^_^ + From bf06526f4623ddfa1d41e1b6f910f83357f8927d Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Sun, 1 Sep 2019 16:37:51 +0800 Subject: [PATCH 17/31] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 081c094..1e6eab5 100644 --- a/README.md +++ b/README.md @@ -154,11 +154,9 @@ APIJSON是一种专为API而生的 JSON网络传输协议 以及 基于这套协 ### 贡献者们
- -
+ -
From 0c27ac85ce0c0753a847a1b644897f301e152568 Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Sun, 1 Sep 2019 16:39:11 +0800 Subject: [PATCH 18/31] Update README.md --- README.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/README.md b/README.md index 1e6eab5..f69859e 100644 --- a/README.md +++ b/README.md @@ -113,14 +113,7 @@ APIJSON是一种专为API而生的 JSON网络传输协议 以及 基于这套协 [前后端 关于接口的 沟通、文档、联调 等 10 大痛点解析](https://github.com/TommyLemon/APIJSON/wiki) ### 快速上手 - -#### 1.后端部署 -可以跳过这个步骤,直接用APIJSON服务器IP地址 apijson.cn:8080 来测试接口。
-见  [APIJSON后端部署 - Java](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-Java-Server)
- -#### 2.前端部署 -可以跳过这个步骤,直接使用 [APIAuto-自动化接口管理工具](https://github.com/TommyLemon/APIAuto) 或 下载客户端App。
-见  [Android](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-Android)  或  [iOS](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-iOS)  或  [JavaScript](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-JavaScript)
+https://github.com/liaozb/APIJSON.NET/tree/master/APIJSON.NET ### 下载客户端App From 56ef8e6ba58a613e984af2b108e86ebdca0c0781 Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Sun, 1 Sep 2019 16:40:10 +0800 Subject: [PATCH 19/31] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f69859e..e55807b 100644 --- a/README.md +++ b/README.md @@ -147,7 +147,7 @@ https://github.com/liaozb/APIJSON.NET/tree/master/APIJSON.NET ### 贡献者们
- + From f64c5bca0a4f9ed7e05cfe3fd56afd0247aa3fdf Mon Sep 17 00:00:00 2001 From: haptear Date: Tue, 3 Dec 2019 10:14:23 +0800 Subject: [PATCH 20/31] =?UTF-8?q?0.0.8=20=E6=B8=85=E7=90=86SelectTable=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=87=8D=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSON.NET.Test/Program.cs | 1 + .../APIJSON.NET/Controllers/JsonController.cs | 33 ++- .../APIJSON.NET/Services/IdentityService.cs | 44 ++- .../APIJSONCommon/ApiJson.Common.csproj | 5 +- .../APIJSONCommon/Properties/AssemblyInfo.cs | 6 +- APIJSON.NET/APIJSONCommon/SelectTable.cs | 263 ++++++++---------- 6 files changed, 197 insertions(+), 155 deletions(-) diff --git a/APIJSON.NET/APIJSON.NET.Test/Program.cs b/APIJSON.NET/APIJSON.NET.Test/Program.cs index b23ebdc..8258537 100644 --- a/APIJSON.NET/APIJSON.NET.Test/Program.cs +++ b/APIJSON.NET/APIJSON.NET.Test/Program.cs @@ -1,5 +1,6 @@ using RestSharp; using System; +using System.Text.RegularExpressions; namespace APIJSON.NET.Test { diff --git a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs index 1fd8d2e..16dd406 100644 --- a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs +++ b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs @@ -57,7 +57,8 @@ public ActionResult Test() public async Task Query([FromBody] JObject jobject) { - JObject resultJobj = new SelectTable(_identitySvc, _tableMapper, db.Db).Query(jobject); + var st = new SelectTable(_identitySvc, _tableMapper, db.Db); + JObject resultJobj = st.Query(jobject); return Ok(resultJobj); } @@ -75,9 +76,25 @@ public async Task QueryByTable([FromRoute]string table) JObject jobject = JObject.Parse(json); ht.Add(table + "[]", jobject); - ht.Add("total@", ""); + + if (jobject["query"] != null && jobject["query"].ToString() != "0" && jobject["total@"] == null) + { + //自动添加总计数量 + ht.Add("total@", ""); + } + + //每页最大1000条数据 + if (jobject["count"] != null && int.Parse(jobject["count"].ToString()) > 1000) + { + throw new Exception("count分页数量最大不能超过1000"); + } + + bool isDebug = (jobject["@debug"] != null && jobject["@debug"].ToString() != "0"); + jobject.Remove("@debug"); bool hasTableKey = false; + List ignoreConditions = new List { "page", "count", "query" }; + JObject tableConditions = new JObject();//表的其它查询条件,比如过滤,字段等 foreach (var item in jobject) { if (item.Key.Equals(table, StringComparison.CurrentCultureIgnoreCase)) @@ -85,10 +102,20 @@ public async Task QueryByTable([FromRoute]string table) hasTableKey = true; break; } + if (!ignoreConditions.Contains(item.Key.ToLower())) + { + tableConditions.Add(item.Key, item.Value); + } + } + + foreach (var removeKey in tableConditions) + { + jobject.Remove(removeKey.Key); } + if (!hasTableKey) { - jobject.Add(table, new JObject()); + jobject.Add(table, tableConditions); } return await Query(ht); diff --git a/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs b/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs index dce67b4..b017ab0 100644 --- a/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs +++ b/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs @@ -10,25 +10,47 @@ namespace APIJSON.NET.Services { + /// + /// + /// public class IdentityService : IIdentityService { private IHttpContextAccessor _context; private List roles; + /// + /// + /// + /// + /// public IdentityService(IHttpContextAccessor context, IOptions> _roles) { _context = context ?? throw new ArgumentNullException(nameof(context)); roles = _roles.Value; } + + /// + /// + /// + /// public string GetUserIdentity() { return _context.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier); } + /// + /// + /// + /// public string GetUserRoleName() { return _context.HttpContext.User.FindFirstValue(ClaimTypes.Role); } + + /// + /// + /// + /// public Role GetRole() { var role = new Role(); @@ -43,23 +65,37 @@ public Role GetRole() } return role; } - public (bool, string) GetSelectRole(string table) + + /// + /// + /// + /// + /// + public Tuple GetSelectRole(string table) { var role = GetRole(); if (role == null || role.Select == null || role.Select.Table == null) { - return (false, $"appsettings.json权限配置不正确!"); + return Tuple.Create(false, $"appsettings.json权限配置不正确!"); } string tablerole = role.Select.Table.FirstOrDefault(it => it == "*" || it.Equals(table, StringComparison.CurrentCultureIgnoreCase)); if (string.IsNullOrEmpty(tablerole)) { - return (false, $"表名{table}没权限查询!"); + return Tuple.Create(false, $"表名{table}没权限查询!"); } int index = Array.IndexOf(role.Select.Table, tablerole); string selectrole = role.Select.Column[index]; - return (true, selectrole); + return Tuple.Create(true, selectrole); } + + + /// + /// + /// + /// + /// + /// public bool ColIsRole(string col, string[] selectrole) { if (selectrole.Contains("*")) diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj index 5148960..653a203 100644 --- a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj +++ b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj @@ -2,8 +2,9 @@ netstandard2.0 - 0.0.7 - 0.0.7 修复not in的缺陷,增加~ 不等于的支持 + 0.0.8 + 0.0.8 清理SelectTable 支持重载 +0.0.7 修复not in的缺陷,增加~ 不等于的支持 0.0.6 增加ToSql接口,处理sql注入的情况 通用查询组件 ApiJson.Common.Core diff --git a/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs b/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs index fbcdc6a..c60d3fa 100644 --- a/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs +++ b/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs @@ -5,7 +5,7 @@ // 控制。更改这些特性值可修改 // 与程序集关联的信息。 [assembly: AssemblyTitle("ApiJson.Common")] -[assembly: AssemblyDescription("增加ToSql接口,处理sql注入的情况")] +[assembly: AssemblyDescription("修复not in的缺陷,增加~ 不等于的支持")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ApiJson.Common")] @@ -31,5 +31,5 @@ //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 //通过使用 "*",如下所示: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.0.6.0")] -[assembly: AssemblyFileVersion("0.0.6.0")] +[assembly: AssemblyVersion("0.0.7.0")] +[assembly: AssemblyFileVersion("0.0.7.0")] diff --git a/APIJSON.NET/APIJSONCommon/SelectTable.cs b/APIJSON.NET/APIJSONCommon/SelectTable.cs index 89109a5..44e7fb3 100644 --- a/APIJSON.NET/APIJSONCommon/SelectTable.cs +++ b/APIJSON.NET/APIJSONCommon/SelectTable.cs @@ -36,7 +36,7 @@ public SelectTable(IIdentityService identityService, ITableMapper tableMapper, S /// /// /// - public bool IsTable(string table) + public virtual bool IsTable(string table) { return db.DbMaintenance.GetTableInfoList().Any(it => it.Name.Equals(table, StringComparison.CurrentCultureIgnoreCase)); } @@ -46,39 +46,11 @@ public bool IsTable(string table) /// /// /// - public bool IsCol(string table, string col) + public virtual bool IsCol(string table, string col) { return db.DbMaintenance.GetColumnInfosByTableName(table).Any(it => it.DbColumnName.Equals(col, StringComparison.CurrentCultureIgnoreCase)); } - /// - /// 动态调用方法 - /// - /// - /// - /// - /// - 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; - } /// /// /// @@ -88,7 +60,7 @@ private string ToSql(string subtable, int page, int count, int query, string jso /// /// /// - public Tuple GetTableData(string subtable, int page, int count, int query, string json, JObject dd) + public virtual Tuple GetTableData(string subtable, int page, int count, int query, string json, JObject dd) { var role = _identitySvc.GetSelectRole(subtable); @@ -130,69 +102,17 @@ public Tuple GetTableData(string subtable, int page, int count, in } } - /// - /// - /// - /// - /// - /// - /// - public dynamic GetFirstData(string subtable, 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); - values.Remove("page"); - values.Remove("count"); - var tb = sugarQueryable(subtable, selectrole, values, dd).First(); - var dic = (IDictionary)tb; - foreach (var item in values.Properties().Where(it => it.Name.EndsWith("()"))) - { - 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(); - var paramss = new List(); - 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()); - } - } - - return tb; - - } - /// /// 解析并查询 /// /// /// - public JObject Query(string queryJson) + public virtual JObject Query(string queryJson) { JObject resultObj = new JObject(); - try - { - JObject queryJobj = JObject.Parse(queryJson); - resultObj = Query(queryJobj); - } - catch (Exception ex) - { - resultObj.Add("code", "500"); - resultObj.Add("msg", ex.Message); - } - + JObject queryJobj = JObject.Parse(queryJson); + resultObj = Query(queryJobj); return resultObj; } @@ -202,37 +122,31 @@ public JObject Query(string queryJson) /// /// 返回数据的节点名称 默认为 infos /// - public JObject QuerySingle(JObject queryObj, string nodeName = "infos") + public virtual 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) { - 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@")) - { - resultObj.Add("total", total); - } + 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) - { - resultObj["code"] = "500"; - resultObj["msg"] = ex.Message; - } + return resultObj; } @@ -241,7 +155,7 @@ public JObject QuerySingle(JObject queryObj, string nodeName = "infos") /// /// /// - public string ToSql(JObject queryObj) + public virtual string ToSql(JObject queryObj) { foreach (var item in queryObj) { @@ -260,50 +174,108 @@ public string ToSql(JObject queryObj) /// /// /// - public JObject Query(JObject queryObj) + public virtual JObject Query(JObject queryObj) { 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.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 + 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) { - var template = GetFirstData(key, item.Value.ToString(), resultObj); - if (template != null) - { - resultObj.Add(key, JToken.FromObject(template)); - } + resultObj.Add(key, JToken.FromObject(template)); } } } - catch (Exception ex) + + return resultObj; + } + + + + //动态调用方法 + private object ExecFunc(string funcname, object[] param, Type[] types) + { + var method = typeof(FuncList).GetMethod(funcname); + + var reflector = method.GetReflector(); + var result = reflector.Invoke(new FuncList(), param); + return result; + } + + //生成sql + 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 sqlObj = tb.Skip((page - 1) * count).Take(10).ToSql(); + return sqlObj.Key; + } + + // + private dynamic GetFirstData(string subtable, string json, JObject job) + { + + var role = _identitySvc.GetSelectRole(subtable); + if (!role.Item1)//没有权限返回异常 { - resultObj["code"] = "500"; - resultObj["msg"] = ex.Message; + throw new Exception(role.Item2); } - return resultObj; + 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, job).First(); + var dic = (IDictionary)tb; + foreach (var item in values.Properties().Where(it => it.Name.EndsWith("()"))) + { + 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(); + var paramss = new List(); + 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()); + } + } + + return tb; + } //单表查询,返回的数据在指定的NodeName节点 @@ -341,6 +313,7 @@ private int QuerySingleList(JObject resultObj, KeyValuePair item return total; } + //生成sql private string ToSql(KeyValuePair item) { string key = item.Key.Trim(); @@ -358,6 +331,7 @@ private string ToSql(KeyValuePair item) return string.Empty; } + //单表查询 private int QuerySingleList(JObject resultObj, KeyValuePair item) { @@ -433,6 +407,7 @@ private int QueryMoreList(JObject resultObj, KeyValuePair item) return total; } + //执行方法 private void ExecFunc(JObject resultObj, KeyValuePair item) { JObject jb = JObject.Parse(item.Value.ToString()); @@ -453,6 +428,7 @@ private void ExecFunc(JObject resultObj, KeyValuePair item) resultObj.Add("func", dataJObj); } + // private ISugarQueryable sugarQueryable(string subtable, string selectrole, JObject values, JObject dd) { if (!IsTable(subtable)) @@ -811,7 +787,8 @@ private void FuzzyQuery(string subtable, List conModels, KeyV } } - public string ReplaceSQLChar(string str) + //处理sql注入 + private string ReplaceSQLChar(string str) { if (str == String.Empty) return String.Empty; From ef21335c4b7aea1decfeabe0bcafcea714a7c4dc Mon Sep 17 00:00:00 2001 From: liaozb <635990945@qq.com> Date: Mon, 8 Jun 2020 10:27:28 +0800 Subject: [PATCH 21/31] =?UTF-8?q?#=E5=8D=87=E7=BA=A7=E5=88=B0.netcore3.1#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj | 17 +++++++---------- APIJSON.NET/APIJSON.NET/Startup.cs | 19 +++++++++---------- .../APIJSONCommon/ApiJson.Common.csproj | 6 +++--- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj index d4d0dd7..ca433bf 100644 --- a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj +++ b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj @@ -1,7 +1,7 @@  - netcoreapp2.2 + netcoreapp3.1 @@ -19,18 +19,15 @@ - - - + - - - - - - + + + + + diff --git a/APIJSON.NET/APIJSON.NET/Startup.cs b/APIJSON.NET/APIJSON.NET/Startup.cs index 15d9b6c..4a0cfb6 100644 --- a/APIJSON.NET/APIJSON.NET/Startup.cs +++ b/APIJSON.NET/APIJSON.NET/Startup.cs @@ -12,6 +12,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; + using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.Swagger; public class Startup @@ -46,10 +47,10 @@ public void ConfigureServices(IServiceCollection services) .AllowAnyHeader() .AllowAnyMethod().AllowCredentials() )); - services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); + services.AddControllers(); services.AddSwaggerGen(c => { - c.SwaggerDoc("v1", new Info { Title = "APIJSON.NET", Version = "v1" }); + c.SwaggerDoc("v1", new OpenApiInfo { Title = "APIJSON.NET", Version = "v1" }); }); services.AddSingleton(); services.AddSingleton(); @@ -61,17 +62,12 @@ public void ConfigureServices(IServiceCollection services) } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IHostingEnvironment env) + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseAuthentication(); - app.UseMvc(routes => - { - routes.MapRoute( - name: "default", - template: "{controller=Home}/{action=Index}/{id?}"); - }); + app.UseRouting(); app.UseStaticFiles(); app.UseCors(_defaultCorsPolicyName); app.UseSwagger(); @@ -80,7 +76,10 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); }); - + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); app.UseJwtTokenMiddleware(); DbInit.Initialize(app); } diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj index e89cd9f..cc2d355 100644 --- a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj +++ b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj @@ -12,9 +12,9 @@ - - - + + + From 20851c5f2688a63583e949253438592087291de4 Mon Sep 17 00:00:00 2001 From: liaozb <635990945@qq.com> Date: Tue, 30 Jun 2020 18:00:50 +0800 Subject: [PATCH 22/31] =?UTF-8?q?#=E4=BF=AE=E5=A4=8D=E9=94=99=E8=AF=AF#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSONCommon/SelectTable.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/APIJSON.NET/APIJSONCommon/SelectTable.cs b/APIJSON.NET/APIJSONCommon/SelectTable.cs index de56221..a2c402c 100644 --- a/APIJSON.NET/APIJSONCommon/SelectTable.cs +++ b/APIJSON.NET/APIJSONCommon/SelectTable.cs @@ -624,9 +624,8 @@ private void ProcessHaving(JObject values, ISugarQueryable tb) } hw.Add(model); } - - var d = db.Context.Utilities.ConditionalModelToSql(hw); - //tb.Having(d.Key, d.Value); + + tb.Having(string.Join(",", havingItems)); } } From 42db8616a1affb2f2413693c02d6e84dd65b1e7c Mon Sep 17 00:00:00 2001 From: haptear Date: Thu, 23 Jul 2020 18:13:38 +0800 Subject: [PATCH 23/31] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=88=AB=E5=90=8D?= =?UTF-8?q?=E5=A6=82=E6=9E=9C=E4=B8=BA=E5=85=B3=E9=94=AE=E5=AD=97=E7=9A=84?= =?UTF-8?q?=E7=BC=BA=E9=99=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSON.NET/appsettings.json | 6 +++--- APIJSON.NET/APIJSON.NET/wwwroot/index.html | 2 +- APIJSON.NET/APIJSON.NET/wwwroot/js/main.js | 3 +-- APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj | 5 +++-- APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs | 6 +++--- APIJSON.NET/APIJSONCommon/SelectTable.cs | 9 ++++++--- 6 files changed, 17 insertions(+), 14 deletions(-) diff --git a/APIJSON.NET/APIJSON.NET/appsettings.json b/APIJSON.NET/APIJSON.NET/appsettings.json index da52e61..3701d48 100644 --- a/APIJSON.NET/APIJSON.NET/appsettings.json +++ b/APIJSON.NET/APIJSON.NET/appsettings.json @@ -1,7 +1,7 @@ { "ConnectionStrings": { "DbType": 0, //0:MySql,1:SqlServer,2:Sqlite - "ConnectionString": "Server=192.168.2.25;Database=yunwei;Uid=root;Pwd=xmjk;Port=3306;Character Set=utf8;" + "ConnectionString": "Server=192.168.2.25;Database=yunwei1.8;Uid=root;Pwd=xmjk;Port=3306;Character Set=utf8;" //"ConnectionString": "Server=119.29.9.25;Port=3306;Database=test;Uid=root;Pwd=1q,2w.3e?;CharSet=UTF8;" }, "Authentication": { @@ -16,8 +16,8 @@ { "name": "role1", //Ȩ������ Ψһ "select": { //��ѯȨ�� - "table": [ "moment", "User", "Comment" ], //�ɲ����ı� - "column": [ "*", "*", "*" ], //�ɲ������ֶ� + "table": [ "*" ], //�ɲ����ı� + "column": [ "*" ], //�ɲ������ֶ� "where": [] }, "update": { //�޸�Ȩ�� diff --git a/APIJSON.NET/APIJSON.NET/wwwroot/index.html b/APIJSON.NET/APIJSON.NET/wwwroot/index.html index 4c8f534..13572c2 100644 --- a/APIJSON.NET/APIJSON.NET/wwwroot/index.html +++ b/APIJSON.NET/APIJSON.NET/wwwroot/index.html @@ -35,7 +35,7 @@ - + diff --git a/APIJSON.NET/APIJSON.NET/wwwroot/js/main.js b/APIJSON.NET/APIJSON.NET/wwwroot/js/main.js index 7f32e28..6642f77 100644 --- a/APIJSON.NET/APIJSON.NET/wwwroot/js/main.js +++ b/APIJSON.NET/APIJSON.NET/wwwroot/js/main.js @@ -142,12 +142,11 @@ }, methods: { hpost: function () { - $.ajax({ url: $('#rest-url').val(), type: "POST", dataType: "json", contentType: "application/json;charset=utf-8", - data: $('#vInput').val(), + data: $('#vInput').val(),//JSON.stringify($('#vInput').val()), success: function (data) { App.jsonhtml = data; diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj index 653a203..6458b59 100644 --- a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj +++ b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj @@ -2,8 +2,9 @@ netstandard2.0 - 0.0.8 - 0.0.8 清理SelectTable 支持重载 + 0.0.10 + 0.0.10 处理别名如果为关键字的缺陷 +0.0.8 清理SelectTable 支持重载 0.0.7 修复not in的缺陷,增加~ 不等于的支持 0.0.6 增加ToSql接口,处理sql注入的情况 通用查询组件 diff --git a/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs b/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs index c60d3fa..7b4ef0d 100644 --- a/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs +++ b/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs @@ -5,7 +5,7 @@ // 控制。更改这些特性值可修改 // 与程序集关联的信息。 [assembly: AssemblyTitle("ApiJson.Common")] -[assembly: AssemblyDescription("修复not in的缺陷,增加~ 不等于的支持")] +[assembly: AssemblyDescription("0.0.19 处理别名如果为关键字的缺陷")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ApiJson.Common")] @@ -31,5 +31,5 @@ //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 //通过使用 "*",如下所示: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.0.7.0")] -[assembly: AssemblyFileVersion("0.0.7.0")] +[assembly: AssemblyVersion("0.0.10.0")] +[assembly: AssemblyFileVersion("0.0.10.0")] diff --git a/APIJSON.NET/APIJSONCommon/SelectTable.cs b/APIJSON.NET/APIJSONCommon/SelectTable.cs index 44e7fb3..c786308 100644 --- a/APIJSON.NET/APIJSONCommon/SelectTable.cs +++ b/APIJSON.NET/APIJSONCommon/SelectTable.cs @@ -456,7 +456,10 @@ private ISugarQueryable sugarQueryable(string subtable, string se { string vakey = va.Key.Trim(); string fieldValue = va.Value.ToString(); - + if (vakey.StartsWith("@")) + { + continue; + } if (vakey.EndsWith("$"))//模糊查询 { FuzzyQuery(subtable, conModels, va); @@ -531,10 +534,10 @@ private void ProcessColumn(string subtable, string selectrole, JObject values, I { throw new Exception("别名不能超过20个字符"); } - str.Append(ziduan[0] + " as " + ReplaceSQLChar(ziduan[1]) + ","); + str.Append(ziduan[0] + " as `" + ReplaceSQLChar(ziduan[1]) + "`,"); } else - str.Append(ziduan[0] + ","); + str.Append("`" + ziduan[0] + "`" + ","); } } From d58966117f3765d766cec0a1123943f7d213ccde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E4=BF=8A=E7=B9=81?= Date: Tue, 10 Nov 2020 10:23:41 +0800 Subject: [PATCH 24/31] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=A4=9A=E4=BD=99nuget?= =?UTF-8?q?=E5=8C=85=EF=BC=8C=E6=B7=BB=E5=8A=A0=E8=B7=A8=E5=9F=9F=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=8C=96=EF=BC=8C=E9=85=8D=E7=BD=AEJSON.NET=E4=BF=AE?= =?UTF-8?q?=E5=A4=8DJObject=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj | 16 +++++++--------- APIJSON.NET/APIJSON.NET/Startup.cs | 10 ++++++++-- APIJSON.NET/APIJSON.NET/appsettings.json | 1 + 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj index ca433bf..1a23f95 100644 --- a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj +++ b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj @@ -19,15 +19,13 @@ - - - - - - - - - + + + + + + + diff --git a/APIJSON.NET/APIJSON.NET/Startup.cs b/APIJSON.NET/APIJSON.NET/Startup.cs index 4a0cfb6..756a23c 100644 --- a/APIJSON.NET/APIJSON.NET/Startup.cs +++ b/APIJSON.NET/APIJSON.NET/Startup.cs @@ -41,13 +41,19 @@ public void ConfigureServices(IServiceCollection services) }); AuthConfigurer.Configure(services, Configuration); + var origins = Configuration.GetSection("CorsUrls").Value.Split(","); services.AddCors( options => options.AddPolicy( _defaultCorsPolicyName, builder => - builder.AllowAnyOrigin() + builder.WithOrigins(origins) .AllowAnyHeader() .AllowAnyMethod().AllowCredentials() )); - services.AddControllers(); + 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" }); diff --git a/APIJSON.NET/APIJSON.NET/appsettings.json b/APIJSON.NET/APIJSON.NET/appsettings.json index da52e61..610c96b 100644 --- a/APIJSON.NET/APIJSON.NET/appsettings.json +++ b/APIJSON.NET/APIJSON.NET/appsettings.json @@ -4,6 +4,7 @@ "ConnectionString": "Server=192.168.2.25;Database=yunwei;Uid=root;Pwd=xmjk;Port=3306;Character Set=utf8;" //"ConnectionString": "Server=119.29.9.25;Port=3306;Database=test;Uid=root;Pwd=1q,2w.3e?;CharSet=UTF8;" }, + "CorsUrls": "http://localhost:5000,http://localhost5001", "Authentication": { "JwtBearer": { "IsEnabled": "true", From f4c72db97eddb71b8ecb9ab15d8b27d96885aa43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Aug 2021 14:50:21 +0000 Subject: [PATCH 25/31] Bump Microsoft.AspNetCore.Authentication.JwtBearer Bumps [Microsoft.AspNetCore.Authentication.JwtBearer](https://github.com/aspnet/AspNetCore) from 3.1.9 to 3.1.18. - [Release notes](https://github.com/aspnet/AspNetCore/releases) - [Commits](https://github.com/aspnet/AspNetCore/compare/v3.1.9...v3.1.18) --- updated-dependencies: - dependency-name: Microsoft.AspNetCore.Authentication.JwtBearer dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj index 1a23f95..d33ec88 100644 --- a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj +++ b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj @@ -19,7 +19,7 @@ - + From 2edec644f40caa4a24780845d6057b9936023b42 Mon Sep 17 00:00:00 2001 From: haptear Date: Tue, 8 Mar 2022 10:55:21 +0800 Subject: [PATCH 26/31] =?UTF-8?q?=E5=8D=87=E7=BA=A7sqlSugarCore=E7=89=88?= =?UTF-8?q?=E6=9C=AC=20=E8=A7=A3=E5=86=B3=E5=A6=82=E6=9E=9C=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E5=AD=97=E6=AE=B5=E6=98=AF=E5=85=B3=E9=94=AE=E5=AD=97?= =?UTF-8?q?(=E4=BE=8B=E5=A6=82:key)=E6=97=B6=E5=87=BA=E9=94=99=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20=E5=A4=84=E7=90=86=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E5=90=8E=E6=98=BE=E7=A4=BA404=E6=97=A0=E7=BD=91=E9=A1=B5?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../APIJSON.NET/Controllers/HomeController.cs | 3 ++- APIJSON.NET/APIJSON.NET/Startup.cs | 8 ++++---- .../APIJSONCommon/ApiJson.Common.csproj | 18 ++++++++++-------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/APIJSON.NET/APIJSON.NET/Controllers/HomeController.cs b/APIJSON.NET/APIJSON.NET/Controllers/HomeController.cs index df8362d..90ee7f9 100644 --- a/APIJSON.NET/APIJSON.NET/Controllers/HomeController.cs +++ b/APIJSON.NET/APIJSON.NET/Controllers/HomeController.cs @@ -10,7 +10,8 @@ public class HomeController : Controller { public IActionResult Index() { - return Redirect("index.html"); + return File("./index.html", "text/html"); + //return Redirect("index.html"); } } } \ No newline at end of file diff --git a/APIJSON.NET/APIJSON.NET/Startup.cs b/APIJSON.NET/APIJSON.NET/Startup.cs index 756a23c..1422d41 100644 --- a/APIJSON.NET/APIJSON.NET/Startup.cs +++ b/APIJSON.NET/APIJSON.NET/Startup.cs @@ -70,10 +70,9 @@ public void ConfigureServices(IServiceCollection services) // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - - app.UseAuthentication(); - app.UseRouting(); + app.UseAuthentication(); + app.UseDefaultFiles(); app.UseStaticFiles(); app.UseCors(_defaultCorsPolicyName); app.UseSwagger(); @@ -84,7 +83,8 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) }); app.UseEndpoints(endpoints => { - endpoints.MapControllers(); + endpoints.MapDefaultControllerRoute(); + //endpoints.MapControllers(); }); app.UseJwtTokenMiddleware(); DbInit.Initialize(app); diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj index 34c1d8b..f6c0ce9 100644 --- a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj +++ b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj @@ -1,13 +1,15 @@  - netstandard2.0 - 0.0.10 - 0.0.10 处理别名如果为关键字的缺陷 -0.0.8 清理SelectTable 支持重载 -0.0.7 修复not in的缺陷,增加~ 不等于的支持 -0.0.6 增加ToSql接口,处理sql注入的情况 -通用查询组件 + netstandard2.1 + 0.0.11 + + 0.0.11 升级sqlSugarCore版本 解决如果查找字段是关键字(例如:key)时出错的问题 + 0.0.10 处理别名如果为关键字的缺陷 + 0.0.8 清理SelectTable 支持重载 + 0.0.7 修复not in的缺陷,增加~ 不等于的支持 + 0.0.6 增加ToSql接口,处理sql注入的情况 + 通用查询组件 ApiJson.Common.Core true @@ -20,7 +22,7 @@ - + From 1a65cf39c19c5cd574e6228d35878319bf7aa0ca Mon Sep 17 00:00:00 2001 From: liaozb <635990945@qq.com> Date: Thu, 23 Jun 2022 16:09:57 +0800 Subject: [PATCH 27/31] =?UTF-8?q?#=E5=8D=87=E7=BA=A7=E5=88=B0.net6.0#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj | 14 ++- APIJSON.NET/APIJSON.NET/Program.cs | 90 ++++++++++++++++--- APIJSON.NET/APIJSON.NET/appsettings.json | 16 ++-- .../APIJSONCommon/ApiJson.Common.csproj | 6 +- 4 files changed, 94 insertions(+), 32 deletions(-) diff --git a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj index d33ec88..a370b61 100644 --- a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj +++ b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net6.0 @@ -19,19 +19,17 @@ - - - + + + - - - + - + diff --git a/APIJSON.NET/APIJSON.NET/Program.cs b/APIJSON.NET/APIJSON.NET/Program.cs index 2fa47dc..47669b6 100644 --- a/APIJSON.NET/APIJSON.NET/Program.cs +++ b/APIJSON.NET/APIJSON.NET/Program.cs @@ -1,19 +1,83 @@ -using Microsoft.AspNetCore; +using APIJSON.NET; +using APIJSON.NET.Models; +using APIJSON.NET.Services; +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.IdentityModel.Tokens; +using Microsoft.OpenApi.Models; +using System; +using System.Collections.Generic; using System.Net; +using System.Text; -namespace APIJSON.NET +const string _defaultCorsPolicyName = "localhost"; +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. + +builder.Services.AddControllers(); +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddEndpointsApiExplorer(); + +builder.Services.Configure>(builder.Configuration.GetSection("RoleList")); +builder.Services.Configure>(builder.Configuration.GetSection("tablempper")); +builder.Services.Configure(tokenAuthConfig => { - public class Program + tokenAuthConfig.SecurityKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(builder.Configuration["Authentication:JwtBearer:SecurityKey"])); + tokenAuthConfig.Issuer = builder.Configuration["Authentication:JwtBearer:Issuer"]; + tokenAuthConfig.Audience = builder.Configuration["Authentication:JwtBearer:Audience"]; + tokenAuthConfig.SigningCredentials = new SigningCredentials(tokenAuthConfig.SecurityKey, SecurityAlgorithms.HmacSha256); + tokenAuthConfig.Expiration = TimeSpan.FromDays(1); +}); +AuthConfigurer.Configure(builder.Services, builder.Configuration); + +var origins = builder.Configuration.GetSection("CorsUrls").Value.Split(","); +builder.Services.AddCors(options => options.AddPolicy(_defaultCorsPolicyName, + builder => + builder.WithOrigins(origins) + .AllowAnyHeader() + .AllowAnyMethod().AllowCredentials() + )); +builder.Services.AddControllers() + .AddNewtonsoftJson(options => { - public static void Main(string[] args) - { - CreateWebHostBuilder(args).Build().Run(); - } - - public static IWebHostBuilder CreateWebHostBuilder(string[] args) - { - return WebHost.CreateDefaultBuilder(args).UseStartup(); - } - } + options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; + options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; + }); ; +builder.Services.AddSwaggerGen(c => +{ + c.SwaggerDoc("v1", new OpenApiInfo { Title = "APIJSON.NET", Version = "v1" }); +}); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddTransient(); +builder.Services.AddTransient(); + + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(c => + { + c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); + + }); } + +app.UseHttpsRedirection(); +app.UseStaticFiles(); +app.UseAuthorization(); +app.UseCors(_defaultCorsPolicyName); +app.MapControllers(); +app.UseJwtTokenMiddleware(); +DbInit.Initialize(app); +app.Run(); \ No newline at end of file diff --git a/APIJSON.NET/APIJSON.NET/appsettings.json b/APIJSON.NET/APIJSON.NET/appsettings.json index 3f3b41c..ac5a7c8 100644 --- a/APIJSON.NET/APIJSON.NET/appsettings.json +++ b/APIJSON.NET/APIJSON.NET/appsettings.json @@ -15,21 +15,21 @@ }, "RoleList": [ { - "name": "role1", //Ȩ������ Ψһ - "select": { //��ѯȨ�� - "table": [ "*" ], //�ɲ����ı� - "column": [ "*" ], //�ɲ������ֶ� + "name": "role1", //Ȩ������ Ψһ + "select": { //��ѯȨ�� + "table": [ "*" ], //�ɲ����ı� + "column": [ "*" ], //�ɲ������ֶ� "where": [] }, - "update": { //�޸�Ȩ�� + "update": { //�޸�Ȩ�� "table": [ "moment", "User", "Comment" ], "column": [ "*", "*", "*" ] }, - "insert": { //����Ȩ�� + "insert": { //���Ȩ�� "table": [ "moment", "User", "Comment" ], "column": [ "*", "*", "*" ] }, - "delete": { //ɾ��Ȩ�� + "delete": { //ɾ��Ȩ�� "table": [ "moment", "User", "Comment" ] } }, @@ -41,7 +41,7 @@ } } ], - "tablempper": //������ӳ�� + "tablempper": //������ӳ�� { "user": "apijson_user", "org": "web_organization" diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj index f6c0ce9..ba4928c 100644 --- a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj +++ b/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj @@ -20,9 +20,9 @@ - - - + + + From f80ed27717e289079e6816b52e833406c1e39542 Mon Sep 17 00:00:00 2001 From: liaozb <635990945@qq.com> Date: Thu, 23 Jun 2022 17:14:28 +0800 Subject: [PATCH 28/31] =?UTF-8?q?#=E4=B9=B1=E7=A0=81=E4=BF=AE=E5=A4=8D#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSON.NET/appsettings.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/APIJSON.NET/APIJSON.NET/appsettings.json b/APIJSON.NET/APIJSON.NET/appsettings.json index ac5a7c8..a088cc3 100644 --- a/APIJSON.NET/APIJSON.NET/appsettings.json +++ b/APIJSON.NET/APIJSON.NET/appsettings.json @@ -15,21 +15,21 @@ }, "RoleList": [ { - "name": "role1", //Ȩ������ Ψһ - "select": { //��ѯȨ�� - "table": [ "*" ], //�ɲ����ı� - "column": [ "*" ], //�ɲ������ֶ� + "name": "role1", //权限名称 唯一 + "select": { //查询权限 + "table": [ "*" ], //可操作的表 + "column": [ "*" ], //可操作的字段 "where": [] }, - "update": { //�޸�Ȩ�� + "update": { //修改权限 "table": [ "moment", "User", "Comment" ], "column": [ "*", "*", "*" ] }, - "insert": { //���Ȩ�� + "insert": { //添加权限 "table": [ "moment", "User", "Comment" ], "column": [ "*", "*", "*" ] }, - "delete": { //ɾ��Ȩ�� + "delete": { //删除权限 "table": [ "moment", "User", "Comment" ] } }, @@ -41,7 +41,7 @@ } } ], - "tablempper": //������ӳ�� + "tablempper": //别名表映射 { "user": "apijson_user", "org": "web_organization" From bd1f3dbed78537ea7fbbd461f37c489c966b89f6 Mon Sep 17 00:00:00 2001 From: liaozb <635990945@qq.com> Date: Fri, 24 Jun 2022 10:11:39 +0800 Subject: [PATCH 29/31] =?UTF-8?q?#=E8=BF=90=E8=A1=8C=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../APIJSON.NET/Controllers/JsonController.cs | 3 --- APIJSON.NET/APIJSON.NET/Data/DbContext.cs | 2 +- APIJSON.NET/APIJSON.NET/Data/DbInit.cs | 2 +- .../APIJSON.NET/{ => Data}/Models/Login.cs | 6 +++--- APIJSON.NET/APIJSON.NET/Program.cs | 18 +++++++++--------- APIJSON.NET/APIJSON.NET/appsettings.json | 4 ++-- 6 files changed, 16 insertions(+), 19 deletions(-) rename APIJSON.NET/APIJSON.NET/{ => Data}/Models/Login.cs (84%) diff --git a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs index 16dd406..d2edac2 100644 --- a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs +++ b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs @@ -134,9 +134,6 @@ public ActionResult Add([FromBody]JObject jobject) ht.Add("msg", "success"); try { - - - foreach (var item in jobject) { string key = item.Key.Trim(); diff --git a/APIJSON.NET/APIJSON.NET/Data/DbContext.cs b/APIJSON.NET/APIJSON.NET/Data/DbContext.cs index d3c8754..0756ffc 100644 --- a/APIJSON.NET/APIJSON.NET/Data/DbContext.cs +++ b/APIJSON.NET/APIJSON.NET/Data/DbContext.cs @@ -1,4 +1,4 @@ -using APIJSON.NET.Models; +using APIJSON.NET.Data.Models; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Options; using SqlSugar; diff --git a/APIJSON.NET/APIJSON.NET/Data/DbInit.cs b/APIJSON.NET/APIJSON.NET/Data/DbInit.cs index b80bdd2..2b395c2 100644 --- a/APIJSON.NET/APIJSON.NET/Data/DbInit.cs +++ b/APIJSON.NET/APIJSON.NET/Data/DbInit.cs @@ -1,4 +1,4 @@ -using APIJSON.NET.Models; +using APIJSON.NET.Data.Models; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using SqlSugar; diff --git a/APIJSON.NET/APIJSON.NET/Models/Login.cs b/APIJSON.NET/APIJSON.NET/Data/Models/Login.cs similarity index 84% rename from APIJSON.NET/APIJSON.NET/Models/Login.cs rename to APIJSON.NET/APIJSON.NET/Data/Models/Login.cs index c3f2be5..2c018e2 100644 --- a/APIJSON.NET/APIJSON.NET/Models/Login.cs +++ b/APIJSON.NET/APIJSON.NET/Data/Models/Login.cs @@ -1,13 +1,13 @@ using SqlSugar; using System; -namespace APIJSON.NET.Models +namespace APIJSON.NET.Data.Models { public class Login { [SugarColumn(IsNullable = false, IsPrimaryKey = true)] public int userId { get; set; } - [SugarColumn(Length =100,ColumnDescription ="用户名")] + [SugarColumn(Length = 100, ColumnDescription = "用户名")] public string userName { get; set; } [SugarColumn(Length = 200, ColumnDescription = "密码")] public string passWord { get; set; } @@ -15,6 +15,6 @@ public class Login public string passWordSalt { get; set; } [SugarColumn(Length = 100, ColumnDescription = "权限组")] public string roleCode { get; set; } - + } } diff --git a/APIJSON.NET/APIJSON.NET/Program.cs b/APIJSON.NET/APIJSON.NET/Program.cs index 47669b6..671614d 100644 --- a/APIJSON.NET/APIJSON.NET/Program.cs +++ b/APIJSON.NET/APIJSON.NET/Program.cs @@ -19,7 +19,11 @@ // Add services to the container. -builder.Services.AddControllers(); +builder.Services.AddControllers().AddNewtonsoftJson(options => +{ + options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; + options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; +}); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); @@ -42,23 +46,18 @@ .AllowAnyHeader() .AllowAnyMethod().AllowCredentials() )); -builder.Services.AddControllers() - .AddNewtonsoftJson(options => - { - options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; - options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; - }); ; + builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "APIJSON.NET", Version = "v1" }); }); builder.Services.AddSingleton(); -builder.Services.AddSingleton(); + builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddTransient(); builder.Services.AddTransient(); - + var app = builder.Build(); @@ -74,6 +73,7 @@ } app.UseHttpsRedirection(); +app.UseDefaultFiles(); app.UseStaticFiles(); app.UseAuthorization(); app.UseCors(_defaultCorsPolicyName); diff --git a/APIJSON.NET/APIJSON.NET/appsettings.json b/APIJSON.NET/APIJSON.NET/appsettings.json index a088cc3..94ff268 100644 --- a/APIJSON.NET/APIJSON.NET/appsettings.json +++ b/APIJSON.NET/APIJSON.NET/appsettings.json @@ -1,7 +1,7 @@ { "ConnectionStrings": { - "DbType": 0, //0:MySql,1:SqlServer,2:Sqlite - "ConnectionString": "Server=192.168.2.25;Database=yunwei1.8;Uid=root;Pwd=xmjk;Port=3306;Character Set=utf8;" + "DbType": 1, //0:MySql,1:SqlServer,2:Sqlite + "ConnectionString": "Server=localhost;Database=APIJSON.NET;Uid=sa;Pwd=sa123qwe,;" //"ConnectionString": "Server=119.29.9.25;Port=3306;Database=test;Uid=root;Pwd=1q,2w.3e?;CharSet=UTF8;" }, "CorsUrls": "http://localhost:5000,http://localhost5001", From 462977a356735ad19ad033e5d579dbc3cb1c18a6 Mon Sep 17 00:00:00 2001 From: liaozb <635990945@qq.com> Date: Sun, 4 Feb 2024 15:51:35 +0800 Subject: [PATCH 30/31] =?UTF-8?q?#=E5=8D=87=E7=BA=A7=E5=88=B0.NET8#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../APIJSON.Data.csproj} | 13 +- .../APIJSON.Data/ApiJsonNetDataModule.cs | 16 + APIJSON.NET/APIJSON.Data/Data/DbContext.cs | 41 + APIJSON.NET/APIJSON.Data/FuncList.cs | 43 + .../Infrastructure/SimpleStringCipher.cs | 134 ++ .../Infrastructure/StringExtensions.cs | 28 + APIJSON.NET/APIJSON.Data/Models/DbOptions.cs | 15 + APIJSON.NET/APIJSON.Data/Models/Login.cs | 19 + APIJSON.NET/APIJSON.Data/Models/RoleItem.cs | 18 + .../Properties/AssemblyInfo.cs | 0 APIJSON.NET/APIJSON.Data/SelectTable.cs | 827 +++++++++ .../APIJSON.Data/Services/IIdentityService.cs | 32 + .../Services/ITableMapper.cs | 6 +- .../APIJSON.Data/Services/TableMapper.cs | 26 + .../APIJSON.NET.Test/APIJSON.NET.Test.csproj | 4 +- APIJSON.NET/APIJSON.NET.Test/Program.cs | 69 +- APIJSON.NET/APIJSON.NET.sln | 6 +- APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj | 48 +- APIJSON.NET/APIJSON.NET/AppModule.cs | 123 ++ .../APIJSON.NET/Controllers/HomeController.cs | 13 +- .../APIJSON.NET/Controllers/JsonController.cs | 439 +++-- .../Controllers/TokenController.cs | 160 +- APIJSON.NET/APIJSON.NET/Data/DbContext.cs | 44 - APIJSON.NET/APIJSON.NET/Data/Models/Login.cs | 20 - APIJSON.NET/APIJSON.NET/Dockerfile | 25 +- .../Infrastructure/JwtTokenMiddleware.cs | 26 - .../Infrastructure/SimpleStringCipher.cs | 138 -- APIJSON.NET/APIJSON.NET/Logs/logs.txt | 1491 +++++++++++++++++ .../Models/TokenAuthConfiguration.cs | 18 - APIJSON.NET/APIJSON.NET/Program.cs | 124 +- .../AuthConfigurer.cs | 0 .../APIJSON.NET/{Data => Services}/DbInit.cs | 26 +- .../APIJSON.NET/Services/IdentityService.cs | 6 +- .../Services/JwtTokenMiddleware.cs | 24 + .../Services/TokenAuthConfiguration.cs | 18 + APIJSON.NET/APIJSON.NET/Startup.cs | 93 - APIJSON.NET/APIJSON.NET/appsettings.json | 4 +- .../APIJSONCommon/ApiJson.Common_461.csproj | 97 -- .../APIJSONCommon/ApiJson.Common_461.sln | 31 - APIJSON.NET/APIJSONCommon/FuncList.cs | 44 - .../Infrastructure/StringExtensions.cs | 29 - APIJSON.NET/APIJSONCommon/Models/DbOptions.cs | 16 - APIJSON.NET/APIJSONCommon/Models/RoleItem.cs | 19 - APIJSON.NET/APIJSONCommon/SelectTable.cs | 829 --------- .../Services/IIdentityService.cs | 33 - .../APIJSONCommon/Services/TableMapper.cs | 26 - APIJSON.NET/APIJSONCommon/app.config | 11 - APIJSON.NET/APIJSONCommon/packages.config | 17 - 48 files changed, 3320 insertions(+), 1969 deletions(-) rename APIJSON.NET/{APIJSONCommon/ApiJson.Common.csproj => APIJSON.Data/APIJSON.Data.csproj} (79%) create mode 100644 APIJSON.NET/APIJSON.Data/ApiJsonNetDataModule.cs create mode 100644 APIJSON.NET/APIJSON.Data/Data/DbContext.cs create mode 100644 APIJSON.NET/APIJSON.Data/FuncList.cs create mode 100644 APIJSON.NET/APIJSON.Data/Infrastructure/SimpleStringCipher.cs create mode 100644 APIJSON.NET/APIJSON.Data/Infrastructure/StringExtensions.cs create mode 100644 APIJSON.NET/APIJSON.Data/Models/DbOptions.cs create mode 100644 APIJSON.NET/APIJSON.Data/Models/Login.cs create mode 100644 APIJSON.NET/APIJSON.Data/Models/RoleItem.cs rename APIJSON.NET/{APIJSONCommon => APIJSON.Data}/Properties/AssemblyInfo.cs (100%) create mode 100644 APIJSON.NET/APIJSON.Data/SelectTable.cs create mode 100644 APIJSON.NET/APIJSON.Data/Services/IIdentityService.cs rename APIJSON.NET/{APIJSONCommon => APIJSON.Data}/Services/ITableMapper.cs (86%) create mode 100644 APIJSON.NET/APIJSON.Data/Services/TableMapper.cs create mode 100644 APIJSON.NET/APIJSON.NET/AppModule.cs delete mode 100644 APIJSON.NET/APIJSON.NET/Data/DbContext.cs delete mode 100644 APIJSON.NET/APIJSON.NET/Data/Models/Login.cs delete mode 100644 APIJSON.NET/APIJSON.NET/Infrastructure/JwtTokenMiddleware.cs delete mode 100644 APIJSON.NET/APIJSON.NET/Infrastructure/SimpleStringCipher.cs create mode 100644 APIJSON.NET/APIJSON.NET/Logs/logs.txt delete mode 100644 APIJSON.NET/APIJSON.NET/Models/TokenAuthConfiguration.cs rename APIJSON.NET/APIJSON.NET/{Infrastructure => Services}/AuthConfigurer.cs (100%) rename APIJSON.NET/APIJSON.NET/{Data => Services}/DbInit.cs (59%) create mode 100644 APIJSON.NET/APIJSON.NET/Services/JwtTokenMiddleware.cs create mode 100644 APIJSON.NET/APIJSON.NET/Services/TokenAuthConfiguration.cs delete mode 100644 APIJSON.NET/APIJSON.NET/Startup.cs delete mode 100644 APIJSON.NET/APIJSONCommon/ApiJson.Common_461.csproj delete mode 100644 APIJSON.NET/APIJSONCommon/ApiJson.Common_461.sln delete mode 100644 APIJSON.NET/APIJSONCommon/FuncList.cs delete mode 100644 APIJSON.NET/APIJSONCommon/Infrastructure/StringExtensions.cs delete mode 100644 APIJSON.NET/APIJSONCommon/Models/DbOptions.cs delete mode 100644 APIJSON.NET/APIJSONCommon/Models/RoleItem.cs delete mode 100644 APIJSON.NET/APIJSONCommon/SelectTable.cs delete mode 100644 APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs delete mode 100644 APIJSON.NET/APIJSONCommon/Services/TableMapper.cs delete mode 100644 APIJSON.NET/APIJSONCommon/app.config delete mode 100644 APIJSON.NET/APIJSONCommon/packages.config diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj b/APIJSON.NET/APIJSON.Data/APIJSON.Data.csproj similarity index 79% rename from APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj rename to APIJSON.NET/APIJSON.Data/APIJSON.Data.csproj index ba4928c..8a515d4 100644 --- a/APIJSON.NET/APIJSONCommon/ApiJson.Common.csproj +++ b/APIJSON.NET/APIJSON.Data/APIJSON.Data.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net8.0 0.0.11 0.0.11 升级sqlSugarCore版本 解决如果查找字段是关键字(例如:key)时出错的问题 @@ -20,13 +20,12 @@ - - - + + + + - - - + diff --git a/APIJSON.NET/APIJSON.Data/ApiJsonNetDataModule.cs b/APIJSON.NET/APIJSON.Data/ApiJsonNetDataModule.cs new file mode 100644 index 0000000..8dbe0dc --- /dev/null +++ b/APIJSON.NET/APIJSON.Data/ApiJsonNetDataModule.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; + +namespace APIJSON.Data; +[DependsOn( + typeof(AbpAutofacModule))] +public class ApiJsonNetDataModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + + } +} diff --git a/APIJSON.NET/APIJSON.Data/Data/DbContext.cs b/APIJSON.NET/APIJSON.Data/Data/DbContext.cs new file mode 100644 index 0000000..1f2ab40 --- /dev/null +++ b/APIJSON.NET/APIJSON.Data/Data/DbContext.cs @@ -0,0 +1,41 @@ +using APIJSON.Data.Models; +using Microsoft.Extensions.Configuration; +using SqlSugar; +using System; +using System.Collections.Generic; +using Volo.Abp.DependencyInjection; +namespace APIJSON.Data; + +public class DbContext:ISingletonDependency +{ + public DbContext(IConfiguration options) + { + Db = new SqlSugarClient(new ConnectionConfig() + { + ConnectionString = options.GetConnectionString("ConnectionString"), + DbType = (DbType)Enum.Parse(typeof(DbType), options.GetConnectionString("DbType")), InitKeyType= InitKeyType.Attribute, + IsAutoCloseConnection = true + }); + Db.Aop.OnLogExecuted = (sql, pars) => //SQL执行完事件 + { + + }; + Db.Aop.OnLogExecuting = (sql, pars) => //SQL执行前事件 + { + + }; + } + public SqlSugarClient Db; + public DbSet LoginDb { get { return new DbSet(Db); } } +} +public class DbSet : SimpleClient where T : class, new() +{ + public DbSet(SqlSugarClient context) : base(context) + { + + } + public List GetByIds(dynamic[] ids) + { + return Context.Queryable().In(ids).ToList(); ; + } +} diff --git a/APIJSON.NET/APIJSON.Data/FuncList.cs b/APIJSON.NET/APIJSON.Data/FuncList.cs new file mode 100644 index 0000000..7acc119 --- /dev/null +++ b/APIJSON.NET/APIJSON.Data/FuncList.cs @@ -0,0 +1,43 @@ +using System; +using System.Linq; + +namespace APIJSON.Data; + +/// +/// 自定义方法 +/// +public class FuncList +{ + /// + /// + /// + /// + /// + /// + public string Merge(object a, object b) + { + return a.ToString() + b.ToString(); + } + + /// + /// + /// + /// + /// + /// + public object MergeObj(object a, object b) + { + return new { a, b }; + } + + /// + /// + /// + /// + /// + /// + public bool isContain(object a, object b) + { + return a.ToString().Split(',').Contains(b); + } +} diff --git a/APIJSON.NET/APIJSON.Data/Infrastructure/SimpleStringCipher.cs b/APIJSON.NET/APIJSON.Data/Infrastructure/SimpleStringCipher.cs new file mode 100644 index 0000000..43b09bc --- /dev/null +++ b/APIJSON.NET/APIJSON.Data/Infrastructure/SimpleStringCipher.cs @@ -0,0 +1,134 @@ +using System; +using System.IO; +using System.Security.Cryptography; +using System.Text; + +namespace APIJSON.Data; + +public class SimpleStringCipher +{ + public static SimpleStringCipher Instance { get; } + + /// + /// This constant string is used as a "salt" value for the PasswordDeriveBytes function calls. + /// This size of the IV (in bytes) must = (keysize / 8). Default keysize is 256, so the IV must be + /// 32 bytes long. Using a 16 character string here gives us 32 bytes when converted to a byte array. + /// + public byte[] InitVectorBytes; + + /// + /// Default password to encrypt/decrypt texts. + /// It's recommented to set to another value for security. + /// Default value: "gsKnGZ041HLL4IM8" + /// + public static string DefaultPassPhrase { get; set; } + + /// + /// Default value: Encoding.ASCII.GetBytes("jkE49230Tf093b42") + /// + public static byte[] DefaultInitVectorBytes { get; set; } + + /// + /// Default value: Encoding.ASCII.GetBytes("hgt!16kl") + /// + public static byte[] DefaultSalt { get; set; } + + /// + /// This constant is used to determine the keysize of the encryption algorithm. + /// + public const int Keysize = 256; + + static SimpleStringCipher() + { + DefaultPassPhrase = "gsKnGZ041HLL4IM9"; + DefaultInitVectorBytes = Encoding.ASCII.GetBytes("jkE49230Tf093b42"); + DefaultSalt = Encoding.ASCII.GetBytes("hgt!11kl"); + Instance = new SimpleStringCipher(); + } + + public SimpleStringCipher() + { + InitVectorBytes = DefaultInitVectorBytes; + } + + public string Encrypt(string plainText, string passPhrase = null, byte[] salt = null) + { + if (plainText == null) + { + return null; + } + + if (passPhrase == null) + { + passPhrase = DefaultPassPhrase; + } + + if (salt == null) + { + salt = DefaultSalt; + } + + var plainTextBytes = Encoding.UTF8.GetBytes(plainText); + using (var password = new Rfc2898DeriveBytes(passPhrase, salt)) + { + var keyBytes = password.GetBytes(Keysize / 8); + using (var symmetricKey = Aes.Create()) + { + symmetricKey.Mode = CipherMode.CBC; + using (var encryptor = symmetricKey.CreateEncryptor(keyBytes, InitVectorBytes)) + { + using (var memoryStream = new MemoryStream()) + { + using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) + { + cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); + cryptoStream.FlushFinalBlock(); + var cipherTextBytes = memoryStream.ToArray(); + return Convert.ToBase64String(cipherTextBytes); + } + } + } + } + } + } + + public string Decrypt(string cipherText, string passPhrase = null, byte[] salt = null) + { + if (string.IsNullOrEmpty(cipherText)) + { + return null; + } + + if (passPhrase == null) + { + passPhrase = DefaultPassPhrase; + } + + if (salt == null) + { + salt = DefaultSalt; + } + + var cipherTextBytes = Convert.FromBase64String(cipherText); + using (var password = new Rfc2898DeriveBytes(passPhrase, salt)) + { + var keyBytes = password.GetBytes(Keysize / 8); + using (var symmetricKey = Aes.Create()) + { + symmetricKey.Mode = CipherMode.CBC; + using (var decryptor = symmetricKey.CreateDecryptor(keyBytes, InitVectorBytes)) + { + using (var memoryStream = new MemoryStream(cipherTextBytes)) + { + using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) + { + var plainTextBytes = new byte[cipherTextBytes.Length]; + var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); + return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); + } + } + } + } + } + } +} diff --git a/APIJSON.NET/APIJSON.Data/Infrastructure/StringExtensions.cs b/APIJSON.NET/APIJSON.Data/Infrastructure/StringExtensions.cs new file mode 100644 index 0000000..240b92b --- /dev/null +++ b/APIJSON.NET/APIJSON.Data/Infrastructure/StringExtensions.cs @@ -0,0 +1,28 @@ +namespace APIJSON.Data; + +using System; +using System.Text.RegularExpressions; +public static class StringExtensions +{ + + /// + /// 是否有值 + /// + /// + /// + public static bool IsValue(this object str) + { + return str != null && !string.IsNullOrEmpty(str.ToString()); + } + + /// + /// + /// + /// + /// + public static string GetParamName(this string param) + { + return param + new Random().Next(1, 100); + } + +} \ No newline at end of file diff --git a/APIJSON.NET/APIJSON.Data/Models/DbOptions.cs b/APIJSON.NET/APIJSON.Data/Models/DbOptions.cs new file mode 100644 index 0000000..c33da47 --- /dev/null +++ b/APIJSON.NET/APIJSON.Data/Models/DbOptions.cs @@ -0,0 +1,15 @@ +namespace APIJSON.Data; + +using global::SqlSugar; +public class DbOptions +{ + /// + /// + /// + public DbType DbType { get; set; } + + /// + /// + /// + public string ConnectionString { get; set; } +} diff --git a/APIJSON.NET/APIJSON.Data/Models/Login.cs b/APIJSON.NET/APIJSON.Data/Models/Login.cs new file mode 100644 index 0000000..0dcdf11 --- /dev/null +++ b/APIJSON.NET/APIJSON.Data/Models/Login.cs @@ -0,0 +1,19 @@ +using SqlSugar; +using System; + +namespace APIJSON.Data.Models; + +public class Login +{ + [SugarColumn(IsNullable = false, IsPrimaryKey = true)] + public int userId { get; set; } + [SugarColumn(Length = 100, ColumnDescription = "用户名")] + public string userName { get; set; } + [SugarColumn(Length = 200, ColumnDescription = "密码")] + public string passWord { get; set; } + [SugarColumn(Length = 100, ColumnDescription = "密码盐")] + public string passWordSalt { get; set; } + [SugarColumn(Length = 100, ColumnDescription = "权限组")] + public string roleCode { get; set; } + +} diff --git a/APIJSON.NET/APIJSON.Data/Models/RoleItem.cs b/APIJSON.NET/APIJSON.Data/Models/RoleItem.cs new file mode 100644 index 0000000..ba16bc6 --- /dev/null +++ b/APIJSON.NET/APIJSON.Data/Models/RoleItem.cs @@ -0,0 +1,18 @@ +namespace APIJSON.Data.Models; + +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; } + +} + diff --git a/APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs b/APIJSON.NET/APIJSON.Data/Properties/AssemblyInfo.cs similarity index 100% rename from APIJSON.NET/APIJSONCommon/Properties/AssemblyInfo.cs rename to APIJSON.NET/APIJSON.Data/Properties/AssemblyInfo.cs diff --git a/APIJSON.NET/APIJSON.Data/SelectTable.cs b/APIJSON.NET/APIJSON.Data/SelectTable.cs new file mode 100644 index 0000000..39838b7 --- /dev/null +++ b/APIJSON.NET/APIJSON.Data/SelectTable.cs @@ -0,0 +1,827 @@ +namespace APIJSON.Data; + +using AspectCore.Extensions.Reflection; +using global::SqlSugar; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Text.RegularExpressions; + +/// +/// +/// +public class SelectTable +{ + private readonly IIdentityService _identitySvc; + private readonly ITableMapper _tableMapper; + private readonly SqlSugarClient db; + + /// + /// + /// + /// + /// + /// + public SelectTable(IIdentityService identityService, ITableMapper tableMapper, SqlSugarClient dbClient) + { + _identitySvc = identityService; + _tableMapper = tableMapper; + db = dbClient; + } + /// + /// 判断表名是否正确 + /// + /// + /// + public virtual bool IsTable(string table) + { + return db.DbMaintenance.GetTableInfoList().Any(it => it.Name.Equals(table, StringComparison.CurrentCultureIgnoreCase)); + } + /// + /// 判断表的列名是否正确 + /// + /// + /// + /// + public virtual bool IsCol(string table, string col) + { + return db.DbMaintenance.GetColumnInfosByTableName(table).Any(it => it.DbColumnName.Equals(col, StringComparison.CurrentCultureIgnoreCase)); + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public virtual Tuple 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(new List(), tb.Count()); + else + { + if (count > 0) + { + int total = 0; + if (query == 0)//0-对象 + return new Tuple(tb.ToPageList(page, count), total); + else + //2-以上全部 + return new Tuple(tb.ToPageList(page, count, ref total), total); + + } + else + { + if (query == 0) + return new Tuple(tb.ToList(), 0); + else + return new Tuple(tb.ToList(), tb.Count()); + } + } + } + + /// + /// 解析并查询 + /// + /// + /// + public virtual JObject Query(string queryJson) + { + JObject resultObj = new JObject(); + + JObject queryJobj = JObject.Parse(queryJson); + resultObj = Query(queryJobj); + return resultObj; + } + + /// + /// 单表查询 + /// + /// + /// 返回数据的节点名称 默认为 infos + /// + public virtual JObject QuerySingle(JObject queryObj, string nodeName = "infos") + { + JObject resultObj = new JObject(); + resultObj.Add("code", "200"); + resultObj.Add("msg", "success"); + + int total = 0; + foreach (var item in queryObj) + { + 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); + } + } + + return resultObj; + } + + /// + /// 获取查询语句 + /// + /// + /// + public virtual string ToSql(JObject queryObj) + { + foreach (var item in queryObj) + { + string key = item.Key.Trim(); + + if (key.EndsWith("[]")) + { + return ToSql(item); + } + } + return string.Empty; + } + + /// + /// 解析并查询 + /// + /// + /// + public virtual JObject Query(JObject queryObj) + { + JObject resultObj = new JObject(); + resultObj.Add("code", "200"); + resultObj.Add("msg", "success"); + + int total = 0; + foreach (var item in queryObj) + { + string key = item.Key.Trim(); + + 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(key, JToken.FromObject(template)); + } + } + } + + return resultObj; + } + + + + //动态调用方法 + private object ExecFunc(string funcname, object[] param, Type[] types) + { + var method = typeof(FuncList).GetMethod(funcname); + + var reflector = method.GetReflector(); + var result = reflector.Invoke(new FuncList(), param); + return result; + } + + //生成sql + 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 sqlObj = tb.Skip((page - 1) * count).Take(10).ToSql(); + return sqlObj.Key; + } + + // + private dynamic GetFirstData(string subtable, string json, JObject job) + { + + 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, job).First(); + var dic = (IDictionary)tb; + foreach (var item in values.Properties().Where(it => it.Name.EndsWith("()"))) + { + 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(); + var paramss = new List(); + 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()); + } + } + + return tb; + + } + + //单表查询,返回的数据在指定的NodeName节点 + private int QuerySingleList(JObject resultObj, KeyValuePair 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) + { + htt.Add(JToken.FromObject(data)); + } + } + + if (!string.IsNullOrEmpty(nodeName)) + { + resultObj.Add(nodeName, htt); + } + else + resultObj.Add(key, htt); + return total; + } + + //生成sql + private string ToSql(KeyValuePair 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()); + } + + return string.Empty; + } + + //单表查询 + private int QuerySingleList(JObject resultObj, KeyValuePair item) + { + string key = item.Key.Trim(); + return QuerySingleList(resultObj, item, key); + } + + //多列表查询 + private int QueryMoreList(JObject resultObj, KeyValuePair 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 tables = new List(), where = new List(); + foreach (var t in jb) + { + tables.Add(t.Key); where.Add(t.Value.ToString()); + } + if (tables.Count > 0) + { + string table = tables[0]; + var temp = GetTableData(table, page, count, query, where[0], null); + if (query > 0) + { + total = temp.Item2; + } + + foreach (var dd in temp.Item1) + { + var zht = new JObject(); + zht.Add(table, JToken.FromObject(dd)); + for (int i = 1; i < tables.Count; i++) + { + 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); + } + + } + if (query != 1) + { + resultObj.Add("[]", htt); + } + + return total; + } + + //执行方法 + private void ExecFunc(JObject resultObj, KeyValuePair item) + { + JObject jb = JObject.Parse(item.Value.ToString()); + Type type = typeof(FuncList); + + var dataJObj = new JObject(); + foreach (var f in jb) + { + var types = new List(); + var param = new List(); + foreach (var va in JArray.Parse(f.Value.ToString())) + { + types.Add(typeof(object)); + param.Add(va); + } + dataJObj.Add(f.Key, JToken.FromObject(ExecFunc(f.Key, param.ToArray(), types.ToArray()))); + } + resultObj.Add("func", dataJObj); + } + + // + private ISugarQueryable sugarQueryable(string subtable, string selectrole, JObject values, JObject dd) + { + if (!IsTable(subtable)) + { + throw new Exception($"表名{subtable}不正确!"); + } + var tb = db.Queryable(subtable, "tb"); + + + if (values["@column"].IsValue()) + { + ProcessColumn(subtable, selectrole, values, tb); + } + else + { + tb.Select(selectrole); + } + + List conModels = new List(); + if (values["identity"].IsValue()) + { + 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(); + if (vakey.StartsWith("@")) + { + continue; + } + if (vakey.EndsWith("$"))//模糊查询 + { + FuzzyQuery(subtable, conModels, va); + } + else if (vakey.EndsWith("{}"))//逻辑运算 + { + ConditionQuery(subtable, conModels, va); + } + else if (vakey.EndsWith("%"))//bwtween查询 + { + ConditionBetween(subtable, conModels, va); + } + else if (vakey.EndsWith("@") && dd != null) // 关联上一个table + { + 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 }); + + } + else if (vakey.EndsWith("~"))//不等于 + { + conModels.Add(new ConditionalModel() { FieldName = vakey.TrimEnd('~'), ConditionalType = ConditionalType.NoEqual, FieldValue = fieldValue }); + } + else if (IsCol(subtable, vakey)) //其他where条件 + { + conModels.Add(new ConditionalModel() { FieldName = vakey, ConditionalType = ConditionalType.Equal, FieldValue = fieldValue }); + } + } + tb.Where(conModels); + + //排序 + ProcessOrder(subtable, values, tb); + + //分组 + PrccessGroup(subtable, values, tb); + + //Having + ProcessHaving(values, tb); + return tb; + } + + //处理字段重命名 "@column":"toId:parentId",对应SQL是toId AS parentId,将查询的字段toId变为parentId返回 + private void ProcessColumn(string subtable, string selectrole, JObject values, ISugarQueryable tb) + { + var str = new System.Text.StringBuilder(100); + foreach (var item in values["@column"].ToString().Split(',')) + { + string[] ziduan = item.Split(':'); + string colName = ziduan[0]; + var ma = new Regex(@"\((\w+)\)").Match(colName); + //处理max,min这样的函数 + if (ma.Success && ma.Groups.Count > 1) + { + 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] + "`" + ","); + + } + } + if (string.IsNullOrEmpty(str.ToString())) + { + throw new Exception($"表名{subtable}没有可查询的字段!"); + } + tb.Select(str.ToString().TrimEnd(',')); + } + + // "@having":"function0(...)?value0;function1(...)?value1;function2(...)?value2...", + // SQL函数条件,一般和 @group一起用,函数一般在 @column里声明 + private void ProcessHaving(JObject values, ISugarQueryable tb) + { + if (values["@having"].IsValue()) + { + List hw = new List(); + List havingItems = new List(); + if (values["@having"].HasValues) + { + havingItems = values["@having"].Select(p => p.ToString()).ToList(); + } + else + { + havingItems.Add(values["@having"].ToString()); + } + foreach (var item in havingItems) + { + string and = item.ToString(); + var model = new ConditionalModel(); + if (and.Contains(">=")) + { + model.FieldName = and.Split(new string[] { ">=" }, StringSplitOptions.RemoveEmptyEntries)[0]; + model.ConditionalType = ConditionalType.GreaterThanOrEqual; + 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.LessThanOrEqual; + 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.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("=")) + { + 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); + } + + //var d = db.Context.Utilities.ConditionalModelToSql(hw); + //tb.Having(d.Key, d.Value); + tb.Having(string.Join(",", havingItems)); + } + } + + //"@group":"column0,column1...",分组方式。如果 @column里声明了Table的id,则id也必须在 @group中声明;其它情况下必须满足至少一个条件: + //1.分组的key在 @column里声明 + //2.Table主键在 @group中声明 + private void PrccessGroup(string subtable, JObject values, ISugarQueryable tb) + { + if (values["@group"].IsValue()) + { + 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(',')); + } + } + + //处理排序 "@order":"name-,id"查询按 name降序、id默认顺序 排序的User数组 + private void ProcessOrder(string subtable, JObject values, ISugarQueryable tb) + { + if (values["@order"].IsValue()) + { + foreach (var item in values["@order"].ToString().Split(',')) + { + 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}"); + } + } + } + } + } + + //条件查询 "key{}":"条件0,条件1...",条件为任意SQL比较表达式字符串,非Number类型必须用''包含条件的值,如'a' + //&, |, ! 逻辑运算符,对应数据库 SQL 中的 AND, OR, NOT。 + // 横或纵与:同一字段的值内条件默认 | 或连接,不同字段的条件默认 & 与连接。 + // ① & 可用于"key&{}":"条件"等 + // ② | 可用于"key|{}":"条件", "key|{}":[] 等,一般可省略 + // ③ ! 可单独使用,如"key!":Object,也可像&,|一样配合其他功能符使用 + private void ConditionQuery(string subtable, List conModels, KeyValuePair va) + { + string vakey = va.Key.Trim(); + string field = vakey.TrimEnd("{}".ToCharArray()); + if (va.Value.HasValues) + { + List inValues = new List(); + foreach (var cm in va.Value) + { + inValues.Add(cm.ToString()); + } + + conModels.Add(new ConditionalModel() + { + FieldName = field.TrimEnd("!".ToCharArray()), + ConditionalType = field.EndsWith("!") ? ConditionalType.NotIn : ConditionalType.In, + FieldValue = string.Join(",", inValues) + }); + + } + else + { + var ddt = new List>(); + foreach (var and in va.Value.ToString().Split(',')) + { + 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("<=")) + { + + 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((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 conModels, KeyValuePair va) + { + string vakey = va.Key.Trim(); + string field = vakey.TrimEnd("%".ToCharArray()); + List inValues = new List(); + + if (va.Value.HasValues) + { + foreach (var cm in va.Value) + { + inValues.Add(cm.ToString()); + } + } + 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>(); + + var leftCondition = new ConditionalModel() + { + FieldName = field, + ConditionalType = ConditionalType.GreaterThanOrEqual, + FieldValue = fileds[0] + }; + ddt.Add(new KeyValuePair(i == 0 ? WhereType.And : WhereType.Or, leftCondition)); + var rightCondition = new ConditionalModel() + { + FieldName = field, + ConditionalType = ConditionalType.LessThanOrEqual, + FieldValue = fileds[1] + }; + ddt.Add(new KeyValuePair(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 conModels, KeyValuePair 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()) }); + } + } + + //处理sql注入 + private 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; + } +} diff --git a/APIJSON.NET/APIJSON.Data/Services/IIdentityService.cs b/APIJSON.NET/APIJSON.Data/Services/IIdentityService.cs new file mode 100644 index 0000000..869ad8f --- /dev/null +++ b/APIJSON.NET/APIJSON.Data/Services/IIdentityService.cs @@ -0,0 +1,32 @@ +using APIJSON.Data.Models; +using System; + +namespace APIJSON.Data; + +public interface IIdentityService +{ + /// + /// 获取当前用户id + /// + /// + string GetUserIdentity(); + /// + /// 获取当前用户权限组名称 + /// + /// + string GetUserRoleName(); + /// + /// 获取当前用户权限 + /// + /// + Role GetRole(); + /// + /// 获取当前表的可查询字段 + /// + /// + /// + Tuple GetSelectRole(string table); + + + bool ColIsRole(string col, string[] selectrole); +} diff --git a/APIJSON.NET/APIJSONCommon/Services/ITableMapper.cs b/APIJSON.NET/APIJSON.Data/Services/ITableMapper.cs similarity index 86% rename from APIJSON.NET/APIJSONCommon/Services/ITableMapper.cs rename to APIJSON.NET/APIJSON.Data/Services/ITableMapper.cs index 30818f5..220099e 100644 --- a/APIJSON.NET/APIJSONCommon/Services/ITableMapper.cs +++ b/APIJSON.NET/APIJSON.Data/Services/ITableMapper.cs @@ -1,5 +1,5 @@ -namespace APIJSON.NET.Services -{ +namespace APIJSON.Data; + public interface ITableMapper { /// @@ -9,4 +9,4 @@ public interface ITableMapper /// string GetTableName(string oldname); } -} + diff --git a/APIJSON.NET/APIJSON.Data/Services/TableMapper.cs b/APIJSON.NET/APIJSON.Data/Services/TableMapper.cs new file mode 100644 index 0000000..2c67426 --- /dev/null +++ b/APIJSON.NET/APIJSON.Data/Services/TableMapper.cs @@ -0,0 +1,26 @@ +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using Volo.Abp.DependencyInjection; + +namespace APIJSON.Data; + +public class TableMapper : ITableMapper,ITransientDependency +{ + private readonly Dictionary _options= new Dictionary(StringComparer.OrdinalIgnoreCase); + public TableMapper(IOptions> options) + { + foreach (var item in options.Value) + { + _options.Add(item.Key, item.Value); + } + } + public string GetTableName(string oldname) + { + if (_options.ContainsKey(oldname)) + { + return _options[oldname]; + } + return oldname; + } +} diff --git a/APIJSON.NET/APIJSON.NET.Test/APIJSON.NET.Test.csproj b/APIJSON.NET/APIJSON.NET.Test/APIJSON.NET.Test.csproj index 7a13087..d3d6c1e 100644 --- a/APIJSON.NET/APIJSON.NET.Test/APIJSON.NET.Test.csproj +++ b/APIJSON.NET/APIJSON.NET.Test/APIJSON.NET.Test.csproj @@ -2,11 +2,11 @@ Exe - netcoreapp2.2 + net8.0 - + diff --git a/APIJSON.NET/APIJSON.NET.Test/Program.cs b/APIJSON.NET/APIJSON.NET.Test/Program.cs index 8258537..369d0cc 100644 --- a/APIJSON.NET/APIJSON.NET.Test/Program.cs +++ b/APIJSON.NET/APIJSON.NET.Test/Program.cs @@ -1,54 +1,55 @@ using RestSharp; using System; -using System.Text.RegularExpressions; + + +namespace APIJSON.NET.Test; -namespace APIJSON.NET.Test +class Program { - class Program + static void Main(string[] args) { - static void Main(string[] args) - { - var client = new RestClient("http://localhost:5000/"); + var client = new RestClient("http://localhost:5000/"); - var login = new RestRequest("token", Method.POST); - login.AddJsonBody(new TokenInput() { username = "admin1", password = "123456" }); - IRestResponse token = client.Execute(login); + var login = new RestRequest("token"); + login.Method= Method.Post; + login.AddJsonBody(new TokenInput() { username = "admin1", password = "123456" }); + var token = client.Post(login); - Console.WriteLine(token.Data.data.AccessToken); + Console.WriteLine(token.data.AccessToken); - var request = new RestRequest("get", Method.POST); - request.AddHeader("Content-Type", "application/json"); - request.AddHeader("Authorization", "Bearer " + token.Data.data.AccessToken); - request.AddJsonBody(@"{ + var request = new RestRequest("get"); + request.Method = Method.Post; + request.AddHeader("Content-Type", "application/json"); + request.AddHeader("Authorization", "Bearer " + token.data.AccessToken); + request.AddJsonBody(@"{ 'User': { 'id': 38710 } } "); - IRestResponse response = client.Execute(request); - Console.WriteLine(response.Content); - - + var response = client.Execute(request); + Console.WriteLine(response.Content); + - Console.ReadLine(); - } - } - public class TokenInput - { - public string username { get; set; } - public string password { get; set; } - } - public class TokenData - { - public AuthenticateResultModel data { get; set; } + + Console.ReadLine(); } - public class AuthenticateResultModel - { - public string AccessToken { get; set; } +} +public class TokenInput +{ + public string username { get; set; } + public string password { get; set; } +} +public class TokenData +{ + public AuthenticateResultModel data { get; set; } +} +public class AuthenticateResultModel +{ + public string AccessToken { get; set; } - public int ExpireInSeconds { get; set; } + public int ExpireInSeconds { get; set; } - } } diff --git a/APIJSON.NET/APIJSON.NET.sln b/APIJSON.NET/APIJSON.NET.sln index 4c1e774..7537f36 100644 --- a/APIJSON.NET/APIJSON.NET.sln +++ b/APIJSON.NET/APIJSON.NET.sln @@ -1,13 +1,13 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28803.202 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34525.116 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APIJSON.NET", "APIJSON.NET\APIJSON.NET.csproj", "{FF647576-A104-4D54-954D-3547B4FDCDB2}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APIJSON.NET.Test", "APIJSON.NET.Test\APIJSON.NET.Test.csproj", "{0828346E-207E-49F8-AD57-E1AB6B6E4077}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApiJson.Common", "APIJSONCommon\ApiJson.Common.csproj", "{3B79D4FD-0BC7-49FD-A3DD-E514433B4B35}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APIJSON.Data", "APIJSON.Data\APIJSON.Data.csproj", "{3B79D4FD-0BC7-49FD-A3DD-E514433B4B35}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj index a370b61..0dd3965 100644 --- a/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj +++ b/APIJSON.NET/APIJSON.NET/APIJSON.NET.csproj @@ -1,35 +1,29 @@  - - net6.0 - + + net8.0 + 7f2f6cea-01ae-4b0d-bee0-e48b642e22fe + Linux + - - - + + + - - - + + + + + + + + + - - - Always - - + + + - - - - - - - - - - - - - + \ No newline at end of file diff --git a/APIJSON.NET/APIJSON.NET/AppModule.cs b/APIJSON.NET/APIJSON.NET/AppModule.cs new file mode 100644 index 0000000..6b5dc30 --- /dev/null +++ b/APIJSON.NET/APIJSON.NET/AppModule.cs @@ -0,0 +1,123 @@ +using APIJSON.Data; +using APIJSON.Data.Models; +using APIJSON.NET.Data; +using APIJSON.NET.Data.Models; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Cors; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.IdentityModel.Tokens; +using Microsoft.OpenApi.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Serilog; +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; +using Volo.Abp.Swashbuckle; + +namespace APIJSON.NET; + +[DependsOn( + typeof(AbpAspNetCoreMvcModule), + typeof(AbpAutofacModule), + typeof(AbpAspNetCoreSerilogModule), + typeof(AbpSwashbuckleModule), + typeof(ApiJsonNetDataModule))] +public class AppModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + var hostingEnvironment = context.Services.GetHostingEnvironment(); + + PreConfigure(options => + { + options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; + }); + + ConfigureCors(context, configuration); + ConfigureSwaggerServices(context, configuration); + + context.Services.Configure>(configuration.GetSection("RoleList")); + context.Services.Configure>(configuration.GetSection("tablempper")); + context.Services.Configure(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(context.Services,configuration); + + context.Services.AddSingleton(); + + } + private static void ConfigureSwaggerServices(ServiceConfigurationContext context, IConfiguration configuration) + { + context.Services.AddAbpSwaggerGen( + options => + { + options.SwaggerDoc("v1", new OpenApiInfo { Title = "APIJSON.NET API", Version = "v1" }); + options.DocInclusionPredicate((docName, description) => true); + options.CustomSchemaIds(type => type.FullName); + }); + } + private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration) + { + context.Services.AddCors(options => + { + options.AddDefaultPolicy(builder => + { + builder + .WithOrigins(configuration["CorsUrls"]? + .Split(",", StringSplitOptions.RemoveEmptyEntries) + .Select(o => o.RemovePostFix("/")) + .ToArray() ?? Array.Empty()) + .WithAbpExposedHeaders() + .SetIsOriginAllowedToAllowWildcardSubdomains() + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); + }); + } + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + var env = context.GetEnvironment(); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseAbpRequestLocalization(); + app.UseCorrelationId(); + app.UseStaticFiles(); + app.UseRouting(); + app.UseCors(); + app.UseAuthentication(); + + + app.UseAuthorization(); + + app.UseSwagger(); + app.UseAbpSwaggerUI(options => + { + options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API"); + + }); + app.UseAbpSerilogEnrichers(); + app.UseConfiguredEndpoints(); + app.UseJwtTokenMiddleware(); + DbInit.Initialize(app); + } +} diff --git a/APIJSON.NET/APIJSON.NET/Controllers/HomeController.cs b/APIJSON.NET/APIJSON.NET/Controllers/HomeController.cs index 90ee7f9..2366e77 100644 --- a/APIJSON.NET/APIJSON.NET/Controllers/HomeController.cs +++ b/APIJSON.NET/APIJSON.NET/Controllers/HomeController.cs @@ -4,14 +4,13 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -namespace APIJSON.NET.Controllers +namespace APIJSON.NET.Controllers; + +public class HomeController : Controller { - public class HomeController : Controller + public IActionResult Index() { - public IActionResult Index() - { - return File("./index.html", "text/html"); - //return Redirect("index.html"); - } + return File("./index.html", "text/html"); + //return Redirect("index.html"); } } \ No newline at end of file diff --git a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs index d2edac2..ae65bed 100644 --- a/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs +++ b/APIJSON.NET/APIJSON.NET/Controllers/JsonController.cs @@ -1,274 +1,269 @@ -namespace APIJSON.NET.Controllers +using System; +using System.Collections.Generic; +using System.Web; +using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json.Linq; +using System.Linq; +using System.Threading.Tasks; +using System.IO; +using System.Text; +using System.Net.Http; +using APIJSON.Data; +using SqlSugar; +using Volo.Abp.AspNetCore.Mvc; + +namespace APIJSON.NET.Controllers; + +[Route("api/[controller]")] +[ApiController] +public class JsonController : AbpControllerBase { - using System; - using System.Collections.Generic; - using System.Web; - using APIJSON.NET.Models; - using Microsoft.AspNetCore.Mvc; - using Microsoft.Extensions.Options; - using Newtonsoft.Json.Linq; - using SqlSugar; - using System.Linq; - using APIJSON.NET.Services; - using System.Reflection; - using Microsoft.AspNetCore.Cors; - using System.Threading.Tasks; - using System.IO; - using System.Text; - using System.Net.Http; - [Route("api/[controller]")] - [ApiController] - [EnableCors("localhost")] - public class JsonController : ControllerBase + private SelectTable selectTable; + private DbContext db; + private readonly IIdentityService _identitySvc; + private ITableMapper _tableMapper; + + public JsonController(IIdentityService identityService, ITableMapper tableMapper, DbContext _db) + { + db = _db; + _tableMapper = tableMapper; + _identitySvc = identityService; + selectTable = new SelectTable(_identitySvc, _tableMapper, _db.Db); + } + + /// + /// + /// + /// + [HttpGet("/test")] + public ActionResult Test() { + string str = "{\"page\":1,\"count\":3,\"query\":2,\"Org\":{\"@column\":\"Id,Name\"}}"; + var content = new StringContent(str); + return Ok(content); + } - private SelectTable selectTable; - private DbContext db; - private readonly IIdentityService _identitySvc; - private ITableMapper _tableMapper; + /// + /// 查询 + /// + /// + /// + [HttpPost("/get")] - public JsonController(IIdentityService identityService, ITableMapper tableMapper, DbContext _db) - { - db = _db; - _tableMapper = tableMapper; - _identitySvc = identityService; - selectTable = new SelectTable(_identitySvc, _tableMapper, _db.Db); - } + public ActionResult Query([FromBody] JObject jobject) + { + var st = new SelectTable(_identitySvc, _tableMapper, db.Db); + JObject resultJobj = st.Query(jobject); + return Ok(resultJobj); + } - /// - /// - /// - /// - [HttpGet("/test")] - public ActionResult Test() + [HttpPost("/{table}")] + public async Task QueryByTable([FromRoute]string table) + { + string json = string.Empty; + using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8)) { - string str = "{\"page\":1,\"count\":3,\"query\":2,\"Org\":{\"@column\":\"Id,Name\"}}"; - var content = new StringContent(str); - return Ok(content); + json = await reader.ReadToEndAsync(); } - /// - /// 查询 - /// - /// - /// - [HttpPost("/get")] + json = HttpUtility.UrlDecode(json); + JObject ht = new JObject(); - public async Task Query([FromBody] JObject jobject) + JObject jobject = JObject.Parse(json); + ht.Add(table + "[]", jobject); + + if (jobject["query"] != null && jobject["query"].ToString() != "0" && jobject["total@"] == null) { - var st = new SelectTable(_identitySvc, _tableMapper, db.Db); - JObject resultJobj = st.Query(jobject); - return Ok(resultJobj); + //自动添加总计数量 + ht.Add("total@", ""); } - [HttpPost("/{table}")] - public async Task QueryByTable([FromRoute]string table) + //每页最大1000条数据 + if (jobject["count"] != null && int.Parse(jobject["count"].ToString()) > 1000) { - string json = string.Empty; - using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8)) - { - json = await reader.ReadToEndAsync(); - } - - json = HttpUtility.UrlDecode(json); - JObject ht = new JObject(); + throw new Exception("count分页数量最大不能超过1000"); + } - JObject jobject = JObject.Parse(json); - ht.Add(table + "[]", jobject); + bool isDebug = (jobject["@debug"] != null && jobject["@debug"].ToString() != "0"); + jobject.Remove("@debug"); - if (jobject["query"] != null && jobject["query"].ToString() != "0" && jobject["total@"] == null) + bool hasTableKey = false; + List ignoreConditions = new List { "page", "count", "query" }; + JObject tableConditions = new JObject();//表的其它查询条件,比如过滤,字段等 + foreach (var item in jobject) + { + if (item.Key.Equals(table, StringComparison.CurrentCultureIgnoreCase)) { - //自动添加总计数量 - ht.Add("total@", ""); + hasTableKey = true; + break; } - - //每页最大1000条数据 - if (jobject["count"] != null && int.Parse(jobject["count"].ToString()) > 1000) + if (!ignoreConditions.Contains(item.Key.ToLower())) { - throw new Exception("count分页数量最大不能超过1000"); + tableConditions.Add(item.Key, item.Value); } + } - bool isDebug = (jobject["@debug"] != null && jobject["@debug"].ToString() != "0"); - jobject.Remove("@debug"); + foreach (var removeKey in tableConditions) + { + jobject.Remove(removeKey.Key); + } - bool hasTableKey = false; - List ignoreConditions = new List { "page", "count", "query" }; - JObject tableConditions = new JObject();//表的其它查询条件,比如过滤,字段等 + if (!hasTableKey) + { + jobject.Add(table, tableConditions); + } + + return Query(ht); + } + /// + /// 新增 + /// + /// + /// + [HttpPost("/add")] + public ActionResult Add([FromBody]JObject jobject) + { + + JObject ht = new JObject(); + ht.Add("code", "200"); + ht.Add("msg", "success"); + try + { foreach (var item in jobject) { - if (item.Key.Equals(table, StringComparison.CurrentCultureIgnoreCase)) + string key = item.Key.Trim(); + var role = _identitySvc.GetRole(); + if (!role.Insert.Table.Contains(key, StringComparer.CurrentCultureIgnoreCase)) { - hasTableKey = true; + ht["code"] = "500"; + ht["msg"] = $"没权限添加{key}"; break; } - if (!ignoreConditions.Contains(item.Key.ToLower())) + var dt = new Dictionary(); + foreach (var f in JObject.Parse(item.Value.ToString())) { - tableConditions.Add(item.Key, item.Value); + if (f.Key.ToLower() != "id" && selectTable.IsCol(key, f.Key) && (role.Insert.Column.Contains("*") || role.Insert.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) + dt.Add(f.Key, f.Value); } + int id = db.Db.Insertable(dt).AS(key).ExecuteReturnIdentity(); + ht.Add(key, JToken.FromObject(new { code = 200, msg = "success", id })); } - - foreach (var removeKey in tableConditions) - { - jobject.Remove(removeKey.Key); - } - - if (!hasTableKey) - { - jobject.Add(table, tableConditions); - } - - return await Query(ht); } - /// - /// 新增 - /// - /// - /// - [HttpPost("/add")] - public ActionResult Add([FromBody]JObject jobject) + catch (Exception ex) { - - JObject ht = new JObject(); - ht.Add("code", "200"); - ht.Add("msg", "success"); - try - { - foreach (var item in jobject) - { - string key = item.Key.Trim(); - var role = _identitySvc.GetRole(); - if (!role.Insert.Table.Contains(key, StringComparer.CurrentCultureIgnoreCase)) - { - ht["code"] = "500"; - ht["msg"] = $"没权限添加{key}"; - break; - } - var dt = new Dictionary(); - foreach (var f in JObject.Parse(item.Value.ToString())) - { - if (f.Key.ToLower() != "id" && selectTable.IsCol(key, f.Key) && (role.Insert.Column.Contains("*") || role.Insert.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) - dt.Add(f.Key, f.Value); - } - int id = db.Db.Insertable(dt).AS(key).ExecuteReturnIdentity(); - ht.Add(key, JToken.FromObject(new { code = 200, msg = "success", id })); - } - } - catch (Exception ex) - { - ht["code"] = "500"; - ht["msg"] = ex.Message; - } - return Ok(ht); + ht["code"] = "500"; + ht["msg"] = ex.Message; } - /// - /// 修改 - /// - /// - /// - [HttpPost("/edit")] - public ActionResult Edit([FromBody]JObject jobject) + return Ok(ht); + } + /// + /// 修改 + /// + /// + /// + [HttpPost("/edit")] + public ActionResult Edit([FromBody]JObject jobject) + { + JObject ht = new JObject(); + ht.Add("code", "200"); + ht.Add("msg", "success"); + try { - JObject ht = new JObject(); - ht.Add("code", "200"); - ht.Add("msg", "success"); - try + foreach (var item in jobject) { - foreach (var item in jobject) + string key = item.Key.Trim(); + var role = _identitySvc.GetRole(); + if (!role.Update.Table.Contains(key, StringComparer.CurrentCultureIgnoreCase)) { - string key = item.Key.Trim(); - var role = _identitySvc.GetRole(); - if (!role.Update.Table.Contains(key, StringComparer.CurrentCultureIgnoreCase)) - { - ht["code"] = "500"; - ht["msg"] = $"没权限修改{key}"; - break; - } - var value = JObject.Parse(item.Value.ToString()); - if (!value.ContainsKey("id")) - { - ht["code"] = "500"; - ht["msg"] = "未传主键id"; - break; - } + ht["code"] = "500"; + ht["msg"] = $"没权限修改{key}"; + break; + } + var value = JObject.Parse(item.Value.ToString()); + if (!value.ContainsKey("id")) + { + ht["code"] = "500"; + ht["msg"] = "未传主键id"; + break; + } - var dt = new Dictionary(); - foreach (var f in value) + var dt = new Dictionary(); + foreach (var f in value) + { + if (f.Key.ToLower() != "id" && selectTable.IsCol(key, f.Key) && (role.Update.Column.Contains("*") || role.Update.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) { - if (f.Key.ToLower() != "id" && selectTable.IsCol(key, f.Key) && (role.Update.Column.Contains("*") || role.Update.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) - { - dt.Add(f.Key, f.Value.ToString()); - } + dt.Add(f.Key, f.Value.ToString()); } - db.Db.Updateable(dt).AS(key).Where("id=@id", new { id = value["id"].ToString() }).ExecuteCommand(); - ht.Add(key, JToken.FromObject(new { code = 200, msg = "success", id = value["id"].ToString() })); } + db.Db.Updateable(dt).AS(key).Where("id=@id", new { id = value["id"].ToString() }).ExecuteCommand(); + ht.Add(key, JToken.FromObject(new { code = 200, msg = "success", id = value["id"].ToString() })); } - catch (Exception ex) - { + } + catch (Exception ex) + { - ht["code"] = "500"; - ht["msg"] = ex.Message; - } - return Ok(ht); + ht["code"] = "500"; + ht["msg"] = ex.Message; } - /// - /// 删除 - /// - /// - /// - [HttpPost("/remove")] - public ActionResult Remove([FromBody]JObject jobject) + return Ok(ht); + } + /// + /// 删除 + /// + /// + /// + [HttpPost("/remove")] + public ActionResult Remove([FromBody]JObject jobject) + { + JObject ht = new JObject(); + ht.Add("code", "200"); + ht.Add("msg", "success"); + try { - JObject ht = new JObject(); - ht.Add("code", "200"); - ht.Add("msg", "success"); - try + var role = _identitySvc.GetRole(); + foreach (var item in jobject) { - var role = _identitySvc.GetRole(); - foreach (var item in jobject) + string key = item.Key.Trim(); + var value = JObject.Parse(item.Value.ToString()); + var sb = new System.Text.StringBuilder(100); + sb.Append($"delete FROM {key} where "); + if (role.Delete == null || role.Delete.Table == null) { - string key = item.Key.Trim(); - var value = JObject.Parse(item.Value.ToString()); - var sb = new System.Text.StringBuilder(100); - sb.Append($"delete FROM {key} where "); - if (role.Delete == null || role.Delete.Table == null) - { - ht["code"] = "500"; - ht["msg"] = "delete权限未配置"; - break; - } - if (!role.Delete.Table.Contains(key, StringComparer.CurrentCultureIgnoreCase)) - { - ht["code"] = "500"; - ht["msg"] = $"没权限删除{key}"; - break; - } - if (!value.ContainsKey("id")) - { - ht["code"] = "500"; - ht["msg"] = "未传主键id"; - break; - } - var p = new List(); - foreach (var f in value) - { - sb.Append($"{f.Key}=@{f.Key},"); - p.Add(new SugarParameter($"@{f.Key}", f.Value.ToString())); - } - string sql = sb.ToString().TrimEnd(','); - db.Db.Ado.ExecuteCommand(sql, p); - ht.Add(key, JToken.FromObject(new { code = 200, msg = "success", id = value["id"].ToString() })); - + ht["code"] = "500"; + ht["msg"] = "delete权限未配置"; + break; } - } - catch (Exception ex) - { + if (!role.Delete.Table.Contains(key, StringComparer.CurrentCultureIgnoreCase)) + { + ht["code"] = "500"; + ht["msg"] = $"没权限删除{key}"; + break; + } + if (!value.ContainsKey("id")) + { + ht["code"] = "500"; + ht["msg"] = "未传主键id"; + break; + } + var p = new List(); + foreach (var f in value) + { + sb.Append($"{f.Key}=@{f.Key},"); + p.Add(new SugarParameter($"@{f.Key}", f.Value.ToString())); + } + string sql = sb.ToString().TrimEnd(','); + db.Db.Ado.ExecuteCommand(sql, p); + ht.Add(key, JToken.FromObject(new { code = 200, msg = "success", id = value["id"].ToString() })); - ht["code"] = "500"; - ht["msg"] = ex.Message; } - return Ok(ht); } + catch (Exception ex) + { + + ht["code"] = "500"; + ht["msg"] = ex.Message; + } + return Ok(ht); } } \ No newline at end of file diff --git a/APIJSON.NET/APIJSON.NET/Controllers/TokenController.cs b/APIJSON.NET/APIJSON.NET/Controllers/TokenController.cs index 2979019..4256291 100644 --- a/APIJSON.NET/APIJSON.NET/Controllers/TokenController.cs +++ b/APIJSON.NET/APIJSON.NET/Controllers/TokenController.cs @@ -5,106 +5,104 @@ using System.Linq; using System.Security.Claims; using System.Text; -using System.Threading.Tasks; +using APIJSON.Data; +using APIJSON.NET.Data.Models; using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Cors; -using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Newtonsoft.Json.Linq; +using Volo.Abp.AspNetCore.Mvc; -namespace APIJSON.NET.Controllers +namespace APIJSON.NET.Controllers; + +[Route("api/[controller]/[action]")] +[ApiController] +[Authorize] +public class TokenController : AbpControllerBase { - [Route("api/[controller]/[action]")] - [ApiController] - [Authorize] - [EnableCors("localhost")] - public class TokenController : ControllerBase + private DbContext db; + private readonly IOptions _configuration; + public TokenController(DbContext _db, IOptions configuration) { - private DbContext db; - private readonly IOptions _configuration; - public TokenController(DbContext _db, IOptions configuration) - { - _configuration = configuration; - db = _db; - } - [HttpPost("/token")] - [AllowAnonymous] - public ActionResult Create([FromBody]TokenInput input) + _configuration = configuration; + db = _db; + } + [HttpPost("/token")] + [AllowAnonymous] + public ActionResult Create([FromBody]TokenInput input) + { + JObject ht = new JObject(); + ht.Add("code", "200"); + ht.Add("msg", "success"); + var us = db.LoginDb.GetSingle(it => it.userName == input.username); + if (us==null) { - JObject ht = new JObject(); - ht.Add("code", "200"); - ht.Add("msg", "success"); - var us = db.LoginDb.GetSingle(it => it.userName == input.username); - if (us==null) - { - ht["code"] = "201"; - ht["msg"] = "用户名或者密码错误!"; - return Ok(ht); - } - string str = SimpleStringCipher.Instance.Encrypt(input.password,null, Encoding.ASCII.GetBytes(us.passWordSalt)); - if (!us.passWord.Equals(str)) - { - ht["code"]="201"; - ht["msg"]= "用户名或者密码错误!"; - return Ok(ht); - } - var identity = new ClaimsIdentity(); - identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, us.userId.ToString(CultureInfo.InvariantCulture))); - identity.AddClaim(new Claim(ClaimTypes.Name, us.userId.ToString(CultureInfo.InvariantCulture))); - identity.AddClaim(new Claim(ClaimTypes.Role, us.roleCode.ToString(CultureInfo.InvariantCulture))); - var claims = identity.Claims.ToList(); - - claims.AddRange(new[] - { - new Claim(JwtRegisteredClaimNames.Sub,us.userId.ToString(CultureInfo.InvariantCulture)), - new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), - new Claim(JwtRegisteredClaimNames.Iat, DateTimeOffset.Now.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64) - }); - - var accessToken = CreateAccessToken(claims); - - var data = new AuthenticateResultModel() - { - AccessToken = accessToken, - ExpireInSeconds = (int)_configuration.Value.Expiration.TotalSeconds - }; - - ht.Add("data", JToken.FromObject(data)); + ht["code"] = "201"; + ht["msg"] = "用户名或者密码错误!"; return Ok(ht); } - [HttpGet] - public ActionResult GetRole() + string str = SimpleStringCipher.Instance.Encrypt(input.password,null, Encoding.ASCII.GetBytes(us.passWordSalt)); + if (!us.passWord.Equals(str)) { - return Ok(User.FindFirstValue(ClaimTypes.Role)); + ht["code"]="201"; + ht["msg"]= "用户名或者密码错误!"; + return Ok(ht); } - private string CreateAccessToken(IEnumerable claims, TimeSpan? expiration = null) + var identity = new ClaimsIdentity(); + identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, us.userId.ToString(CultureInfo.InvariantCulture))); + identity.AddClaim(new Claim(ClaimTypes.Name, us.userId.ToString(CultureInfo.InvariantCulture))); + identity.AddClaim(new Claim(ClaimTypes.Role, us.roleCode.ToString(CultureInfo.InvariantCulture))); + var claims = identity.Claims.ToList(); + + claims.AddRange(new[] { - var now = DateTime.UtcNow; + new Claim(JwtRegisteredClaimNames.Sub,us.userId.ToString(CultureInfo.InvariantCulture)), + new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), + new Claim(JwtRegisteredClaimNames.Iat, DateTimeOffset.Now.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64) + }); - var jwtSecurityToken = new JwtSecurityToken( - issuer: _configuration.Value.Issuer, - audience: _configuration.Value.Audience, - claims: claims, - notBefore: now, - expires: now.Add(expiration ?? _configuration.Value.Expiration), - signingCredentials: _configuration.Value.SigningCredentials - ); + var accessToken = CreateAccessToken(claims); - return new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken); - } + var data = new AuthenticateResultModel() + { + AccessToken = accessToken, + ExpireInSeconds = (int)_configuration.Value.Expiration.TotalSeconds + }; + + ht.Add("data", JToken.FromObject(data)); + return Ok(ht); } - public class TokenInput + [HttpGet] + public ActionResult GetRole() { - public string username { get; set; } - public string password { get; set; } + return Ok(User.FindFirstValue(ClaimTypes.Role)); } - public class AuthenticateResultModel + private string CreateAccessToken(IEnumerable claims, TimeSpan? expiration = null) { - public string AccessToken { get; set; } - - public int ExpireInSeconds { get; set; } - + var now = DateTime.UtcNow; + + var jwtSecurityToken = new JwtSecurityToken( + issuer: _configuration.Value.Issuer, + audience: _configuration.Value.Audience, + claims: claims, + notBefore: now, + expires: now.Add(expiration ?? _configuration.Value.Expiration), + signingCredentials: _configuration.Value.SigningCredentials + ); + return new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken); } +} +public class TokenInput +{ + public string username { get; set; } + public string password { get; set; } +} +public class AuthenticateResultModel +{ + public string AccessToken { get; set; } + + public int ExpireInSeconds { get; set; } + + } \ No newline at end of file diff --git a/APIJSON.NET/APIJSON.NET/Data/DbContext.cs b/APIJSON.NET/APIJSON.NET/Data/DbContext.cs deleted file mode 100644 index 0756ffc..0000000 --- a/APIJSON.NET/APIJSON.NET/Data/DbContext.cs +++ /dev/null @@ -1,44 +0,0 @@ -using APIJSON.NET.Data.Models; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Options; -using SqlSugar; -using System; -using System.Collections.Generic; - -namespace APIJSON.NET -{ - public class DbContext - { - public DbContext(IConfiguration options) - { - Db = new SqlSugarClient(new ConnectionConfig() - { - ConnectionString = options.GetConnectionString("ConnectionString"), - DbType = (DbType)Enum.Parse(typeof(SqlSugar.DbType), options.GetConnectionString("DbType")), InitKeyType= InitKeyType.Attribute, - IsAutoCloseConnection = true - }); - Db.Aop.OnLogExecuted = (sql, pars) => //SQL执行完事件 - { - - }; - Db.Aop.OnLogExecuting = (sql, pars) => //SQL执行前事件 - { - - }; - } - public SqlSugarClient Db; - public DbSet LoginDb { get { return new DbSet(Db); } } - } - public class DbSet : SimpleClient where T : class, new() - { - public DbSet(SqlSugarClient context) : base(context) - { - - } - public List GetByIds(dynamic[] ids) - { - return Context.Queryable().In(ids).ToList(); ; - } - } - -} diff --git a/APIJSON.NET/APIJSON.NET/Data/Models/Login.cs b/APIJSON.NET/APIJSON.NET/Data/Models/Login.cs deleted file mode 100644 index 2c018e2..0000000 --- a/APIJSON.NET/APIJSON.NET/Data/Models/Login.cs +++ /dev/null @@ -1,20 +0,0 @@ -using SqlSugar; -using System; - -namespace APIJSON.NET.Data.Models -{ - public class Login - { - [SugarColumn(IsNullable = false, IsPrimaryKey = true)] - public int userId { get; set; } - [SugarColumn(Length = 100, ColumnDescription = "用户名")] - public string userName { get; set; } - [SugarColumn(Length = 200, ColumnDescription = "密码")] - public string passWord { get; set; } - [SugarColumn(Length = 100, ColumnDescription = "密码盐")] - public string passWordSalt { get; set; } - [SugarColumn(Length = 100, ColumnDescription = "权限组")] - public string roleCode { get; set; } - - } -} diff --git a/APIJSON.NET/APIJSON.NET/Dockerfile b/APIJSON.NET/APIJSON.NET/Dockerfile index f2e1229..297ac0f 100644 --- a/APIJSON.NET/APIJSON.NET/Dockerfile +++ b/APIJSON.NET/APIJSON.NET/Dockerfile @@ -1,7 +1,26 @@ -FROM microsoft/dotnet:2.1.2-aspnetcore-runtime +#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +USER app WORKDIR /app +EXPOSE 8080 +EXPOSE 8081 + +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["APIJSON.NET/APIJSON.NET.csproj", "APIJSON.NET/"] +COPY ["APIJSONCommon/ApiJson.Common.csproj", "APIJSONCommon/"] +RUN dotnet restore "./APIJSON.NET/./APIJSON.NET.csproj" COPY . . +WORKDIR "/src/APIJSON.NET" +RUN dotnet build "./APIJSON.NET.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./APIJSON.NET.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false - -ENTRYPOINT ["dotnet", "APIJSON.NET.dll"] +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "APIJSON.NET.dll"] \ No newline at end of file diff --git a/APIJSON.NET/APIJSON.NET/Infrastructure/JwtTokenMiddleware.cs b/APIJSON.NET/APIJSON.NET/Infrastructure/JwtTokenMiddleware.cs deleted file mode 100644 index 061b999..0000000 --- a/APIJSON.NET/APIJSON.NET/Infrastructure/JwtTokenMiddleware.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.AspNetCore.Builder; - -namespace APIJSON.NET -{ - public static class JwtTokenMiddleware - { - public static IApplicationBuilder UseJwtTokenMiddleware(this IApplicationBuilder app) - { - return app.Use(async (ctx, next) => - { - if (ctx.User.Identity?.IsAuthenticated != true) - { - var result = await ctx.AuthenticateAsync("JwtBearer"); - if (result.Succeeded && result.Principal != null) - { - ctx.User = result.Principal; - } - } - - await next(); - }); - } - } -} diff --git a/APIJSON.NET/APIJSON.NET/Infrastructure/SimpleStringCipher.cs b/APIJSON.NET/APIJSON.NET/Infrastructure/SimpleStringCipher.cs deleted file mode 100644 index eb4ae39..0000000 --- a/APIJSON.NET/APIJSON.NET/Infrastructure/SimpleStringCipher.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Security.Cryptography; -using System.Text; -using System.Threading.Tasks; - -namespace APIJSON.NET -{ - public class SimpleStringCipher - { - public static SimpleStringCipher Instance { get; } - - /// - /// This constant string is used as a "salt" value for the PasswordDeriveBytes function calls. - /// This size of the IV (in bytes) must = (keysize / 8). Default keysize is 256, so the IV must be - /// 32 bytes long. Using a 16 character string here gives us 32 bytes when converted to a byte array. - /// - public byte[] InitVectorBytes; - - /// - /// Default password to encrypt/decrypt texts. - /// It's recommented to set to another value for security. - /// Default value: "gsKnGZ041HLL4IM8" - /// - public static string DefaultPassPhrase { get; set; } - - /// - /// Default value: Encoding.ASCII.GetBytes("jkE49230Tf093b42") - /// - public static byte[] DefaultInitVectorBytes { get; set; } - - /// - /// Default value: Encoding.ASCII.GetBytes("hgt!16kl") - /// - public static byte[] DefaultSalt { get; set; } - - /// - /// This constant is used to determine the keysize of the encryption algorithm. - /// - public const int Keysize = 256; - - static SimpleStringCipher() - { - DefaultPassPhrase = "gsKnGZ041HLL4IM9"; - DefaultInitVectorBytes = Encoding.ASCII.GetBytes("jkE49230Tf093b42"); - DefaultSalt = Encoding.ASCII.GetBytes("hgt!11kl"); - Instance = new SimpleStringCipher(); - } - - public SimpleStringCipher() - { - InitVectorBytes = DefaultInitVectorBytes; - } - - public string Encrypt(string plainText, string passPhrase = null, byte[] salt = null) - { - if (plainText == null) - { - return null; - } - - if (passPhrase == null) - { - passPhrase = DefaultPassPhrase; - } - - if (salt == null) - { - salt = DefaultSalt; - } - - var plainTextBytes = Encoding.UTF8.GetBytes(plainText); - using (var password = new Rfc2898DeriveBytes(passPhrase, salt)) - { - var keyBytes = password.GetBytes(Keysize / 8); - using (var symmetricKey = Aes.Create()) - { - symmetricKey.Mode = CipherMode.CBC; - using (var encryptor = symmetricKey.CreateEncryptor(keyBytes, InitVectorBytes)) - { - using (var memoryStream = new MemoryStream()) - { - using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) - { - cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); - cryptoStream.FlushFinalBlock(); - var cipherTextBytes = memoryStream.ToArray(); - return Convert.ToBase64String(cipherTextBytes); - } - } - } - } - } - } - - public string Decrypt(string cipherText, string passPhrase = null, byte[] salt = null) - { - if (string.IsNullOrEmpty(cipherText)) - { - return null; - } - - if (passPhrase == null) - { - passPhrase = DefaultPassPhrase; - } - - if (salt == null) - { - salt = DefaultSalt; - } - - var cipherTextBytes = Convert.FromBase64String(cipherText); - using (var password = new Rfc2898DeriveBytes(passPhrase, salt)) - { - var keyBytes = password.GetBytes(Keysize / 8); - using (var symmetricKey = Aes.Create()) - { - symmetricKey.Mode = CipherMode.CBC; - using (var decryptor = symmetricKey.CreateDecryptor(keyBytes, InitVectorBytes)) - { - using (var memoryStream = new MemoryStream(cipherTextBytes)) - { - using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) - { - var plainTextBytes = new byte[cipherTextBytes.Length]; - var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); - return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); - } - } - } - } - } - } - } -} diff --git a/APIJSON.NET/APIJSON.NET/Logs/logs.txt b/APIJSON.NET/APIJSON.NET/Logs/logs.txt new file mode 100644 index 0000000..4f52f5f --- /dev/null +++ b/APIJSON.NET/APIJSON.NET/Logs/logs.txt @@ -0,0 +1,1491 @@ +2024-02-04 11:08:04.221 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 11:08:07.352 +08:00 [INF] Loaded ABP modules: +2024-02-04 11:08:07.353 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 11:08:07.353 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 11:08:07.890 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 11:09:22.623 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 11:09:24.232 +08:00 [INF] Loaded ABP modules: +2024-02-04 11:09:24.233 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 11:09:24.233 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 11:09:24.536 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 11:15:37.016 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 11:15:38.749 +08:00 [INF] Loaded ABP modules: +2024-02-04 11:15:38.750 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 11:15:38.750 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 11:15:38.751 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 11:15:38.751 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 11:15:38.751 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 11:15:39.027 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 11:15:56.937 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 11:15:58.558 +08:00 [INF] Loaded ABP modules: +2024-02-04 11:15:58.559 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 11:15:58.559 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 11:15:58.887 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 11:18:32.544 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 11:18:34.289 +08:00 [INF] Loaded ABP modules: +2024-02-04 11:18:34.290 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 11:18:34.290 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 11:18:34.641 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 11:23:04.119 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 11:23:05.977 +08:00 [INF] Loaded ABP modules: +2024-02-04 11:23:05.978 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 11:23:05.978 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 11:23:06.289 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 11:24:23.469 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 11:24:25.014 +08:00 [INF] Loaded ABP modules: +2024-02-04 11:24:25.015 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 11:24:25.015 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 11:24:25.330 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 11:27:00.865 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 11:27:02.613 +08:00 [INF] Loaded ABP modules: +2024-02-04 11:27:02.614 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 11:27:02.614 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 11:27:02.894 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 11:28:15.811 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 11:28:17.591 +08:00 [INF] Loaded ABP modules: +2024-02-04 11:28:17.592 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 11:28:17.592 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 11:28:17.865 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 11:28:20.705 +08:00 [INF] Initialized all ABP modules. +2024-02-04 11:28:20.873 +08:00 [INF] Unable to bind to https://localhost:49796 on the IPv4 loopback interface: '以一种访问权限不允许的方式做了一个访问套接字的尝试。'. +2024-02-04 11:28:20.874 +08:00 [INF] Unable to bind to https://localhost:49796 on the IPv6 loopback interface: '以一种访问权限不允许的方式做了一个访问套接字的尝试。'. +2024-02-04 11:28:20.881 +08:00 [ERR] Hosting failed to start +System.IO.IOException: Failed to bind to address https://localhost:49796. + ---> System.AggregateException: One or more errors occurred. (以一种访问权限不允许的方式做了一个访问套接字的尝试。) (以一种访问权限不允许的方式做了一个访问套接字的尝试。) + ---> System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + --- End of inner exception stack trace --- + ---> (Inner Exception #1) System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken)<--- + + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(ListenOptions[] listenOptions, AddressBindContext context, Func`2 useHttps, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.Internal.Host.b__15_1(IHostedService service, CancellationToken token) + at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation) + at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at APIJSON.NET.Program.Main(String[] args) in E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\Program.cs:line 36 +2024-02-04 11:28:20.910 +08:00 [FTL] Host terminated unexpectedly! +System.IO.IOException: Failed to bind to address https://localhost:49796. + ---> System.AggregateException: One or more errors occurred. (以一种访问权限不允许的方式做了一个访问套接字的尝试。) (以一种访问权限不允许的方式做了一个访问套接字的尝试。) + ---> System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + --- End of inner exception stack trace --- + ---> (Inner Exception #1) System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken)<--- + + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(ListenOptions[] listenOptions, AddressBindContext context, Func`2 useHttps, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.Internal.Host.b__15_1(IHostedService service, CancellationToken token) + at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation) + at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at APIJSON.NET.Program.Main(String[] args) in E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\Program.cs:line 36 +2024-02-04 12:33:07.600 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 12:33:09.298 +08:00 [INF] Loaded ABP modules: +2024-02-04 12:33:09.299 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 12:33:09.299 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 12:33:09.576 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 12:33:10.388 +08:00 [INF] Initialized all ABP modules. +2024-02-04 12:33:10.527 +08:00 [INF] Unable to bind to https://localhost:49796 on the IPv4 loopback interface: '以一种访问权限不允许的方式做了一个访问套接字的尝试。'. +2024-02-04 12:33:10.529 +08:00 [INF] Unable to bind to https://localhost:49796 on the IPv6 loopback interface: '以一种访问权限不允许的方式做了一个访问套接字的尝试。'. +2024-02-04 12:33:10.536 +08:00 [ERR] Hosting failed to start +System.IO.IOException: Failed to bind to address https://localhost:49796. + ---> System.AggregateException: One or more errors occurred. (以一种访问权限不允许的方式做了一个访问套接字的尝试。) (以一种访问权限不允许的方式做了一个访问套接字的尝试。) + ---> System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + --- End of inner exception stack trace --- + ---> (Inner Exception #1) System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken)<--- + + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(ListenOptions[] listenOptions, AddressBindContext context, Func`2 useHttps, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.Internal.Host.b__15_1(IHostedService service, CancellationToken token) + at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation) + at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at APIJSON.NET.Program.Main(String[] args) in E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\Program.cs:line 36 +2024-02-04 12:33:10.562 +08:00 [FTL] Host terminated unexpectedly! +System.IO.IOException: Failed to bind to address https://localhost:49796. + ---> System.AggregateException: One or more errors occurred. (以一种访问权限不允许的方式做了一个访问套接字的尝试。) (以一种访问权限不允许的方式做了一个访问套接字的尝试。) + ---> System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + --- End of inner exception stack trace --- + ---> (Inner Exception #1) System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken)<--- + + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(ListenOptions[] listenOptions, AddressBindContext context, Func`2 useHttps, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.Internal.Host.b__15_1(IHostedService service, CancellationToken token) + at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation) + at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at APIJSON.NET.Program.Main(String[] args) in E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\Program.cs:line 36 +2024-02-04 12:34:34.568 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 12:34:36.444 +08:00 [INF] Loaded ABP modules: +2024-02-04 12:34:36.444 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 12:34:36.445 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 12:34:36.735 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 12:34:37.549 +08:00 [INF] Initialized all ABP modules. +2024-02-04 12:34:37.667 +08:00 [INF] Unable to bind to https://localhost:49796 on the IPv4 loopback interface: '以一种访问权限不允许的方式做了一个访问套接字的尝试。'. +2024-02-04 12:34:37.668 +08:00 [INF] Unable to bind to https://localhost:49796 on the IPv6 loopback interface: '以一种访问权限不允许的方式做了一个访问套接字的尝试。'. +2024-02-04 12:34:37.674 +08:00 [ERR] Hosting failed to start +System.IO.IOException: Failed to bind to address https://localhost:49796. + ---> System.AggregateException: One or more errors occurred. (以一种访问权限不允许的方式做了一个访问套接字的尝试。) (以一种访问权限不允许的方式做了一个访问套接字的尝试。) + ---> System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + --- End of inner exception stack trace --- + ---> (Inner Exception #1) System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken)<--- + + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(ListenOptions[] listenOptions, AddressBindContext context, Func`2 useHttps, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.Internal.Host.b__15_1(IHostedService service, CancellationToken token) + at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation) + at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at APIJSON.NET.Program.Main(String[] args) in E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\Program.cs:line 36 +2024-02-04 12:34:37.703 +08:00 [FTL] Host terminated unexpectedly! +System.IO.IOException: Failed to bind to address https://localhost:49796. + ---> System.AggregateException: One or more errors occurred. (以一种访问权限不允许的方式做了一个访问套接字的尝试。) (以一种访问权限不允许的方式做了一个访问套接字的尝试。) + ---> System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + --- End of inner exception stack trace --- + ---> (Inner Exception #1) System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken)<--- + + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(ListenOptions[] listenOptions, AddressBindContext context, Func`2 useHttps, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.Internal.Host.b__15_1(IHostedService service, CancellationToken token) + at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation) + at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at APIJSON.NET.Program.Main(String[] args) in E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\Program.cs:line 36 +2024-02-04 12:36:06.186 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 12:36:07.838 +08:00 [INF] Loaded ABP modules: +2024-02-04 12:36:07.839 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 12:36:07.839 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 12:36:07.840 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 12:36:08.113 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 12:36:08.881 +08:00 [INF] Initialized all ABP modules. +2024-02-04 12:36:08.991 +08:00 [INF] Unable to bind to https://localhost:49796 on the IPv4 loopback interface: '以一种访问权限不允许的方式做了一个访问套接字的尝试。'. +2024-02-04 12:36:08.992 +08:00 [INF] Unable to bind to https://localhost:49796 on the IPv6 loopback interface: '以一种访问权限不允许的方式做了一个访问套接字的尝试。'. +2024-02-04 12:36:08.997 +08:00 [ERR] Hosting failed to start +System.IO.IOException: Failed to bind to address https://localhost:49796. + ---> System.AggregateException: One or more errors occurred. (以一种访问权限不允许的方式做了一个访问套接字的尝试。) (以一种访问权限不允许的方式做了一个访问套接字的尝试。) + ---> System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + --- End of inner exception stack trace --- + ---> (Inner Exception #1) System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken)<--- + + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(ListenOptions[] listenOptions, AddressBindContext context, Func`2 useHttps, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.Internal.Host.b__15_1(IHostedService service, CancellationToken token) + at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation) + at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at APIJSON.NET.Program.Main(String[] args) in E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\Program.cs:line 36 +2024-02-04 12:36:09.024 +08:00 [FTL] Host terminated unexpectedly! +System.IO.IOException: Failed to bind to address https://localhost:49796. + ---> System.AggregateException: One or more errors occurred. (以一种访问权限不允许的方式做了一个访问套接字的尝试。) (以一种访问权限不允许的方式做了一个访问套接字的尝试。) + ---> System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + --- End of inner exception stack trace --- + ---> (Inner Exception #1) System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken)<--- + + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(ListenOptions[] listenOptions, AddressBindContext context, Func`2 useHttps, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.Internal.Host.b__15_1(IHostedService service, CancellationToken token) + at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation) + at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at APIJSON.NET.Program.Main(String[] args) in E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\Program.cs:line 36 +2024-02-04 12:36:28.324 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 12:36:30.059 +08:00 [INF] Loaded ABP modules: +2024-02-04 12:36:30.060 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 12:36:30.060 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 12:36:30.329 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 12:36:31.096 +08:00 [INF] Initialized all ABP modules. +2024-02-04 12:36:31.208 +08:00 [INF] Unable to bind to https://localhost:49786 on the IPv4 loopback interface: '以一种访问权限不允许的方式做了一个访问套接字的尝试。'. +2024-02-04 12:36:31.208 +08:00 [INF] Unable to bind to https://localhost:49786 on the IPv6 loopback interface: '以一种访问权限不允许的方式做了一个访问套接字的尝试。'. +2024-02-04 12:36:31.215 +08:00 [ERR] Hosting failed to start +System.IO.IOException: Failed to bind to address https://localhost:49786. + ---> System.AggregateException: One or more errors occurred. (以一种访问权限不允许的方式做了一个访问套接字的尝试。) (以一种访问权限不允许的方式做了一个访问套接字的尝试。) + ---> System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + --- End of inner exception stack trace --- + ---> (Inner Exception #1) System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken)<--- + + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(ListenOptions[] listenOptions, AddressBindContext context, Func`2 useHttps, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.Internal.Host.b__15_1(IHostedService service, CancellationToken token) + at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation) + at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at APIJSON.NET.Program.Main(String[] args) in E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\Program.cs:line 36 +2024-02-04 12:36:31.245 +08:00 [FTL] Host terminated unexpectedly! +System.IO.IOException: Failed to bind to address https://localhost:49786. + ---> System.AggregateException: One or more errors occurred. (以一种访问权限不允许的方式做了一个访问套接字的尝试。) (以一种访问权限不允许的方式做了一个访问套接字的尝试。) + ---> System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + --- End of inner exception stack trace --- + ---> (Inner Exception #1) System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。 + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken)<--- + + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Core.LocalhostListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(ListenOptions[] listenOptions, AddressBindContext context, Func`2 useHttps, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.Internal.Host.b__15_1(IHostedService service, CancellationToken token) + at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation) + at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) + at APIJSON.NET.Program.Main(String[] args) in E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\Program.cs:line 36 +2024-02-04 13:24:01.883 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 13:24:03.930 +08:00 [INF] Loaded ABP modules: +2024-02-04 13:24:03.930 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 13:24:03.930 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 13:24:03.931 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 13:24:04.366 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 13:24:05.279 +08:00 [INF] Initialized all ABP modules. +2024-02-04 13:24:05.460 +08:00 [INF] Now listening on: https://localhost:42786 +2024-02-04 13:24:05.460 +08:00 [INF] Application started. Press Ctrl+C to shut down. +2024-02-04 13:24:05.460 +08:00 [INF] Hosting environment: Development +2024-02-04 13:24:05.460 +08:00 [INF] Content root path: E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET +2024-02-04 13:24:09.244 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/ - null null +2024-02-04 13:24:09.607 +08:00 [INF] Executing endpoint 'APIJSON.NET.Controllers.HomeController.Index (APIJSON.NET)' +2024-02-04 13:24:09.640 +08:00 [INF] Route matched with {action = "Index", controller = "Home", area = ""}. Executing controller action with signature Microsoft.AspNetCore.Mvc.IActionResult Index() on controller APIJSON.NET.Controllers.HomeController (APIJSON.NET). +2024-02-04 13:24:09.759 +08:00 [INF] Executing action method APIJSON.NET.Controllers.HomeController.Index (APIJSON.NET) - Validation state: "Valid" +2024-02-04 13:24:09.762 +08:00 [INF] Executed action method APIJSON.NET.Controllers.HomeController.Index (APIJSON.NET), returned result Microsoft.AspNetCore.Mvc.VirtualFileResult in 0.4545ms. +2024-02-04 13:24:09.773 +08:00 [INF] Executing VirtualFileResult, sending file './index.html' with download name '' ... +2024-02-04 13:24:09.808 +08:00 [INF] Executed action APIJSON.NET.Controllers.HomeController.Index (APIJSON.NET) in 165.4196ms +2024-02-04 13:24:09.809 +08:00 [INF] Executed endpoint 'APIJSON.NET.Controllers.HomeController.Index (APIJSON.NET)' +2024-02-04 13:24:09.810 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/css/hint.min.css - null null +2024-02-04 13:24:09.810 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/css/loading.css - null null +2024-02-04 13:24:09.812 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/css/main.css - null null +2024-02-04 13:24:09.820 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/js/vue.min.js - null null +2024-02-04 13:24:09.821 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/js/jquery.js - null null +2024-02-04 13:24:09.829 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/js/jsonlint.js - null null +2024-02-04 13:24:09.876 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/js/editor.js - null null +2024-02-04 13:24:09.876 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/js/parse.js - null null +2024-02-04 13:24:09.947 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/js/localforage.min.js - null null +2024-02-04 13:24:09.959 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/js/FileSaver.js - null null +2024-02-04 13:24:09.974 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/js/helper.js - null null +2024-02-04 13:24:09.974 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/js/uuid.js - null null +2024-02-04 13:24:09.974 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/js/main.js - null null +2024-02-04 13:24:09.974 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/js/clipboard.min.js - null null +2024-02-04 13:24:09.974 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/_framework/aspnetcore-browser-refresh.js - null null +2024-02-04 13:24:09.974 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/svg/icon.svg - null null +2024-02-04 13:24:09.974 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/_vs/browserLink - null null +2024-02-04 13:24:09.978 +08:00 [INF] Sending file. Request path: '/js/editor.js'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\js\editor.js' +2024-02-04 13:24:09.978 +08:00 [INF] Sending file. Request path: '/css/loading.css'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\css\loading.css' +2024-02-04 13:24:09.978 +08:00 [INF] Sending file. Request path: '/js/parse.js'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\js\parse.js' +2024-02-04 13:24:09.979 +08:00 [INF] Sending file. Request path: '/css/hint.min.css'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\css\hint.min.css' +2024-02-04 13:24:09.980 +08:00 [INF] Sending file. Request path: '/css/main.css'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\css\main.css' +2024-02-04 13:24:09.981 +08:00 [INF] Sending file. Request path: '/js/jsonlint.js'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\js\jsonlint.js' +2024-02-04 13:24:09.981 +08:00 [INF] Sending file. Request path: '/js/FileSaver.js'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\js\FileSaver.js' +2024-02-04 13:24:09.982 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/css/hint.min.css - 200 9631 text/css 170.5663ms +2024-02-04 13:24:09.982 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/css/main.css - 200 8617 text/css 169.3931ms +2024-02-04 13:24:09.982 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/js/FileSaver.js - 200 12533 application/javascript 23.2624ms +2024-02-04 13:24:09.982 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/js/parse.js - 200 1903 application/javascript 103.4859ms +2024-02-04 13:24:09.982 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/ - 200 null text/html 741.4393ms +2024-02-04 13:24:09.982 +08:00 [INF] Sending file. Request path: '/js/helper.js'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\js\helper.js' +2024-02-04 13:24:09.982 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/css/loading.css - 200 2012 text/css 169.4139ms +2024-02-04 13:24:09.982 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/js/jsonlint.js - 200 8831 application/javascript 152.9287ms +2024-02-04 13:24:09.982 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/js/editor.js - 200 964 application/javascript 103.5691ms +2024-02-04 13:24:09.982 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/js/helper.js - 200 314 application/javascript 8.5496ms +2024-02-04 13:24:09.985 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/_framework/aspnetcore-browser-refresh.js - 200 13758 application/javascript; charset=utf-8 10.8048ms +2024-02-04 13:24:10.023 +08:00 [INF] Sending file. Request path: '/js/uuid.js'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\js\uuid.js' +2024-02-04 13:24:10.023 +08:00 [INF] Sending file. Request path: '/js/clipboard.min.js'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\js\clipboard.min.js' +2024-02-04 13:24:10.023 +08:00 [INF] Sending file. Request path: '/js/localforage.min.js'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\js\localforage.min.js' +2024-02-04 13:24:10.023 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/js/uuid.js - 200 2332 application/javascript 50.2195ms +2024-02-04 13:24:10.023 +08:00 [INF] Sending file. Request path: '/js/main.js'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\js\main.js' +2024-02-04 13:24:10.023 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/js/clipboard.min.js - 200 10923 application/javascript 50.1902ms +2024-02-04 13:24:10.023 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/js/localforage.min.js - 200 25354 application/javascript 76.9606ms +2024-02-04 13:24:10.024 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/js/main.js - 200 10840 application/javascript 49.5733ms +2024-02-04 13:24:10.024 +08:00 [INF] Sending file. Request path: '/svg/icon.svg'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\svg\icon.svg' +2024-02-04 13:24:10.025 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/svg/icon.svg - 200 16669 image/svg+xml 50.2147ms +2024-02-04 13:24:10.026 +08:00 [INF] Sending file. Request path: '/js/vue.min.js'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\js\vue.min.js' +2024-02-04 13:24:10.026 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/js/vue.min.js - 200 72070 application/javascript 206.547ms +2024-02-04 13:24:10.034 +08:00 [INF] Sending file. Request path: '/js/jquery.js'. Physical path: 'E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET\wwwroot\js\jquery.js' +2024-02-04 13:24:10.034 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/js/jquery.js - 200 276875 application/javascript 213.8547ms +2024-02-04 13:24:10.135 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/_vs/browserLink - 200 null text/javascript; charset=UTF-8 160.4953ms +2024-02-04 13:24:10.149 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/favicon.ico - null null +2024-02-04 13:24:10.154 +08:00 [INF] Executing endpoint '405 HTTP Method Not Supported' +2024-02-04 13:24:10.154 +08:00 [INF] Executed endpoint '405 HTTP Method Not Supported' +2024-02-04 13:24:10.154 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/favicon.ico - 405 0 null 5.4415ms +2024-02-04 13:24:19.899 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/favicon.ico - null null +2024-02-04 13:24:19.901 +08:00 [INF] Executing endpoint '405 HTTP Method Not Supported' +2024-02-04 13:24:19.901 +08:00 [INF] Executed endpoint '405 HTTP Method Not Supported' +2024-02-04 13:24:19.901 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/favicon.ico - 405 0 null 2.8212ms +2024-02-04 15:23:50.160 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 15:23:51.820 +08:00 [INF] Loaded ABP modules: +2024-02-04 15:23:51.821 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 15:23:51.821 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 15:23:52.130 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 15:24:59.065 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 15:25:00.673 +08:00 [INF] Loaded ABP modules: +2024-02-04 15:25:00.673 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 15:25:00.673 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 15:25:00.674 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 15:25:00.674 +08:00 [INF] - APIJSON.NET.SqlSugar.ApiJsonNetDataModule +2024-02-04 15:25:00.989 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 15:25:01.767 +08:00 [INF] Initialized all ABP modules. +2024-02-04 15:25:01.886 +08:00 [INF] Now listening on: https://localhost:42786 +2024-02-04 15:25:01.886 +08:00 [INF] Application started. Press Ctrl+C to shut down. +2024-02-04 15:25:01.886 +08:00 [INF] Hosting environment: Development +2024-02-04 15:25:01.886 +08:00 [INF] Content root path: E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET +2024-02-04 15:25:12.932 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/_framework/aspnetcore-browser-refresh.js - null null +2024-02-04 15:25:12.932 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/_vs/browserLink - null null +2024-02-04 15:25:12.956 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/_framework/aspnetcore-browser-refresh.js - 200 13758 application/javascript; charset=utf-8 23.8275ms +2024-02-04 15:25:12.990 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/_vs/browserLink - 200 null text/javascript; charset=UTF-8 61.6177ms +2024-02-04 15:25:13.027 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/favicon.ico - null null +2024-02-04 15:25:13.145 +08:00 [INF] Executing endpoint '405 HTTP Method Not Supported' +2024-02-04 15:25:13.145 +08:00 [INF] Executed endpoint '405 HTTP Method Not Supported' +2024-02-04 15:25:13.148 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/favicon.ico - 405 0 null 121.7504ms +2024-02-04 15:47:22.194 +08:00 [INF] Starting APIJSON.NET.Host. +2024-02-04 15:47:24.493 +08:00 [INF] Loaded ABP modules: +2024-02-04 15:47:24.494 +08:00 [INF] - APIJSON.NET.AppModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Data.AbpDataModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.UI.AbpUiModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule +2024-02-04 15:47:24.494 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2024-02-04 15:47:24.495 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2024-02-04 15:47:24.495 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule +2024-02-04 15:47:24.495 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule +2024-02-04 15:47:24.495 +08:00 [INF] - APIJSON.Data.ApiJsonNetDataModule +2024-02-04 15:47:24.780 +08:00 [INF] User profile is available. Using 'C:\Users\liaozb\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2024-02-04 15:47:25.532 +08:00 [INF] Initialized all ABP modules. +2024-02-04 15:47:25.651 +08:00 [INF] Now listening on: https://localhost:42786 +2024-02-04 15:47:25.651 +08:00 [INF] Application started. Press Ctrl+C to shut down. +2024-02-04 15:47:25.652 +08:00 [INF] Hosting environment: Development +2024-02-04 15:47:25.652 +08:00 [INF] Content root path: E:\Github\APIJSON.NET\APIJSON.NET\APIJSON.NET +2024-02-04 15:47:32.943 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/_framework/aspnetcore-browser-refresh.js - null null +2024-02-04 15:47:32.943 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/_vs/browserLink - null null +2024-02-04 15:47:32.968 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/_framework/aspnetcore-browser-refresh.js - 200 13758 application/javascript; charset=utf-8 29.0063ms +2024-02-04 15:47:33.000 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/_vs/browserLink - 200 null text/javascript; charset=UTF-8 61.8765ms +2024-02-04 15:47:33.025 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/favicon.ico - null null +2024-02-04 15:47:33.138 +08:00 [INF] Executing endpoint '405 HTTP Method Not Supported' +2024-02-04 15:47:33.139 +08:00 [INF] Executed endpoint '405 HTTP Method Not Supported' +2024-02-04 15:47:33.142 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/favicon.ico - 405 0 null 116.8573ms +2024-02-04 15:47:39.867 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/swagger - null null +2024-02-04 15:47:40.108 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/swagger - 301 0 null 240.6922ms +2024-02-04 15:47:40.111 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/swagger/index.html - null null +2024-02-04 15:47:40.191 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/swagger/index.html - 200 null text/html;charset=utf-8 79.9549ms +2024-02-04 15:47:40.197 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/swagger/swagger-ui.css - null null +2024-02-04 15:47:40.200 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/swagger/swagger-ui-bundle.js - null null +2024-02-04 15:47:40.200 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/swagger/ui/abp.swagger.js - null null +2024-02-04 15:47:40.200 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/swagger/ui/abp.js - null null +2024-02-04 15:47:40.200 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/_framework/aspnetcore-browser-refresh.js - null null +2024-02-04 15:47:40.200 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/swagger/swagger-ui-standalone-preset.js - null null +2024-02-04 15:47:40.209 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/_framework/aspnetcore-browser-refresh.js - 200 13758 application/javascript; charset=utf-8 8.3443ms +2024-02-04 15:47:40.236 +08:00 [INF] Sending file. Request path: '/swagger/ui/abp.js'. Physical path: 'N/A' +2024-02-04 15:47:40.237 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/swagger/ui/abp.js - 200 3122 application/javascript 36.343ms +2024-02-04 15:47:40.245 +08:00 [INF] Sending file. Request path: '/swagger/ui/abp.swagger.js'. Physical path: 'N/A' +2024-02-04 15:47:40.247 +08:00 [INF] Sending file. Request path: '/swagger-ui.css'. Physical path: 'N/A' +2024-02-04 15:47:40.251 +08:00 [INF] Sending file. Request path: '/swagger-ui-standalone-preset.js'. Physical path: 'N/A' +2024-02-04 15:47:40.253 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/swagger/swagger-ui.css - 200 144929 text/css 56.0193ms +2024-02-04 15:47:40.253 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/swagger/ui/abp.swagger.js - 200 4375 application/javascript 53.1194ms +2024-02-04 15:47:40.253 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/swagger/swagger-ui-standalone-preset.js - 200 312163 text/javascript 52.6814ms +2024-02-04 15:47:40.262 +08:00 [INF] Sending file. Request path: '/swagger-ui-bundle.js'. Physical path: 'N/A' +2024-02-04 15:47:40.262 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/_vs/browserLink - null null +2024-02-04 15:47:40.263 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/swagger/swagger-ui-bundle.js - 200 1061536 text/javascript 62.882ms +2024-02-04 15:47:40.281 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/_vs/browserLink - 200 null text/javascript; charset=UTF-8 18.3651ms +2024-02-04 15:47:40.394 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/api/abp/application-configuration - null null +2024-02-04 15:47:40.396 +08:00 [INF] Executing endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController.GetAsync (Volo.Abp.AspNetCore.Mvc)' +2024-02-04 15:47:40.417 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/swagger/v1/swagger.json - null null +2024-02-04 15:47:40.425 +08:00 [INF] Request starting HTTP/2 GET https://localhost:42786/swagger/favicon-32x32.png - null null +2024-02-04 15:47:40.426 +08:00 [INF] Sending file. Request path: '/favicon-32x32.png'. Physical path: 'N/A' +2024-02-04 15:47:40.427 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/swagger/favicon-32x32.png - 200 628 image/png 1.9458ms +2024-02-04 15:47:40.445 +08:00 [INF] Route matched with {area = "abp", action = "Get", controller = "AbpApplicationConfiguration"}. Executing controller action with signature System.Threading.Tasks.Task`1[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto] GetAsync(Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationRequestOptions) on controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController (Volo.Abp.AspNetCore.Mvc). +2024-02-04 15:47:40.539 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/swagger/v1/swagger.json - 200 null application/json;charset=utf-8 121.9611ms +2024-02-04 15:47:40.588 +08:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController.GetAsync (Volo.Abp.AspNetCore.Mvc) - Validation state: "Valid" +2024-02-04 15:47:40.639 +08:00 [DBG] Executing AbpApplicationConfigurationAppService.GetAsync()... +2024-02-04 15:47:40.800 +08:00 [DBG] Executed AbpApplicationConfigurationAppService.GetAsync(). +2024-02-04 15:47:40.804 +08:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController.GetAsync (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 213.9227ms. +2024-02-04 15:47:40.812 +08:00 [INF] Executing ObjectResult, writing value of type 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto'. +2024-02-04 15:47:40.844 +08:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController.GetAsync (Volo.Abp.AspNetCore.Mvc) in 395.6075ms +2024-02-04 15:47:40.845 +08:00 [INF] Executed endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController.GetAsync (Volo.Abp.AspNetCore.Mvc)' +2024-02-04 15:47:40.845 +08:00 [INF] Request finished HTTP/2 GET https://localhost:42786/api/abp/application-configuration - 200 null application/json; charset=utf-8 451.1174ms diff --git a/APIJSON.NET/APIJSON.NET/Models/TokenAuthConfiguration.cs b/APIJSON.NET/APIJSON.NET/Models/TokenAuthConfiguration.cs deleted file mode 100644 index b9beade..0000000 --- a/APIJSON.NET/APIJSON.NET/Models/TokenAuthConfiguration.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Microsoft.IdentityModel.Tokens; -using System; - -namespace APIJSON.NET -{ - public class TokenAuthConfiguration - { - public SymmetricSecurityKey SecurityKey { get; set; } - - public string Issuer { get; set; } - - public string Audience { get; set; } - - public SigningCredentials SigningCredentials { get; set; } - - public TimeSpan Expiration { get; set; } - } -} diff --git a/APIJSON.NET/APIJSON.NET/Program.cs b/APIJSON.NET/APIJSON.NET/Program.cs index 671614d..f19d9a1 100644 --- a/APIJSON.NET/APIJSON.NET/Program.cs +++ b/APIJSON.NET/APIJSON.NET/Program.cs @@ -1,83 +1,55 @@ -using APIJSON.NET; -using APIJSON.NET.Models; -using APIJSON.NET.Services; -using Microsoft.AspNetCore; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Microsoft.IdentityModel.Tokens; -using Microsoft.OpenApi.Models; +using Serilog.Events; +using Serilog; using System; -using System.Collections.Generic; -using System.Net; -using System.Text; +using System.Threading.Tasks; -const string _defaultCorsPolicyName = "localhost"; -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. - -builder.Services.AddControllers().AddNewtonsoftJson(options => -{ - options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; - options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; -}); -// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle -builder.Services.AddEndpointsApiExplorer(); - -builder.Services.Configure>(builder.Configuration.GetSection("RoleList")); -builder.Services.Configure>(builder.Configuration.GetSection("tablempper")); -builder.Services.Configure(tokenAuthConfig => +namespace APIJSON.NET; +public class Program { - tokenAuthConfig.SecurityKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(builder.Configuration["Authentication:JwtBearer:SecurityKey"])); - tokenAuthConfig.Issuer = builder.Configuration["Authentication:JwtBearer:Issuer"]; - tokenAuthConfig.Audience = builder.Configuration["Authentication:JwtBearer:Audience"]; - tokenAuthConfig.SigningCredentials = new SigningCredentials(tokenAuthConfig.SecurityKey, SecurityAlgorithms.HmacSha256); - tokenAuthConfig.Expiration = TimeSpan.FromDays(1); -}); -AuthConfigurer.Configure(builder.Services, builder.Configuration); - -var origins = builder.Configuration.GetSection("CorsUrls").Value.Split(","); -builder.Services.AddCors(options => options.AddPolicy(_defaultCorsPolicyName, - builder => - builder.WithOrigins(origins) - .AllowAnyHeader() - .AllowAnyMethod().AllowCredentials() - )); - -builder.Services.AddSwaggerGen(c => -{ - c.SwaggerDoc("v1", new OpenApiInfo { Title = "APIJSON.NET", Version = "v1" }); -}); -builder.Services.AddSingleton(); - -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddTransient(); -builder.Services.AddTransient(); - - -var app = builder.Build(); - -// Configure the HTTP request pipeline. -if (app.Environment.IsDevelopment()) -{ - app.UseSwagger(); - app.UseSwaggerUI(c => + public async static Task Main(string[] args) { - c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); - - }); + Log.Logger = new LoggerConfiguration() +#if DEBUG + .MinimumLevel.Debug() + .WriteTo.Async(c => c.Console()) +#else + .MinimumLevel.Information() +#endif + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) + .CreateLogger(); + + try + { + Log.Information("Starting APIJSON.NET.Host."); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() + .UseAutofac() + .UseSerilog(); + await builder.AddApplicationAsync(); + var app = builder.Build(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); + return 0; + } + catch (Exception ex) + { + if (ex is HostAbortedException) + { + throw; + } + + Log.Fatal(ex, "Host terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } + } } - -app.UseHttpsRedirection(); -app.UseDefaultFiles(); -app.UseStaticFiles(); -app.UseAuthorization(); -app.UseCors(_defaultCorsPolicyName); -app.MapControllers(); -app.UseJwtTokenMiddleware(); -DbInit.Initialize(app); -app.Run(); \ No newline at end of file + \ No newline at end of file diff --git a/APIJSON.NET/APIJSON.NET/Infrastructure/AuthConfigurer.cs b/APIJSON.NET/APIJSON.NET/Services/AuthConfigurer.cs similarity index 100% rename from APIJSON.NET/APIJSON.NET/Infrastructure/AuthConfigurer.cs rename to APIJSON.NET/APIJSON.NET/Services/AuthConfigurer.cs diff --git a/APIJSON.NET/APIJSON.NET/Data/DbInit.cs b/APIJSON.NET/APIJSON.NET/Services/DbInit.cs similarity index 59% rename from APIJSON.NET/APIJSON.NET/Data/DbInit.cs rename to APIJSON.NET/APIJSON.NET/Services/DbInit.cs index 2b395c2..ec8d7f4 100644 --- a/APIJSON.NET/APIJSON.NET/Data/DbInit.cs +++ b/APIJSON.NET/APIJSON.NET/Services/DbInit.cs @@ -1,20 +1,27 @@ -using APIJSON.NET.Data.Models; +using APIJSON.Data; +using APIJSON.Data.Models; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; -using SqlSugar; using System; using System.Collections.Generic; using System.Text; -namespace APIJSON.NET + +namespace APIJSON.NET.Data; + +public static class DbInit { - public static class DbInit + /// + /// 初始化用户表和数据 + /// + /// + public static void Initialize(IApplicationBuilder app) { - public static void Initialize(IApplicationBuilder app) + using (var scope = app.ApplicationServices.CreateScope()) { - var db = app.ApplicationServices.GetRequiredService(); + var db = scope.ServiceProvider.GetRequiredService(); db.Db.CodeFirst.InitTables(typeof(Login)); - if (!db.LoginDb.IsAny(it=>it.userId>0)) + if (!db.LoginDb.IsAny(it => it.userId > 0)) { var ds = new List(); @@ -22,7 +29,7 @@ public static void Initialize(IApplicationBuilder app) { var d = new Login(); d.userId = i; - d.userName = "admin"+i.ToString(); + d.userName = "admin" + i.ToString(); d.passWordSalt = Guid.NewGuid().ToString(); d.passWord = SimpleStringCipher.Instance.Encrypt("123456", null, Encoding.ASCII.GetBytes(d.passWordSalt)); d.roleCode = "role1"; @@ -32,7 +39,8 @@ public static void Initialize(IApplicationBuilder app) } - } + + } } diff --git a/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs b/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs index b017ab0..d445443 100644 --- a/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs +++ b/APIJSON.NET/APIJSON.NET/Services/IdentityService.cs @@ -1,4 +1,5 @@ -using APIJSON.NET.Models; +using APIJSON.Data; +using APIJSON.Data.Models; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Options; using System; @@ -7,13 +8,14 @@ using System.Security.Claims; using System.Text.RegularExpressions; using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; namespace APIJSON.NET.Services { /// /// /// - public class IdentityService : IIdentityService + public class IdentityService : IIdentityService,ITransientDependency { private IHttpContextAccessor _context; private List roles; diff --git a/APIJSON.NET/APIJSON.NET/Services/JwtTokenMiddleware.cs b/APIJSON.NET/APIJSON.NET/Services/JwtTokenMiddleware.cs new file mode 100644 index 0000000..fffc899 --- /dev/null +++ b/APIJSON.NET/APIJSON.NET/Services/JwtTokenMiddleware.cs @@ -0,0 +1,24 @@ +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Builder; + +namespace APIJSON.NET; + +public static class JwtTokenMiddleware +{ + public static IApplicationBuilder UseJwtTokenMiddleware(this IApplicationBuilder app) + { + return app.Use(async (ctx, next) => + { + if (ctx.User.Identity?.IsAuthenticated != true) + { + var result = await ctx.AuthenticateAsync("JwtBearer"); + if (result.Succeeded && result.Principal != null) + { + ctx.User = result.Principal; + } + } + + await next(); + }); + } +} diff --git a/APIJSON.NET/APIJSON.NET/Services/TokenAuthConfiguration.cs b/APIJSON.NET/APIJSON.NET/Services/TokenAuthConfiguration.cs new file mode 100644 index 0000000..e0b8d75 --- /dev/null +++ b/APIJSON.NET/APIJSON.NET/Services/TokenAuthConfiguration.cs @@ -0,0 +1,18 @@ +using Microsoft.IdentityModel.Tokens; +using System; +using Volo.Abp.DependencyInjection; + +namespace APIJSON.NET.Data.Models; + +public class TokenAuthConfiguration:ISingletonDependency +{ + public SymmetricSecurityKey SecurityKey { get; set; } + + public string Issuer { get; set; } + + public string Audience { get; set; } + + public SigningCredentials SigningCredentials { get; set; } + + public TimeSpan Expiration { get; set; } +} diff --git a/APIJSON.NET/APIJSON.NET/Startup.cs b/APIJSON.NET/APIJSON.NET/Startup.cs deleted file mode 100644 index 1422d41..0000000 --- a/APIJSON.NET/APIJSON.NET/Startup.cs +++ /dev/null @@ -1,93 +0,0 @@ -namespace APIJSON.NET -{ - using System; - using System.Collections.Generic; - using System.Text; - using APIJSON.NET.Models; - using APIJSON.NET.Services; - using Microsoft.AspNetCore.Builder; - using Microsoft.AspNetCore.Hosting; - using Microsoft.AspNetCore.Http; - using Microsoft.AspNetCore.Mvc; - using Microsoft.Extensions.Configuration; - using Microsoft.Extensions.DependencyInjection; - using Microsoft.IdentityModel.Tokens; - using Microsoft.OpenApi.Models; - using Swashbuckle.AspNetCore.Swagger; - - public class Startup - { - private const string _defaultCorsPolicyName = "localhost"; - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - - services.Configure>(Configuration.GetSection("RoleList")); - services.Configure>(Configuration.GetSection("tablempper")); - services.Configure(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(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddTransient(); - services.AddTransient(); - - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - app.UseRouting(); - app.UseAuthentication(); - app.UseDefaultFiles(); - app.UseStaticFiles(); - app.UseCors(_defaultCorsPolicyName); - app.UseSwagger(); - app.UseSwaggerUI(c => - { - c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); - - }); - app.UseEndpoints(endpoints => - { - endpoints.MapDefaultControllerRoute(); - //endpoints.MapControllers(); - }); - app.UseJwtTokenMiddleware(); - DbInit.Initialize(app); - } - } -} diff --git a/APIJSON.NET/APIJSON.NET/appsettings.json b/APIJSON.NET/APIJSON.NET/appsettings.json index 94ff268..f6ffb5e 100644 --- a/APIJSON.NET/APIJSON.NET/appsettings.json +++ b/APIJSON.NET/APIJSON.NET/appsettings.json @@ -1,7 +1,7 @@ { "ConnectionStrings": { - "DbType": 1, //0:MySql,1:SqlServer,2:Sqlite - "ConnectionString": "Server=localhost;Database=APIJSON.NET;Uid=sa;Pwd=sa123qwe,;" + "DbType": 0, //0:MySql,1:SqlServer,2:Sqlite + "ConnectionString": "Server=localhost;Port=3306;Database=APIJSON_NET;Uid=root;Pwd=admin;" //"ConnectionString": "Server=119.29.9.25;Port=3306;Database=test;Uid=root;Pwd=1q,2w.3e?;CharSet=UTF8;" }, "CorsUrls": "http://localhost:5000,http://localhost5001", diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.csproj b/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.csproj deleted file mode 100644 index ef2a11b..0000000 --- a/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.csproj +++ /dev/null @@ -1,97 +0,0 @@ - - - - - Debug - AnyCPU - {DC07586E-7241-4BB5-9200-CE57A81C5E27} - Library - Properties - APIJSON.NET - ApiJson.Common - v4.6.1 - 512 - true - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - - packages\AspectCore.Extensions.Reflection.1.2.0\lib\net45\AspectCore.Extensions.Reflection.dll - - - - packages\Microsoft.Extensions.DependencyInjection.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll - - - packages\Microsoft.Extensions.Options.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Options.dll - - - packages\Microsoft.Extensions.Primitives.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll - - - packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - - - packages\sqlSugar.4.9.9.10\lib\SqlSugar.dll - - - - packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll - - - packages\System.ComponentModel.Annotations.4.5.0\lib\net461\System.ComponentModel.Annotations.dll - - - - - packages\System.Memory.4.5.1\lib\netstandard2.0\System.Memory.dll - - - - packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll - - - packages\System.Runtime.CompilerServices.Unsafe.4.5.1\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.sln b/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.sln deleted file mode 100644 index 9689606..0000000 --- a/APIJSON.NET/APIJSONCommon/ApiJson.Common_461.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28803.202 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApiJson.Common_461", "ApiJson.Common_461.csproj", "{DC07586E-7241-4BB5-9200-CE57A81C5E27}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APIJSON.NET.Test", "..\APIJSON.NET.Test\APIJSON.NET.Test.csproj", "{3F99B6A8-3A58-4714-A0FF-186BE2874A68}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DC07586E-7241-4BB5-9200-CE57A81C5E27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DC07586E-7241-4BB5-9200-CE57A81C5E27}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DC07586E-7241-4BB5-9200-CE57A81C5E27}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DC07586E-7241-4BB5-9200-CE57A81C5E27}.Release|Any CPU.Build.0 = Release|Any CPU - {3F99B6A8-3A58-4714-A0FF-186BE2874A68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3F99B6A8-3A58-4714-A0FF-186BE2874A68}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3F99B6A8-3A58-4714-A0FF-186BE2874A68}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3F99B6A8-3A58-4714-A0FF-186BE2874A68}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {53F36702-3FD9-4AF5-A4C3-E3C30C943492} - EndGlobalSection -EndGlobal diff --git a/APIJSON.NET/APIJSONCommon/FuncList.cs b/APIJSON.NET/APIJSONCommon/FuncList.cs deleted file mode 100644 index a92f653..0000000 --- a/APIJSON.NET/APIJSONCommon/FuncList.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Linq; - -namespace APIJSON.NET -{ - /// - /// 自定义方法 - /// - public class FuncList - { - /// - /// - /// - /// - /// - /// - public string Merge(object a, object b) - { - return a.ToString() + b.ToString(); - } - - /// - /// - /// - /// - /// - /// - public object MergeObj(object a, object b) - { - return new { a, b }; - } - - /// - /// - /// - /// - /// - /// - public bool isContain(object a, object b) - { - return a.ToString().Split(',').Contains(b); - } - } -} diff --git a/APIJSON.NET/APIJSONCommon/Infrastructure/StringExtensions.cs b/APIJSON.NET/APIJSONCommon/Infrastructure/StringExtensions.cs deleted file mode 100644 index e806081..0000000 --- a/APIJSON.NET/APIJSONCommon/Infrastructure/StringExtensions.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace APIJSON.NET -{ - using System; - using System.Text.RegularExpressions; - public static class StringExtensions - { - - /// - /// 是否有值 - /// - /// - /// - public static bool IsValue(this object str) - { - return str != null && !string.IsNullOrEmpty(str.ToString()); - } - - /// - /// - /// - /// - /// - public static string GetParamName(this string param) - { - return param + new Random().Next(1, 100); - } - - } -} \ No newline at end of file diff --git a/APIJSON.NET/APIJSONCommon/Models/DbOptions.cs b/APIJSON.NET/APIJSONCommon/Models/DbOptions.cs deleted file mode 100644 index 8d4c3a3..0000000 --- a/APIJSON.NET/APIJSONCommon/Models/DbOptions.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace APIJSON.NET -{ - using SqlSugar; - public class DbOptions - { - /// - /// - /// - public DbType DbType { get; set; } - - /// - /// - /// - public string ConnectionString { get; set; } - } -} diff --git a/APIJSON.NET/APIJSONCommon/Models/RoleItem.cs b/APIJSON.NET/APIJSONCommon/Models/RoleItem.cs deleted file mode 100644 index 05a20d5..0000000 --- a/APIJSON.NET/APIJSONCommon/Models/RoleItem.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace APIJSON.NET.Models -{ - 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; } - - } - -} diff --git a/APIJSON.NET/APIJSONCommon/SelectTable.cs b/APIJSON.NET/APIJSONCommon/SelectTable.cs deleted file mode 100644 index c786308..0000000 --- a/APIJSON.NET/APIJSONCommon/SelectTable.cs +++ /dev/null @@ -1,829 +0,0 @@ -namespace APIJSON.NET -{ - 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; - - /// - /// - /// - public class SelectTable - { - private readonly IIdentityService _identitySvc; - private readonly ITableMapper _tableMapper; - private readonly SqlSugarClient db; - - /// - /// - /// - /// - /// - /// - public SelectTable(IIdentityService identityService, ITableMapper tableMapper, SqlSugarClient dbClient) - { - _identitySvc = identityService; - _tableMapper = tableMapper; - db = dbClient; - } - /// - /// 判断表名是否正确 - /// - /// - /// - public virtual bool IsTable(string table) - { - return db.DbMaintenance.GetTableInfoList().Any(it => it.Name.Equals(table, StringComparison.CurrentCultureIgnoreCase)); - } - /// - /// 判断表的列名是否正确 - /// - /// - /// - /// - public virtual bool IsCol(string table, string col) - { - return db.DbMaintenance.GetColumnInfosByTableName(table).Any(it => it.DbColumnName.Equals(col, StringComparison.CurrentCultureIgnoreCase)); - } - - /// - /// - /// - /// - /// - /// - /// - /// - /// - public virtual Tuple 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(new List(), tb.Count()); - else - { - if (count > 0) - { - int total = 0; - if (query == 0)//0-对象 - return new Tuple(tb.ToPageList(page, count), total); - else - //2-以上全部 - return new Tuple(tb.ToPageList(page, count, ref total), total); - - } - else - { - if (query == 0) - return new Tuple(tb.ToList(), 0); - else - return new Tuple(tb.ToList(), tb.Count()); - } - } - } - - /// - /// 解析并查询 - /// - /// - /// - public virtual JObject Query(string queryJson) - { - JObject resultObj = new JObject(); - - JObject queryJobj = JObject.Parse(queryJson); - resultObj = Query(queryJobj); - return resultObj; - } - - /// - /// 单表查询 - /// - /// - /// 返回数据的节点名称 默认为 infos - /// - public virtual JObject QuerySingle(JObject queryObj, string nodeName = "infos") - { - JObject resultObj = new JObject(); - resultObj.Add("code", "200"); - resultObj.Add("msg", "success"); - - int total = 0; - foreach (var item in queryObj) - { - 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); - } - } - - return resultObj; - } - - /// - /// 获取查询语句 - /// - /// - /// - public virtual string ToSql(JObject queryObj) - { - foreach (var item in queryObj) - { - string key = item.Key.Trim(); - - if (key.EndsWith("[]")) - { - return ToSql(item); - } - } - return string.Empty; - } - - /// - /// 解析并查询 - /// - /// - /// - public virtual JObject Query(JObject queryObj) - { - JObject resultObj = new JObject(); - resultObj.Add("code", "200"); - resultObj.Add("msg", "success"); - - int total = 0; - foreach (var item in queryObj) - { - string key = item.Key.Trim(); - - 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(key, JToken.FromObject(template)); - } - } - } - - return resultObj; - } - - - - //动态调用方法 - private object ExecFunc(string funcname, object[] param, Type[] types) - { - var method = typeof(FuncList).GetMethod(funcname); - - var reflector = method.GetReflector(); - var result = reflector.Invoke(new FuncList(), param); - return result; - } - - //生成sql - 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 sqlObj = tb.Skip((page - 1) * count).Take(10).ToSql(); - return sqlObj.Key; - } - - // - private dynamic GetFirstData(string subtable, string json, JObject job) - { - - 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, job).First(); - var dic = (IDictionary)tb; - foreach (var item in values.Properties().Where(it => it.Name.EndsWith("()"))) - { - 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(); - var paramss = new List(); - 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()); - } - } - - return tb; - - } - - //单表查询,返回的数据在指定的NodeName节点 - private int QuerySingleList(JObject resultObj, KeyValuePair 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) - { - htt.Add(JToken.FromObject(data)); - } - } - - if (!string.IsNullOrEmpty(nodeName)) - { - resultObj.Add(nodeName, htt); - } - else - resultObj.Add(key, htt); - return total; - } - - //生成sql - private string ToSql(KeyValuePair 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()); - } - - return string.Empty; - } - - //单表查询 - private int QuerySingleList(JObject resultObj, KeyValuePair item) - { - string key = item.Key.Trim(); - return QuerySingleList(resultObj, item, key); - } - - //多列表查询 - private int QueryMoreList(JObject resultObj, KeyValuePair 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 tables = new List(), where = new List(); - foreach (var t in jb) - { - tables.Add(t.Key); where.Add(t.Value.ToString()); - } - if (tables.Count > 0) - { - string table = tables[0]; - var temp = GetTableData(table, page, count, query, where[0], null); - if (query > 0) - { - total = temp.Item2; - } - - foreach (var dd in temp.Item1) - { - var zht = new JObject(); - zht.Add(table, JToken.FromObject(dd)); - for (int i = 1; i < tables.Count; i++) - { - 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); - } - - } - if (query != 1) - { - resultObj.Add("[]", htt); - } - - return total; - } - - //执行方法 - private void ExecFunc(JObject resultObj, KeyValuePair item) - { - JObject jb = JObject.Parse(item.Value.ToString()); - Type type = typeof(FuncList); - - var dataJObj = new JObject(); - foreach (var f in jb) - { - var types = new List(); - var param = new List(); - foreach (var va in JArray.Parse(f.Value.ToString())) - { - types.Add(typeof(object)); - param.Add(va); - } - dataJObj.Add(f.Key, JToken.FromObject(ExecFunc(f.Key, param.ToArray(), types.ToArray()))); - } - resultObj.Add("func", dataJObj); - } - - // - private ISugarQueryable sugarQueryable(string subtable, string selectrole, JObject values, JObject dd) - { - if (!IsTable(subtable)) - { - throw new Exception($"表名{subtable}不正确!"); - } - var tb = db.Queryable(subtable, "tb"); - - - if (values["@column"].IsValue()) - { - ProcessColumn(subtable, selectrole, values, tb); - } - else - { - tb.Select(selectrole); - } - - List conModels = new List(); - if (values["identity"].IsValue()) - { - 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(); - if (vakey.StartsWith("@")) - { - continue; - } - if (vakey.EndsWith("$"))//模糊查询 - { - FuzzyQuery(subtable, conModels, va); - } - else if (vakey.EndsWith("{}"))//逻辑运算 - { - ConditionQuery(subtable, conModels, va); - } - else if (vakey.EndsWith("%"))//bwtween查询 - { - ConditionBetween(subtable, conModels, va); - } - else if (vakey.EndsWith("@") && dd != null) // 关联上一个table - { - 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 }); - - } - else if (vakey.EndsWith("~"))//不等于 - { - conModels.Add(new ConditionalModel() { FieldName = vakey.TrimEnd('~'), ConditionalType = ConditionalType.NoEqual, FieldValue = fieldValue }); - } - else if (IsCol(subtable, vakey)) //其他where条件 - { - conModels.Add(new ConditionalModel() { FieldName = vakey, ConditionalType = ConditionalType.Equal, FieldValue = fieldValue }); - } - } - tb.Where(conModels); - - //排序 - ProcessOrder(subtable, values, tb); - - //分组 - PrccessGroup(subtable, values, tb); - - //Having - ProcessHaving(values, tb); - return tb; - } - - //处理字段重命名 "@column":"toId:parentId",对应SQL是toId AS parentId,将查询的字段toId变为parentId返回 - private void ProcessColumn(string subtable, string selectrole, JObject values, ISugarQueryable tb) - { - var str = new System.Text.StringBuilder(100); - foreach (var item in values["@column"].ToString().Split(',')) - { - string[] ziduan = item.Split(':'); - string colName = ziduan[0]; - var ma = new Regex(@"\((\w+)\)").Match(colName); - //处理max,min这样的函数 - if (ma.Success && ma.Groups.Count > 1) - { - 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] + "`" + ","); - - } - } - if (string.IsNullOrEmpty(str.ToString())) - { - throw new Exception($"表名{subtable}没有可查询的字段!"); - } - tb.Select(str.ToString().TrimEnd(',')); - } - - // "@having":"function0(...)?value0;function1(...)?value1;function2(...)?value2...", - // SQL函数条件,一般和 @group一起用,函数一般在 @column里声明 - private void ProcessHaving(JObject values, ISugarQueryable tb) - { - if (values["@having"].IsValue()) - { - List hw = new List(); - List havingItems = new List(); - if (values["@having"].HasValues) - { - havingItems = values["@having"].Select(p => p.ToString()).ToList(); - } - else - { - havingItems.Add(values["@having"].ToString()); - } - foreach (var item in havingItems) - { - string and = item.ToString(); - var model = new ConditionalModel(); - if (and.Contains(">=")) - { - model.FieldName = and.Split(new string[] { ">=" }, StringSplitOptions.RemoveEmptyEntries)[0]; - model.ConditionalType = ConditionalType.GreaterThanOrEqual; - 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.LessThanOrEqual; - 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.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("=")) - { - 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); - } - - //var d = db.Context.Utilities.ConditionalModelToSql(hw); - //tb.Having(d.Key, d.Value); - tb.Having(string.Join(",", havingItems)); - } - } - - //"@group":"column0,column1...",分组方式。如果 @column里声明了Table的id,则id也必须在 @group中声明;其它情况下必须满足至少一个条件: - //1.分组的key在 @column里声明 - //2.Table主键在 @group中声明 - private void PrccessGroup(string subtable, JObject values, ISugarQueryable tb) - { - if (values["@group"].IsValue()) - { - 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(',')); - } - } - - //处理排序 "@order":"name-,id"查询按 name降序、id默认顺序 排序的User数组 - private void ProcessOrder(string subtable, JObject values, ISugarQueryable tb) - { - if (values["@order"].IsValue()) - { - foreach (var item in values["@order"].ToString().Split(',')) - { - 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}"); - } - } - } - } - } - - //条件查询 "key{}":"条件0,条件1...",条件为任意SQL比较表达式字符串,非Number类型必须用''包含条件的值,如'a' - //&, |, ! 逻辑运算符,对应数据库 SQL 中的 AND, OR, NOT。 - // 横或纵与:同一字段的值内条件默认 | 或连接,不同字段的条件默认 & 与连接。 - // ① & 可用于"key&{}":"条件"等 - // ② | 可用于"key|{}":"条件", "key|{}":[] 等,一般可省略 - // ③ ! 可单独使用,如"key!":Object,也可像&,|一样配合其他功能符使用 - private void ConditionQuery(string subtable, List conModels, KeyValuePair va) - { - string vakey = va.Key.Trim(); - string field = vakey.TrimEnd("{}".ToCharArray()); - if (va.Value.HasValues) - { - List inValues = new List(); - foreach (var cm in va.Value) - { - inValues.Add(cm.ToString()); - } - - conModels.Add(new ConditionalModel() - { - FieldName = field.TrimEnd("!".ToCharArray()), - ConditionalType = field.EndsWith("!") ? ConditionalType.NotIn : ConditionalType.In, - FieldValue = string.Join(",", inValues) - }); - - } - else - { - var ddt = new List>(); - foreach (var and in va.Value.ToString().Split(',')) - { - 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("<=")) - { - - 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((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 conModels, KeyValuePair va) - { - string vakey = va.Key.Trim(); - string field = vakey.TrimEnd("%".ToCharArray()); - List inValues = new List(); - - if (va.Value.HasValues) - { - foreach (var cm in va.Value) - { - inValues.Add(cm.ToString()); - } - } - 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>(); - - var leftCondition = new ConditionalModel() - { - FieldName = field, - ConditionalType = ConditionalType.GreaterThanOrEqual, - FieldValue = fileds[0] - }; - ddt.Add(new KeyValuePair(i == 0 ? WhereType.And : WhereType.Or, leftCondition)); - var rightCondition = new ConditionalModel() - { - FieldName = field, - ConditionalType = ConditionalType.LessThanOrEqual, - FieldValue = fileds[1] - }; - ddt.Add(new KeyValuePair(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 conModels, KeyValuePair 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()) }); - } - } - - //处理sql注入 - private 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; - } - } -} diff --git a/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs b/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs deleted file mode 100644 index d911702..0000000 --- a/APIJSON.NET/APIJSONCommon/Services/IIdentityService.cs +++ /dev/null @@ -1,33 +0,0 @@ -using APIJSON.NET.Models; -using System; - -namespace APIJSON.NET.Services -{ - public interface IIdentityService - { - /// - /// 获取当前用户id - /// - /// - string GetUserIdentity(); - /// - /// 获取当前用户权限组名称 - /// - /// - string GetUserRoleName(); - /// - /// 获取当前用户权限 - /// - /// - Role GetRole(); - /// - /// 获取当前表的可查询字段 - /// - /// - /// - Tuple GetSelectRole(string table); - - - bool ColIsRole(string col, string[] selectrole); - } -} diff --git a/APIJSON.NET/APIJSONCommon/Services/TableMapper.cs b/APIJSON.NET/APIJSONCommon/Services/TableMapper.cs deleted file mode 100644 index d236cd5..0000000 --- a/APIJSON.NET/APIJSONCommon/Services/TableMapper.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Microsoft.Extensions.Options; -using System; -using System.Collections.Generic; - -namespace APIJSON.NET.Services -{ - public class TableMapper : ITableMapper - { - private readonly Dictionary _options= new Dictionary(StringComparer.OrdinalIgnoreCase); - public TableMapper(IOptions> options) - { - foreach (var item in options.Value) - { - _options.Add(item.Key, item.Value); - } - } - public string GetTableName(string oldname) - { - if (_options.ContainsKey(oldname)) - { - return _options[oldname]; - } - return oldname; - } - } -} diff --git a/APIJSON.NET/APIJSONCommon/app.config b/APIJSON.NET/APIJSONCommon/app.config deleted file mode 100644 index 2bbe771..0000000 --- a/APIJSON.NET/APIJSONCommon/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/APIJSON.NET/APIJSONCommon/packages.config b/APIJSON.NET/APIJSONCommon/packages.config deleted file mode 100644 index deca899..0000000 --- a/APIJSON.NET/APIJSONCommon/packages.config +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file From 850afe09990bf922a5f87251ceffd333a792d2e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E6=99=BA=E6=98=8E?= <390620652@qq.com> Date: Wed, 6 Mar 2024 16:47:42 +0800 Subject: [PATCH 31/31] =?UTF-8?q?=E4=B8=8D=E5=AF=B9=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=8A=A0``,=E8=A7=A3=E5=86=B3sum(*),Count(1)=E7=AD=89=E4=B8=8D?= =?UTF-8?q?=E8=83=BD=E4=BD=BF=E7=94=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSON.NET/APIJSON.Data/SelectTable.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/APIJSON.NET/APIJSON.Data/SelectTable.cs b/APIJSON.NET/APIJSON.Data/SelectTable.cs index 39838b7..8aa9e2d 100644 --- a/APIJSON.NET/APIJSON.Data/SelectTable.cs +++ b/APIJSON.NET/APIJSON.Data/SelectTable.cs @@ -140,7 +140,7 @@ public virtual JObject QuerySingle(JObject queryObj, string nodeName = "infos") { ExecFunc(resultObj, item); } - else if (key.Equals("total@")) + else if (key.Equals("total@")|| key.Equals("total")) { resultObj.Add("total", total); } @@ -196,7 +196,7 @@ public virtual JObject Query(JObject queryObj) { ExecFunc(resultObj, item); } - else if (key.Equals("total@")) + else if (key.Equals("total@")|| key.Equals("total")) { resultObj.Add("total", total); } @@ -535,6 +535,11 @@ private void ProcessColumn(string subtable, string selectrole, JObject values, I } str.Append(ziduan[0] + " as `" + ReplaceSQLChar(ziduan[1]) + "`,"); } + //不对函数加``,解决sum(*),Count(1)等不能使用的问题 + else if (ziduan[0].Contains('(')) + { + str.Append(ziduan[0] + ","); + } else str.Append("`" + ziduan[0] + "`" + ",");