From 527b94159f696778b582e5c0f11b040d7f5caf87 Mon Sep 17 00:00:00 2001 From: "cd\\zhuzhiqing" Date: Thu, 20 Dec 2018 18:21:28 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=8F=90=E5=87=BAcommon=E9=A1=B9=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 2/4] =?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 2e830c4d83e0e176ac3f4832e7f560e6f83fcfef Mon Sep 17 00:00:00 2001 From: haptear Date: Fri, 10 May 2019 13:07:45 +0800 Subject: [PATCH 3/4] =?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 4/4] =?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();