APIJSONService.cs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. // 麻省理工学院许可证
  2. //
  3. // 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司 联系电话/微信:18020030720 QQ:515096995
  4. //
  5. // 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
  6. //
  7. // 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
  8. // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
  9. using Newtonsoft.Json;
  10. using Newtonsoft.Json.Linq;
  11. namespace Admin.NET.Core.Service;
  12. /// <summary>
  13. /// APIJSON服务
  14. /// </summary>
  15. [ApiDescriptionSettings(Order = 100)]
  16. public class APIJSONService : IDynamicApiController, ITransient
  17. {
  18. private readonly ISqlSugarClient _db;
  19. private readonly IdentityService _identityService;
  20. private readonly TableMapper _tableMapper;
  21. private readonly SelectTable _selectTable;
  22. public APIJSONService(ISqlSugarClient db,
  23. IdentityService identityService,
  24. TableMapper tableMapper)
  25. {
  26. _db = db;
  27. _tableMapper = tableMapper;
  28. _identityService = identityService;
  29. _selectTable = new SelectTable(_identityService, _tableMapper, _db);
  30. }
  31. /// <summary>
  32. /// 统一查询入口
  33. /// </summary>
  34. /// <param name="jobject"></param>
  35. /// <remarks>参数:{"[]":{"SYSLOGOP":{}}}</remarks>
  36. /// <returns></returns>
  37. [HttpPost("get")]
  38. public JObject Query([FromBody] JObject jobject)
  39. {
  40. return _selectTable.Query(jobject);
  41. }
  42. [HttpPost("get/{table}")]
  43. public async Task<JObject> QueryByTable([FromRoute] string table, [FromBody] JObject jobject)
  44. {
  45. JObject ht = new JObject();
  46. ht.Add(table + "[]", jobject);
  47. if (jobject["query"] != null && jobject["query"].ToString() != "0" && jobject["total@"] == null)
  48. {
  49. //自动添加总计数量
  50. ht.Add("total@", "");
  51. }
  52. //每页最大1000条数据
  53. if (jobject["count"] != null && int.Parse(jobject["count"].ToString()) > 1000)
  54. {
  55. throw Oops.Bah("count分页数量最大不能超过1000");
  56. }
  57. bool isDebug = (jobject["@debug"] != null && jobject["@debug"].ToString() != "0");
  58. jobject.Remove("@debug");
  59. bool hasTableKey = false;
  60. List<string> ignoreConditions = new List<string> { "page", "count", "query" };
  61. JObject tableConditions = new JObject();//表的其它查询条件,比如过滤,字段等
  62. foreach (var item in jobject)
  63. {
  64. if (item.Key.Equals(table, StringComparison.CurrentCultureIgnoreCase))
  65. {
  66. hasTableKey = true;
  67. break;
  68. }
  69. if (!ignoreConditions.Contains(item.Key.ToLower()))
  70. {
  71. tableConditions.Add(item.Key, item.Value);
  72. }
  73. }
  74. foreach (var removeKey in tableConditions)
  75. {
  76. jobject.Remove(removeKey.Key);
  77. }
  78. if (!hasTableKey)
  79. {
  80. jobject.Add(table, tableConditions);
  81. }
  82. return Query(ht);
  83. }
  84. /// <summary>
  85. /// 新增
  86. /// </summary>
  87. /// <param name="json"></param>
  88. /// <returns></returns>
  89. [HttpPost("post")]
  90. public JObject Add([FromBody] JObject jobject)
  91. {
  92. JObject ht = new JObject();
  93. //todo 批量增加
  94. foreach (var item in jobject)
  95. {
  96. string key = item.Key.Trim();
  97. var role = _identityService.GetRole();
  98. if (!role.Insert.Table.Contains(key, StringComparer.CurrentCultureIgnoreCase))
  99. {
  100. throw Oops.Bah($"没权限添加{key}");
  101. }
  102. var dt = new Dictionary<string, object>();
  103. var cols = item.Value.ToObject<JObject>();
  104. foreach (var f in cols)
  105. {
  106. if (//f.Key.ToLower() != "id" &&
  107. _selectTable.IsCol(key, f.Key) &&
  108. (role.Insert.Column.Contains("*") || role.Insert.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase)))
  109. dt.Add(f.Key, f.Value);
  110. }
  111. //如果外部没传id,就后端生成或使用数据库默认值,如果都没有会出错
  112. if (!dt.ContainsKey("id"))
  113. {
  114. dt.Add("id", YitIdHelper.NextId());
  115. }
  116. var id = _db.Insertable(dt).AS(key).ExecuteCommand();//根据主键类型设置返回雪花或自增
  117. ht.Add(key, id );
  118. }
  119. return ht;
  120. }
  121. /// <summary>
  122. /// 修改
  123. /// </summary>
  124. /// <param name="json"></param>
  125. /// <returns></returns>
  126. [HttpPost("put")]
  127. public JObject Edit([FromBody] JObject jobject)
  128. {
  129. JObject ht = new JObject();
  130. foreach (var item in jobject)
  131. {
  132. string key = item.Key.Trim();
  133. var role = _identityService.GetRole();
  134. if (!role.Update.Table.Contains(key, StringComparer.CurrentCultureIgnoreCase))
  135. {
  136. throw Oops.Bah("没权限修改{key}");
  137. }
  138. var value = JObject.Parse(item.Value.ToString());
  139. if (!value.ContainsKey("id"))
  140. {
  141. throw Oops.Bah("未传主键id");
  142. }
  143. var dt = new Dictionary<string, object>();
  144. foreach (var f in value)
  145. {
  146. if (f.Key.ToLower() != "id" && _selectTable.IsCol(key, f.Key) && (role.Update.Column.Contains("*") || role.Update.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase)))
  147. {
  148. dt.Add(f.Key, f.Value.ToString());
  149. }
  150. }
  151. _db.Updateable(dt).AS(key).Where("id=@id", new { id = value["id"].ToString() }).ExecuteCommand();
  152. ht.Add(key, JToken.FromObject(new { code = 200, msg = "success", id = value["id"].ToString() }));
  153. }
  154. return ht;
  155. }
  156. /// <summary>
  157. /// 删除 支持非id条件,支持批量
  158. /// </summary>
  159. /// <param name="jobject"></param>
  160. /// <returns></returns>
  161. [HttpPost("delete")]
  162. public JObject Delete([FromBody] JObject jobject)
  163. {
  164. JObject ht = new JObject();
  165. var role = _identityService.GetRole();
  166. foreach (var item in jobject)//每个表执行一次
  167. {
  168. string talbeName = item.Key.Trim();
  169. var value = JObject.Parse(item.Value.ToString());
  170. if (role.Delete == null || role.Delete.Table == null)
  171. {
  172. throw Oops.Bah("delete权限未配置");
  173. }
  174. if (!role.Delete.Table.Contains(talbeName, StringComparer.CurrentCultureIgnoreCase))
  175. {
  176. throw Oops.Bah($"没权限删除{talbeName}");
  177. }
  178. //if (!value.ContainsKey("id"))
  179. //{
  180. // throw Oops.Bah("未传主键id");
  181. //}
  182. var sb = new StringBuilder(100);
  183. List< SugarParameter > parameters = new List< SugarParameter >();
  184. foreach (var f in value)//每个条件
  185. {
  186. if (f.Value is JArray)//数组
  187. {
  188. sb.Append($"{f.Key} in (@{f.Key}) and ");
  189. var paraArray =FuncList.TransJArrayToSugarPara(f.Value);
  190. parameters.Add(new SugarParameter($"@{f.Key}", paraArray));
  191. //sb.Append($"{f.Key} in ({f.Value.ToString().TrimStart("[").TrimEnd("]").TrimInvisible()}) and");
  192. }
  193. else//单个值
  194. {
  195. sb.Append($"{f.Key}=@{f.Key} and ");
  196. parameters.Add(new SugarParameter($"@{f.Key}", FuncList.TransJObjectToSugarPara(f.Value)));
  197. }
  198. }
  199. string whereSql = sb.ToString().TrimEnd(" and ");
  200. int count = _db.Deleteable<object>().AS(talbeName).Where(whereSql,parameters).ExecuteCommand();//无实体删除
  201. value.Add("count", count);//命中数量
  202. ht.Add(talbeName, value);
  203. }
  204. return ht;
  205. }
  206. }