From 4528b52834c169294d51b32f380688af4b7f2dbb Mon Sep 17 00:00:00 2001
From: haptear
Date: Fri, 24 May 2019 17:59:05 +0800
Subject: [PATCH 01/21] =?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
-
+
-
+
+
@@ -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 07/21] 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 08/21] 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 09/21] 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 10/21] =?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 11/21] =?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 12/21] =?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 13/21] =?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 14/21] =?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 15/21] 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 16/21] =?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 17/21] =?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 18/21] =?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 19/21] =?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 20/21] =?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 21/21] =?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] + "`" + ",");