From 965f047a9dacdc1d2644764f8c3b8def35c7667c Mon Sep 17 00:00:00 2001 From: zhontai <59038867+zhontai@users.noreply.github.com> Date: Mon, 23 Mar 2020 00:11:40 +0800 Subject: [PATCH 01/53] Add files via upload --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..4e3c578fe --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 zhontai + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file From 9c1fb7534d9f8c7878bc718f46074a6d49829f50 Mon Sep 17 00:00:00 2001 From: zhontai <59038867+zhontai@users.noreply.github.com> Date: Mon, 23 Mar 2020 00:25:37 +0800 Subject: [PATCH 02/53] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fa03b0075..835c5eb5a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ 一个基于.Net Core开发的权限管理系统,后续会增加更多实用的功能。 ### 在线体验 -演示地址:https://www.admin.zhontai.net/ +演示地址:https://admin.zhontai.net/ 文档地址:https://zhontai.net/ ********************************************************* From c545962c75c1b99a3c0971cb6e27273b4f6a72d3 Mon Sep 17 00:00:00 2001 From: zhontai <59038867+zhontai@users.noreply.github.com> Date: Mon, 23 Mar 2020 01:12:17 +0800 Subject: [PATCH 03/53] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 835c5eb5a..1415df9d8 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ 一个基于.Net Core开发的权限管理系统,后续会增加更多实用的功能。 ### 在线体验 -演示地址:https://admin.zhontai.net/ -文档地址:https://zhontai.net/ +演示地址:https://www.admin.zhontai.net/ +文档地址:https://www.zhontai.net/ ********************************************************* ### 项目下载后,直接编译运行项目 From 9d01e88fd894d13eff994d15061bae4c7891191c Mon Sep 17 00:00:00 2001 From: zhontai <59038867+zhontai@users.noreply.github.com> Date: Mon, 23 Mar 2020 01:45:32 +0800 Subject: [PATCH 04/53] Update appconfig.json --- Admin.Core/configs/appconfig.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Admin.Core/configs/appconfig.json b/Admin.Core/configs/appconfig.json index 375700e6a..fb05a46d3 100644 --- a/Admin.Core/configs/appconfig.json +++ b/Admin.Core/configs/appconfig.json @@ -1,10 +1,10 @@ { - //Swaggerĵ + //Swagger文档 "swagger": false, - //Apiַ + //Api地址 "urls": "http://*:8081", "aop": { - // + //事物 "transaction": false } } From 57b9fffb25071152e2c58e0ddab19b757b960442 Mon Sep 17 00:00:00 2001 From: zhontai <59038867+zhontai@users.noreply.github.com> Date: Mon, 23 Mar 2020 01:47:05 +0800 Subject: [PATCH 05/53] Update cacheconfig.json --- Admin.Core/configs/cacheconfig.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Admin.Core/configs/cacheconfig.json b/Admin.Core/configs/cacheconfig.json index 794fe2a86..744b3c1e1 100644 --- a/Admin.Core/configs/cacheconfig.json +++ b/Admin.Core/configs/cacheconfig.json @@ -1,7 +1,7 @@ { - // Memory = 0,Redis = 1 - "type": 1, - //Redis + //缓存类型 Memory = 0,Redis = 1 + "type": 0, + //Redis配置 "redis": { "connectionString": "127.0.0.1:6379,password=,defaultDatabase=2" } From e84437ce8d5028fc90f2c225816931ee8f90988a Mon Sep 17 00:00:00 2001 From: zhontai <59038867+zhontai@users.noreply.github.com> Date: Mon, 23 Mar 2020 01:51:24 +0800 Subject: [PATCH 06/53] Update dbconfig.json --- Admin.Core/configs/dbconfig.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Admin.Core/configs/dbconfig.json b/Admin.Core/configs/dbconfig.json index d75988b1d..6de9ac1c4 100644 --- a/Admin.Core/configs/dbconfig.json +++ b/Admin.Core/configs/dbconfig.json @@ -1,7 +1,7 @@ { - //ݿ MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4, OdbcOracle = 5, OdbcSqlServer = 6, OdbcMySql = 7, OdbcPostgreSQL = 8, Odbc = 9, OdbcDameng = 10, MsAccess = 11 + //数据库类型 MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4, OdbcOracle = 5, OdbcSqlServer = 6, OdbcMySql = 7, OdbcPostgreSQL = 8, Odbc = 9, OdbcDameng = 10, MsAccess = 11 "type": 0, - //ַ + //连接字符串 //MySql "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;" //Sqlite "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" "Data Source=F:\\data\\admindb.db; Pooling=true;Min Pool Size=1" "connectionString": "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;" From 3fc926165709a42d692c5f9d70dcd7773862a59d Mon Sep 17 00:00:00 2001 From: e Date: Mon, 23 Mar 2020 19:20:23 +0800 Subject: [PATCH 07/53] 1.0.0 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1415df9d8..a1756888d 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ ### 在线体验 演示地址:https://www.admin.zhontai.net/ + 文档地址:https://www.zhontai.net/ ********************************************************* From b9fcd2302e3d41a8600ffa0467efa13bde8d1d77 Mon Sep 17 00:00:00 2001 From: e Date: Mon, 23 Mar 2020 19:33:29 +0800 Subject: [PATCH 08/53] 1.0.0 --- Admin.Core/configs/dbconfig.Development.json | 20 ++++++++++---------- Admin.Core/configs/jwtconfig.json | 8 ++++---- Admin.Core/configs/logconfig.json | 16 ++++++++-------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Admin.Core/configs/dbconfig.Development.json b/Admin.Core/configs/dbconfig.Development.json index a4c9569a4..4cefbd3c7 100644 --- a/Admin.Core/configs/dbconfig.Development.json +++ b/Admin.Core/configs/dbconfig.Development.json @@ -1,27 +1,27 @@ { - // + //生成数据 "generateData": false, - //в + //监听所有操作 "monitorCommand": false, - //Curd + //监听Curd操作 "curd": true, - //ͬṹ + //同步结构 "syncStructure": true, - //ͬ + //同步数据 "syncData": true, - // + //建库 "createDb": true, //SqlServer,PostgreSQL,Oracle,OdbcOracle,OdbcSqlServer,OdbcMySql,OdbcPostgreSQL,Odbc,OdbcDameng,MsAccess - //ַ + //建库连接字符串 //MySql "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd={}; Charset=utf8mb4;" "createDbConnectionString": "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;", - //ű + //建库脚本 //MySql "CREATE DATABASE `{admindb}` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'" "createDbSql": "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'", - //ݿ MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4, OdbcOracle = 5, OdbcSqlServer = 6, OdbcMySql = 7, OdbcPostgreSQL = 8, Odbc = 9, OdbcDameng = 10, MsAccess = 11 + //数据库类型 MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4, OdbcOracle = 5, OdbcSqlServer = 6, OdbcMySql = 7, OdbcPostgreSQL = 8, Odbc = 9, OdbcDameng = 10, MsAccess = 11 "type": 4, - //ַ + //连接字符串 "connectionString": "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" } diff --git a/Admin.Core/configs/jwtconfig.json b/Admin.Core/configs/jwtconfig.json index e5628cead..732340ea2 100644 --- a/Admin.Core/configs/jwtconfig.json +++ b/Admin.Core/configs/jwtconfig.json @@ -1,10 +1,10 @@ { - // + //发行者 "issuer": "http://www.zhontai.com", - // + //订阅者 "audience": "http://www.zhontai.com", - //Կ + //秘钥 "securityKey": "ertJKl#521*a@790asD&", - //Ч() + //有效期(分钟) "expires": 120 } diff --git a/Admin.Core/configs/logconfig.json b/Admin.Core/configs/logconfig.json index 394a5bbef..a875f891a 100644 --- a/Admin.Core/configs/logconfig.json +++ b/Admin.Core/configs/logconfig.json @@ -7,18 +7,18 @@ { _logger = logger; } - _logger.LogDebug(1, ""); + _logger.LogDebug(1, "调试"); - + 或 private readonly ILogger _logger; constructor() { _logger = LogManager.GetLogger("loggerName"); - + 或 _logger = LogManager.GetCurrentClassLogger(); } - _logger.Error(""); + _logger.Error("错误"); */ "nLog": { "extensions": { @@ -27,19 +27,19 @@ } }, "targets": { - // + //调试 "debug": { "type": "File", "fileName": "logs\\debug-${shortdate}.log", "layout": "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" }, - // + //警告 "warn": { "type": "File", "fileName": "logs\\warn-${shortdate}.log", "layout": "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" }, - // + //错误 "error": { "type": "File", "fileName": "logs\\error-${shortdate}.log", @@ -65,7 +65,7 @@ "maxlevel": "Fatal", "writeTo": "error" }, - //Ҫ΢־ + //跳过不重要的微软日志 { "logger": "Microsoft.*", "maxLevel": "Info", From 513fff41aacd66aa269b8a70a6cbb234ddd15a7a Mon Sep 17 00:00:00 2001 From: e Date: Mon, 23 Mar 2020 22:14:13 +0800 Subject: [PATCH 09/53] =?UTF-8?q?1.0.0=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=9B=A0?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=95=B0=E6=8D=AE=EF=BC=8C=E8=80=8C=E6=97=A0?= =?UTF-8?q?=E6=9D=83=E9=99=90=E8=AE=BF=E9=97=AE=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/MethodInfoExtensions.cs | 2 +- Admin.Core.Model/Base/Entity.cs | 2 +- Admin.Core/Admin.Core.xml | 2 +- Admin.Core/Db/DbHelper.cs | 38 ++++++++++++++----- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/Admin.Core.Common/Extensions/MethodInfoExtensions.cs b/Admin.Core.Common/Extensions/MethodInfoExtensions.cs index 9890475a8..0f2458a61 100644 --- a/Admin.Core.Common/Extensions/MethodInfoExtensions.cs +++ b/Admin.Core.Common/Extensions/MethodInfoExtensions.cs @@ -8,7 +8,7 @@ public static class MethodInfoExtensions { public static bool HasAttribute(this MethodInfo method) { - return method.GetCustomAttributes(true).FirstOrDefault(x => x.GetType() == typeof(T)) is T; + return method.GetCustomAttributes(typeof(T), false).FirstOrDefault() is T; } diff --git a/Admin.Core.Model/Base/Entity.cs b/Admin.Core.Model/Base/Entity.cs index a0d0c9ecb..72d2c30cb 100644 --- a/Admin.Core.Model/Base/Entity.cs +++ b/Admin.Core.Model/Base/Entity.cs @@ -11,7 +11,7 @@ public class Entity : IEntity /// /// 主键Id /// - [Column(Position = 1,IsIdentity = true)] + [Column(Position = 1)] public virtual TKey Id { get; set; } } diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index b357f11cb..e25cbf355 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -522,7 +522,7 @@ - + 同步结构 diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index 9409d6b9f..7d55c967c 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -5,11 +5,11 @@ using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using FreeSql; +using FreeSql.Aop; using FreeSql.DataAnnotations; using Admin.Core.Common.Configs; using Admin.Core.Common.Helpers; using Admin.Core.Model.Admin; -using FreeSql.Aop; namespace Admin.Core.Db { @@ -46,7 +46,7 @@ public async static Task CreateDatabase(DbConfig dbConfig) /// /// 同步结构 /// - public static void SyncStructure(IFreeSql db) + public static void SyncStructure(IFreeSql db,bool autoIncrement = true, string msg = null) { //打印结构比对脚本 //var dDL = db.CodeFirst.GetComparisonDDLStatements(); @@ -61,9 +61,8 @@ public static void SyncStructure(IFreeSql db) // } //}; - // 同步结构 - Console.WriteLine("\r\nsync structure started"); - db.CodeFirst.SyncStructure( + var types = new Type[] + { typeof(DictionaryEntity), typeof(ApiEntity), typeof(ViewEntity), @@ -72,8 +71,26 @@ public static void SyncStructure(IFreeSql db) typeof(RoleEntity), typeof(UserRoleEntity), typeof(RolePermissionEntity) - ); - Console.WriteLine("sync structure succeed\r\n"); + }; + + foreach (var type in types) + { + try + { + db.CodeFirst.ConfigEntity(type, a => + { + a.Property("Id").IsIdentity(autoIncrement); + }); + } + catch (Exception) + { + } + } + + // 同步结构 + Console.WriteLine($"\r\n{(msg.NotNull() ? msg : "sync structure")} started"); + db.CodeFirst.SyncStructure(types); + Console.WriteLine($"{(msg.NotNull() ? msg : "sync structure")} succeed\r\n"); } /// @@ -85,8 +102,7 @@ public static void SyncStructure(IFreeSql db) /// private static async Task InitData(IFreeSql db,T[] data) where T : class { - var table = typeof(T).GetCustomAttributes(true) - .FirstOrDefault(x => x.GetType() == typeof(TableAttribute)) as TableAttribute; + var table = typeof(T).GetCustomAttributes(typeof(TableAttribute),false).FirstOrDefault() as TableAttribute; var tableName = table.Name; try @@ -159,6 +175,8 @@ public static async Task SyncData(IFreeSql db) db.Aop.AuditValue += SyncDataAuditValue; + SyncStructure(db, false ,"sync structure for sync data"); + var filePath = Path.Combine(Directory.GetCurrentDirectory(), @"Db\Data\data.json"); var jsonData = FileHelper.ReadFile(filePath); var data = JsonConvert.DeserializeObject(jsonData); @@ -173,6 +191,8 @@ public static async Task SyncData(IFreeSql db) db.Aop.AuditValue -= SyncDataAuditValue; + SyncStructure(db, true, "sync structure for sync data"); + Console.WriteLine("sync data succeed\r\n"); } catch (Exception ex) From 7f3e59bbc0ad8a66e1d1a20eda355206bea8de17 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Wed, 25 Mar 2020 00:40:32 +0800 Subject: [PATCH 10/53] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E7=AE=A1=E7=90=86=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=90=8C=E6=AD=A5?= =?UTF-8?q?api=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Cache/CacheKey.cs | 9 +++- Admin.Core.Common/Configs/AppConfig.cs | 5 ++ Admin.Core.Common/Helpers/ConsoleHelper.cs | 2 - Admin.Core.Common/Helpers/UtilConvert.cs | 12 ++--- Admin.Core.Model/Admin/ApiEntity.cs | 2 +- Admin.Core.Model/Admin/ViewEntity.cs | 2 +- Admin.Core.Repository/Base/IRepositoryBase.cs | 6 +++ Admin.Core.Services/Admin.Core.Service.csproj | 3 ++ Admin.Core.Services/Admin/Api/ApiService.cs | 2 +- Admin.Core.Services/Admin/Auth/AuthService.cs | 33 ++++-------- .../Admin/Auth/IAuthService.cs | 2 +- .../Admin/Auth/Input/AuthLoginInput.cs | 7 ++- .../Admin/Cache/CacheService.cs | 52 +++++++++++++++++++ .../Admin/Cache/ICacheService.cs | 26 ++++++++++ Admin.Core.Services/Admin/View/ViewService.cs | 2 +- Admin.Core/Admin.Core.Service.xml | 18 +++++++ Admin.Core/Admin.Core.xml | 24 +++++++-- .../Attributes/VersionRouteAttribute.cs | 4 +- .../Controllers/Admin/AuthController.cs | 4 +- .../Controllers/Admin/CacheController.cs | 42 +++++++++++++++ .../Controllers/Admin/PermissionController.cs | 2 +- Admin.Core/Db/Data/data.json | 2 +- Admin.Core/configs/appconfig.json | 5 +- 23 files changed, 217 insertions(+), 49 deletions(-) create mode 100644 Admin.Core.Services/Admin/Cache/CacheService.cs create mode 100644 Admin.Core.Services/Admin/Cache/ICacheService.cs create mode 100644 Admin.Core/Controllers/Admin/CacheController.cs diff --git a/Admin.Core.Common/Cache/CacheKey.cs b/Admin.Core.Common/Cache/CacheKey.cs index 06708fed2..f4d781440 100644 --- a/Admin.Core.Common/Cache/CacheKey.cs +++ b/Admin.Core.Common/Cache/CacheKey.cs @@ -1,4 +1,6 @@  +using System.ComponentModel; + namespace Admin.Core.Common.Cache { /// @@ -9,16 +11,19 @@ public static class CacheKey /// /// 验证码 admin:verify:code:guid /// + [Description("验证码")] public const string VerifyCodeKey = "admin:verify:code:{0}"; /// - /// 密码 admin:password:guid + /// 密码加密 admin:password:encrypt:guid /// - public const string PassWordKey = "admin:password:{0}"; + [Description("密码加密")] + public const string PassWordEncryptKey = "admin:password:{0}"; /// /// 用户权限 admin:user:用户主键:permissions /// + [Description("用户权限")] public const string UserPermissions = "admin:user:{0}:permissions"; } } diff --git a/Admin.Core.Common/Configs/AppConfig.cs b/Admin.Core.Common/Configs/AppConfig.cs index 5313d9930..4a9380eaa 100644 --- a/Admin.Core.Common/Configs/AppConfig.cs +++ b/Admin.Core.Common/Configs/AppConfig.cs @@ -16,6 +16,11 @@ public class AppConfig public string Urls { get; set; } = "http://*:8081"; public AopConfig Aop { get; set; } + + /// + /// 同步缓存键 + /// + public bool SyncCacheKey { get; set; } } public class AopConfig diff --git a/Admin.Core.Common/Helpers/ConsoleHelper.cs b/Admin.Core.Common/Helpers/ConsoleHelper.cs index 5beca332b..0f875ab13 100644 --- a/Admin.Core.Common/Helpers/ConsoleHelper.cs +++ b/Admin.Core.Common/Helpers/ConsoleHelper.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Text; namespace Admin.Core.Common.Helpers { diff --git a/Admin.Core.Common/Helpers/UtilConvert.cs b/Admin.Core.Common/Helpers/UtilConvert.cs index a1de3fb09..8af15256a 100644 --- a/Admin.Core.Common/Helpers/UtilConvert.cs +++ b/Admin.Core.Common/Helpers/UtilConvert.cs @@ -21,7 +21,7 @@ public static int ToInt(this object thisValue) public static int ToInt(this object thisValue, int errorValue) { - int reval = 0; + int reval; if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) { return reval; @@ -40,7 +40,7 @@ public static long ToLong(this object s) public static double ToMoney(this object thisValue) { - double reval = 0; + double reval; if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) { return reval; @@ -50,7 +50,7 @@ public static double ToMoney(this object thisValue) public static double ToMoney(this object thisValue, double errorValue) { - double reval = 0; + double reval; if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) { return reval; @@ -72,7 +72,7 @@ public static string ToString(this object thisValue, string errorValue) public static decimal ToDecimal(this object thisValue) { - Decimal reval = 0; + decimal reval; if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval)) { return reval; @@ -82,7 +82,7 @@ public static decimal ToDecimal(this object thisValue) public static decimal ToDecimal(this object thisValue, decimal errorValue) { - Decimal reval = 0; + decimal reval; if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval)) { return reval; @@ -102,7 +102,7 @@ public static DateTime ToDate(this object thisValue) public static DateTime ToDate(this object thisValue, DateTime errorValue) { - DateTime reval = DateTime.MinValue; + DateTime reval; if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) { return reval; diff --git a/Admin.Core.Model/Admin/ApiEntity.cs b/Admin.Core.Model/Admin/ApiEntity.cs index 1117da0c0..1a294bffc 100644 --- a/Admin.Core.Model/Admin/ApiEntity.cs +++ b/Admin.Core.Model/Admin/ApiEntity.cs @@ -14,7 +14,7 @@ public class ApiEntity : EntityBase /// /// 所属模块 /// - public long? ParentId { get; set; } + public long ParentId { get; set; } /// /// 接口命名 diff --git a/Admin.Core.Model/Admin/ViewEntity.cs b/Admin.Core.Model/Admin/ViewEntity.cs index 988c541a8..b8dfe64e8 100644 --- a/Admin.Core.Model/Admin/ViewEntity.cs +++ b/Admin.Core.Model/Admin/ViewEntity.cs @@ -14,7 +14,7 @@ public class ViewEntity : EntityBase /// /// 所属节点 /// - public long? ParentId { get; set; } + public long ParentId { get; set; } /// /// 视图命名 diff --git a/Admin.Core.Repository/Base/IRepositoryBase.cs b/Admin.Core.Repository/Base/IRepositoryBase.cs index 61f935630..95e10f354 100644 --- a/Admin.Core.Repository/Base/IRepositoryBase.cs +++ b/Admin.Core.Repository/Base/IRepositoryBase.cs @@ -6,6 +6,12 @@ namespace Admin.Core.Repository { public interface IRepositoryBase : IBaseRepository where TEntity : class { + /// + /// 获得Dto + /// + /// + /// + /// Task GetAsync(TKey id); /// diff --git a/Admin.Core.Services/Admin.Core.Service.csproj b/Admin.Core.Services/Admin.Core.Service.csproj index bad0c7093..3c3e31c9e 100644 --- a/Admin.Core.Services/Admin.Core.Service.csproj +++ b/Admin.Core.Services/Admin.Core.Service.csproj @@ -11,8 +11,11 @@ + + + diff --git a/Admin.Core.Services/Admin/Api/ApiService.cs b/Admin.Core.Services/Admin/Api/ApiService.cs index 40ce9b150..9403d6ca7 100644 --- a/Admin.Core.Services/Admin/Api/ApiService.cs +++ b/Admin.Core.Services/Admin/Api/ApiService.cs @@ -183,7 +183,7 @@ public async Task SyncAsync(ApiSyncInput input) label = labels != null && labels.Count > 0 ? labels[0] : string.Empty; desc = labels != null && labels.Count > 1 ? string.Join("\r\n", labels.GetRange(1, labels.Count() - 1)) : string.Empty; - a.ParentId = pa?.Id; + a.ParentId = pa.Id; a.Label = label; a.Description = desc; a.HttpMethods = api.HttpMethods; diff --git a/Admin.Core.Services/Admin/Auth/AuthService.cs b/Admin.Core.Services/Admin/Auth/AuthService.cs index 508cc365f..19944956f 100644 --- a/Admin.Core.Services/Admin/Auth/AuthService.cs +++ b/Admin.Core.Services/Admin/Auth/AuthService.cs @@ -37,19 +37,6 @@ IRolePermissionRepository rolePermissionRepository public async Task LoginAsync(AuthLoginInput input) { - if (input.UserName.IsNull()) - { - return ResponseOutput.NotOk("用户名不能为空!"); - } - if (input.Password.IsNull()) - { - return ResponseOutput.NotOk("密码不能为空!"); - } - if (input.VerifyCode.IsNull()) - { - return ResponseOutput.NotOk("验证码不能为空!"); - } - #region 验证码校验 var verifyCodeKey = string.Format(CacheKey.VerifyCodeKey, input.VerifyCodeKey); var exists = await _cache.ExistsAsync(verifyCodeKey); @@ -81,17 +68,17 @@ public async Task LoginAsync(AuthLoginInput input) #region 解密 if (input.PasswordKey.NotNull()) { - var passwordKey = string.Format(CacheKey.PassWordKey, input.PasswordKey); - var existsPasswordKey = await _cache.ExistsAsync(passwordKey); + var passwordEncryptKey = string.Format(CacheKey.PassWordEncryptKey, input.PasswordKey); + var existsPasswordKey = await _cache.ExistsAsync(passwordEncryptKey); if (existsPasswordKey) { - var secretKey = await _cache.GetAsync(passwordKey); - if (passwordKey.IsNull()) + var secretKey = await _cache.GetAsync(passwordEncryptKey); + if (passwordEncryptKey.IsNull()) { return ResponseOutput.NotOk("解密失败!",1); } input.Password = DesEncrypt.Decrypt(input.Password, secretKey); - await _cache.DelAsync(passwordKey); + await _cache.DelAsync(passwordEncryptKey); } else { @@ -181,14 +168,14 @@ public async Task GetVerifyCodeAsync(string lastKey) return ResponseOutput.Ok(data); } - public async Task GetPassWordKeyAsync() + public async Task GetPassWordEncryptKeyAsync() { //写入Redis var guid = Guid.NewGuid().ToString("N"); - var key = string.Format(CacheKey.PassWordKey, guid); - var secretKey = StringHelper.GenerateRandom(8); - await _cache.SetAsync(key, secretKey, TimeSpan.FromMinutes(5)); - var data = new { key = guid, secretKey }; + var key = string.Format(CacheKey.PassWordEncryptKey, guid); + var encyptKey = StringHelper.GenerateRandom(8); + await _cache.SetAsync(key, encyptKey, TimeSpan.FromMinutes(5)); + var data = new { key = guid, encyptKey }; return ResponseOutput.Ok(data); } diff --git a/Admin.Core.Services/Admin/Auth/IAuthService.cs b/Admin.Core.Services/Admin/Auth/IAuthService.cs index f87237e27..208558e83 100644 --- a/Admin.Core.Services/Admin/Auth/IAuthService.cs +++ b/Admin.Core.Services/Admin/Auth/IAuthService.cs @@ -16,6 +16,6 @@ public interface IAuthService Task GetVerifyCodeAsync(string lastKey); - Task GetPassWordKeyAsync(); + Task GetPassWordEncryptKeyAsync(); } } diff --git a/Admin.Core.Services/Admin/Auth/Input/AuthLoginInput.cs b/Admin.Core.Services/Admin/Auth/Input/AuthLoginInput.cs index 79624be9a..e189775e3 100644 --- a/Admin.Core.Services/Admin/Auth/Input/AuthLoginInput.cs +++ b/Admin.Core.Services/Admin/Auth/Input/AuthLoginInput.cs @@ -1,4 +1,6 @@ -namespace Admin.Core.Service.Admin.Auth.Input +using System.ComponentModel.DataAnnotations; + +namespace Admin.Core.Service.Admin.Auth.Input { /// /// 登录信息 @@ -8,11 +10,13 @@ public class AuthLoginInput /// /// 账号 /// + [Required(ErrorMessage = "用户名不能为空!")] public string UserName { get; set; } /// /// 密码 /// + [Required(ErrorMessage = "密码不能为空!")] public string Password { get; set; } /// @@ -23,6 +27,7 @@ public class AuthLoginInput /// /// 验证码 /// + [Required(ErrorMessage = "验证码不能为空!")] public string VerifyCode { get; set; } /// diff --git a/Admin.Core.Services/Admin/Cache/CacheService.cs b/Admin.Core.Services/Admin/Cache/CacheService.cs new file mode 100644 index 000000000..a46cbbc3b --- /dev/null +++ b/Admin.Core.Services/Admin/Cache/CacheService.cs @@ -0,0 +1,52 @@ +using Admin.Core.Common.Auth; +using Admin.Core.Common.Cache; +using Admin.Core.Model.Output; +using Microsoft.Extensions.Logging; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; + +namespace Admin.Core.Service.Admin.Cache +{ + public class CacheService : ICacheService + { + private readonly ICache _cache; + private readonly IUser _user; + private readonly ILogger _logger; + public CacheService(ICache cache, IUser user, ILogger logger) + { + _cache = cache; + _user = user; + _logger = logger; + } + + public IResponseOutput List() + { + var list = new List(); + var cacheKey = typeof(CacheKey); + var fields = cacheKey.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy); + foreach (var field in fields) + { + var descriptionAttribute = field.GetCustomAttributes(typeof(DescriptionAttribute),false).FirstOrDefault() as DescriptionAttribute; + + list.Add(new + { + field.Name, + Value = field.GetRawConstantValue().ToString(), + descriptionAttribute?.Description + }); + } + + return ResponseOutput.Ok(list); + } + + public async Task ClearAsync(string cacheKey) + { + _logger.LogWarning($"{_user.Id}.{_user.Name}清除缓存[{cacheKey}]"); + await _cache.DelByPatternAsync(cacheKey); + return ResponseOutput.Ok(); + } + } +} diff --git a/Admin.Core.Services/Admin/Cache/ICacheService.cs b/Admin.Core.Services/Admin/Cache/ICacheService.cs new file mode 100644 index 000000000..a802eb801 --- /dev/null +++ b/Admin.Core.Services/Admin/Cache/ICacheService.cs @@ -0,0 +1,26 @@ + + +using Admin.Core.Model.Output; +using System.Threading.Tasks; + +namespace Admin.Core.Service.Admin.Cache +{ + /// + /// + /// + public interface ICacheService + { + /// + /// б + /// + /// + IResponseOutput List(); + + /// + /// + /// + /// + /// + Task ClearAsync(string cacheKey); + } +} diff --git a/Admin.Core.Services/Admin/View/ViewService.cs b/Admin.Core.Services/Admin/View/ViewService.cs index 0a7e6dfec..42bedf73a 100644 --- a/Admin.Core.Services/Admin/View/ViewService.cs +++ b/Admin.Core.Services/Admin/View/ViewService.cs @@ -187,7 +187,7 @@ public async Task SyncAsync(ViewSyncInput input) label = labels != null && labels.Count > 0 ? labels[0] : string.Empty; desc = labels != null && labels.Count > 1 ? string.Join("\r\n", labels.GetRange(1, labels.Count() - 1)) : string.Empty; - a.ParentId = pa?.Id; + a.ParentId = pa.Id; a.Label = label; a.Description = desc; a.Enabled = true; diff --git a/Admin.Core/Admin.Core.Service.xml b/Admin.Core/Admin.Core.Service.xml index 8ef97befc..b5f595917 100644 --- a/Admin.Core/Admin.Core.Service.xml +++ b/Admin.Core/Admin.Core.Service.xml @@ -237,6 +237,24 @@ 映射配置 + + + 缓存服务 + + + + + 缓存列表 + + + + + + 清除缓存 + + + + 添加 diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index e25cbf355..07e6bf812 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -21,7 +21,7 @@ - 自定义路由 /api/{version}/[controler]/[action] + 自定义路由 /api/{version}/[area]/[controler]/[action] @@ -135,7 +135,7 @@ 上次验证码键 - + 获取密钥 @@ -155,6 +155,24 @@ 登录信息 + + + 缓存管理 + + + + + 获取缓存列表 + + + + + + 清除缓存 + + + + 数据字典 @@ -261,7 +279,7 @@ - 查询权限分配界面权限列表 + 查询角色权限-权限列表 diff --git a/Admin.Core/Attributes/VersionRouteAttribute.cs b/Admin.Core/Attributes/VersionRouteAttribute.cs index 19959b80d..d0d077b6e 100644 --- a/Admin.Core/Attributes/VersionRouteAttribute.cs +++ b/Admin.Core/Attributes/VersionRouteAttribute.cs @@ -6,14 +6,14 @@ namespace Admin.Core.Attributes { /// - /// 自定义路由 /api/{version}/[controler]/[action] + /// 自定义路由 /api/{version}/[area]/[controler]/[action] /// [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] public class VersionRouteAttribute : RouteAttribute, IApiDescriptionGroupNameProvider { public string GroupName { get; set; } - public VersionRouteAttribute(ApiVersion version, string actionName = "") : base($"/api/{version.ToString()}/[controller]/{actionName}") + public VersionRouteAttribute(ApiVersion version, string actionName = "") : base($"/api/{version.ToString()}/[area]/[controller]/{actionName}") { GroupName = version.ToString(); } diff --git a/Admin.Core/Controllers/Admin/AuthController.cs b/Admin.Core/Controllers/Admin/AuthController.cs index 9fa313459..ceeb8c0f2 100644 --- a/Admin.Core/Controllers/Admin/AuthController.cs +++ b/Admin.Core/Controllers/Admin/AuthController.cs @@ -39,9 +39,9 @@ public async Task GetVerifyCode(string lastKey) /// [HttpGet] [AllowAnonymous] - public async Task GetPassWordKey() + public async Task GetPassWordEncryptKey() { - return await _authServices.GetPassWordKeyAsync(); + return await _authServices.GetPassWordEncryptKeyAsync(); } /// diff --git a/Admin.Core/Controllers/Admin/CacheController.cs b/Admin.Core/Controllers/Admin/CacheController.cs new file mode 100644 index 000000000..777189a66 --- /dev/null +++ b/Admin.Core/Controllers/Admin/CacheController.cs @@ -0,0 +1,42 @@ +using System.Threading.Tasks; +using Admin.Core.Model.Output; +using Admin.Core.Service.Admin.Cache; +using Microsoft.AspNetCore.Mvc; + +namespace Admin.Core.Controllers.Admin +{ + /// + /// 缓存管理 + /// + public class CacheController : AreaController + { + + private readonly ICacheService _cacheServices; + + public CacheController(ICacheService cacheServices) + { + _cacheServices = cacheServices; + } + + /// + /// 获取缓存列表 + /// + /// + [HttpGet] + public IResponseOutput List() + { + return _cacheServices.List(); + } + + /// + /// 清除缓存 + /// + /// + /// + [HttpDelete] + public async Task Clear(string cacheKey) + { + return await _cacheServices.ClearAsync(cacheKey); + } + } +} diff --git a/Admin.Core/Controllers/Admin/PermissionController.cs b/Admin.Core/Controllers/Admin/PermissionController.cs index 11a048025..99786ee12 100644 --- a/Admin.Core/Controllers/Admin/PermissionController.cs +++ b/Admin.Core/Controllers/Admin/PermissionController.cs @@ -66,7 +66,7 @@ public async Task GetApi(long id) } /// - /// 查询权限分配界面权限列表 + /// 查询角色权限-权限列表 /// /// [HttpGet] diff --git a/Admin.Core/Db/Data/data.json b/Admin.Core/Db/Data/data.json index 648156c1c..7dafdbed2 100644 --- a/Admin.Core/Db/Data/data.json +++ b/Admin.Core/Db/Data/data.json @@ -1 +1 @@ -{"dictionaries":[],"apis":[{"id":1,"parentId":0,"label":"接口管理","path":"api","description":""},{"id":2,"parentId":0,"label":"授权管理","path":"auth","description":""},{"id":3,"parentId":0,"label":"数据字典","path":"dictionary","description":""},{"id":4,"parentId":0,"label":"图片管理","path":"img","description":""},{"id":5,"parentId":0,"label":"权限管理","path":"permission","description":""},{"id":6,"parentId":0,"label":"角色管理","path":"role","description":""},{"id":7,"parentId":0,"label":"用户管理","path":"user","description":""},{"id":8,"parentId":0,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":27,"parentId":4,"label":"获取头像","path":"/api/admin/img/avatar/{filename}","httpMethods":"get","description":""},{"id":28,"parentId":4,"label":"下载图片","path":"/api/admin/img/download/{filename}","httpMethods":"get","description":""},{"id":29,"parentId":4,"label":"上传图片","path":"/api/admin/img/upload","httpMethods":"post","description":"支持多图片上传"},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询权限分配界面权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"post","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"post","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"post","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"parentId":0,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/logs","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4}],"permissions":[{"id":1,"parentId":65,"label":"首页","type":2,"viewId":1,"path":"/","icon":"fa fa-home","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":true,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"parentId":65,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":4,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/2881099/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","name":"管理员","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","name":"小雪转中雪","nickName":"小雪转中雪","avatar":"avatar.gif","remark":""}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":2,"userId":2,"roleId":2}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66}]} \ No newline at end of file +{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":4,"label":"图片管理","path":"img","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":27,"parentId":4,"label":"获取头像","path":"/api/admin/img/avatar/{filename}","httpMethods":"get","description":""},{"id":28,"parentId":4,"label":"下载图片","path":"/api/admin/img/download/{filename}","httpMethods":"get","description":""},{"id":29,"parentId":4,"label":"上传图片","path":"/api/admin/img/upload","httpMethods":"post","description":"支持多图片上传"},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"post","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"post","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"post","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/logs","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":true,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"parentId":65,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":4,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/2881099/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","type":3,"apiId":72,"sort":2,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","name":"管理员","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","name":"小雪转中雪","nickName":"小雪转中雪","avatar":"avatar.gif","remark":""}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":2,"userId":2,"roleId":2}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69}]} \ No newline at end of file diff --git a/Admin.Core/configs/appconfig.json b/Admin.Core/configs/appconfig.json index fb05a46d3..2d529123d 100644 --- a/Admin.Core/configs/appconfig.json +++ b/Admin.Core/configs/appconfig.json @@ -3,8 +3,11 @@ "swagger": false, //Api地址 "urls": "http://*:8081", + //面向切面编程 "aop": { //事物 "transaction": false - } + }, + //同步缓存键到数据库 + "syncCacheKey": true } From d59fc3f558f95420e7adb6745e55f37e51d9b8d1 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Wed, 25 Mar 2020 12:22:43 +0800 Subject: [PATCH 11/53] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E5=8F=8B=E5=A5=BD=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Configs/AppConfig.cs | 5 ----- Admin.Core/Admin.Core.xml | 2 +- Admin.Core/Db/DbHelper.cs | 10 ++++------ Admin.Core/Db/ServiceCollectionExtensions.cs | 2 +- Admin.Core/configs/appconfig.json | 4 +--- 5 files changed, 7 insertions(+), 16 deletions(-) diff --git a/Admin.Core.Common/Configs/AppConfig.cs b/Admin.Core.Common/Configs/AppConfig.cs index 4a9380eaa..5313d9930 100644 --- a/Admin.Core.Common/Configs/AppConfig.cs +++ b/Admin.Core.Common/Configs/AppConfig.cs @@ -16,11 +16,6 @@ public class AppConfig public string Urls { get; set; } = "http://*:8081"; public AopConfig Aop { get; set; } - - /// - /// 同步缓存键 - /// - public bool SyncCacheKey { get; set; } } public class AopConfig diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index 07e6bf812..b1fb3667b 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -540,7 +540,7 @@ - + 同步结构 diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index 7d55c967c..2d5ebdc2e 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -46,7 +46,7 @@ public async static Task CreateDatabase(DbConfig dbConfig) /// /// 同步结构 /// - public static void SyncStructure(IFreeSql db,bool autoIncrement = true, string msg = null) + public static void SyncStructure(IFreeSql db,bool autoIncrement = true, string msg = null,string dbType = null) { //打印结构比对脚本 //var dDL = db.CodeFirst.GetComparisonDDLStatements(); @@ -88,9 +88,9 @@ public static void SyncStructure(IFreeSql db,bool autoIncrement = true, string m } // 同步结构 - Console.WriteLine($"\r\n{(msg.NotNull() ? msg : "sync structure")} started"); + Console.WriteLine($"\r\n{(msg.NotNull() ? msg : $"sync {dbType} structure")} started"); db.CodeFirst.SyncStructure(types); - Console.WriteLine($"{(msg.NotNull() ? msg : "sync structure")} succeed\r\n"); + Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} succeed\r\n"); } /// @@ -112,7 +112,7 @@ private static async Task InitData(IFreeSql db,T[] data) where T : class if (data?.Length > 0) { await db.Insert().AppendData(data).ExecuteAffrowsAsync(); - Console.WriteLine($"table:{tableName} sync data succeed"); + Console.WriteLine($"table: {tableName} sync data succeed"); } else { @@ -353,7 +353,5 @@ public static async Task GenerateSimpleJsonData(IFreeSql db) throw new Exception($"generate data failed。\n{ex.Message}\r\n"); } } - - } } diff --git a/Admin.Core/Db/ServiceCollectionExtensions.cs b/Admin.Core/Db/ServiceCollectionExtensions.cs index 77e2eaef0..f5e010af1 100644 --- a/Admin.Core/Db/ServiceCollectionExtensions.cs +++ b/Admin.Core/Db/ServiceCollectionExtensions.cs @@ -50,7 +50,7 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen //同步结构 if (dbConfig.SyncStructure) { - DbHelper.SyncStructure(fsql); + DbHelper.SyncStructure(fsql, dbType: dbConfig.Type.ToString()); } //同步数据 diff --git a/Admin.Core/configs/appconfig.json b/Admin.Core/configs/appconfig.json index 2d529123d..83b2f1f8e 100644 --- a/Admin.Core/configs/appconfig.json +++ b/Admin.Core/configs/appconfig.json @@ -7,7 +7,5 @@ "aop": { //事物 "transaction": false - }, - //同步缓存键到数据库 - "syncCacheKey": true + } } From fcfc6e893d73b256054bb2de1617ad4607b65540 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Wed, 25 Mar 2020 23:26:23 +0800 Subject: [PATCH 12/53] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C=E5=8D=87?= =?UTF-8?q?=E7=BA=A7Nuge=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 12 +++++----- Admin.Core.Common/Auth/User.cs | 23 +++++++++++++++++++ Admin.Core.Common/Cache/CacheKey.cs | 2 +- Admin.Core.Services/Admin/Auth/AuthService.cs | 3 ++- .../Permission/Input/PermissionAssignInput.cs | 6 ++++- .../Admin/Permission/PermissionService.cs | 5 ---- .../Admin/User/Input/UserAddInput.cs | 1 + .../User/Input/UserChangePasswordInput.cs | 14 +++++++---- .../Admin/User/Input/UserUpdateInput.cs | 4 ++++ Admin.Core/Admin.Core.Service.xml | 10 ++++---- Admin.Core/Admin.Core.csproj | 6 ++--- .../Controllers/Admin/CacheController.cs | 2 +- .../Controllers/Admin/PermissionController.cs | 6 ++--- Admin.Core/Db/Data/data.json | 2 +- Admin.Core/Db/DbHelper.cs | 8 +++---- 15 files changed, 68 insertions(+), 36 deletions(-) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 3a029b93e..216f6e677 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -5,18 +5,18 @@ - + - - - - + + + + - + diff --git a/Admin.Core.Common/Auth/User.cs b/Admin.Core.Common/Auth/User.cs index 553fb8426..3afd73e15 100644 --- a/Admin.Core.Common/Auth/User.cs +++ b/Admin.Core.Common/Auth/User.cs @@ -51,6 +51,24 @@ public string Name } } + /// + /// 姓名 + /// + public string RealName + { + get + { + var name = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.UserRealName); + + if (name != null && name.Value.NotNull()) + { + return name.Value; + } + + return ""; + } + } + /// /// 用户IP @@ -128,5 +146,10 @@ public static class ClaimAttributes /// 用户名 /// public const string UserName = "na"; + + /// + /// 姓名 + /// + public const string UserRealName = "rna"; } } diff --git a/Admin.Core.Common/Cache/CacheKey.cs b/Admin.Core.Common/Cache/CacheKey.cs index f4d781440..5b5d817c9 100644 --- a/Admin.Core.Common/Cache/CacheKey.cs +++ b/Admin.Core.Common/Cache/CacheKey.cs @@ -18,7 +18,7 @@ public static class CacheKey /// 密码加密 admin:password:encrypt:guid /// [Description("密码加密")] - public const string PassWordEncryptKey = "admin:password:{0}"; + public const string PassWordEncryptKey = "admin:password:encrypt:{0}"; /// /// 用户权限 admin:user:用户主键:permissions diff --git a/Admin.Core.Services/Admin/Auth/AuthService.cs b/Admin.Core.Services/Admin/Auth/AuthService.cs index 19944956f..098382fba 100644 --- a/Admin.Core.Services/Admin/Auth/AuthService.cs +++ b/Admin.Core.Services/Admin/Auth/AuthService.cs @@ -97,7 +97,8 @@ public async Task LoginAsync(AuthLoginInput input) var claims = new[] { new Claim(ClaimAttributes.UserId, user.Id.ToString()), - new Claim(ClaimAttributes.UserName, user.Name.IsNull()?user.NickName:user.Name) + new Claim(ClaimAttributes.UserName, user.UserName), + new Claim(ClaimAttributes.UserRealName, user.Name) }; var token = _userToken.Build(claims); diff --git a/Admin.Core.Services/Admin/Permission/Input/PermissionAssignInput.cs b/Admin.Core.Services/Admin/Permission/Input/PermissionAssignInput.cs index 342f52cb8..e9fdaef29 100644 --- a/Admin.Core.Services/Admin/Permission/Input/PermissionAssignInput.cs +++ b/Admin.Core.Services/Admin/Permission/Input/PermissionAssignInput.cs @@ -1,10 +1,14 @@ using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; namespace Admin.Core.Service.Admin.Permission.Input { public class PermissionAssignInput { - public List PermissionIds { get; set; } + [Required(ErrorMessage = "ɫΪգ")] public int RoleId { get; set; } + + [Required(ErrorMessage = "Ȩ޲Ϊգ")] + public List PermissionIds { get; set; } } } diff --git a/Admin.Core.Services/Admin/Permission/PermissionService.cs b/Admin.Core.Services/Admin/Permission/PermissionService.cs index c823b4394..53b4c78d9 100644 --- a/Admin.Core.Services/Admin/Permission/PermissionService.cs +++ b/Admin.Core.Services/Admin/Permission/PermissionService.cs @@ -159,11 +159,6 @@ public async Task SoftDeleteAsync(long id) [Transaction] public async Task AssignAsync(PermissionAssignInput input) { - if (!(input.RoleId > 0)) - { - return ResponseOutput.NotOk("ɫΪ"); - } - //ѯɫȨ var permissionIds = await _rolePermissionRepository.Select.Where(d => d.RoleId == input.RoleId).ToListAsync(m=>m.PermissionId); diff --git a/Admin.Core.Services/Admin/User/Input/UserAddInput.cs b/Admin.Core.Services/Admin/User/Input/UserAddInput.cs index e49c7f13e..29f4975a4 100644 --- a/Admin.Core.Services/Admin/User/Input/UserAddInput.cs +++ b/Admin.Core.Services/Admin/User/Input/UserAddInput.cs @@ -23,6 +23,7 @@ public class UserAddInput /// /// 姓名 /// + [Required(ErrorMessage = "请输入姓名")] public string Name { get; set; } /// diff --git a/Admin.Core.Services/Admin/User/Input/UserChangePasswordInput.cs b/Admin.Core.Services/Admin/User/Input/UserChangePasswordInput.cs index 16a32280e..2ea0fa1b6 100644 --- a/Admin.Core.Services/Admin/User/Input/UserChangePasswordInput.cs +++ b/Admin.Core.Services/Admin/User/Input/UserChangePasswordInput.cs @@ -1,4 +1,5 @@ using Admin.Core.Model; +using System.ComponentModel.DataAnnotations; namespace Admin.Core.Service.Admin.User.Input { @@ -7,26 +8,29 @@ namespace Admin.Core.Service.Admin.User.Input /// public class UserChangePasswordInput: Entity { - /// - /// 密码 - /// - public string Password { get; set; } - /// /// 旧密码 /// + [Required(ErrorMessage = "请输入旧密码")] public string OldPassword { get; set; } /// /// 新密码 /// + [Required(ErrorMessage = "请输入新密码")] public string NewPassword { get; set; } /// /// 确认新密码 /// + [Required(ErrorMessage = "请输入确认新密码")] public string ConfirmPassword { get; set; } + /// + /// 密码 + /// + public string Password { get; set; } + /// /// 版本 /// diff --git a/Admin.Core.Services/Admin/User/Input/UserUpdateInput.cs b/Admin.Core.Services/Admin/User/Input/UserUpdateInput.cs index f847fd7fe..a5a4a9e37 100644 --- a/Admin.Core.Services/Admin/User/Input/UserUpdateInput.cs +++ b/Admin.Core.Services/Admin/User/Input/UserUpdateInput.cs @@ -1,4 +1,6 @@  +using System.ComponentModel.DataAnnotations; + namespace Admin.Core.Service.Admin.User.Input { /// @@ -14,11 +16,13 @@ public partial class UserUpdateInput /// /// 账号 /// + [Required(ErrorMessage = "请输入账号")] public string UserName { get; set; } /// /// 姓名 /// + [Required(ErrorMessage = "请输入姓名")] public string Name { get; set; } /// diff --git a/Admin.Core/Admin.Core.Service.xml b/Admin.Core/Admin.Core.Service.xml index b5f595917..c030aa3e5 100644 --- a/Admin.Core/Admin.Core.Service.xml +++ b/Admin.Core/Admin.Core.Service.xml @@ -675,11 +675,6 @@ 修改密码 - - - 密码 - - 旧密码 @@ -695,6 +690,11 @@ 确认新密码 + + + 密码 + + 版本 diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index 334c2e2ff..80c3931e5 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -35,10 +35,10 @@ - - + + - + diff --git a/Admin.Core/Controllers/Admin/CacheController.cs b/Admin.Core/Controllers/Admin/CacheController.cs index 777189a66..7519d45ef 100644 --- a/Admin.Core/Controllers/Admin/CacheController.cs +++ b/Admin.Core/Controllers/Admin/CacheController.cs @@ -1,7 +1,7 @@ using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; using Admin.Core.Model.Output; using Admin.Core.Service.Admin.Cache; -using Microsoft.AspNetCore.Mvc; namespace Admin.Core.Controllers.Admin { diff --git a/Admin.Core/Controllers/Admin/PermissionController.cs b/Admin.Core/Controllers/Admin/PermissionController.cs index 99786ee12..c4327d788 100644 --- a/Admin.Core/Controllers/Admin/PermissionController.cs +++ b/Admin.Core/Controllers/Admin/PermissionController.cs @@ -124,7 +124,7 @@ public async Task AddApi(PermissionAddApiInput input) /// /// /// - [HttpPost] + [HttpPut] public async Task UpdateGroup(PermissionUpdateGroupInput input) { return await _permissionServices.UpdateGroupAsync(input); @@ -135,7 +135,7 @@ public async Task UpdateGroup(PermissionUpdateGroupInput input) /// /// /// - [HttpPost] + [HttpPut] public async Task UpdateMenu(PermissionUpdateMenuInput input) { return await _permissionServices.UpdateMenuAsync(input); @@ -146,7 +146,7 @@ public async Task UpdateMenu(PermissionUpdateMenuInput input) /// /// /// - [HttpPost] + [HttpPut] public async Task UpdateApi(PermissionUpdateApiInput input) { return await _permissionServices.UpdateApiAsync(input); diff --git a/Admin.Core/Db/Data/data.json b/Admin.Core/Db/Data/data.json index 7dafdbed2..37e4be62c 100644 --- a/Admin.Core/Db/Data/data.json +++ b/Admin.Core/Db/Data/data.json @@ -1 +1 @@ -{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":4,"label":"图片管理","path":"img","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":27,"parentId":4,"label":"获取头像","path":"/api/admin/img/avatar/{filename}","httpMethods":"get","description":""},{"id":28,"parentId":4,"label":"下载图片","path":"/api/admin/img/download/{filename}","httpMethods":"get","description":""},{"id":29,"parentId":4,"label":"上传图片","path":"/api/admin/img/upload","httpMethods":"post","description":"支持多图片上传"},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"post","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"post","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"post","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/logs","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":true,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"parentId":65,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":4,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/2881099/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","type":3,"apiId":72,"sort":2,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","name":"管理员","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","name":"小雪转中雪","nickName":"小雪转中雪","avatar":"avatar.gif","remark":""}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":2,"userId":2,"roleId":2}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69}]} \ No newline at end of file +{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":4,"label":"图片管理","path":"img","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":27,"parentId":4,"label":"获取头像","path":"/api/admin/img/avatar/{filename}","httpMethods":"get","description":""},{"id":28,"parentId":4,"label":"下载图片","path":"/api/admin/img/download/{filename}","httpMethods":"get","description":""},{"id":29,"parentId":4,"label":"上传图片","path":"/api/admin/img/upload","httpMethods":"post","description":"支持多图片上传"},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/logs","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":true,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"parentId":65,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":4,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/2881099/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","type":3,"apiId":72,"sort":2,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","name":"管理员","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","name":"小雪转中雪","nickName":"小雪转中雪","avatar":"avatar.gif","remark":""}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":2,"userId":2,"roleId":2}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69}]} \ No newline at end of file diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index 2d5ebdc2e..6b2e660e2 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -142,10 +142,10 @@ private static void SyncDataAuditValue(object s, AuditValueEventArgs e) switch (e.Property.Name) { case "CreatedUserId": - e.Value = 1; + e.Value = 2; break; case "CreatedUserName": - e.Value = "小雪转中雪"; + e.Value = "xiaoxue"; break; } } @@ -154,10 +154,10 @@ private static void SyncDataAuditValue(object s, AuditValueEventArgs e) switch (e.Property.Name) { case "ModifiedUserId": - e.Value = 1; + e.Value = 2; break; case "ModifiedUserName": - e.Value = "小雪转中雪"; + e.Value = "xiaoxue"; break; } } From ae341c69bd1357fb679b39291da93fdd47540718 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Sun, 29 Mar 2020 00:36:52 +0800 Subject: [PATCH 13/53] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=92=8C=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 1 + Admin.Core.Common/Auth/IUser.cs | 26 +- Admin.Core.Common/Auth/User.cs | 44 ++- Admin.Core.Common/Configs/AppConfig.cs | 22 ++ Admin.Core.Model/Admin/LogAbstract.cs | 69 +++++ Admin.Core.Model/Admin/LoginLogEntity.cs | 12 + Admin.Core.Model/Admin/OprationLogEntity.cs | 36 +++ Admin.Core.Model/Output/IResponseOutput.cs | 5 + .../Admin/LoginLog/ILoginLogRepository.cs | 11 + .../Admin/LoginLog/LoginLogRepository.cs | 14 + .../OprationLog/IOprationLogRepository.cs | 11 + .../OprationLog/OprationLogRepository.cs | 13 + Admin.Core.Repository/Base/IRepositoryBase.cs | 18 +- Admin.Core.Repository/Base/RepositoryBase.cs | 17 +- Admin.Core.Services/Admin.Core.Service.csproj | 4 - .../Admin/Api/Output/ApiListOutput.cs | 2 +- Admin.Core.Services/Admin/Auth/AuthService.cs | 23 +- .../Admin/Auth/Output/AuthLoginOutput.cs | 22 ++ Admin.Core.Services/Admin/Auth/_MapConfig.cs | 4 +- .../Dictionary/Output/DictionaryListOutput.cs | 2 +- .../Admin/LoginLog/ILoginLogService.cs | 15 + .../Admin/LoginLog/Input/LoginLogAddInput.cs | 68 ++++ .../Admin/LoginLog/LoginLogService.cs | 74 +++++ .../LoginLog/Output/LoginLogListOutput.cs | 62 ++++ .../Admin/LoginLog/_MapConfig.cs | 17 + .../Admin/OprationLog/IOprationLogService.cs | 15 + .../OprationLog/Input/OprationLogAddInput.cs | 78 +++++ .../Admin/OprationLog/OprationLogService.cs | 73 +++++ .../Output/OprationLogListOutput.cs | 77 +++++ .../Admin/OprationLog/_MapConfig.cs | 17 + .../Permission/Output/PermissionListOutput.cs | 2 +- .../Admin/Role/Output/RoleListOutput.cs | 2 +- .../Admin/User/Output/UserListOutput.cs | 2 +- .../Admin/View/Output/ViewListOutput.cs | 2 +- Admin.Core/Admin.Core.Model.xml | 90 ++++++ Admin.Core/Admin.Core.Service.xml | 290 ++++++++++++++++++ Admin.Core/Admin.Core.csproj | 4 - Admin.Core/Admin.Core.xml | 56 +++- .../Attributes/NoOprationLogAttribute.cs | 12 + Admin.Core/Attributes/PermissionAttribute.cs | 9 +- .../Controllers/Admin/AuthController.cs | 73 ++++- Admin.Core/Controllers/Admin/ImgController.cs | 2 + .../Controllers/Admin/LoginLogController.cs | 33 ++ .../Admin/OprationLogController.cs | 33 ++ Admin.Core/Db/Data/data.json | 2 +- Admin.Core/Db/DbHelper.cs | 4 +- Admin.Core/Db/ServiceCollectionExtensions.cs | 12 +- ...ptionFilter.cs => AdminExceptionFilter.cs} | 22 +- Admin.Core/Filters/LogActionFilter.cs | 28 ++ Admin.Core/Logs/ApiHelper.cs | 53 ++++ Admin.Core/Logs/ILogHandler.cs | 20 ++ Admin.Core/Logs/LogHandler.cs | 59 ++++ Admin.Core/Startup.cs | 62 ++-- Admin.Core/configs/appconfig.json | 5 + Admin.Core/configs/dbconfig.Development.json | 1 + 55 files changed, 1610 insertions(+), 120 deletions(-) create mode 100644 Admin.Core.Model/Admin/LogAbstract.cs create mode 100644 Admin.Core.Model/Admin/LoginLogEntity.cs create mode 100644 Admin.Core.Model/Admin/OprationLogEntity.cs create mode 100644 Admin.Core.Repository/Admin/LoginLog/ILoginLogRepository.cs create mode 100644 Admin.Core.Repository/Admin/LoginLog/LoginLogRepository.cs create mode 100644 Admin.Core.Repository/Admin/OprationLog/IOprationLogRepository.cs create mode 100644 Admin.Core.Repository/Admin/OprationLog/OprationLogRepository.cs create mode 100644 Admin.Core.Services/Admin/Auth/Output/AuthLoginOutput.cs create mode 100644 Admin.Core.Services/Admin/LoginLog/ILoginLogService.cs create mode 100644 Admin.Core.Services/Admin/LoginLog/Input/LoginLogAddInput.cs create mode 100644 Admin.Core.Services/Admin/LoginLog/LoginLogService.cs create mode 100644 Admin.Core.Services/Admin/LoginLog/Output/LoginLogListOutput.cs create mode 100644 Admin.Core.Services/Admin/LoginLog/_MapConfig.cs create mode 100644 Admin.Core.Services/Admin/OprationLog/IOprationLogService.cs create mode 100644 Admin.Core.Services/Admin/OprationLog/Input/OprationLogAddInput.cs create mode 100644 Admin.Core.Services/Admin/OprationLog/OprationLogService.cs create mode 100644 Admin.Core.Services/Admin/OprationLog/Output/OprationLogListOutput.cs create mode 100644 Admin.Core.Services/Admin/OprationLog/_MapConfig.cs create mode 100644 Admin.Core/Attributes/NoOprationLogAttribute.cs create mode 100644 Admin.Core/Controllers/Admin/LoginLogController.cs create mode 100644 Admin.Core/Controllers/Admin/OprationLogController.cs rename Admin.Core/Filters/{GlobalExceptionFilter.cs => AdminExceptionFilter.cs} (70%) create mode 100644 Admin.Core/Filters/LogActionFilter.cs create mode 100644 Admin.Core/Logs/ApiHelper.cs create mode 100644 Admin.Core/Logs/ILogHandler.cs create mode 100644 Admin.Core/Logs/LogHandler.cs diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 216f6e677..8bc5760e7 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -17,6 +17,7 @@ + diff --git a/Admin.Core.Common/Auth/IUser.cs b/Admin.Core.Common/Auth/IUser.cs index 1292f0d77..257086279 100644 --- a/Admin.Core.Common/Auth/IUser.cs +++ b/Admin.Core.Common/Auth/IUser.cs @@ -1,14 +1,26 @@ -using System.Collections.Generic; -using System.Security.Claims; - -namespace Admin.Core.Common.Auth +namespace Admin.Core.Common.Auth { public interface IUser { + /// + /// 主键 + /// long Id { get; } + /// + /// 登录日志Id + /// + long LoginLogId { get; } + /// + /// 用户名 + /// string Name { get; } - bool IsAuthenticated(); - IEnumerable GetClaimsIdentity(); - List GetClaimValueByType(string ClaimType); + /// + /// 姓名 + /// + string RealName { get; } + /// + /// IP + /// + string IP { get; } } } diff --git a/Admin.Core.Common/Auth/User.cs b/Admin.Core.Common/Auth/User.cs index 3afd73e15..1c1fecf39 100644 --- a/Admin.Core.Common/Auth/User.cs +++ b/Admin.Core.Common/Auth/User.cs @@ -1,7 +1,4 @@ -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http; namespace Admin.Core.Common.Auth { @@ -69,6 +66,21 @@ public string RealName } } + /// + /// 登录日志Id + /// + public long LoginLogId + { + get + { + var id = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.UserLoginLogId); + if (id != null && id.Value.NotNull()) + { + return id.Value.ToLong(); + } + return 0; + } + } /// /// 用户IP @@ -111,25 +123,6 @@ public string IPv6 return _accessor.HttpContext.Connection.RemoteIpAddress.MapToIPv6().ToString(); } } - - public bool IsAuthenticated() - { - return _accessor.HttpContext.User.Identity.IsAuthenticated; - } - - public IEnumerable GetClaimsIdentity() - { - return _accessor.HttpContext.User.Claims; - } - - public List GetClaimValueByType(string ClaimType) - { - - return (from item in GetClaimsIdentity() - where item.Type == ClaimType - select item.Value).ToList(); - - } } /// @@ -151,5 +144,10 @@ public static class ClaimAttributes /// 姓名 /// public const string UserRealName = "rna"; + + /// + /// 登录日志Id + /// + public const string UserLoginLogId = "llid"; } } diff --git a/Admin.Core.Common/Configs/AppConfig.cs b/Admin.Core.Common/Configs/AppConfig.cs index 5313d9930..dc7fcf467 100644 --- a/Admin.Core.Common/Configs/AppConfig.cs +++ b/Admin.Core.Common/Configs/AppConfig.cs @@ -15,9 +15,20 @@ public class AppConfig /// public string Urls { get; set; } = "http://*:8081"; + /// + /// Aop配置 + /// public AopConfig Aop { get; set; } + + /// + /// 日志配置 + /// + public LogConfig Log { get; set; } } + /// + /// Aop配置 + /// public class AopConfig { /// @@ -25,4 +36,15 @@ public class AopConfig /// public bool Transaction { get; set; } } + + /// + /// 日志配置 + /// + public class LogConfig + { + /// + /// 操作日志 + /// + public bool Operation { get; set; } + } } diff --git a/Admin.Core.Model/Admin/LogAbstract.cs b/Admin.Core.Model/Admin/LogAbstract.cs new file mode 100644 index 000000000..f0c46a7c4 --- /dev/null +++ b/Admin.Core.Model/Admin/LogAbstract.cs @@ -0,0 +1,69 @@ +using FreeSql.DataAnnotations; +using System.ComponentModel.DataAnnotations; + +namespace Admin.Core.Model.Admin +{ + /// + /// 日志 + /// + public abstract class LogAbstract : EntityAdd + { + /// + /// 姓名 + /// + [MaxLength(60)] + public string RealName { get; set; } + + /// + /// IP + /// + [MaxLength(100)] + public string IP { get; set; } + + /// + /// 浏览器 + /// + [MaxLength(100)] + public string Browser { get; set; } + + /// + /// 操作系统 + /// + [MaxLength(100)] + public string Os { get; set; } + + /// + /// 设备 + /// + [MaxLength(50)] + public string Device { get; set; } + + /// + /// 浏览器信息 + /// + [Column(StringLength = -1)] + public string BrowserInfo { get; set; } + + /// + /// 耗时(毫秒) + /// + public long ElapsedMilliseconds { get; set; } + + /// + /// 操作状态 + /// + public bool Status { get; set; } + + /// + /// 操作消息 + /// + [Column(StringLength = 500)] + public string Msg { get; set; } + + /// + /// 操作结果 + /// + [Column(StringLength = -1)] + public string Result { get; set; } + } +} diff --git a/Admin.Core.Model/Admin/LoginLogEntity.cs b/Admin.Core.Model/Admin/LoginLogEntity.cs new file mode 100644 index 000000000..b8bb8d9d0 --- /dev/null +++ b/Admin.Core.Model/Admin/LoginLogEntity.cs @@ -0,0 +1,12 @@ +using FreeSql.DataAnnotations; + +namespace Admin.Core.Model.Admin +{ + /// + /// 操作日志 + /// + [Table(Name = "ad_login_log")] + public class LoginLogEntity : LogAbstract + { + } +} diff --git a/Admin.Core.Model/Admin/OprationLogEntity.cs b/Admin.Core.Model/Admin/OprationLogEntity.cs new file mode 100644 index 000000000..5b4693b8a --- /dev/null +++ b/Admin.Core.Model/Admin/OprationLogEntity.cs @@ -0,0 +1,36 @@ +using System.ComponentModel.DataAnnotations; +using FreeSql.DataAnnotations; + +namespace Admin.Core.Model.Admin +{ + /// + /// 操作日志 + /// + [Table(Name = "ad_opration_log")] + public class OprationLogEntity: LogAbstract + { + /// + /// 接口名称 + /// + [Column(Position = 2, StringLength = 50)] + public string ApiLabel { get; set; } + + /// + /// 接口地址 + /// + [Column(Position = 3, StringLength = 500)] + public string ApiPath { get; set; } + + /// + /// 接口提交方法 + /// + [Column(Position = 4, StringLength = 50)] + public string ApiMethod { get; set; } + + /// + /// 操作参数 + /// + [Column(StringLength = -1)] + public string Params { get; set; } + } +} diff --git a/Admin.Core.Model/Output/IResponseOutput.cs b/Admin.Core.Model/Output/IResponseOutput.cs index 7f37c0473..f0402a68e 100644 --- a/Admin.Core.Model/Output/IResponseOutput.cs +++ b/Admin.Core.Model/Output/IResponseOutput.cs @@ -12,6 +12,11 @@ public interface IResponseOutput /// [JsonIgnore] bool Success { get; } + + /// + /// 消息 + /// + public string Msg { get;} } /// diff --git a/Admin.Core.Repository/Admin/LoginLog/ILoginLogRepository.cs b/Admin.Core.Repository/Admin/LoginLog/ILoginLogRepository.cs new file mode 100644 index 000000000..db8ee6d2d --- /dev/null +++ b/Admin.Core.Repository/Admin/LoginLog/ILoginLogRepository.cs @@ -0,0 +1,11 @@ +using Admin.Core.Model.Admin; + +namespace Admin.Core.Repository.Admin +{ + public interface ILoginLogRepository : IRepositoryBase + { + } +} + + + \ No newline at end of file diff --git a/Admin.Core.Repository/Admin/LoginLog/LoginLogRepository.cs b/Admin.Core.Repository/Admin/LoginLog/LoginLogRepository.cs new file mode 100644 index 000000000..cd431f33a --- /dev/null +++ b/Admin.Core.Repository/Admin/LoginLog/LoginLogRepository.cs @@ -0,0 +1,14 @@ +using FreeSql; +using Admin.Core.Model.Admin; +using Admin.Core.Common.Auth; +using System.Threading.Tasks; + +namespace Admin.Core.Repository.Admin +{ + public class LoginLogRepository : RepositoryBase, ILoginLogRepository + { + public LoginLogRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + { + } + } +} diff --git a/Admin.Core.Repository/Admin/OprationLog/IOprationLogRepository.cs b/Admin.Core.Repository/Admin/OprationLog/IOprationLogRepository.cs new file mode 100644 index 000000000..7d5c2418e --- /dev/null +++ b/Admin.Core.Repository/Admin/OprationLog/IOprationLogRepository.cs @@ -0,0 +1,11 @@ +using Admin.Core.Model.Admin; + +namespace Admin.Core.Repository.Admin +{ + public interface IOprationLogRepository : IRepositoryBase + { + } +} + + + \ No newline at end of file diff --git a/Admin.Core.Repository/Admin/OprationLog/OprationLogRepository.cs b/Admin.Core.Repository/Admin/OprationLog/OprationLogRepository.cs new file mode 100644 index 000000000..e04b510aa --- /dev/null +++ b/Admin.Core.Repository/Admin/OprationLog/OprationLogRepository.cs @@ -0,0 +1,13 @@ +using FreeSql; +using Admin.Core.Model.Admin; +using Admin.Core.Common.Auth; + +namespace Admin.Core.Repository.Admin +{ + public class OprationLogRepository : RepositoryBase, IOprationLogRepository + { + public OprationLogRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + { + } + } +} diff --git a/Admin.Core.Repository/Base/IRepositoryBase.cs b/Admin.Core.Repository/Base/IRepositoryBase.cs index 95e10f354..471b8a437 100644 --- a/Admin.Core.Repository/Base/IRepositoryBase.cs +++ b/Admin.Core.Repository/Base/IRepositoryBase.cs @@ -1,6 +1,8 @@  -using FreeSql; +using System; +using System.Linq.Expressions; using System.Threading.Tasks; +using FreeSql; namespace Admin.Core.Repository { @@ -14,6 +16,20 @@ public interface IRepositoryBase : IBaseRepository /// Task GetAsync(TKey id); + /// + /// 根据条件获取实体 + /// + /// + /// + Task GetAsync(Expression> exp); + + /// + /// 根据条件获取Dto + /// + /// + /// + Task GetAsync(Expression> exp); + /// /// 软删除 /// diff --git a/Admin.Core.Repository/Base/RepositoryBase.cs b/Admin.Core.Repository/Base/RepositoryBase.cs index a9cfc9099..f594dd744 100644 --- a/Admin.Core.Repository/Base/RepositoryBase.cs +++ b/Admin.Core.Repository/Base/RepositoryBase.cs @@ -1,6 +1,9 @@  -using FreeSql; + +using System; using System.Threading.Tasks; +using System.Linq.Expressions; +using FreeSql; using Admin.Core.Common.Auth; namespace Admin.Core.Repository @@ -14,12 +17,22 @@ protected RepositoryBase(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, UnitOfWork = uow; _user = user; } - + public virtual Task GetAsync(TKey id) { return Select.WhereDynamic(id).ToOneAsync(); } + public virtual Task GetAsync(Expression> exp) + { + return Select.Where(exp).ToOneAsync(); + } + + public virtual Task GetAsync(Expression> exp) + { + return Select.Where(exp).ToOneAsync(); + } + public async Task SoftDeleteAsync(TKey id) { await UpdateDiy diff --git a/Admin.Core.Services/Admin.Core.Service.csproj b/Admin.Core.Services/Admin.Core.Service.csproj index 3c3e31c9e..a0e86d7d9 100644 --- a/Admin.Core.Services/Admin.Core.Service.csproj +++ b/Admin.Core.Services/Admin.Core.Service.csproj @@ -29,8 +29,4 @@ - - - - diff --git a/Admin.Core.Services/Admin/Api/Output/ApiListOutput.cs b/Admin.Core.Services/Admin/Api/Output/ApiListOutput.cs index 4c26377c8..d8f94d217 100644 --- a/Admin.Core.Services/Admin/Api/Output/ApiListOutput.cs +++ b/Admin.Core.Services/Admin/Api/Output/ApiListOutput.cs @@ -5,7 +5,7 @@ public class ApiListOutput /// /// 接口Id /// - public int Id { get; set; } + public long Id { get; set; } /// /// 接口父级 diff --git a/Admin.Core.Services/Admin/Auth/AuthService.cs b/Admin.Core.Services/Admin/Auth/AuthService.cs index 098382fba..7fe31e5cb 100644 --- a/Admin.Core.Services/Admin/Auth/AuthService.cs +++ b/Admin.Core.Services/Admin/Auth/AuthService.cs @@ -9,6 +9,8 @@ using Admin.Core.Common.Auth; using Admin.Core.Common.Cache; using Admin.Core.Service.Admin.Auth.Input; +using AutoMapper; +using Admin.Core.Service.Admin.Auth.Output; namespace Admin.Core.Service.Admin.Auth { @@ -16,6 +18,7 @@ public class AuthService : IAuthService { private readonly IUser _user; private readonly ICache _cache; + private readonly IMapper _mapper; private readonly IUserToken _userToken; private readonly IUserRepository _userRepository; private readonly IRolePermissionRepository _rolePermissionRepository; @@ -23,6 +26,7 @@ public class AuthService : IAuthService public AuthService( IUser user, ICache cache, + IMapper mapper, IUserToken userToken, IUserRepository userRepository, IRolePermissionRepository rolePermissionRepository @@ -30,6 +34,7 @@ IRolePermissionRepository rolePermissionRepository { _user = user; _cache = cache; + _mapper = mapper; _userToken = userToken; _userRepository = userRepository; _rolePermissionRepository = rolePermissionRepository; @@ -59,7 +64,7 @@ public async Task LoginAsync(AuthLoginInput input) } #endregion - var user = (await _userRepository.Select.Where(a => a.UserName == input.UserName).ToOneAsync()); + var user = (await _userRepository.GetAsync(a => a.UserName == input.UserName)); if (!(user?.Id > 0)) { return ResponseOutput.NotOk("账号输入有误!", 3); @@ -93,19 +98,9 @@ public async Task LoginAsync(AuthLoginInput input) return ResponseOutput.NotOk("密码输入有误!",4); } - //生成token信息 - var claims = new[] - { - new Claim(ClaimAttributes.UserId, user.Id.ToString()), - new Claim(ClaimAttributes.UserName, user.UserName), - new Claim(ClaimAttributes.UserRealName, user.Name) - }; - var token = _userToken.Build(claims); - - return ResponseOutput.Ok(new - { - token - }); + var authLoginOutput = _mapper.Map(user); + + return ResponseOutput.Ok(authLoginOutput); } public async Task GetUserInfoAsync() diff --git a/Admin.Core.Services/Admin/Auth/Output/AuthLoginOutput.cs b/Admin.Core.Services/Admin/Auth/Output/AuthLoginOutput.cs new file mode 100644 index 000000000..32dbc02cf --- /dev/null +++ b/Admin.Core.Services/Admin/Auth/Output/AuthLoginOutput.cs @@ -0,0 +1,22 @@ +using System; + +namespace Admin.Core.Service.Admin.Auth.Output +{ + public class AuthLoginOutput + { + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 账号 + /// + public string UserName { get; set; } + + /// + /// 姓名 + /// + public string Name { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/Auth/_MapConfig.cs b/Admin.Core.Services/Admin/Auth/_MapConfig.cs index 2d463b60a..b07a2f483 100644 --- a/Admin.Core.Services/Admin/Auth/_MapConfig.cs +++ b/Admin.Core.Services/Admin/Auth/_MapConfig.cs @@ -1,6 +1,6 @@ using AutoMapper; using Admin.Core.Model.Admin; -using Admin.Core.Service.Admin.Permission.Input; +using Admin.Core.Service.Admin.Auth.Output; namespace Admin.Core.Service.Admin.Auth { @@ -11,7 +11,7 @@ public class MapConfig : Profile { public MapConfig() { - + CreateMap(); } } } diff --git a/Admin.Core.Services/Admin/Dictionary/Output/DictionaryListOutput.cs b/Admin.Core.Services/Admin/Dictionary/Output/DictionaryListOutput.cs index 283f7702f..c9c9b4b9d 100644 --- a/Admin.Core.Services/Admin/Dictionary/Output/DictionaryListOutput.cs +++ b/Admin.Core.Services/Admin/Dictionary/Output/DictionaryListOutput.cs @@ -7,7 +7,7 @@ public class DictionaryListOutput /// /// 主键Id /// - public int Id { get; set; } + public long Id { get; set; } /// /// 字典父级 diff --git a/Admin.Core.Services/Admin/LoginLog/ILoginLogService.cs b/Admin.Core.Services/Admin/LoginLog/ILoginLogService.cs new file mode 100644 index 000000000..778c9c780 --- /dev/null +++ b/Admin.Core.Services/Admin/LoginLog/ILoginLogService.cs @@ -0,0 +1,15 @@ +using System.Threading.Tasks; +using Admin.Core.Model.Input; +using Admin.Core.Model.Output; +using Admin.Core.Model.Admin; +using Admin.Core.Service.Admin.LoginLog.Input; + +namespace Admin.Core.Service.Admin.LoginLog +{ + public interface ILoginLogService + { + Task PageAsync(PageInput input); + + Task> AddAsync(LoginLogAddInput input); + } +} diff --git a/Admin.Core.Services/Admin/LoginLog/Input/LoginLogAddInput.cs b/Admin.Core.Services/Admin/LoginLog/Input/LoginLogAddInput.cs new file mode 100644 index 000000000..087bcb183 --- /dev/null +++ b/Admin.Core.Services/Admin/LoginLog/Input/LoginLogAddInput.cs @@ -0,0 +1,68 @@ +namespace Admin.Core.Service.Admin.LoginLog.Input +{ + /// + /// 添加 + /// + public class LoginLogAddInput + { + /// + /// 姓名 + /// + public string RealName { get; set; } + + /// + /// IP + /// + public string IP { get; set; } + + /// + /// 浏览器 + /// + public string Browser { get; set; } + + /// + /// 操作系统 + /// + public string Os { get; set; } + + /// + /// 设备 + /// + public string Device { get; set; } + + /// + /// 浏览器信息 + /// + public string BrowserInfo { get; set; } + + /// + /// 耗时(毫秒) + /// + public long ElapsedMilliseconds { get; set; } + + /// + /// 操作状态 + /// + public bool? Status { get; set; } + + /// + /// 操作消息 + /// + public string Msg { get; set; } + + /// + /// 操作结果 + /// + public string Result { get; set; } + + /// + /// 创建者Id + /// + public long? CreatedUserId { get; set; } + + /// + /// 创建者 + /// + public string CreatedUserName { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs b/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs new file mode 100644 index 000000000..205f3a187 --- /dev/null +++ b/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs @@ -0,0 +1,74 @@ +using System.Threading.Tasks; +using AutoMapper; +using Admin.Core.Common.Auth; +using Admin.Core.Model.Input; +using Admin.Core.Model.Output; +using Admin.Core.Model.Admin; +using Admin.Core.Repository.Admin; +using Admin.Core.Service.Admin.LoginLog.Input; +using Admin.Core.Service.Admin.LoginLog.Output; +using Microsoft.AspNetCore.Http; + +namespace Admin.Core.Service.Admin.LoginLog +{ + public class LoginLogService : ILoginLogService + { + private readonly IUser _user; + private readonly IMapper _mapper; + private readonly IHttpContextAccessor _context; + private readonly ILoginLogRepository _loginLogRepository; + public LoginLogService( + IUser user, + IMapper mapper, + IHttpContextAccessor context, + ILoginLogRepository loginLogRepository + ) + { + _user = user; + _mapper = mapper; + _context = context; + _loginLogRepository = loginLogRepository; + } + + public async Task PageAsync(PageInput input) + { + var userName = input.Filter?.CreatedUserName; + + var list = await _loginLogRepository.Select + .WhereIf(userName.NotNull(), a => a.CreatedUserName.Contains(userName)) + .Count(out var total) + .OrderByDescending(true, c => c.Id) + .Page(input.CurrentPage, input.PageSize) + .ToListAsync(); + + var data = new PageOutput() + { + List = list, + Total = total + }; + + return ResponseOutput.Ok(data); + } + + public async Task> AddAsync(LoginLogAddInput input) + { + var res = new ResponseOutput(); + + input.IP = _user.IP; + + string ua = _context.HttpContext.Request.Headers["User-Agent"]; + var client = UAParser.Parser.GetDefault().Parse(ua); + var device = client.Device.Family; + device = device.ToLower() == "other" ? "" : device; + input.Browser = client.UA.Family; + input.Os = client.OS.Family; + input.Device = device; + input.BrowserInfo = ua; + + var entity = _mapper.Map(input); + var id = (await _loginLogRepository.InsertAsync(entity)).Id; + + return id > 0 ? res.Ok(id) : res; + } + } +} diff --git a/Admin.Core.Services/Admin/LoginLog/Output/LoginLogListOutput.cs b/Admin.Core.Services/Admin/LoginLog/Output/LoginLogListOutput.cs new file mode 100644 index 000000000..8858898ce --- /dev/null +++ b/Admin.Core.Services/Admin/LoginLog/Output/LoginLogListOutput.cs @@ -0,0 +1,62 @@ +using System; + +namespace Admin.Core.Service.Admin.LoginLog.Output +{ + public class LoginLogListOutput + { + /// + /// 编号 + /// + public long Id { get; set; } + + /// + /// 姓名 + /// + public string RealName { get; set; } + + /// + /// 创建者 + /// + public string CreatedUserName { get; set; } + + /// + /// IP + /// + public string IP { get; set; } + + /// + /// 浏览器 + /// + public string Browser { get; set; } + + /// + /// 操作系统 + /// + public string Os { get; set; } + + /// + /// 设备 + /// + public string Device { get; set; } + + /// + /// 耗时(毫秒) + /// + public long ElapsedMilliseconds { get; set; } + + /// + /// 操作状态 + /// + public bool Status { get; set; } + + /// + /// 操作消息 + /// + public string Msg { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreatedTime { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/LoginLog/_MapConfig.cs b/Admin.Core.Services/Admin/LoginLog/_MapConfig.cs new file mode 100644 index 000000000..b55cd8da0 --- /dev/null +++ b/Admin.Core.Services/Admin/LoginLog/_MapConfig.cs @@ -0,0 +1,17 @@ +using AutoMapper; +using Admin.Core.Model.Admin; +using Admin.Core.Service.Admin.LoginLog.Input; + +namespace Admin.Core.Service.Admin.LoginLog +{ + /// + /// 映射配置 + /// + public class MapConfig : Profile + { + public MapConfig() + { + CreateMap(); + } + } +} diff --git a/Admin.Core.Services/Admin/OprationLog/IOprationLogService.cs b/Admin.Core.Services/Admin/OprationLog/IOprationLogService.cs new file mode 100644 index 000000000..6d2954625 --- /dev/null +++ b/Admin.Core.Services/Admin/OprationLog/IOprationLogService.cs @@ -0,0 +1,15 @@ +using System.Threading.Tasks; +using Admin.Core.Model.Input; +using Admin.Core.Model.Output; +using Admin.Core.Model.Admin; +using Admin.Core.Service.Admin.OprationLog.Input; + +namespace Admin.Core.Service.Admin.OprationLog +{ + public interface IOprationLogService + { + Task PageAsync(PageInput input); + + Task AddAsync(OprationLogAddInput input); + } +} diff --git a/Admin.Core.Services/Admin/OprationLog/Input/OprationLogAddInput.cs b/Admin.Core.Services/Admin/OprationLog/Input/OprationLogAddInput.cs new file mode 100644 index 000000000..3d085e847 --- /dev/null +++ b/Admin.Core.Services/Admin/OprationLog/Input/OprationLogAddInput.cs @@ -0,0 +1,78 @@ +namespace Admin.Core.Service.Admin.OprationLog.Input +{ + /// + /// 添加 + /// + public class OprationLogAddInput + { + /// + /// 姓名 + /// + public string RealName { get; set; } + + /// + /// 接口名称 + /// + public string ApiLabel { get; set; } + + /// + /// 接口地址 + /// + public string ApiPath { get; set; } + + /// + /// 接口提交方法 + /// + public string ApiMethod { get; set; } + + /// + /// IP + /// + public string IP { get; set; } + + /// + /// 浏览器 + /// + public string Browser { get; set; } + + /// + /// 操作系统 + /// + public string Os { get; set; } + + /// + /// 设备 + /// + public string Device { get; set; } + + /// + /// 浏览器信息 + /// + public string BrowserInfo { get; set; } + + /// + /// 耗时(毫秒) + /// + public long ElapsedMilliseconds { get; set; } + + /// + /// 操作状态 + /// + public bool? Status { get; set; } + + /// + /// 操作消息 + /// + public string Msg { get; set; } + + /// + /// 操作参数 + /// + public string Params { get; set; } + + /// + /// 操作结果 + /// + public string Result { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs b/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs new file mode 100644 index 000000000..f401580f0 --- /dev/null +++ b/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs @@ -0,0 +1,73 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using AutoMapper; +using Admin.Core.Common.Auth; +using Admin.Core.Model.Input; +using Admin.Core.Model.Output; +using Admin.Core.Model.Admin; +using Admin.Core.Repository.Admin; +using Admin.Core.Service.Admin.OprationLog.Input; +using Admin.Core.Service.Admin.OprationLog.Output; + +namespace Admin.Core.Service.Admin.OprationLog +{ + public class OprationLogService : IOprationLogService + { + private readonly IUser _user; + private readonly IMapper _mapper; + private readonly IHttpContextAccessor _context; + private readonly IOprationLogRepository _oprationLogRepository; + public OprationLogService( + IUser user, + IMapper mapper, + IHttpContextAccessor context, + IOprationLogRepository oprationLogRepository + ) + { + _user = user; + _mapper = mapper; + _context = context; + _oprationLogRepository = oprationLogRepository; + } + + public async Task PageAsync(PageInput input) + { + var userName = input.Filter?.CreatedUserName; + + var list = await _oprationLogRepository.Select + .WhereIf(userName.NotNull(), a => a.CreatedUserName.Contains(userName)) + .Count(out var total) + .OrderByDescending(true, c => c.Id) + .Page(input.CurrentPage, input.PageSize) + .ToListAsync(); + + var data = new PageOutput() + { + List = list, + Total = total + }; + + return ResponseOutput.Ok(data); + } + + public async Task AddAsync(OprationLogAddInput input) + { + string ua = _context.HttpContext.Request.Headers["User-Agent"]; + var client = UAParser.Parser.GetDefault().Parse(ua); + var device = client.Device.Family; + device = device.ToLower() == "other" ? "" : device; + input.Browser = client.UA.Family; + input.Os = client.OS.Family; + input.Device = device; + input.BrowserInfo = ua; + + input.RealName = _user.RealName; + input.IP = _user.IP; + + var entity = _mapper.Map(input); + var id = (await _oprationLogRepository.InsertAsync(entity)).Id; + + return ResponseOutput.Result(id > 0); + } + } +} diff --git a/Admin.Core.Services/Admin/OprationLog/Output/OprationLogListOutput.cs b/Admin.Core.Services/Admin/OprationLog/Output/OprationLogListOutput.cs new file mode 100644 index 000000000..6541cb334 --- /dev/null +++ b/Admin.Core.Services/Admin/OprationLog/Output/OprationLogListOutput.cs @@ -0,0 +1,77 @@ +using System; + +namespace Admin.Core.Service.Admin.OprationLog.Output +{ + public class OprationLogListOutput + { + /// + /// 编号 + /// + public long Id { get; set; } + + /// + /// 姓名 + /// + public string RealName { get; set; } + + /// + /// 创建者 + /// + public string CreatedUserName { get; set; } + + /// + /// 接口名称 + /// + public string ApiLabel { get; set; } + + /// + /// 接口地址 + /// + public string ApiPath { get; set; } + + /// + /// 接口提交方法 + /// + public string ApiMethod { get; set; } + + /// + /// IP + /// + public string IP { get; set; } + + /// + /// 浏览器 + /// + public string Browser { get; set; } + + /// + /// 操作系统 + /// + public string Os { get; set; } + + /// + /// 设备 + /// + public string Device { get; set; } + + /// + /// 耗时(毫秒) + /// + public long ElapsedMilliseconds { get; set; } + + /// + /// 操作状态 + /// + public bool Status { get; set; } + + /// + /// 操作消息 + /// + public string Msg { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreatedTime { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/OprationLog/_MapConfig.cs b/Admin.Core.Services/Admin/OprationLog/_MapConfig.cs new file mode 100644 index 000000000..e470624d8 --- /dev/null +++ b/Admin.Core.Services/Admin/OprationLog/_MapConfig.cs @@ -0,0 +1,17 @@ +using AutoMapper; +using Admin.Core.Model.Admin; +using Admin.Core.Service.Admin.OprationLog.Input; + +namespace Admin.Core.Service.Admin.OprationLog +{ + /// + /// 映射配置 + /// + public class MapConfig : Profile + { + public MapConfig() + { + CreateMap(); + } + } +} diff --git a/Admin.Core.Services/Admin/Permission/Output/PermissionListOutput.cs b/Admin.Core.Services/Admin/Permission/Output/PermissionListOutput.cs index ea3335683..072f724dd 100644 --- a/Admin.Core.Services/Admin/Permission/Output/PermissionListOutput.cs +++ b/Admin.Core.Services/Admin/Permission/Output/PermissionListOutput.cs @@ -8,7 +8,7 @@ public class PermissionListOutput /// /// 权限Id /// - public int Id { get; set; } + public long Id { get; set; } /// /// 父级节点 diff --git a/Admin.Core.Services/Admin/Role/Output/RoleListOutput.cs b/Admin.Core.Services/Admin/Role/Output/RoleListOutput.cs index 84dcac838..52e432376 100644 --- a/Admin.Core.Services/Admin/Role/Output/RoleListOutput.cs +++ b/Admin.Core.Services/Admin/Role/Output/RoleListOutput.cs @@ -7,7 +7,7 @@ public class RoleListOutput /// /// 主键 /// - public int Id { get; set; } + public long Id { get; set; } /// /// 名称 diff --git a/Admin.Core.Services/Admin/User/Output/UserListOutput.cs b/Admin.Core.Services/Admin/User/Output/UserListOutput.cs index 95ea3aead..829fd7bd0 100644 --- a/Admin.Core.Services/Admin/User/Output/UserListOutput.cs +++ b/Admin.Core.Services/Admin/User/Output/UserListOutput.cs @@ -7,7 +7,7 @@ public class UserListOutput /// /// 主键Id /// - public int Id { get; set; } + public long Id { get; set; } /// /// 账号 diff --git a/Admin.Core.Services/Admin/View/Output/ViewListOutput.cs b/Admin.Core.Services/Admin/View/Output/ViewListOutput.cs index 040236187..c6172b5e3 100644 --- a/Admin.Core.Services/Admin/View/Output/ViewListOutput.cs +++ b/Admin.Core.Services/Admin/View/Output/ViewListOutput.cs @@ -5,7 +5,7 @@ public class ViewListOutput /// /// 视图Id /// - public int Id { get; set; } + public long Id { get; set; } /// /// 视图父级 diff --git a/Admin.Core/Admin.Core.Model.xml b/Admin.Core/Admin.Core.Model.xml index de5870bdd..87354915e 100644 --- a/Admin.Core/Admin.Core.Model.xml +++ b/Admin.Core/Admin.Core.Model.xml @@ -89,6 +89,91 @@ 排序 + + + 日志 + + + + + 姓名 + + + + + IP + + + + + 浏览器 + + + + + 操作系统 + + + + + 设备 + + + + + 浏览器信息 + + + + + 耗时(毫秒) + + + + + 操作状态 + + + + + 操作消息 + + + + + 操作结果 + + + + + 操作日志 + + + + + 操作日志 + + + + + 接口名称 + + + + + 接口地址 + + + + + 接口提交方法 + + + + + 操作参数 + + 权限 @@ -494,6 +579,11 @@ 是否成功 + + + 消息 + + 响应数据泛型接口 diff --git a/Admin.Core/Admin.Core.Service.xml b/Admin.Core/Admin.Core.Service.xml index c030aa3e5..9850d3105 100644 --- a/Admin.Core/Admin.Core.Service.xml +++ b/Admin.Core/Admin.Core.Service.xml @@ -232,6 +232,21 @@ 验证码键 + + + 主键Id + + + + + 账号 + + + + + 姓名 + + 映射配置 @@ -350,6 +365,281 @@ 映射配置 + + + 添加 + + + + + 姓名 + + + + + IP + + + + + 浏览器 + + + + + 操作系统 + + + + + 设备 + + + + + 浏览器信息 + + + + + 耗时(毫秒) + + + + + 操作状态 + + + + + 操作消息 + + + + + 操作结果 + + + + + 创建者Id + + + + + 创建者 + + + + + 编号 + + + + + 姓名 + + + + + 创建者 + + + + + IP + + + + + 浏览器 + + + + + 操作系统 + + + + + 设备 + + + + + 耗时(毫秒) + + + + + 操作状态 + + + + + 操作消息 + + + + + 创建时间 + + + + + 映射配置 + + + + + 添加 + + + + + 姓名 + + + + + 接口名称 + + + + + 接口地址 + + + + + 接口提交方法 + + + + + IP + + + + + 浏览器 + + + + + 操作系统 + + + + + 设备 + + + + + 浏览器信息 + + + + + 耗时(毫秒) + + + + + 操作状态 + + + + + 操作消息 + + + + + 操作参数 + + + + + 操作结果 + + + + + 编号 + + + + + 姓名 + + + + + 创建者 + + + + + 接口名称 + + + + + 接口地址 + + + + + 接口提交方法 + + + + + IP + + + + + 浏览器 + + + + + 操作系统 + + + + + 设备 + + + + + 耗时(毫秒) + + + + + 操作状态 + + + + + 操作消息 + + + + + 创建时间 + + + + + 映射配置 + + 权限类型 diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index 80c3931e5..aa3394aa9 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -14,16 +14,12 @@ - - - - diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index b1fb3667b..32f7e5650 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -9,6 +9,11 @@ 启用登录 + + + 禁用操作日志 + + 启用权限 @@ -242,6 +247,30 @@ + + + 登录日志管理 + + + + + 查询分页登录日志 + + + + + + + 操作日志管理 + + + + + 查询分页操作日志 + + + + 权限管理 @@ -631,9 +660,32 @@ 系统内部错误(非业务代码里显式抛出的异常,例如由于数据不正确导致空指针异常、数据库异常等等) - + + + Admin异常错误过滤 + + + + + Api帮助类 + + + + + 操作日志处理接口 + + + + + 写操作日志 + + + + + + - 全局异常错误过滤 + 操作日志处理 diff --git a/Admin.Core/Attributes/NoOprationLogAttribute.cs b/Admin.Core/Attributes/NoOprationLogAttribute.cs new file mode 100644 index 000000000..736c4085f --- /dev/null +++ b/Admin.Core/Attributes/NoOprationLogAttribute.cs @@ -0,0 +1,12 @@ +using System; + +namespace Admin.Core.Attributes +{ + /// + /// 禁用操作日志 + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] + public class NoOprationLogAttribute : Attribute + { + } +} diff --git a/Admin.Core/Attributes/PermissionAttribute.cs b/Admin.Core/Attributes/PermissionAttribute.cs index d12fceed2..53cce6899 100644 --- a/Admin.Core/Attributes/PermissionAttribute.cs +++ b/Admin.Core/Attributes/PermissionAttribute.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.DependencyInjection; using Admin.Core.Auth; using Admin.Core.Common.Auth; +using System.Threading.Tasks; namespace Admin.Core.Attributes { @@ -13,7 +14,7 @@ namespace Admin.Core.Attributes /// 启用权限 /// [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] - public class PermissionAttribute : AuthorizeAttribute, IAuthorizationFilter + public class PermissionAttribute : AuthorizeAttribute, IAuthorizationFilter, IAsyncAuthorizationFilter { public async void OnAuthorization(AuthorizationFilterContext context) { @@ -43,5 +44,11 @@ public async void OnAuthorization(AuthorizationFilterContext context) context.Result = new ForbidResult(); } } + + public Task OnAuthorizationAsync(AuthorizationFilterContext context) + { + OnAuthorization(context); + return Task.CompletedTask; + } } } diff --git a/Admin.Core/Controllers/Admin/AuthController.cs b/Admin.Core/Controllers/Admin/AuthController.cs index ceeb8c0f2..804a26205 100644 --- a/Admin.Core/Controllers/Admin/AuthController.cs +++ b/Admin.Core/Controllers/Admin/AuthController.cs @@ -1,10 +1,16 @@ using System.Threading.Tasks; +using System.Security.Claims; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using Admin.Core.Attributes; using Admin.Core.Model.Output; using Admin.Core.Service.Admin.Auth; using Admin.Core.Service.Admin.Auth.Input; +using Admin.Core.Service.Admin.Auth.Output; +using Admin.Core.Common.Auth; +using System.Diagnostics; +using Admin.Core.Service.Admin.LoginLog.Input; +using Admin.Core.Service.Admin.LoginLog; namespace Admin.Core.Controllers.Admin { @@ -13,12 +19,19 @@ namespace Admin.Core.Controllers.Admin /// public class AuthController : AreaController { - - private readonly IAuthService _authServices; - - public AuthController(IAuthService authServices) + private readonly IUserToken _userToken; + private readonly IAuthService _authService; + private readonly ILoginLogService _loginLogService; + + public AuthController( + IUserToken userToken, + IAuthService authServices, + ILoginLogService loginLogService + ) { - _authServices = authServices; + _userToken = userToken; + _authService = authServices; + _loginLogService = loginLogService; } /// @@ -28,9 +41,10 @@ public AuthController(IAuthService authServices) /// [HttpGet] [AllowAnonymous] + [NoOprationLog] public async Task GetVerifyCode(string lastKey) { - return await _authServices.GetVerifyCodeAsync(lastKey); + return await _authService.GetVerifyCodeAsync(lastKey); } /// @@ -39,9 +53,10 @@ public async Task GetVerifyCode(string lastKey) /// [HttpGet] [AllowAnonymous] + [NoOprationLog] public async Task GetPassWordEncryptKey() { - return await _authServices.GetPassWordEncryptKeyAsync(); + return await _authService.GetPassWordEncryptKeyAsync(); } /// @@ -52,7 +67,7 @@ public async Task GetPassWordEncryptKey() [Login] public async Task GetUserInfo() { - return await _authServices.GetUserInfoAsync(); + return await _authService.GetUserInfoAsync(); } /// @@ -63,9 +78,49 @@ public async Task GetUserInfo() /// [HttpPost] [AllowAnonymous] + [NoOprationLog] public async Task Login(AuthLoginInput input) { - return await _authServices.LoginAsync(input); + var sw = new Stopwatch(); + sw.Start(); + var res = (await _authService.LoginAsync(input)) as IResponseOutput; + sw.Stop(); + + #region 添加登录日志 + var loginLogAddInput = new LoginLogAddInput() + { + CreatedUserName = input.UserName, + ElapsedMilliseconds = sw.ElapsedMilliseconds, + Status = res.Success, + Msg = res.Msg + }; + + AuthLoginOutput user = null; + if (res.Success) + { + user = (res as IResponseOutput).Data; + loginLogAddInput.CreatedUserId = user.Id; + loginLogAddInput.RealName = user.Name; + } + + await _loginLogService.AddAsync(loginLogAddInput); + #endregion + + if (!res.Success) + { + return res; + } + + #region 生成token信息 + var token = _userToken.Build(new[] + { + new Claim(ClaimAttributes.UserId, user.Id.ToString()), + new Claim(ClaimAttributes.UserName, user.UserName), + new Claim(ClaimAttributes.UserRealName, user.Name) + }); + #endregion + + return ResponseOutput.Ok(new { token }); } } } diff --git a/Admin.Core/Controllers/Admin/ImgController.cs b/Admin.Core/Controllers/Admin/ImgController.cs index ac3f4bb80..d6a48914b 100644 --- a/Admin.Core/Controllers/Admin/ImgController.cs +++ b/Admin.Core/Controllers/Admin/ImgController.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Admin.Core.Model.Output; +using Admin.Core.Attributes; namespace Admin.Core.Controllers.Admin { @@ -15,6 +16,7 @@ namespace Admin.Core.Controllers.Admin [Area("Admin")] [Route("api/[area]/[controller]/[action]")] [ApiController] + [NoOprationLog] public class ImgController : ControllerBase { /// diff --git a/Admin.Core/Controllers/Admin/LoginLogController.cs b/Admin.Core/Controllers/Admin/LoginLogController.cs new file mode 100644 index 000000000..607a54d52 --- /dev/null +++ b/Admin.Core/Controllers/Admin/LoginLogController.cs @@ -0,0 +1,33 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Admin.Core.Model.Input; +using Admin.Core.Model.Output; +using Admin.Core.Model.Admin; +using Admin.Core.Service.Admin.LoginLog; + +namespace Admin.Core.Controllers.Admin +{ + /// + /// 登录日志管理 + /// + public class LoginLogController : AreaController + { + private readonly ILoginLogService _loginLogService; + + public LoginLogController(ILoginLogService loginLogService) + { + _loginLogService = loginLogService; + } + + /// + /// 查询分页登录日志 + /// + /// + /// + [HttpPost] + public async Task GetPage(PageInput model) + { + return await _loginLogService.PageAsync(model); + } + } +} diff --git a/Admin.Core/Controllers/Admin/OprationLogController.cs b/Admin.Core/Controllers/Admin/OprationLogController.cs new file mode 100644 index 000000000..7afe580fe --- /dev/null +++ b/Admin.Core/Controllers/Admin/OprationLogController.cs @@ -0,0 +1,33 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Admin.Core.Model.Input; +using Admin.Core.Model.Output; +using Admin.Core.Model.Admin; +using Admin.Core.Service.Admin.OprationLog; + +namespace Admin.Core.Controllers.Admin +{ + /// + /// 操作日志管理 + /// + public class OprationLogController : AreaController + { + private readonly IOprationLogService _oprationLogService; + + public OprationLogController(IOprationLogService loginLogService) + { + _oprationLogService = loginLogService; + } + + /// + /// 查询分页操作日志 + /// + /// + /// + [HttpPost] + public async Task GetPage(PageInput model) + { + return await _oprationLogService.PageAsync(model); + } + } +} diff --git a/Admin.Core/Db/Data/data.json b/Admin.Core/Db/Data/data.json index 37e4be62c..b17dbcb60 100644 --- a/Admin.Core/Db/Data/data.json +++ b/Admin.Core/Db/Data/data.json @@ -1 +1 @@ -{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":4,"label":"图片管理","path":"img","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":27,"parentId":4,"label":"获取头像","path":"/api/admin/img/avatar/{filename}","httpMethods":"get","description":""},{"id":28,"parentId":4,"label":"下载图片","path":"/api/admin/img/download/{filename}","httpMethods":"get","description":""},{"id":29,"parentId":4,"label":"上传图片","path":"/api/admin/img/upload","httpMethods":"post","description":"支持多图片上传"},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/logs","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":true,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"parentId":65,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":4,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/2881099/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","type":3,"apiId":72,"sort":2,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","name":"管理员","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","name":"小雪转中雪","nickName":"小雪转中雪","avatar":"avatar.gif","remark":""}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":2,"userId":2,"roleId":2}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69}]} \ No newline at end of file +{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":4,"label":"图片管理","path":"img","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":27,"parentId":4,"label":"获取头像","path":"/api/admin/img/avatar/{filename}","httpMethods":"get","description":""},{"id":28,"parentId":4,"label":"下载图片","path":"/api/admin/img/download/{filename}","httpMethods":"get","description":""},{"id":29,"parentId":4,"label":"上传图片","path":"/api/admin/img/upload","httpMethods":"post","description":"支持多图片上传"},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/2881099/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":false,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","type":3,"apiId":75,"sort":1,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","name":"管理员","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","name":"小雪转中雪","nickName":"小雪转中雪","avatar":"avatar.gif","remark":""}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":2,"userId":2,"roleId":2}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74}]} \ No newline at end of file diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index 6b2e660e2..5f533b70b 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -70,7 +70,9 @@ public static void SyncStructure(IFreeSql db,bool autoIncrement = true, string m typeof(UserEntity), typeof(RoleEntity), typeof(UserRoleEntity), - typeof(RolePermissionEntity) + typeof(RolePermissionEntity), + typeof(OprationLogEntity), + typeof(LoginLogEntity) }; foreach (var type in types) diff --git a/Admin.Core/Db/ServiceCollectionExtensions.cs b/Admin.Core/Db/ServiceCollectionExtensions.cs index f5e010af1..fe86b3784 100644 --- a/Admin.Core/Db/ServiceCollectionExtensions.cs +++ b/Admin.Core/Db/ServiceCollectionExtensions.cs @@ -83,16 +83,20 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen fsql.Aop.AuditValue += (s, e) => { var user = services.BuildServiceProvider().GetService(); + if(user == null || !(user.Id > 0)) + { + return; + } if (e.AuditValueType == FreeSql.Aop.AuditValueType.Insert) { switch (e.Property.Name) { case "CreatedUserId": - e.Value = user?.Id; + e.Value = user.Id; break; case "CreatedUserName": - e.Value = user?.Name; + e.Value = user.Name; break; //case "CreatedTime": // e.Value = DateTime.Now.Subtract(timeOffset); @@ -104,10 +108,10 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen switch (e.Property.Name) { case "ModifiedUserId": - e.Value = user?.Id; + e.Value = user.Id; break; case "ModifiedUserName": - e.Value = user?.Name; + e.Value = user.Name; break; //case "ModifiedTime": // e.Value = DateTime.Now.Subtract(timeOffset); diff --git a/Admin.Core/Filters/GlobalExceptionFilter.cs b/Admin.Core/Filters/AdminExceptionFilter.cs similarity index 70% rename from Admin.Core/Filters/GlobalExceptionFilter.cs rename to Admin.Core/Filters/AdminExceptionFilter.cs index d48359747..661b9a6a6 100644 --- a/Admin.Core/Filters/GlobalExceptionFilter.cs +++ b/Admin.Core/Filters/AdminExceptionFilter.cs @@ -1,22 +1,22 @@ -using System; -using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Hosting; -using Admin.Core.Model.Output; using Microsoft.Extensions.Logging; +using Admin.Core.Model.Output; +using System.Threading.Tasks; namespace Admin.Core.Filters { /// - /// 全局异常错误过滤 + /// Admin异常错误过滤 /// - public class GlobalExceptionFilter : IExceptionFilter + public class AdminExceptionFilter : IExceptionFilter, IAsyncExceptionFilter { private readonly IWebHostEnvironment _env; - private readonly ILogger _logger; + private readonly ILogger _logger; - public GlobalExceptionFilter(IWebHostEnvironment env, ILogger logger) + public AdminExceptionFilter(IWebHostEnvironment env, ILogger logger) { _env = env; _logger = logger; @@ -35,11 +35,15 @@ public void OnException(ExceptionContext context) } _logger.LogError(context.Exception,""); - var data = ResponseOutput.NotOk(message); - context.Result = new InternalServerErrorResult(data); } + + public Task OnExceptionAsync(ExceptionContext context) + { + OnException(context); + return Task.CompletedTask; + } } public class InternalServerErrorResult : ObjectResult { diff --git a/Admin.Core/Filters/LogActionFilter.cs b/Admin.Core/Filters/LogActionFilter.cs new file mode 100644 index 000000000..404774571 --- /dev/null +++ b/Admin.Core/Filters/LogActionFilter.cs @@ -0,0 +1,28 @@ +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.Filters; +using Admin.Core.Logs; +using Admin.Core.Attributes; + +namespace Admin.Core.Filters +{ + public class LogActionFilter : IAsyncActionFilter + { + private readonly ILogHandler _logHandler; + + public LogActionFilter(ILogHandler opratoinLogHandler) + { + _logHandler = opratoinLogHandler; + } + + public Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) + { + if (context.ActionDescriptor.EndpointMetadata.Any(m => m.GetType() == typeof(NoOprationLogAttribute))) + { + return next(); + } + + return _logHandler.LogAsync(context, next); + } + } +} diff --git a/Admin.Core/Logs/ApiHelper.cs b/Admin.Core/Logs/ApiHelper.cs new file mode 100644 index 000000000..421057298 --- /dev/null +++ b/Admin.Core/Logs/ApiHelper.cs @@ -0,0 +1,53 @@ +using System.IO; +using System.Linq; +using System.Collections.Generic; +using Newtonsoft.Json; +using Admin.Core.Common.Helpers; +using Admin.Core.Db; + +namespace Admin.Core.Logs +{ + /// + /// Api帮助类 + /// + public class ApiHelper + { + private List _apis; + private static readonly object _lockObject = new object(); + + public List GetApis() + { + if (_apis != null && _apis.Any()) + return _apis; + + lock (_lockObject) + { + if (_apis != null && _apis.Any()) + return _apis; + + _apis = new List(); + var filePath = Path.Combine(Directory.GetCurrentDirectory(), @"Db\Data\data.json"); + var jsonData = FileHelper.ReadFile(filePath); + var apis = JsonConvert.DeserializeObject(jsonData).Apis; + foreach (var api in apis) + { + var parentLabel = apis.FirstOrDefault(a => a.Id == api.ParentId)?.Label; + + _apis.Add(new ApiHelperDto + { + Label = parentLabel.NotNull() ? $"{parentLabel} / {api.Label}" : api.Label, + Path = api.Path?.ToLower().Trim('/') + }); + } + + return _apis; + } + } + } + + public class ApiHelperDto + { + public string Label { get; set; } + public string Path { get; set; } + } +} diff --git a/Admin.Core/Logs/ILogHandler.cs b/Admin.Core/Logs/ILogHandler.cs new file mode 100644 index 000000000..d8f191a22 --- /dev/null +++ b/Admin.Core/Logs/ILogHandler.cs @@ -0,0 +1,20 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.Filters; + + +namespace Admin.Core.Logs +{ + /// + /// 操作日志处理接口 + /// + public interface ILogHandler + { + /// + /// 写操作日志 + /// + /// + /// + /// + Task LogAsync(ActionExecutingContext context, ActionExecutionDelegate next); + } +} diff --git a/Admin.Core/Logs/LogHandler.cs b/Admin.Core/Logs/LogHandler.cs new file mode 100644 index 000000000..41687bc7a --- /dev/null +++ b/Admin.Core/Logs/LogHandler.cs @@ -0,0 +1,59 @@ +using System.Linq; +using System.Diagnostics; +using System.Threading.Tasks; +using Admin.Core.Model.Output; +using Admin.Core.Service.Admin.OprationLog; +using Admin.Core.Service.Admin.OprationLog.Input; +using Microsoft.AspNetCore.Mvc.Filters; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Admin.Core.Logs +{ + /// + /// 操作日志处理 + /// + public class LogHandler : ILogHandler + { + private readonly ApiHelper _apiHelper; + private readonly IOprationLogService _oprationLogService; + + public LogHandler( + ApiHelper apiHelper, + IOprationLogService oprationLogService + ) + { + _apiHelper = apiHelper; + _oprationLogService = oprationLogService; + } + + public async Task LogAsync(ActionExecutingContext context, ActionExecutionDelegate next) + { + var sw = new Stopwatch(); + sw.Start(); + + dynamic actionResult = (await next()).Result; + + sw.Stop(); + + //操作参数 + //var args = JsonConvert.SerializeObject(context.ActionArguments); + //操作结果 + //var result = JsonConvert.SerializeObject(actionResult?.Value); + + var res = actionResult?.Value as IResponseOutput; + + var input = new OprationLogAddInput + { + ApiMethod = context.HttpContext.Request.Method.ToLower(), + ApiPath = context.ActionDescriptor.AttributeRouteInfo.Template.ToLower(), + ElapsedMilliseconds = sw.ElapsedMilliseconds, + Status = res?.Success, + Msg = res?.Msg + }; + input.ApiLabel = _apiHelper.GetApis().FirstOrDefault(a => a.Path == input.ApiPath)?.Label; + + await _oprationLogService.AddAsync(input); + } + } +} diff --git a/Admin.Core/Startup.cs b/Admin.Core/Startup.cs index f5e5ea7ff..37475b6ba 100644 --- a/Admin.Core/Startup.cs +++ b/Admin.Core/Startup.cs @@ -32,6 +32,7 @@ using Admin.Core.Common.Cache; using PermissionHandler = Admin.Core.Auth.PermissionHandler; using Admin.Core.Aop; +using Admin.Core.Logs; namespace Admin.Core { @@ -44,14 +45,16 @@ public class Startup public Startup(IWebHostEnvironment env) { _env = env; - _appConfig = new ConfigHelper().Get("appconfig",env.EnvironmentName) ?? new AppConfig(); + _appConfig = new ConfigHelper().Get("appconfig", env.EnvironmentName) ?? new AppConfig(); } public void ConfigureServices(IServiceCollection services) { + services.AddSingleton(_appConfig); + services.AddSingleton(typeof(ApiHelper)); + #region AutoMapper 自动映射 - var ServiceDll = Path.Combine(basePath, "Admin.Core.Service.dll"); - var serviceAssembly = Assembly.LoadFrom(ServiceDll); + var serviceAssembly = Assembly.Load("Admin.Core.Service"); services.AddAutoMapper(serviceAssembly); #endregion @@ -83,12 +86,12 @@ public void ConfigureServices(IServiceCollection services) //c.OrderActionsBy(o => o.RelativePath); }); - var xmlModelPath = Path.Combine(basePath, "Admin.Core.Model.xml"); - c.IncludeXmlComments(xmlModelPath); - var xmlPath = Path.Combine(basePath, "Admin.Core.xml"); c.IncludeXmlComments(xmlPath, true); + var xmlModelPath = Path.Combine(basePath, "Admin.Core.Model.xml"); + c.IncludeXmlComments(xmlModelPath); + var xmlServicesPath = Path.Combine(basePath, "Admin.Core.Service.xml"); c.IncludeXmlComments(xmlServicesPath); @@ -132,7 +135,7 @@ public void ConfigureServices(IServiceCollection services) services.TryAddSingleton(); services.AddScoped(); - services.AddAuthentication(options => + services.AddAuthentication(options => { options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = nameof(ResponseAuthenticationHandler); //401 @@ -156,9 +159,17 @@ public void ConfigureServices(IServiceCollection services) #endregion #region 控制器 - services.AddControllers(options => - { - options.Filters.Add(typeof(GlobalExceptionFilter)); + if (_appConfig.Log.Operation) + { + services.AddSingleton(); + } + services.AddControllers(options => + { + options.Filters.Add(); + if (_appConfig.Log.Operation) + { + options.Filters.Add(); + } }) //.AddFluentValidation(config => //{ @@ -175,13 +186,13 @@ public void ConfigureServices(IServiceCollection services) options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; }); #endregion - + //数据库 services.AddDb(_env); #region 缓存 var cacheConfig = new ConfigHelper().Get("cacheconfig", _env.EnvironmentName); - if(cacheConfig.Type == CacheType.Redis) + if (cacheConfig.Type == CacheType.Redis) { var csredis = new CSRedis.CSRedisClient(cacheConfig.Redis.ConnectionString); RedisHelper.Initialization(csredis); @@ -201,7 +212,7 @@ public void ConfigureServices(IServiceCollection services) public void ConfigureContainer(ContainerBuilder builder) { #region AutoFac IOC容器 - + try { #region Aop @@ -210,25 +221,23 @@ public void ConfigureContainer(ContainerBuilder builder) { builder.RegisterType(); interceptorServiceTypes.Add(typeof(TransactionInterceptor)); - } + } #endregion #region Service - var servicesDllFile = Path.Combine(basePath, "Admin.Core.Service.dll"); - var assemblysServices = Assembly.LoadFrom(servicesDllFile); - + var assemblysServices = Assembly.Load("Admin.Core.Service"); builder.RegisterAssemblyTypes(assemblysServices) .AsImplementedInterfaces() - .InstancePerLifetimeScope() + .InstancePerDependency() .EnableInterfaceInterceptors() .InterceptedBy(interceptorServiceTypes.ToArray()); #endregion #region Repository - var repositoryDllFile = Path.Combine(basePath, "Admin.Core.Repository.dll"); - var assemblysRepository = Assembly.LoadFrom(repositoryDllFile); + var assemblysRepository = Assembly.Load("Admin.Core.Repository"); builder.RegisterAssemblyTypes(assemblysRepository) - .AsImplementedInterfaces(); + .AsImplementedInterfaces() + .InstancePerDependency(); #endregion } catch (Exception ex) @@ -242,14 +251,7 @@ public void Configure(IApplicationBuilder app, IHostEnvironment env) { #region app配置 //异常 - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - else - { - app.UseExceptionHandler("/Error"); - } + app.UseExceptionHandler("/Error"); //静态文件 app.UseStaticFiles(); @@ -289,4 +291,4 @@ public void Configure(IApplicationBuilder app, IHostEnvironment env) #endregion } } -} +} \ No newline at end of file diff --git a/Admin.Core/configs/appconfig.json b/Admin.Core/configs/appconfig.json index 83b2f1f8e..b82d25897 100644 --- a/Admin.Core/configs/appconfig.json +++ b/Admin.Core/configs/appconfig.json @@ -7,5 +7,10 @@ "aop": { //事物 "transaction": false + }, + //日志 + "log": { + //操作日志 + "operation": true } } diff --git a/Admin.Core/configs/dbconfig.Development.json b/Admin.Core/configs/dbconfig.Development.json index 4cefbd3c7..cfb926c50 100644 --- a/Admin.Core/configs/dbconfig.Development.json +++ b/Admin.Core/configs/dbconfig.Development.json @@ -23,5 +23,6 @@ //数据库类型 MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4, OdbcOracle = 5, OdbcSqlServer = 6, OdbcMySql = 7, OdbcPostgreSQL = 8, Odbc = 9, OdbcDameng = 10, MsAccess = 11 "type": 4, //连接字符串 + //MySql "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;" "connectionString": "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" } From 8bdc027af90e5df367ff88056f3b58243c2a0b74 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Sun, 29 Mar 2020 01:35:39 +0800 Subject: [PATCH 14/53] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E6=97=A0=E8=87=AA=E5=A2=9E=E9=95=BF=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core/configs/dbconfig.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Admin.Core/configs/dbconfig.json b/Admin.Core/configs/dbconfig.json index 6de9ac1c4..7bf1f6960 100644 --- a/Admin.Core/configs/dbconfig.json +++ b/Admin.Core/configs/dbconfig.json @@ -4,5 +4,7 @@ //连接字符串 //MySql "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;" //Sqlite "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" "Data Source=F:\\data\\admindb.db; Pooling=true;Min Pool Size=1" - "connectionString": "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;" + "connectionString": "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;", + //同步结构,由于Entity取消自增长,生产环境必须同步自增长结构 + "syncStructure": true } From 2189eb73ffa19bea8be34f1f3784d0a8d37316c9 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Sun, 29 Mar 2020 01:55:01 +0800 Subject: [PATCH 15/53] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core/Admin.Core.xml | 2 +- Admin.Core/Db/DbHelper.cs | 12 ++++++++---- Admin.Core/Db/ServiceCollectionExtensions.cs | 7 ++----- Admin.Core/configs/dbconfig.json | 4 +--- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index 32f7e5650..37d94c2ec 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -569,7 +569,7 @@ - + 同步结构 diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index 5f533b70b..c3d2ccdc7 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -46,7 +46,7 @@ public async static Task CreateDatabase(DbConfig dbConfig) /// /// 同步结构 /// - public static void SyncStructure(IFreeSql db,bool autoIncrement = true, string msg = null,string dbType = null) + public static void SyncStructure(IFreeSql db,bool autoIncrement = true, string msg = null, DbConfig dbConfig = null) { //打印结构比对脚本 //var dDL = db.CodeFirst.GetComparisonDDLStatements(); @@ -90,9 +90,13 @@ public static void SyncStructure(IFreeSql db,bool autoIncrement = true, string m } // 同步结构 - Console.WriteLine($"\r\n{(msg.NotNull() ? msg : $"sync {dbType} structure")} started"); - db.CodeFirst.SyncStructure(types); - Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} succeed\r\n"); + if (dbConfig.SyncStructure) + { + var dbType = dbConfig.Type.ToString(); + Console.WriteLine($"\r\n{(msg.NotNull() ? msg : $"sync {dbType} structure")} started"); + db.CodeFirst.SyncStructure(types); + Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} succeed\r\n"); + } } /// diff --git a/Admin.Core/Db/ServiceCollectionExtensions.cs b/Admin.Core/Db/ServiceCollectionExtensions.cs index fe86b3784..c2d30022b 100644 --- a/Admin.Core/Db/ServiceCollectionExtensions.cs +++ b/Admin.Core/Db/ServiceCollectionExtensions.cs @@ -47,11 +47,8 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen var fsql = freeSqlBuilder.Build(); #region 初始化数据库 - //同步结构 - if (dbConfig.SyncStructure) - { - DbHelper.SyncStructure(fsql, dbType: dbConfig.Type.ToString()); - } + //同步结构,需要内部配置自增长 + DbHelper.SyncStructure(fsql, dbConfig: dbConfig); //同步数据 if (dbConfig.SyncData) diff --git a/Admin.Core/configs/dbconfig.json b/Admin.Core/configs/dbconfig.json index 7bf1f6960..6de9ac1c4 100644 --- a/Admin.Core/configs/dbconfig.json +++ b/Admin.Core/configs/dbconfig.json @@ -4,7 +4,5 @@ //连接字符串 //MySql "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;" //Sqlite "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" "Data Source=F:\\data\\admindb.db; Pooling=true;Min Pool Size=1" - "connectionString": "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;", - //同步结构,由于Entity取消自增长,生产环境必须同步自增长结构 - "syncStructure": true + "connectionString": "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;" } From 3273ab91cf2767f72d7ac27fec96217b072a9918 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Sun, 29 Mar 2020 03:04:22 +0800 Subject: [PATCH 16/53] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dnginx=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E8=8E=B7=E5=BE=97ip=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Auth/IUser.cs | 13 ++--- Admin.Core.Common/Auth/User.cs | 58 ------------------- Admin.Core.Common/Helpers/IPHelper.cs | 43 ++++++++++++++ .../Admin/LoginLog/LoginLogService.cs | 9 +-- .../Admin/OprationLog/OprationLogService.cs | 3 +- Admin.Core/Logs/LogHandler.cs | 3 +- 6 files changed, 54 insertions(+), 75 deletions(-) create mode 100644 Admin.Core.Common/Helpers/IPHelper.cs diff --git a/Admin.Core.Common/Auth/IUser.cs b/Admin.Core.Common/Auth/IUser.cs index 257086279..7f444f36f 100644 --- a/Admin.Core.Common/Auth/IUser.cs +++ b/Admin.Core.Common/Auth/IUser.cs @@ -1,26 +1,23 @@ namespace Admin.Core.Common.Auth { + /// + /// 用户信息接口 + /// public interface IUser { /// /// 主键 /// long Id { get; } - /// - /// 登录日志Id - /// - long LoginLogId { get; } + /// /// 用户名 /// string Name { get; } + /// /// 姓名 /// string RealName { get; } - /// - /// IP - /// - string IP { get; } } } diff --git a/Admin.Core.Common/Auth/User.cs b/Admin.Core.Common/Auth/User.cs index 1c1fecf39..58775d8cb 100644 --- a/Admin.Core.Common/Auth/User.cs +++ b/Admin.Core.Common/Auth/User.cs @@ -65,64 +65,6 @@ public string RealName return ""; } } - - /// - /// 登录日志Id - /// - public long LoginLogId - { - get - { - var id = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.UserLoginLogId); - if (id != null && id.Value.NotNull()) - { - return id.Value.ToLong(); - } - return 0; - } - } - - /// - /// 用户IP - /// - public string IP - { - get - { - if (_accessor?.HttpContext?.Connection == null) - return ""; - - return _accessor.HttpContext.Connection.RemoteIpAddress.ToString(); - } - } - - /// - /// 用户IPv4 - /// - public string IPv4 - { - get - { - if (_accessor?.HttpContext?.Connection == null) - return ""; - - return _accessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); - } - } - - /// - /// 用户IPv6 - /// - public string IPv6 - { - get - { - if (_accessor?.HttpContext?.Connection == null) - return ""; - - return _accessor.HttpContext.Connection.RemoteIpAddress.MapToIPv6().ToString(); - } - } } /// diff --git a/Admin.Core.Common/Helpers/IPHelper.cs b/Admin.Core.Common/Helpers/IPHelper.cs new file mode 100644 index 000000000..f5598dd35 --- /dev/null +++ b/Admin.Core.Common/Helpers/IPHelper.cs @@ -0,0 +1,43 @@ +using System.Linq; +using System.Text.RegularExpressions; +using Microsoft.AspNetCore.Http; + +namespace Admin.Core.Common.Helpers +{ + public class IPHelper + { + /// + /// 是否为ip + /// + /// + /// + public static bool IsIP(string ip) + { + return Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$"); + } + + public static string GetIP(HttpRequest request) + { + if (request == null) + { + return ""; + } + + string ip = request.Headers["X-Real-IP"].FirstOrDefault(); + if (ip.IsNull()) + { + ip = request.Headers["X-Forwarded-For"].FirstOrDefault(); + } + if (ip.IsNull()) + { + ip = request.HttpContext?.Connection?.RemoteIpAddress?.ToString(); + } + if (ip.IsNull() || !IsIP(ip)) + { + ip = "127.0.0.1"; + } + + return ip; + } + } +} diff --git a/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs b/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs index 205f3a187..be4efb04d 100644 --- a/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs +++ b/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs @@ -1,30 +1,27 @@ using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; using AutoMapper; -using Admin.Core.Common.Auth; using Admin.Core.Model.Input; using Admin.Core.Model.Output; using Admin.Core.Model.Admin; using Admin.Core.Repository.Admin; using Admin.Core.Service.Admin.LoginLog.Input; using Admin.Core.Service.Admin.LoginLog.Output; -using Microsoft.AspNetCore.Http; +using Admin.Core.Common.Helpers; namespace Admin.Core.Service.Admin.LoginLog { public class LoginLogService : ILoginLogService { - private readonly IUser _user; private readonly IMapper _mapper; private readonly IHttpContextAccessor _context; private readonly ILoginLogRepository _loginLogRepository; public LoginLogService( - IUser user, IMapper mapper, IHttpContextAccessor context, ILoginLogRepository loginLogRepository ) { - _user = user; _mapper = mapper; _context = context; _loginLogRepository = loginLogRepository; @@ -54,7 +51,7 @@ public async Task> AddAsync(LoginLogAddInput input) { var res = new ResponseOutput(); - input.IP = _user.IP; + input.IP = IPHelper.GetIP(_context?.HttpContext?.Request); string ua = _context.HttpContext.Request.Headers["User-Agent"]; var client = UAParser.Parser.GetDefault().Parse(ua); diff --git a/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs b/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs index f401580f0..618cd5603 100644 --- a/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs +++ b/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs @@ -8,6 +8,7 @@ using Admin.Core.Repository.Admin; using Admin.Core.Service.Admin.OprationLog.Input; using Admin.Core.Service.Admin.OprationLog.Output; +using Admin.Core.Common.Helpers; namespace Admin.Core.Service.Admin.OprationLog { @@ -62,7 +63,7 @@ public async Task AddAsync(OprationLogAddInput input) input.BrowserInfo = ua; input.RealName = _user.RealName; - input.IP = _user.IP; + input.IP = IPHelper.GetIP(_context?.HttpContext?.Request); var entity = _mapper.Map(input); var id = (await _oprationLogRepository.InsertAsync(entity)).Id; diff --git a/Admin.Core/Logs/LogHandler.cs b/Admin.Core/Logs/LogHandler.cs index 41687bc7a..12987f158 100644 --- a/Admin.Core/Logs/LogHandler.cs +++ b/Admin.Core/Logs/LogHandler.cs @@ -5,8 +5,7 @@ using Admin.Core.Service.Admin.OprationLog; using Admin.Core.Service.Admin.OprationLog.Input; using Microsoft.AspNetCore.Mvc.Filters; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; +//using Newtonsoft.Json; namespace Admin.Core.Logs { From dea93d4350ff8b0c8b42ae980b3bc13cc55a63a4 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Mon, 30 Mar 2020 01:02:31 +0800 Subject: [PATCH 17/53] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9ESqlServer=E6=B5=8B=E8=AF=95=EF=BC=8C?= =?UTF-8?q?=E9=A2=9D=E5=A4=96=E5=A4=84=E7=90=86SqlServer=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E8=87=AA=E5=A2=9E=E9=95=BF=E3=80=82=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Nuget=E5=8C=85FreeSql.Provider.Oracle?= =?UTF-8?q?=E5=92=8CFreeSql.Provider.SqlServer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 10 +- Admin.Core.Model/Base/Entity.cs | 4 +- Admin.Core.Services/Admin/Auth/AuthService.cs | 2 +- Admin.Core/Admin.Core.Model.xml | 2 +- Admin.Core/Admin.Core.xml | 23 +++- Admin.Core/Db/DbHelper.cs | 100 ++++++++++-------- Admin.Core/Db/ServiceCollectionExtensions.cs | 16 ++- Admin.Core/Logs/ApiHelper.cs | 6 ++ Admin.Core/Program.cs | 5 +- Admin.Core/Properties/launchSettings.json | 2 +- Admin.Core/Startup.cs | 2 +- Admin.Core/configs/appconfig.json | 2 +- Admin.Core/configs/dbconfig.Development.json | 12 ++- 13 files changed, 113 insertions(+), 73 deletions(-) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 8bc5760e7..417eaf5e9 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -6,10 +6,12 @@ - - - - + + + + + + diff --git a/Admin.Core.Model/Base/Entity.cs b/Admin.Core.Model/Base/Entity.cs index 72d2c30cb..082bab75f 100644 --- a/Admin.Core.Model/Base/Entity.cs +++ b/Admin.Core.Model/Base/Entity.cs @@ -9,9 +9,9 @@ public interface IEntity public class Entity : IEntity { /// - /// 主键Id + /// 编号 /// - [Column(Position = 1)] + [Column(Position = 1, IsIdentity = true)] public virtual TKey Id { get; set; } } diff --git a/Admin.Core.Services/Admin/Auth/AuthService.cs b/Admin.Core.Services/Admin/Auth/AuthService.cs index 7fe31e5cb..4115c40df 100644 --- a/Admin.Core.Services/Admin/Auth/AuthService.cs +++ b/Admin.Core.Services/Admin/Auth/AuthService.cs @@ -122,9 +122,9 @@ public async Task GetUserInfoAsync() .InnerJoin((a, b) => a.RoleId == b.RoleId && b.UserId == _user.Id) .Include(a => a.Permission.View) .Where(a => new[] { PermissionType.Group,PermissionType.Menu }.Contains(a.Permission.Type)) + //.Distinct() .OrderBy(a => a.Permission.ParentId) .OrderBy(a => a.Permission.Sort) - .Distinct() .ToListAsync(a => new { a.Permission.Id, diff --git a/Admin.Core/Admin.Core.Model.xml b/Admin.Core/Admin.Core.Model.xml index 87354915e..b57b66675 100644 --- a/Admin.Core/Admin.Core.Model.xml +++ b/Admin.Core/Admin.Core.Model.xml @@ -431,7 +431,7 @@ - 主键Id + 编号 diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index 37d94c2ec..0ce8ec504 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -569,18 +569,20 @@ - + 同步结构 - + - 初始化数据 + 初始化数据表数据 + + @@ -590,7 +592,7 @@ - + 同步数据 @@ -603,12 +605,13 @@ - + 添加数据库 + @@ -670,6 +673,16 @@ Api帮助类 + + + 接口名称 + + + + + 接口地址 + + 操作日志处理接口 diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index c3d2ccdc7..3ab912900 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -27,14 +27,14 @@ public async static Task CreateDatabase(DbConfig dbConfig) return; } - var fsql = new FreeSqlBuilder() + var db = new FreeSqlBuilder() .UseConnectionString(dbConfig.Type, dbConfig.CreateDbConnectionString) .Build(); try { Console.WriteLine("\r\ncreate database started"); - await fsql.Ado.ExecuteNonQueryAsync(dbConfig.CreateDbSql); + await db.Ado.ExecuteNonQueryAsync(dbConfig.CreateDbSql); Console.WriteLine("create database succeed\r\n"); } catch (Exception e) @@ -46,7 +46,7 @@ public async static Task CreateDatabase(DbConfig dbConfig) /// /// 同步结构 /// - public static void SyncStructure(IFreeSql db,bool autoIncrement = true, string msg = null, DbConfig dbConfig = null) + public static void SyncStructure(IFreeSql db, string msg = null, DbConfig dbConfig = null) { //打印结构比对脚本 //var dDL = db.CodeFirst.GetComparisonDDLStatements(); @@ -61,7 +61,10 @@ public static void SyncStructure(IFreeSql db,bool autoIncrement = true, string m // } //}; - var types = new Type[] + // 同步结构 + var dbType = dbConfig.Type.ToString(); + Console.WriteLine($"\r\n{(msg.NotNull() ? msg : $"sync {dbType} structure")} started"); + db.CodeFirst.SyncStructure(new Type[] { typeof(DictionaryEntity), typeof(ApiEntity), @@ -73,40 +76,25 @@ public static void SyncStructure(IFreeSql db,bool autoIncrement = true, string m typeof(RolePermissionEntity), typeof(OprationLogEntity), typeof(LoginLogEntity) - }; - - foreach (var type in types) - { - try - { - db.CodeFirst.ConfigEntity(type, a => - { - a.Property("Id").IsIdentity(autoIncrement); - }); - } - catch (Exception) - { - } - } - - // 同步结构 - if (dbConfig.SyncStructure) - { - var dbType = dbConfig.Type.ToString(); - Console.WriteLine($"\r\n{(msg.NotNull() ? msg : $"sync {dbType} structure")} started"); - db.CodeFirst.SyncStructure(types); - Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} succeed\r\n"); - } + }); + Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} succeed\r\n"); } /// - /// 初始化数据 + /// 初始化数据表数据 /// /// /// /// + /// + /// /// - private static async Task InitData(IFreeSql db,T[] data) where T : class + private static async Task InitDtData( + IFreeSql db, + T[] data, + System.Data.Common.DbTransaction tran, + DbConfig dbConfig = null + ) where T : class { var table = typeof(T).GetCustomAttributes(typeof(TableAttribute),false).FirstOrDefault() as TableAttribute; var tableName = table.Name; @@ -117,7 +105,23 @@ private static async Task InitData(IFreeSql db,T[] data) where T : class { if (data?.Length > 0) { - await db.Insert().AppendData(data).ExecuteAffrowsAsync(); + var insert = db.Insert(); + + if(tran != null) + { + insert = insert.WithTransaction(tran); + } + + if(dbConfig.Type == DataType.SqlServer) + { + var insrtSql = insert.AppendData(data).InsertIdentity().ToSql(); + await db.Ado.ExecuteNonQueryAsync($"SET IDENTITY_INSERT {tableName} ON\n {insrtSql} \nSET IDENTITY_INSERT {tableName} OFF"); + } + else + { + await insert.AppendData(data).InsertIdentity().ExecuteAffrowsAsync(); + } + Console.WriteLine($"table: {tableName} sync data succeed"); } else @@ -173,31 +177,39 @@ private static void SyncDataAuditValue(object s, AuditValueEventArgs e) /// 同步数据 /// /// - public static async Task SyncData(IFreeSql db) + public static async Task SyncData(IFreeSql db, DbConfig dbConfig = null) { try { + //db.Aop.CurdBefore += (s, e) => + //{ + // Console.WriteLine($"{e.Sql}\r\n"); + //}; + Console.WriteLine("\r\nsync data started"); db.Aop.AuditValue += SyncDataAuditValue; - SyncStructure(db, false ,"sync structure for sync data"); - var filePath = Path.Combine(Directory.GetCurrentDirectory(), @"Db\Data\data.json"); var jsonData = FileHelper.ReadFile(filePath); var data = JsonConvert.DeserializeObject(jsonData); - await InitData(db, data.Dictionaries); - await InitData(db, data.Apis); - await InitData(db, data.Views); - await InitData(db, data.Permissions); - await InitData(db, data.Users); - await InitData(db, data.Roles); - await InitData(db, data.UserRoles); - await InitData(db, data.RolePermissions); - db.Aop.AuditValue -= SyncDataAuditValue; + using (var uow = db.CreateUnitOfWork()) + using (var tran = uow.GetOrBeginTransaction()) + { + await InitDtData(db, data.Dictionaries, tran, dbConfig); + await InitDtData(db, data.Apis, tran, dbConfig); + await InitDtData(db, data.Views, tran, dbConfig); + await InitDtData(db, data.Permissions, tran, dbConfig); + await InitDtData(db, data.Users, tran, dbConfig); + await InitDtData(db, data.Roles, tran, dbConfig); + await InitDtData(db, data.UserRoles, tran, dbConfig); + await InitDtData(db, data.RolePermissions, tran, dbConfig); + + uow.Commit(); + } - SyncStructure(db, true, "sync structure for sync data"); + db.Aop.AuditValue -= SyncDataAuditValue; Console.WriteLine("sync data succeed\r\n"); } diff --git a/Admin.Core/Db/ServiceCollectionExtensions.cs b/Admin.Core/Db/ServiceCollectionExtensions.cs index c2d30022b..04c1d2158 100644 --- a/Admin.Core/Db/ServiceCollectionExtensions.cs +++ b/Admin.Core/Db/ServiceCollectionExtensions.cs @@ -16,7 +16,8 @@ public static class ServiceCollectionExtensions /// /// /// - public async static void AddDb(this IServiceCollection services, IHostEnvironment env) + /// + public async static void AddDb(this IServiceCollection services, IHostEnvironment env, AppConfig appConfig) { var dbConfig = new ConfigHelper().Get("dbconfig", env.EnvironmentName); @@ -48,12 +49,15 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen #region 初始化数据库 //同步结构,需要内部配置自增长 - DbHelper.SyncStructure(fsql, dbConfig: dbConfig); + if (dbConfig.SyncStructure) + { + DbHelper.SyncStructure(fsql, dbConfig: dbConfig); + } //同步数据 if (dbConfig.SyncData) { - await DbHelper.SyncData(fsql); + await DbHelper.SyncData(fsql, dbConfig); } #endregion @@ -117,11 +121,13 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen } }; #endregion - + services.AddSingleton(fsql); services.AddFreeRepository(filter => filter.Apply("SoftDelete", a => a.IsDeleted == false)); - services.AddScoped(sp => sp.GetRequiredService().CreateUnitOfWork()); + services.AddScoped(sp => fsql.CreateUnitOfWork()); #endregion + + Console.WriteLine($"{appConfig.Urls}\r\n"); } } } diff --git a/Admin.Core/Logs/ApiHelper.cs b/Admin.Core/Logs/ApiHelper.cs index 421057298..b73ba96aa 100644 --- a/Admin.Core/Logs/ApiHelper.cs +++ b/Admin.Core/Logs/ApiHelper.cs @@ -47,7 +47,13 @@ public List GetApis() public class ApiHelperDto { + /// + /// 接口名称 + /// public string Label { get; set; } + /// + /// 接口地址 + /// public string Path { get; set; } } } diff --git a/Admin.Core/Program.cs b/Admin.Core/Program.cs index 804623be5..a77b13931 100644 --- a/Admin.Core/Program.cs +++ b/Admin.Core/Program.cs @@ -18,10 +18,7 @@ public class Program public static void Main(string[] args) { Console.WriteLine("launching..."); - var host = CreateHostBuilder(args).Build(); - var appConfig = new ConfigHelper().Get("appconfig") ?? new AppConfig(); - Console.WriteLine($"{appConfig.Urls}\r\n"); - host.Run(); + CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) diff --git a/Admin.Core/Properties/launchSettings.json b/Admin.Core/Properties/launchSettings.json index a900e557d..415b3367d 100644 --- a/Admin.Core/Properties/launchSettings.json +++ b/Admin.Core/Properties/launchSettings.json @@ -7,7 +7,7 @@ "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, - "applicationUrl": "http://localhost:8081" + "applicationUrl": "http://localhost:8888" } } } \ No newline at end of file diff --git a/Admin.Core/Startup.cs b/Admin.Core/Startup.cs index 37475b6ba..409e64c35 100644 --- a/Admin.Core/Startup.cs +++ b/Admin.Core/Startup.cs @@ -188,7 +188,7 @@ public void ConfigureServices(IServiceCollection services) #endregion //数据库 - services.AddDb(_env); + services.AddDb(_env, _appConfig); #region 缓存 var cacheConfig = new ConfigHelper().Get("cacheconfig", _env.EnvironmentName); diff --git a/Admin.Core/configs/appconfig.json b/Admin.Core/configs/appconfig.json index b82d25897..9d1dbfee8 100644 --- a/Admin.Core/configs/appconfig.json +++ b/Admin.Core/configs/appconfig.json @@ -2,7 +2,7 @@ //Swagger文档 "swagger": false, //Api地址 - "urls": "http://*:8081", + "urls": "http://*:8888", //面向切面编程 "aop": { //事物 diff --git a/Admin.Core/configs/dbconfig.Development.json b/Admin.Core/configs/dbconfig.Development.json index cfb926c50..f7f984678 100644 --- a/Admin.Core/configs/dbconfig.Development.json +++ b/Admin.Core/configs/dbconfig.Development.json @@ -14,15 +14,19 @@ "createDb": true, //SqlServer,PostgreSQL,Oracle,OdbcOracle,OdbcSqlServer,OdbcMySql,OdbcPostgreSQL,Odbc,OdbcDameng,MsAccess //建库连接字符串 - //MySql "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd={}; Charset=utf8mb4;" - "createDbConnectionString": "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;", + //MySql "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;" + //SqlServer "Data Source=.;Integrated Security=True;Initial Catalog=master;Pooling=true;Min Pool Size=1" + "createDbConnectionString": "Data Source=.;Integrated Security=True;Initial Catalog=master;Pooling=true;Min Pool Size=1", //建库脚本 - //MySql "CREATE DATABASE `{admindb}` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'" - "createDbSql": "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'", + //MySql "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'" + //SqlServer "CREATE DATABASE [admindb]" + "createDbSql": "CREATE DATABASE [admindb]", //数据库类型 MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4, OdbcOracle = 5, OdbcSqlServer = 6, OdbcMySql = 7, OdbcPostgreSQL = 8, Odbc = 9, OdbcDameng = 10, MsAccess = 11 "type": 4, //连接字符串 //MySql "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;" + //SqlServer "Data Source=.;Integrated Security=True;Initial Catalog=admindb;Pooling=true;Min Pool Size=1" + //Sqlite "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" "connectionString": "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" } From a95a596335dc971f010072edf4d2bae6c72b7a95 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Mon, 30 Mar 2020 12:50:47 +0800 Subject: [PATCH 18/53] =?UTF-8?q?=E4=BF=AE=E5=A4=8DSqlServer=E7=89=88?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E8=B0=83=E7=94=A8=E5=BC=82=E5=B8=B8=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E4=BA=8B=E7=89=A9=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core/Aop/TransactionInterceptor.cs | 13 +++++-------- Admin.Core/Db/ServiceCollectionExtensions.cs | 10 +++++----- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/Admin.Core/Aop/TransactionInterceptor.cs b/Admin.Core/Aop/TransactionInterceptor.cs index 85e844bdb..95850cf31 100644 --- a/Admin.Core/Aop/TransactionInterceptor.cs +++ b/Admin.Core/Aop/TransactionInterceptor.cs @@ -32,6 +32,7 @@ public async void Intercept(IInvocation invocation) if (invocation.Method.ReturnType == typeof(Task)) { await (Task)invocation.ReturnValue; + _unitOfWork.Commit(); } else { @@ -49,6 +50,7 @@ public async void Intercept(IInvocation invocation) { _unitOfWork.Rollback(); } + _unitOfWork.Commit(); }, ex => { @@ -65,19 +67,14 @@ public async void Intercept(IInvocation invocation) { _unitOfWork.Rollback(); } + _unitOfWork.Commit(); } } - - _unitOfWork.Commit(); } - catch (Exception) + catch (Exception ex) { _unitOfWork.Rollback(); - throw; - } - finally - { - _unitOfWork.Close(); + throw ex; } } else diff --git a/Admin.Core/Db/ServiceCollectionExtensions.cs b/Admin.Core/Db/ServiceCollectionExtensions.cs index 04c1d2158..add8ac78c 100644 --- a/Admin.Core/Db/ServiceCollectionExtensions.cs +++ b/Admin.Core/Db/ServiceCollectionExtensions.cs @@ -47,8 +47,12 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen var fsql = freeSqlBuilder.Build(); + services.AddFreeRepository(filter => filter.Apply("SoftDelete", a => a.IsDeleted == false)); + services.AddScoped(sp => fsql.CreateUnitOfWork()); + services.AddSingleton(fsql); + #region 初始化数据库 - //同步结构,需要内部配置自增长 + //同步结构 if (dbConfig.SyncStructure) { DbHelper.SyncStructure(fsql, dbConfig: dbConfig); @@ -121,10 +125,6 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen } }; #endregion - - services.AddSingleton(fsql); - services.AddFreeRepository(filter => filter.Apply("SoftDelete", a => a.IsDeleted == false)); - services.AddScoped(sp => fsql.CreateUnitOfWork()); #endregion Console.WriteLine($"{appConfig.Urls}\r\n"); From 9574b88ae54428be1b388b20e6c1c20b08714cf5 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Mon, 30 Mar 2020 21:35:34 +0800 Subject: [PATCH 19/53] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 417eaf5e9..0f3682f8c 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -8,9 +8,9 @@ - + - + From 6aeb77911aceb29d86305e39f85a97c2557a7e90 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Mon, 30 Mar 2020 21:48:23 +0800 Subject: [PATCH 20/53] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Admin/RolePermissionEntity.cs | 16 ----- Admin.Core.Services/Admin/Auth/AuthService.cs | 59 ++++++++++--------- Admin.Core/Admin.Core.Model.xml | 10 ---- 3 files changed, 30 insertions(+), 55 deletions(-) diff --git a/Admin.Core.Model/Admin/RolePermissionEntity.cs b/Admin.Core.Model/Admin/RolePermissionEntity.cs index ce579f098..336c4f5f3 100644 --- a/Admin.Core.Model/Admin/RolePermissionEntity.cs +++ b/Admin.Core.Model/Admin/RolePermissionEntity.cs @@ -19,31 +19,15 @@ public class RolePermissionEntity: EntityAdd /// public long PermissionId { get; set; } - #region 外键 => 导航属性,ManyToMany /// /// 角色 /// - [Navigate("RoleId")] public RoleEntity Role { get; set; } /// /// 权限 /// - [Navigate("PermissionId")] public PermissionEntity Permission { get; set; } - - /// - /// 角色名称 - /// - [Column(IsIgnore = true)] - public string RoleName { get; set; } - - /// - /// 路由 - /// - [Column(IsIgnore = true)] - public string ApiPath { get; set; } - #endregion } } diff --git a/Admin.Core.Services/Admin/Auth/AuthService.cs b/Admin.Core.Services/Admin/Auth/AuthService.cs index 4115c40df..3cdd59398 100644 --- a/Admin.Core.Services/Admin/Auth/AuthService.cs +++ b/Admin.Core.Services/Admin/Auth/AuthService.cs @@ -1,7 +1,6 @@ using System; using System.Linq; using System.Threading.Tasks; -using System.Security.Claims; using Admin.Core.Model.Admin; using Admin.Core.Model.Output; using Admin.Core.Repository.Admin; @@ -19,24 +18,24 @@ public class AuthService : IAuthService private readonly IUser _user; private readonly ICache _cache; private readonly IMapper _mapper; - private readonly IUserToken _userToken; private readonly IUserRepository _userRepository; + private readonly IPermissionRepository _permissionRepository; private readonly IRolePermissionRepository _rolePermissionRepository; public AuthService( IUser user, ICache cache, IMapper mapper, - IUserToken userToken, IUserRepository userRepository, + IPermissionRepository permissionRepository, IRolePermissionRepository rolePermissionRepository ) { _user = user; _cache = cache; _mapper = mapper; - _userToken = userToken; _userRepository = userRepository; + _permissionRepository = permissionRepository; _rolePermissionRepository = rolePermissionRepository; } @@ -50,11 +49,11 @@ public async Task LoginAsync(AuthLoginInput input) var verifyCode = await _cache.GetAsync(verifyCodeKey); if (string.IsNullOrEmpty(verifyCode)) { - return ResponseOutput.NotOk("验证码已过期!",1); + return ResponseOutput.NotOk("验证码已过期!", 1); } if (verifyCode.ToLower() != input.VerifyCode.ToLower()) { - return ResponseOutput.NotOk("验证码输入有误!",2); + return ResponseOutput.NotOk("验证码输入有误!", 2); } await _cache.DelAsync(verifyCodeKey); } @@ -80,14 +79,14 @@ public async Task LoginAsync(AuthLoginInput input) var secretKey = await _cache.GetAsync(passwordEncryptKey); if (passwordEncryptKey.IsNull()) { - return ResponseOutput.NotOk("解密失败!",1); + return ResponseOutput.NotOk("解密失败!", 1); } input.Password = DesEncrypt.Decrypt(input.Password, secretKey); await _cache.DelAsync(passwordEncryptKey); } else { - return ResponseOutput.NotOk("解密失败!",1); + return ResponseOutput.NotOk("解密失败!", 1); } } #endregion @@ -95,7 +94,7 @@ public async Task LoginAsync(AuthLoginInput input) var password = MD5Encrypt.Encrypt32(input.Password); if (user.Password != password) { - return ResponseOutput.NotOk("密码输入有误!",4); + return ResponseOutput.NotOk("密码输入有误!", 4); } var authLoginOutput = _mapper.Map(user); @@ -111,34 +110,36 @@ public async Task GetUserInfoAsync() } var user = await _userRepository.Select.WhereDynamic(_user.Id) - .ToOneAsync(m=>new { + .ToOneAsync(m => new { m.NickName, m.Name, m.Avatar }); //获取菜单 - var menus = await _rolePermissionRepository.Select - .InnerJoin((a, b) => a.RoleId == b.RoleId && b.UserId == _user.Id) - .Include(a => a.Permission.View) - .Where(a => new[] { PermissionType.Group,PermissionType.Menu }.Contains(a.Permission.Type)) - //.Distinct() - .OrderBy(a => a.Permission.ParentId) - .OrderBy(a => a.Permission.Sort) + var menus = await _permissionRepository.Select + .Where(a => new[] { PermissionType.Group, PermissionType.Menu }.Contains(a.Type)) + .Where(a => + _rolePermissionRepository.Select + .InnerJoin((b, c) => b.RoleId == c.RoleId && b.PermissionId == a.Id && c.UserId == _user.Id) + .Any() + ) + .OrderBy(a => a.ParentId) + .OrderBy(a => a.Sort) .ToListAsync(a => new { - a.Permission.Id, - a.Permission.ParentId, - a.Permission.Path, - ViewPath = a.Permission.View.Path, - a.Permission.Label, - - a.Permission.Icon, - a.Permission.Opened, - a.Permission.Closable, - a.Permission.Hidden, - a.Permission.NewWindow, - a.Permission.External + a.Id, + a.ParentId, + a.Path, + ViewPath = a.View.Path, + a.Label, + + a.Icon, + a.Opened, + a.Closable, + a.Hidden, + a.NewWindow, + a.External }); return ResponseOutput.Ok(new { user, menus }); diff --git a/Admin.Core/Admin.Core.Model.xml b/Admin.Core/Admin.Core.Model.xml index b57b66675..183b31e23 100644 --- a/Admin.Core/Admin.Core.Model.xml +++ b/Admin.Core/Admin.Core.Model.xml @@ -324,16 +324,6 @@ 权限 - - - 角色名称 - - - - - 路由 - - 用户 From 2507da4a9dbf429dcddf6dd64569e1efc4c86354 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Mon, 30 Mar 2020 21:50:22 +0800 Subject: [PATCH 21/53] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 0f3682f8c..417eaf5e9 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -8,9 +8,9 @@ - + - + From 7fe80d42aab77bac02283775251b629c7b27b3f3 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Mon, 30 Mar 2020 22:11:37 +0800 Subject: [PATCH 22/53] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Services/Admin/Auth/AuthService.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Admin.Core.Services/Admin/Auth/AuthService.cs b/Admin.Core.Services/Admin/Auth/AuthService.cs index 3cdd59398..98006e90b 100644 --- a/Admin.Core.Services/Admin/Auth/AuthService.cs +++ b/Admin.Core.Services/Admin/Auth/AuthService.cs @@ -121,7 +121,8 @@ public async Task GetUserInfoAsync() .Where(a => new[] { PermissionType.Group, PermissionType.Menu }.Contains(a.Type)) .Where(a => _rolePermissionRepository.Select - .InnerJoin((b, c) => b.RoleId == c.RoleId && b.PermissionId == a.Id && c.UserId == _user.Id) + .InnerJoin((b, c) => b.RoleId == c.RoleId && c.UserId == _user.Id) + .Where(b => b.PermissionId == a.Id) .Any() ) .OrderBy(a => a.ParentId) From cfd0c87fa7b8ea1f146c84d3530cb8a97533a8c5 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Mon, 30 Mar 2020 23:14:29 +0800 Subject: [PATCH 23/53] =?UTF-8?q?=E4=BF=AE=E5=A4=8DOracle=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E7=BB=93=E6=9E=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Model/Admin/DictionaryEntity.cs | 2 +- Admin.Core.Model/Admin/UserEntity.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Admin.Core.Model/Admin/DictionaryEntity.cs b/Admin.Core.Model/Admin/DictionaryEntity.cs index 6116742b3..c4aaddf72 100644 --- a/Admin.Core.Model/Admin/DictionaryEntity.cs +++ b/Admin.Core.Model/Admin/DictionaryEntity.cs @@ -36,7 +36,7 @@ public class DictionaryEntity: EntityBase /// /// 描述 /// - [MaxLength(4000)] + [Column(StringLength = 500)] public string Description { get; set; } /// diff --git a/Admin.Core.Model/Admin/UserEntity.cs b/Admin.Core.Model/Admin/UserEntity.cs index a0235dd30..6342dfe68 100644 --- a/Admin.Core.Model/Admin/UserEntity.cs +++ b/Admin.Core.Model/Admin/UserEntity.cs @@ -50,7 +50,7 @@ public class UserEntity: EntityBase /// /// 备注 /// - [MaxLength(4000)] + [Column(StringLength = 500)] public string Remark { get; set; } [Navigate(ManyToMany = typeof(UserRoleEntity))] From f351bec4caeda6569b819afe03dcd18e9a725218 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Mon, 30 Mar 2020 23:20:55 +0800 Subject: [PATCH 24/53] =?UTF-8?q?Oracle=E5=90=8C=E6=AD=A5=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E5=A4=A7=E5=86=99=E7=BA=A6=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core/Db/DbHelper.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index 3ab912900..bf0207fc1 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -64,6 +64,10 @@ public static void SyncStructure(IFreeSql db, string msg = null, DbConfig dbConf // 同步结构 var dbType = dbConfig.Type.ToString(); Console.WriteLine($"\r\n{(msg.NotNull() ? msg : $"sync {dbType} structure")} started"); + if(dbConfig.Type == DataType.Oracle) + { + db.CodeFirst.IsSyncStructureToUpper = true; + } db.CodeFirst.SyncStructure(new Type[] { typeof(DictionaryEntity), From a46f9e80a161858a93f3728e65f570127e26d26e Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Tue, 31 Mar 2020 21:36:08 +0800 Subject: [PATCH 25/53] =?UTF-8?q?=E5=8D=87=E7=BA=A7Freesql=EF=BC=8C?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=95=B0=E6=8D=AE=E5=BA=93=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E4=BB=A5=E7=94=9F=E4=BA=A7=E7=8E=AF=E5=A2=83=E4=B8=BA?= =?UTF-8?q?=E4=B8=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 12 ++++----- Admin.Core/configs/dbconfig.Development.json | 28 +------------------- Admin.Core/configs/dbconfig.json | 27 ++++++++++++++++--- 3 files changed, 31 insertions(+), 36 deletions(-) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 417eaf5e9..0e16cba55 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -6,12 +6,12 @@ - - - - - - + + + + + + diff --git a/Admin.Core/configs/dbconfig.Development.json b/Admin.Core/configs/dbconfig.Development.json index f7f984678..3e8f2f79f 100644 --- a/Admin.Core/configs/dbconfig.Development.json +++ b/Admin.Core/configs/dbconfig.Development.json @@ -1,32 +1,6 @@ { - //生成数据 - "generateData": false, //监听所有操作 "monitorCommand": false, //监听Curd操作 - "curd": true, - - //同步结构 - "syncStructure": true, - //同步数据 - "syncData": true, - //建库 - "createDb": true, - //SqlServer,PostgreSQL,Oracle,OdbcOracle,OdbcSqlServer,OdbcMySql,OdbcPostgreSQL,Odbc,OdbcDameng,MsAccess - //建库连接字符串 - //MySql "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;" - //SqlServer "Data Source=.;Integrated Security=True;Initial Catalog=master;Pooling=true;Min Pool Size=1" - "createDbConnectionString": "Data Source=.;Integrated Security=True;Initial Catalog=master;Pooling=true;Min Pool Size=1", - //建库脚本 - //MySql "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'" - //SqlServer "CREATE DATABASE [admindb]" - "createDbSql": "CREATE DATABASE [admindb]", - - //数据库类型 MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4, OdbcOracle = 5, OdbcSqlServer = 6, OdbcMySql = 7, OdbcPostgreSQL = 8, Odbc = 9, OdbcDameng = 10, MsAccess = 11 - "type": 4, - //连接字符串 - //MySql "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;" - //SqlServer "Data Source=.;Integrated Security=True;Initial Catalog=admindb;Pooling=true;Min Pool Size=1" - //Sqlite "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" - "connectionString": "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" + "curd": true } diff --git a/Admin.Core/configs/dbconfig.json b/Admin.Core/configs/dbconfig.json index 6de9ac1c4..266f0ee7d 100644 --- a/Admin.Core/configs/dbconfig.json +++ b/Admin.Core/configs/dbconfig.json @@ -1,8 +1,29 @@ { + //生成数据 + "generateData": false, + + //同步结构 + "syncStructure": false, + //同步数据 + "syncData": false, + + //建库 + "createDb": false, + //SqlServer,PostgreSQL,Oracle,OdbcOracle,OdbcSqlServer,OdbcMySql,OdbcPostgreSQL,Odbc,OdbcDameng,MsAccess + //建库连接字符串 + //MySql "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;" + //SqlServer "Data Source=.;Integrated Security=True;Initial Catalog=master;Pooling=true;Min Pool Size=1" + "createDbConnectionString": "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;", + //建库脚本 + //MySql "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'" + //SqlServer "CREATE DATABASE [admindb]" + "createDbSql": "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'", + //数据库类型 MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4, OdbcOracle = 5, OdbcSqlServer = 6, OdbcMySql = 7, OdbcPostgreSQL = 8, Odbc = 9, OdbcDameng = 10, MsAccess = 11 - "type": 0, + "type": 4, //连接字符串 //MySql "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;" - //Sqlite "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" "Data Source=F:\\data\\admindb.db; Pooling=true;Min Pool Size=1" - "connectionString": "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;" + //SqlServer "Data Source=.;Integrated Security=True;Initial Catalog=admindb;Pooling=true;Min Pool Size=1" + //Sqlite "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" + "connectionString": "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" } From 0e811e026f62ea17c81c55f0c18c31a56e1fed99 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Wed, 1 Apr 2020 10:15:03 +0800 Subject: [PATCH 26/53] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E7=B4=A2=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Model/Admin/ApiEntity.cs | 2 +- Admin.Core.Model/Admin/DictionaryEntity.cs | 2 +- Admin.Core.Model/Admin/PermissionEntity.cs | 2 +- Admin.Core.Model/Admin/RoleEntity.cs | 2 +- Admin.Core.Model/Admin/RolePermissionEntity.cs | 2 +- Admin.Core.Model/Admin/UserEntity.cs | 2 +- Admin.Core.Model/Admin/UserRoleEntity.cs | 2 +- Admin.Core.Model/Admin/ViewEntity.cs | 2 +- Admin.Core/configs/dbconfig.json | 6 +++--- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Admin.Core.Model/Admin/ApiEntity.cs b/Admin.Core.Model/Admin/ApiEntity.cs index 1a294bffc..6656eab72 100644 --- a/Admin.Core.Model/Admin/ApiEntity.cs +++ b/Admin.Core.Model/Admin/ApiEntity.cs @@ -8,7 +8,7 @@ namespace Admin.Core.Model.Admin /// 接口管理 /// [Table(Name = "ad_api")] - [Index("uk_api_path", "Path", true)] + [Index("uk_api_path", nameof(Path), true)] public class ApiEntity : EntityBase { /// diff --git a/Admin.Core.Model/Admin/DictionaryEntity.cs b/Admin.Core.Model/Admin/DictionaryEntity.cs index c4aaddf72..9eb21027c 100644 --- a/Admin.Core.Model/Admin/DictionaryEntity.cs +++ b/Admin.Core.Model/Admin/DictionaryEntity.cs @@ -7,7 +7,7 @@ namespace Admin.Core.Model.Admin /// 数据字典 /// [Table(Name = "ad_dictionary")] - [Index("uk_role_parentid_name", "ParentId,Name", true)] + [Index("uk_role_parentid_name", nameof(ParentId)+","+nameof(Name), true)] public class DictionaryEntity: EntityBase { /// diff --git a/Admin.Core.Model/Admin/PermissionEntity.cs b/Admin.Core.Model/Admin/PermissionEntity.cs index f0bcbb601..185798fa1 100644 --- a/Admin.Core.Model/Admin/PermissionEntity.cs +++ b/Admin.Core.Model/Admin/PermissionEntity.cs @@ -8,7 +8,7 @@ namespace Admin.Core.Model.Admin /// 权限 /// [Table(Name = "ad_permission")] - [Index("uk_permission_parentid_label", "ParentId,Label", true)] + [Index("uk_permission_parentid_label", nameof(ParentId) + "," + nameof(Label), true)] public class PermissionEntity : EntityBase { /// diff --git a/Admin.Core.Model/Admin/RoleEntity.cs b/Admin.Core.Model/Admin/RoleEntity.cs index 5a58b34c4..af9db5e18 100644 --- a/Admin.Core.Model/Admin/RoleEntity.cs +++ b/Admin.Core.Model/Admin/RoleEntity.cs @@ -9,7 +9,7 @@ namespace Admin.Core.Model.Admin /// 角色 /// [Table(Name = "ad_role")] - [Index("uk_role_name", "Name", true)] + [Index("uk_role_name", nameof(Name), true)] public class RoleEntity: EntityBase { /// diff --git a/Admin.Core.Model/Admin/RolePermissionEntity.cs b/Admin.Core.Model/Admin/RolePermissionEntity.cs index 336c4f5f3..871636307 100644 --- a/Admin.Core.Model/Admin/RolePermissionEntity.cs +++ b/Admin.Core.Model/Admin/RolePermissionEntity.cs @@ -6,7 +6,7 @@ namespace Admin.Core.Model.Admin /// 角色权限 /// [Table(Name = "ad_role_permission")] - [Index("uk_role_permissioin_roleid_permissionid", "RoleId,PermissionId", true)] + [Index("uk_role_permissioin_roleid_permissionid", nameof(RoleId) + "," + nameof(PermissionId), true)] public class RolePermissionEntity: EntityAdd { /// diff --git a/Admin.Core.Model/Admin/UserEntity.cs b/Admin.Core.Model/Admin/UserEntity.cs index 6342dfe68..e0a031278 100644 --- a/Admin.Core.Model/Admin/UserEntity.cs +++ b/Admin.Core.Model/Admin/UserEntity.cs @@ -9,7 +9,7 @@ namespace Admin.Core.Model.Admin /// 用户 /// [Table(Name = "ad_user")] - [Index("uk_user_username", "UserName", true)] + [Index("uk_user_username", nameof(UserName), true)] public class UserEntity: EntityBase { /// diff --git a/Admin.Core.Model/Admin/UserRoleEntity.cs b/Admin.Core.Model/Admin/UserRoleEntity.cs index e0139226b..56908c415 100644 --- a/Admin.Core.Model/Admin/UserRoleEntity.cs +++ b/Admin.Core.Model/Admin/UserRoleEntity.cs @@ -6,7 +6,7 @@ namespace Admin.Core.Model.Admin /// 用户角色 /// [Table(Name = "ad_user_role")] - [Index("uk_role_userid_roleid", "UserId,RoleId", true)] + [Index("uk_role_userid_roleid", nameof(UserId) + "," + nameof(RoleId), true)] public class UserRoleEntity: EntityAdd { public UserRoleEntity() { } diff --git a/Admin.Core.Model/Admin/ViewEntity.cs b/Admin.Core.Model/Admin/ViewEntity.cs index b8dfe64e8..53cb1baf7 100644 --- a/Admin.Core.Model/Admin/ViewEntity.cs +++ b/Admin.Core.Model/Admin/ViewEntity.cs @@ -8,7 +8,7 @@ namespace Admin.Core.Model.Admin /// 视图管理 /// [Table(Name = "ad_view")] - [Index("uk_view_path", "Path", true)] + [Index("uk_view_path", nameof(Path), true)] public class ViewEntity : EntityBase { /// diff --git a/Admin.Core/configs/dbconfig.json b/Admin.Core/configs/dbconfig.json index 266f0ee7d..e455bd10b 100644 --- a/Admin.Core/configs/dbconfig.json +++ b/Admin.Core/configs/dbconfig.json @@ -3,12 +3,12 @@ "generateData": false, //同步结构 - "syncStructure": false, + "syncStructure": true, //同步数据 - "syncData": false, + "syncData": true, //建库 - "createDb": false, + "createDb": true, //SqlServer,PostgreSQL,Oracle,OdbcOracle,OdbcSqlServer,OdbcMySql,OdbcPostgreSQL,Odbc,OdbcDameng,MsAccess //建库连接字符串 //MySql "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;" From 50acaa2e3d626ce1a41e3804efe1acff046091d0 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Fri, 10 Apr 2020 21:54:57 +0800 Subject: [PATCH 27/53] =?UTF-8?q?=E6=9B=B4=E6=96=B0FreeSql=20Nuget?= =?UTF-8?q?=E5=8C=85=EF=BC=8C=E4=BF=AE=E6=AD=A3=E8=A7=A3=E5=AF=86=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 14 +++++++------- Admin.Core.Services/Admin/Auth/AuthService.cs | 2 +- Admin.Core/Admin.Core.csproj | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 0e16cba55..c736f9881 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -5,13 +5,13 @@ - - - - - - - + + + + + + + diff --git a/Admin.Core.Services/Admin/Auth/AuthService.cs b/Admin.Core.Services/Admin/Auth/AuthService.cs index 98006e90b..f9209248d 100644 --- a/Admin.Core.Services/Admin/Auth/AuthService.cs +++ b/Admin.Core.Services/Admin/Auth/AuthService.cs @@ -77,7 +77,7 @@ public async Task LoginAsync(AuthLoginInput input) if (existsPasswordKey) { var secretKey = await _cache.GetAsync(passwordEncryptKey); - if (passwordEncryptKey.IsNull()) + if (secretKey.IsNull()) { return ResponseOutput.NotOk("解密失败!", 1); } diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index aa3394aa9..e85538e1d 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -34,9 +34,9 @@ - + - + From 6083913dbd139f47f554c4cc23efcc51e341e913 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Sat, 25 Apr 2020 23:33:45 +0800 Subject: [PATCH 28/53] =?UTF-8?q?=E6=9B=B4=E6=96=B01.1.0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 14 +- Admin.Core.Common/Auth/IUser.cs | 4 +- Admin.Core.Common/Auth/User.cs | 13 +- Admin.Core.Common/Configs/UploadConfig.cs | 82 +++++++++ Admin.Core.Common/Helpers/ConfigHelper.cs | 36 +++- Admin.Core.Common/Helpers/Snowfake.cs | 85 +++++++++ Admin.Core.Model/Admin/ApiEntity.cs | 10 +- Admin.Core.Model/Admin/DictionaryEntity.cs | 8 +- Admin.Core.Model/Admin/DocumentEntity.cs | 69 ++++++++ Admin.Core.Model/Admin/DocumentType.cs | 18 ++ Admin.Core.Model/Admin/LogAbstract.cs | 14 +- Admin.Core.Model/Admin/PermissionEntity.cs | 9 +- Admin.Core.Model/Admin/RoleEntity.cs | 2 +- Admin.Core.Model/Admin/UserEntity.cs | 14 +- Admin.Core.Model/Admin/ViewEntity.cs | 8 +- .../Admin/Document/DocumentRepository.cs | 13 ++ .../Admin/Document/IDocumentRepository.cs | 9 + Admin.Core.Services/Admin/Auth/AuthService.cs | 2 +- .../Admin/Auth/Output/AuthLoginOutput.cs | 2 +- .../Admin/Document/DocumentService.cs | 167 ++++++++++++++++++ .../Admin/Document/IDocumentService.cs | 38 ++++ .../Document/Input/DocumentAddGroupInput.cs | 32 ++++ .../Document/Input/DocumentAddMenuInput.cs | 32 ++++ .../Input/DocumentUpdateContentInput.cs | 26 +++ .../Input/DocumentUpdateGroupInput.cs | 16 ++ .../Document/Input/DocumentUpdateMenuInput.cs | 16 ++ .../Output/DocumentGetContentOutput.cs | 9 + .../Document/Output/DocumentGetGroupOutput.cs | 8 + .../Document/Output/DocumentGetMenuOutput.cs | 9 + .../Document/Output/DocumentListOutput.cs | 42 +++++ .../Admin/Document/_MapConfig.cs | 22 +++ .../Admin/LoginLog/Input/LoginLogAddInput.cs | 4 +- .../LoginLog/Output/LoginLogListOutput.cs | 4 +- .../OprationLog/Input/OprationLogAddInput.cs | 4 +- .../Admin/OprationLog/OprationLogService.cs | 2 +- .../Output/OprationLogListOutput.cs | 4 +- .../Permission/Output/PermissionListOutput.cs | 3 +- .../Admin/User/Input/UserAddInput.cs | 6 - .../Admin/User/Input/UserUpdateBasicInput.cs | 2 + .../Admin/User/Input/UserUpdateInput.cs | 6 - Admin.Core.Services/Admin/User/UserService.cs | 4 +- Admin.Core/Admin.Core.Model.xml | 79 ++++++++- Admin.Core/Admin.Core.Service.xml | 158 +++++++++++++++-- Admin.Core/Admin.Core.csproj | 5 +- Admin.Core/Admin.Core.xml | 96 ++++++++-- .../Controllers/Admin/AuthController.cs | 4 +- .../Controllers/Admin/DocumentController.cs | 144 +++++++++++++++ Admin.Core/Controllers/Admin/ImgController.cs | 122 ++++++------- Admin.Core/Db/Data.cs | 1 + Admin.Core/Db/Data/data.json | 2 +- Admin.Core/Db/DbHelper.cs | 5 +- Admin.Core/Db/ServiceCollectionExtensions.cs | 10 +- ...ploadConfigApplicationBuilderExtensions.cs | 34 ++++ Admin.Core/Program.cs | 4 +- Admin.Core/Startup.cs | 24 ++- Admin.Core/configs/dbconfig.json | 5 + Admin.Core/configs/jwtconfig.json | 8 +- .../configs/uploadconfig.Development.json | 3 + Admin.Core/configs/uploadconfig.json | 34 ++++ Admin.Core/wwwroot/avatar/avatar.gif | Bin 57566 -> 0 bytes 60 files changed, 1386 insertions(+), 220 deletions(-) create mode 100644 Admin.Core.Common/Configs/UploadConfig.cs create mode 100644 Admin.Core.Common/Helpers/Snowfake.cs create mode 100644 Admin.Core.Model/Admin/DocumentEntity.cs create mode 100644 Admin.Core.Model/Admin/DocumentType.cs create mode 100644 Admin.Core.Repository/Admin/Document/DocumentRepository.cs create mode 100644 Admin.Core.Repository/Admin/Document/IDocumentRepository.cs create mode 100644 Admin.Core.Services/Admin/Document/DocumentService.cs create mode 100644 Admin.Core.Services/Admin/Document/IDocumentService.cs create mode 100644 Admin.Core.Services/Admin/Document/Input/DocumentAddGroupInput.cs create mode 100644 Admin.Core.Services/Admin/Document/Input/DocumentAddMenuInput.cs create mode 100644 Admin.Core.Services/Admin/Document/Input/DocumentUpdateContentInput.cs create mode 100644 Admin.Core.Services/Admin/Document/Input/DocumentUpdateGroupInput.cs create mode 100644 Admin.Core.Services/Admin/Document/Input/DocumentUpdateMenuInput.cs create mode 100644 Admin.Core.Services/Admin/Document/Output/DocumentGetContentOutput.cs create mode 100644 Admin.Core.Services/Admin/Document/Output/DocumentGetGroupOutput.cs create mode 100644 Admin.Core.Services/Admin/Document/Output/DocumentGetMenuOutput.cs create mode 100644 Admin.Core.Services/Admin/Document/Output/DocumentListOutput.cs create mode 100644 Admin.Core.Services/Admin/Document/_MapConfig.cs create mode 100644 Admin.Core/Controllers/Admin/DocumentController.cs create mode 100644 Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs create mode 100644 Admin.Core/configs/uploadconfig.Development.json create mode 100644 Admin.Core/configs/uploadconfig.json delete mode 100644 Admin.Core/wwwroot/avatar/avatar.gif diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index c736f9881..00787ee82 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -5,13 +5,13 @@ - - - - - - - + + + + + + + diff --git a/Admin.Core.Common/Auth/IUser.cs b/Admin.Core.Common/Auth/IUser.cs index 7f444f36f..c86757ec5 100644 --- a/Admin.Core.Common/Auth/IUser.cs +++ b/Admin.Core.Common/Auth/IUser.cs @@ -16,8 +16,8 @@ public interface IUser string Name { get; } /// - /// 姓名 + /// 昵称 /// - string RealName { get; } + string NickName { get; } } } diff --git a/Admin.Core.Common/Auth/User.cs b/Admin.Core.Common/Auth/User.cs index 58775d8cb..33224d00f 100644 --- a/Admin.Core.Common/Auth/User.cs +++ b/Admin.Core.Common/Auth/User.cs @@ -49,13 +49,13 @@ public string Name } /// - /// 姓名 + /// 昵称 /// - public string RealName + public string NickName { get { - var name = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.UserRealName); + var name = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.UserNickName); if (name != null && name.Value.NotNull()) { @@ -85,11 +85,6 @@ public static class ClaimAttributes /// /// 姓名 /// - public const string UserRealName = "rna"; - - /// - /// 登录日志Id - /// - public const string UserLoginLogId = "llid"; + public const string UserNickName = "nn"; } } diff --git a/Admin.Core.Common/Configs/UploadConfig.cs b/Admin.Core.Common/Configs/UploadConfig.cs new file mode 100644 index 000000000..42e1c6a93 --- /dev/null +++ b/Admin.Core.Common/Configs/UploadConfig.cs @@ -0,0 +1,82 @@ +namespace Admin.Core.Common.Configs +{ + /// + /// 上传配置 + /// + public class UploadConfig + { + public AvatarConfig Avatar { get; set; } + public AvatarConfig Document { get; set; } + } + + /// + /// 头像配置 + /// + public class AvatarConfig + { + /// + /// 路径 + /// + public string Path { get; set; } + + /// + /// 请求路径 + /// + public string RequestPath { get; set; } + + /// + /// 路径格式 + /// + public string Format { get; set; } + /// + /// 路径日期格式 + /// + public string DateTimeFormat { get; set; } + + /// + /// 图片大小 1M = 1024 * 1024 + /// + public long Size { get; set; } + + /// + /// 图片格式 + /// + public string[] ContentType { get; set; } + } + + /// + /// 文档配置 + /// + public class DocumentConfig + { + /// + /// 路径 + /// + public string Path { get; set; } + + /// + /// 请求路径 + /// + public string RequestPath { get; set; } + + /// + /// 路径格式 + /// + public string Format { get; set; } + + /// + /// 路径日期格式 + /// + public string DateTimeFormat { get; set; } + + /// + /// 文件大小 10M = 10 * 1024 * 1024 + /// + public long Size { get; set; } + + /// + /// 文件格式 + /// + public string[] ContentType { get; set; } + } +} diff --git a/Admin.Core.Common/Helpers/ConfigHelper.cs b/Admin.Core.Common/Helpers/ConfigHelper.cs index 348cdb8f9..c94174f52 100644 --- a/Admin.Core.Common/Helpers/ConfigHelper.cs +++ b/Admin.Core.Common/Helpers/ConfigHelper.cs @@ -1,5 +1,4 @@ -using System; -using System.IO; +using System.IO; using Microsoft.Extensions.Configuration; namespace Admin.Core.Common.Helpers @@ -9,6 +8,17 @@ namespace Admin.Core.Common.Helpers /// public class ConfigHelper { + /* 使用热更新 + var uploadConfig = new ConfigHelper().Load("uploadconfig", _env.EnvironmentName, true); + services.Configure(uploadConfig); + + private readonly UploadConfig _uploadConfig; + public ImgController(IOptionsMonitor uploadConfig) + { + _uploadConfig = uploadConfig.CurrentValue; + } + */ + /// /// 加载配置文件 /// @@ -18,7 +28,7 @@ public class ConfigHelper /// public IConfiguration Load(string fileName, string environmentName = "", bool reloadOnChange = false) { - var filePath = Path.Combine(AppContext.BaseDirectory, "configs"); + var filePath = Path.Combine(Directory.GetCurrentDirectory(), "configs"); if (!Directory.Exists(filePath)) return null; @@ -38,8 +48,8 @@ public IConfiguration Load(string fileName, string environmentName = "", bool re /// 获得配置信息 /// /// 配置信息 - /// - /// 文件名称 + /// 文件名称 + /// 环境名称 /// 自动更新 /// public T Get(string fileName, string environmentName = "", bool reloadOnChange = false) @@ -50,5 +60,21 @@ public T Get(string fileName, string environmentName = "", bool reloadOnChang return configuration.Get(); } + + /// + /// 绑定实例配置信息 + /// + /// 文件名称 + /// 实例配置 + /// 环境名称 + /// 自动更新 + public void Bind(string fileName, object instance, string environmentName = "", bool reloadOnChange = false) + { + var configuration = Load(fileName, environmentName, reloadOnChange); + if (configuration == null) + return; + + configuration.Bind(instance); + } } } diff --git a/Admin.Core.Common/Helpers/Snowfake.cs b/Admin.Core.Common/Helpers/Snowfake.cs new file mode 100644 index 000000000..157ddc1cd --- /dev/null +++ b/Admin.Core.Common/Helpers/Snowfake.cs @@ -0,0 +1,85 @@ +using System; + +namespace Admin.Core.Common.Helpers +{ + public class Snowfake + { + public static Snowfake Default { get; } = new Snowfake(0); + + //机器ID + private static long workerId; + private static long twepoch = 687888001020L; //唯一时间,这是一个避免重复的随机量,自行设定不要大于当前时间戳 + private static long sequence = 0L; + private static int workerIdBits = 4; //机器码字节数。4个字节用来保存机器码(定义为Long类型会出现,最大偏移64位,所以左移64位没有意义) + public static long maxWorkerId = -1L ^ -1L << workerIdBits; //最大机器ID + private static int sequenceBits = 10; //计数器字节数,10个字节用来保存计数码 + private static int workerIdShift = sequenceBits; //机器码数据左移位数,就是后面计数器占用的位数 + private static int timestampLeftShift = sequenceBits + workerIdBits; //时间戳左移动位数就是机器码和计数器总字节数 + public static long sequenceMask = -1L ^ -1L << sequenceBits; //一微秒内可以产生计数,如果达到该值则等到下一微妙在进行生成 + private long lastTimestamp = -1L; + + /// + /// 机器码 + /// + /// + public Snowfake(long workerId) + { + if (workerId > maxWorkerId || workerId < 0) + throw new Exception(string.Format("worker Id can't be greater than {0} or less than 0 ", workerId)); + Snowfake.workerId = workerId; + } + + public long nextId() + { + lock (this) + { + long timestamp = timeGen(); + if (lastTimestamp == timestamp) + { //同一微妙中生成ID + sequence = (sequence + 1) & sequenceMask; //用&运算计算该微秒内产生的计数是否已经到达上限 + if (sequence == 0) + { + //一微妙内产生的ID计数已达上限,等待下一微妙 + timestamp = tillNextMillis(lastTimestamp); + } + } + else + { //不同微秒生成ID + sequence = 0; //计数清0 + } + if (timestamp < lastTimestamp) + { //如果当前时间戳比上一次生成ID时时间戳还小,抛出异常,因为不能保证现在生成的ID之前没有生成过 + throw new Exception(string.Format("Clock moved backwards. Refusing to generate id for {0} milliseconds", + lastTimestamp - timestamp)); + } + lastTimestamp = timestamp; //把当前时间戳保存为最后生成ID的时间戳 + long nextId = (timestamp - twepoch << timestampLeftShift) | workerId << workerIdShift | sequence; + return nextId; + } + } + + /// + /// 获取下一微秒时间戳 + /// + /// + /// + private long tillNextMillis(long lastTimestamp) + { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) + { + timestamp = timeGen(); + } + return timestamp; + } + + /// + /// 生成当前时间戳 + /// + /// + private long timeGen() + { + return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; + } + } +} diff --git a/Admin.Core.Model/Admin/ApiEntity.cs b/Admin.Core.Model/Admin/ApiEntity.cs index 6656eab72..a069746d7 100644 --- a/Admin.Core.Model/Admin/ApiEntity.cs +++ b/Admin.Core.Model/Admin/ApiEntity.cs @@ -19,31 +19,31 @@ public class ApiEntity : EntityBase /// /// 接口命名 /// - [MaxLength(50)] + [Column(StringLength = 50)] public string Name { get; set; } /// /// 接口名称 /// - [MaxLength(500)] + [Column(StringLength = 500)] public string Label { get; set; } /// /// 接口地址 /// - [MaxLength(500)] + [Column(StringLength = 500)] public string Path { get; set; } /// /// 接口提交方法 /// - [MaxLength(50)] + [Column(StringLength = 50)] public string HttpMethods { get; set; } /// /// 说明 /// - [MaxLength(500)] + [Column(StringLength = 500)] public string Description { get; set; } /// diff --git a/Admin.Core.Model/Admin/DictionaryEntity.cs b/Admin.Core.Model/Admin/DictionaryEntity.cs index 9eb21027c..2cc0127c8 100644 --- a/Admin.Core.Model/Admin/DictionaryEntity.cs +++ b/Admin.Core.Model/Admin/DictionaryEntity.cs @@ -7,7 +7,7 @@ namespace Admin.Core.Model.Admin /// 数据字典 /// [Table(Name = "ad_dictionary")] - [Index("uk_role_parentid_name", nameof(ParentId)+","+nameof(Name), true)] + [Index("uk_dictionary_parentid_name", nameof(ParentId)+","+nameof(Name), true)] public class DictionaryEntity: EntityBase { /// @@ -18,19 +18,19 @@ public class DictionaryEntity: EntityBase /// /// 字典名称 /// - [MaxLength(50)] + [Column(StringLength = 50)] public string Name { get; set; } /// /// 字典编码 /// - [MaxLength(50)] + [Column(StringLength = 50)] public string Code { get; set; } /// /// 字典值 /// - [MaxLength(50)] + [Column(StringLength = 50)] public string Value { get; set; } /// diff --git a/Admin.Core.Model/Admin/DocumentEntity.cs b/Admin.Core.Model/Admin/DocumentEntity.cs new file mode 100644 index 000000000..ce579c8aa --- /dev/null +++ b/Admin.Core.Model/Admin/DocumentEntity.cs @@ -0,0 +1,69 @@ +using System.ComponentModel.DataAnnotations; +using FreeSql.DataAnnotations; + +namespace Admin.Core.Model.Admin +{ + /// + /// 文档 + /// + [Table(Name = "ad_document")] + [Index("uk_document_parentid_label", nameof(ParentId) + "," + nameof(Label), true)] + public class DocumentEntity : EntityBase + { + /// + /// 父级节点 + /// + public long ParentId { get; set; } + + /// + /// 名称 + /// + [Column(StringLength = 50)] + public string Label { get; set; } + + /// + /// 类型 + /// + [Column(MapType = typeof(int),CanUpdate = false)] + public DocumentType Type { get; set; } + + /// + /// 命名 + /// + [Column(StringLength = 500)] + public string Name { get; set; } + + /// + /// 内容 + /// + [Column(StringLength = -1)] + public string Content { get; set; } + + /// + /// Html + /// + [Column(StringLength = -1)] + public string Html { get; set; } + + /// + /// 启用 + /// + public bool Enabled { get; set; } = true; + + /// + /// 打开组 + /// + public bool? Opened { get; set; } + + /// + /// 排序 + /// + public int? Sort { get; set; } = 0; + + /// + /// 描述 + /// + [Column(StringLength = 100)] + public string Description { get; set; } + } +} diff --git a/Admin.Core.Model/Admin/DocumentType.cs b/Admin.Core.Model/Admin/DocumentType.cs new file mode 100644 index 000000000..e9356e955 --- /dev/null +++ b/Admin.Core.Model/Admin/DocumentType.cs @@ -0,0 +1,18 @@ + +namespace Admin.Core.Model.Admin +{ + /// + /// 文档类型 + /// + public enum DocumentType + { + /// + /// 分组 + /// + Group = 1, + /// + /// Markdown文档 + /// + Markdown = 2 + } +} diff --git a/Admin.Core.Model/Admin/LogAbstract.cs b/Admin.Core.Model/Admin/LogAbstract.cs index f0c46a7c4..58ef68bfa 100644 --- a/Admin.Core.Model/Admin/LogAbstract.cs +++ b/Admin.Core.Model/Admin/LogAbstract.cs @@ -9,33 +9,33 @@ namespace Admin.Core.Model.Admin public abstract class LogAbstract : EntityAdd { /// - /// 姓名 + /// 昵称 /// - [MaxLength(60)] - public string RealName { get; set; } + [Column(StringLength = 60)] + public string NickName { get; set; } /// /// IP /// - [MaxLength(100)] + [Column(StringLength = 100)] public string IP { get; set; } /// /// 浏览器 /// - [MaxLength(100)] + [Column(StringLength = 100)] public string Browser { get; set; } /// /// 操作系统 /// - [MaxLength(100)] + [Column(StringLength = 100)] public string Os { get; set; } /// /// 设备 /// - [MaxLength(50)] + [Column(StringLength = 50)] public string Device { get; set; } /// diff --git a/Admin.Core.Model/Admin/PermissionEntity.cs b/Admin.Core.Model/Admin/PermissionEntity.cs index 185798fa1..18be41d2c 100644 --- a/Admin.Core.Model/Admin/PermissionEntity.cs +++ b/Admin.Core.Model/Admin/PermissionEntity.cs @@ -1,5 +1,4 @@ using System.ComponentModel.DataAnnotations; -using Admin.Core.Model.Admin; using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin @@ -19,7 +18,7 @@ public class PermissionEntity : EntityBase /// /// 权限名称 /// - [MaxLength(50)] + [Column(StringLength = 50)] public string Label { get; set; } /// @@ -43,13 +42,13 @@ public class PermissionEntity : EntityBase /// /// 菜单访问地址 /// - [MaxLength(500)] + [Column(StringLength = 500)] public string Path { get; set; } /// /// 图标 /// - [MaxLength(100)] + [Column(StringLength = 100)] public string Icon { get; set; } /// @@ -90,7 +89,7 @@ public class PermissionEntity : EntityBase /// /// 描述 /// - [MaxLength(100)] + [Column(StringLength = 100)] public string Description { get; set; } } } diff --git a/Admin.Core.Model/Admin/RoleEntity.cs b/Admin.Core.Model/Admin/RoleEntity.cs index af9db5e18..cf7b95c49 100644 --- a/Admin.Core.Model/Admin/RoleEntity.cs +++ b/Admin.Core.Model/Admin/RoleEntity.cs @@ -21,7 +21,7 @@ public class RoleEntity: EntityBase /// /// 说明 /// - [Column(DbType = "varchar(100)")] + [Column(StringLength = 200)] public string Description { get; set; } /// diff --git a/Admin.Core.Model/Admin/UserEntity.cs b/Admin.Core.Model/Admin/UserEntity.cs index e0a031278..d72de3748 100644 --- a/Admin.Core.Model/Admin/UserEntity.cs +++ b/Admin.Core.Model/Admin/UserEntity.cs @@ -15,31 +15,25 @@ public class UserEntity: EntityBase /// /// 账号 /// - [MaxLength(60)] + [Column(StringLength = 60)] public string UserName { get; set; } /// /// 密码 /// - [MaxLength(60)] + [Column(StringLength = 60)] public string Password { get; set; } - /// - /// 姓名 - /// - [MaxLength(60)] - public string Name { get; set; } - /// /// 昵称 /// - [MaxLength(60)] + [Column(StringLength = 60)] public string NickName { get; set; } /// /// 头像 /// - [MaxLength(100)] + [Column(StringLength = 100)] public string Avatar { get; set; } /// diff --git a/Admin.Core.Model/Admin/ViewEntity.cs b/Admin.Core.Model/Admin/ViewEntity.cs index 53cb1baf7..4e43cbc5a 100644 --- a/Admin.Core.Model/Admin/ViewEntity.cs +++ b/Admin.Core.Model/Admin/ViewEntity.cs @@ -19,25 +19,25 @@ public class ViewEntity : EntityBase /// /// 视图命名 /// - [MaxLength(50)] + [Column(StringLength = 50)] public string Name { get; set; } /// /// 视图名称 /// - [MaxLength(500)] + [Column(StringLength = 500)] public string Label { get; set; } /// /// 视图路径 /// - [MaxLength(500)] + [Column(StringLength = 500)] public string Path { get; set; } /// /// 说明 /// - [MaxLength(500)] + [Column(StringLength = 500)] public string Description { get; set; } /// diff --git a/Admin.Core.Repository/Admin/Document/DocumentRepository.cs b/Admin.Core.Repository/Admin/Document/DocumentRepository.cs new file mode 100644 index 000000000..00a1d9774 --- /dev/null +++ b/Admin.Core.Repository/Admin/Document/DocumentRepository.cs @@ -0,0 +1,13 @@ +using FreeSql; +using Admin.Core.Model.Admin; +using Admin.Core.Common.Auth; + +namespace Admin.Core.Repository.Admin +{ + public class DocumentRepository : RepositoryBase, IDocumentRepository + { + public DocumentRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + { + } + } +} diff --git a/Admin.Core.Repository/Admin/Document/IDocumentRepository.cs b/Admin.Core.Repository/Admin/Document/IDocumentRepository.cs new file mode 100644 index 000000000..8ab834843 --- /dev/null +++ b/Admin.Core.Repository/Admin/Document/IDocumentRepository.cs @@ -0,0 +1,9 @@ + +using Admin.Core.Model.Admin; + +namespace Admin.Core.Repository.Admin +{ + public partial interface IDocumentRepository : IRepositoryBase + { + } +} \ No newline at end of file diff --git a/Admin.Core.Services/Admin/Auth/AuthService.cs b/Admin.Core.Services/Admin/Auth/AuthService.cs index f9209248d..cd03e938f 100644 --- a/Admin.Core.Services/Admin/Auth/AuthService.cs +++ b/Admin.Core.Services/Admin/Auth/AuthService.cs @@ -112,7 +112,7 @@ public async Task GetUserInfoAsync() var user = await _userRepository.Select.WhereDynamic(_user.Id) .ToOneAsync(m => new { m.NickName, - m.Name, + m.UserName, m.Avatar }); diff --git a/Admin.Core.Services/Admin/Auth/Output/AuthLoginOutput.cs b/Admin.Core.Services/Admin/Auth/Output/AuthLoginOutput.cs index 32dbc02cf..c36af2f56 100644 --- a/Admin.Core.Services/Admin/Auth/Output/AuthLoginOutput.cs +++ b/Admin.Core.Services/Admin/Auth/Output/AuthLoginOutput.cs @@ -17,6 +17,6 @@ public class AuthLoginOutput /// /// 姓名 /// - public string Name { get; set; } + public string NickName { get; set; } } } diff --git a/Admin.Core.Services/Admin/Document/DocumentService.cs b/Admin.Core.Services/Admin/Document/DocumentService.cs new file mode 100644 index 000000000..a63ccd509 --- /dev/null +++ b/Admin.Core.Services/Admin/Document/DocumentService.cs @@ -0,0 +1,167 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using AutoMapper; +using Admin.Core.Repository.Admin; +using Admin.Core.Model.Admin; +using Admin.Core.Model.Output; +using Admin.Core.Service.Admin.Document.Input; +using Admin.Core.Service.Admin.Document.Output; +using Admin.Core.Common.Cache; + + +namespace Admin.Core.Service.Admin.Document +{ + public class DocumentService : IDocumentService + { + private readonly IMapper _mapper; + private readonly ICache _cache; + private readonly IDocumentRepository _DocumentRepository; + + public DocumentService( + IMapper mapper, + ICache cache, + IDocumentRepository DocumentRepository + ) + { + _mapper = mapper; + _cache = cache; + _DocumentRepository = DocumentRepository; + } + + public async Task GetAsync(long id) + { + var result = await _DocumentRepository.GetAsync(id); + + return ResponseOutput.Ok(result); + } + + public async Task GetGroupAsync(long id) + { + var result = await _DocumentRepository.GetAsync(id); + return ResponseOutput.Ok(result); + } + + public async Task GetMenuAsync(long id) + { + var result = await _DocumentRepository.GetAsync(id); + return ResponseOutput.Ok(result); + } + + public async Task GetContentAsync(long id) + { + var result = await _DocumentRepository.GetAsync(id); + return ResponseOutput.Ok(result); + } + + public async Task GetListAsync(string key, DateTime? start, DateTime? end) + { + if (end.HasValue) + { + end = end.Value.AddDays(1); + } + + var data = await _DocumentRepository + .WhereIf(key.NotNull(), a => a.Name.Contains(key) || a.Label.Contains(key)) + .WhereIf(start.HasValue && end.HasValue, a => a.CreatedTime.Value.BetweenEnd(start.Value, end.Value)) + .OrderBy(a => a.ParentId) + .OrderBy(a => a.Sort) + .ToListAsync(); + + return ResponseOutput.Ok(data); + } + + public async Task AddGroupAsync(DocumentAddGroupInput input) + { + var entity = _mapper.Map(input); + var id = (await _DocumentRepository.InsertAsync(entity)).Id; + + return ResponseOutput.Ok(id > 0); + } + + public async Task AddMenuAsync(DocumentAddMenuInput input) + { + var entity = _mapper.Map(input); + var id = (await _DocumentRepository.InsertAsync(entity)).Id; + + return ResponseOutput.Ok(id > 0); + } + + public async Task UpdateGroupAsync(DocumentUpdateGroupInput input) + { + var result = false; + if (input != null && input.Id > 0) + { + var entity = await _DocumentRepository.GetAsync(input.Id); + entity = _mapper.Map(input, entity); + result = (await _DocumentRepository.UpdateAsync(entity)) > 0; + } + + return ResponseOutput.Result(result); + } + + public async Task UpdateMenuAsync(DocumentUpdateMenuInput input) + { + var result = false; + if (input != null && input.Id > 0) + { + var entity = await _DocumentRepository.GetAsync(input.Id); + entity = _mapper.Map(input, entity); + result = (await _DocumentRepository.UpdateAsync(entity)) > 0; + } + + return ResponseOutput.Result(result); + } + + public async Task UpdateContentAsync(DocumentUpdateContentInput input) + { + var result = false; + if (input != null && input.Id > 0) + { + var entity = await _DocumentRepository.GetAsync(input.Id); + entity = _mapper.Map(input, entity); + result = (await _DocumentRepository.UpdateAsync(entity)) > 0; + } + + return ResponseOutput.Result(result); + } + + public async Task DeleteAsync(long id) + { + var result = false; + if (id > 0) + { + result = (await _DocumentRepository.DeleteAsync(m => m.Id == id)) > 0; + } + + return ResponseOutput.Result(result); + } + + public async Task SoftDeleteAsync(long id) + { + var result = await _DocumentRepository.SoftDeleteAsync(id); + return ResponseOutput.Result(result); + } + + public async Task GetPlainListAsync() + { + var documents = await _DocumentRepository.Select + .OrderBy(a => a.ParentId) + .OrderBy(a => a.Sort) + .ToListAsync(a => new { a.Id, a.ParentId, a.Label, a.Type, a.Opened }); + + var menus = documents + .Where(a => (new[] { DocumentType.Group, DocumentType.Markdown }).Contains(a.Type)) + .Select(a => new + { + a.Id, + a.ParentId, + a.Label, + a.Type, + a.Opened + }); + + return ResponseOutput.Ok(menus); + } + } +} diff --git a/Admin.Core.Services/Admin/Document/IDocumentService.cs b/Admin.Core.Services/Admin/Document/IDocumentService.cs new file mode 100644 index 000000000..7c8734f9a --- /dev/null +++ b/Admin.Core.Services/Admin/Document/IDocumentService.cs @@ -0,0 +1,38 @@ + +using System; +using System.Threading.Tasks; +using Admin.Core.Model.Output; +using Admin.Core.Service.Admin.Document.Input; + +namespace Admin.Core.Service.Admin.Document +{ + public partial interface IDocumentService + { + Task GetAsync(long id); + + Task GetGroupAsync(long id); + + Task GetMenuAsync(long id); + + Task GetContentAsync(long id); + + Task GetPlainListAsync(); + + Task GetListAsync(string key, DateTime? start, DateTime? end); + + Task AddGroupAsync(DocumentAddGroupInput input); + + Task AddMenuAsync(DocumentAddMenuInput input); + + Task UpdateGroupAsync(DocumentUpdateGroupInput input); + + Task UpdateMenuAsync(DocumentUpdateMenuInput input); + + Task UpdateContentAsync(DocumentUpdateContentInput input); + + Task DeleteAsync(long id); + + Task SoftDeleteAsync(long id); + + } +} \ No newline at end of file diff --git a/Admin.Core.Services/Admin/Document/Input/DocumentAddGroupInput.cs b/Admin.Core.Services/Admin/Document/Input/DocumentAddGroupInput.cs new file mode 100644 index 000000000..d341c300e --- /dev/null +++ b/Admin.Core.Services/Admin/Document/Input/DocumentAddGroupInput.cs @@ -0,0 +1,32 @@ +using Admin.Core.Model.Admin; + +namespace Admin.Core.Service.Admin.Document.Input +{ + public class DocumentAddGroupInput + { + /// + /// ڵ + /// + public int ParentId { get; set; } + + /// + /// + /// + public DocumentType Type { get; set; } + + /// + /// + /// + public string Label { get; set; } + + /// + /// + /// + public string Name { get; set; } + + /// + /// + /// + public bool? Opened { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/Document/Input/DocumentAddMenuInput.cs b/Admin.Core.Services/Admin/Document/Input/DocumentAddMenuInput.cs new file mode 100644 index 000000000..c4965d5b1 --- /dev/null +++ b/Admin.Core.Services/Admin/Document/Input/DocumentAddMenuInput.cs @@ -0,0 +1,32 @@ +using Admin.Core.Model.Admin; + +namespace Admin.Core.Service.Admin.Document.Input +{ + public class DocumentAddMenuInput + { + /// + /// ڵ + /// + public int ParentId { get; set; } + + /// + /// + /// + public DocumentType Type { get; set; } + + /// + /// + /// + public string Name { get; set; } + + /// + /// + /// + public string Label { get; set; } + + /// + /// ˵ + /// + public string Description { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/Document/Input/DocumentUpdateContentInput.cs b/Admin.Core.Services/Admin/Document/Input/DocumentUpdateContentInput.cs new file mode 100644 index 000000000..31165fe11 --- /dev/null +++ b/Admin.Core.Services/Admin/Document/Input/DocumentUpdateContentInput.cs @@ -0,0 +1,26 @@ + +namespace Admin.Core.Service.Admin.Document.Input +{ + public class DocumentUpdateContentInput + { + /// + /// + /// + public long Id { get; set; } + + /// + /// + /// + public string Label { get; set; } + + /// + /// + /// + public string Content { get; set; } + + /// + /// 汾 + /// + public long Version { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/Document/Input/DocumentUpdateGroupInput.cs b/Admin.Core.Services/Admin/Document/Input/DocumentUpdateGroupInput.cs new file mode 100644 index 000000000..feae1ba3a --- /dev/null +++ b/Admin.Core.Services/Admin/Document/Input/DocumentUpdateGroupInput.cs @@ -0,0 +1,16 @@ + +namespace Admin.Core.Service.Admin.Document.Input +{ + public class DocumentUpdateGroupInput : DocumentAddGroupInput + { + /// + /// + /// + public long Id { get; set; } + + /// + /// 汾 + /// + public long Version { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/Document/Input/DocumentUpdateMenuInput.cs b/Admin.Core.Services/Admin/Document/Input/DocumentUpdateMenuInput.cs new file mode 100644 index 000000000..d4ce9ce9a --- /dev/null +++ b/Admin.Core.Services/Admin/Document/Input/DocumentUpdateMenuInput.cs @@ -0,0 +1,16 @@ + +namespace Admin.Core.Service.Admin.Document.Input +{ + public class DocumentUpdateMenuInput : DocumentAddMenuInput + { + /// + /// + /// + public long Id { get; set; } + + /// + /// 汾 + /// + public long Version { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/Document/Output/DocumentGetContentOutput.cs b/Admin.Core.Services/Admin/Document/Output/DocumentGetContentOutput.cs new file mode 100644 index 000000000..9fc6b4a0d --- /dev/null +++ b/Admin.Core.Services/Admin/Document/Output/DocumentGetContentOutput.cs @@ -0,0 +1,9 @@ + +using Admin.Core.Service.Admin.Document.Input; + +namespace Admin.Core.Service.Admin.Document.Output +{ + public class DocumentGetContentOutput : DocumentUpdateContentInput + { + } +} diff --git a/Admin.Core.Services/Admin/Document/Output/DocumentGetGroupOutput.cs b/Admin.Core.Services/Admin/Document/Output/DocumentGetGroupOutput.cs new file mode 100644 index 000000000..bf4a7d706 --- /dev/null +++ b/Admin.Core.Services/Admin/Document/Output/DocumentGetGroupOutput.cs @@ -0,0 +1,8 @@ +using Admin.Core.Service.Admin.Document.Input; + +namespace Admin.Core.Service.Admin.Document.Output +{ + public class DocumentGetGroupOutput : DocumentUpdateGroupInput + { + } +} diff --git a/Admin.Core.Services/Admin/Document/Output/DocumentGetMenuOutput.cs b/Admin.Core.Services/Admin/Document/Output/DocumentGetMenuOutput.cs new file mode 100644 index 000000000..e86c29f6e --- /dev/null +++ b/Admin.Core.Services/Admin/Document/Output/DocumentGetMenuOutput.cs @@ -0,0 +1,9 @@ + +using Admin.Core.Service.Admin.Document.Input; + +namespace Admin.Core.Service.Admin.Document.Output +{ + public class DocumentGetMenuOutput : DocumentUpdateMenuInput + { + } +} diff --git a/Admin.Core.Services/Admin/Document/Output/DocumentListOutput.cs b/Admin.Core.Services/Admin/Document/Output/DocumentListOutput.cs new file mode 100644 index 000000000..b1d7c0982 --- /dev/null +++ b/Admin.Core.Services/Admin/Document/Output/DocumentListOutput.cs @@ -0,0 +1,42 @@ +using Admin.Core.Model.Admin; + +namespace Admin.Core.Service.Admin.Document.Output +{ + public class DocumentListOutput + { + /// + /// 编号 + /// + public long Id { get; set; } + + /// + /// 父级节点 + /// + public int ParentId { get; set; } + + /// + /// 名称 + /// + public string Label { get; set; } + + /// + /// 类型 + /// + public DocumentType Type { get; set; } + + /// + /// 命名 + /// + public string Name { get; set; } + + /// + /// 描述 + /// + public string Description { get; set; } + + /// + /// 组打开 + /// + public bool? Opened { get; set; } + } +} \ No newline at end of file diff --git a/Admin.Core.Services/Admin/Document/_MapConfig.cs b/Admin.Core.Services/Admin/Document/_MapConfig.cs new file mode 100644 index 000000000..7b464b76c --- /dev/null +++ b/Admin.Core.Services/Admin/Document/_MapConfig.cs @@ -0,0 +1,22 @@ +using AutoMapper; +using Admin.Core.Model.Admin; +using Admin.Core.Service.Admin.Document.Input; + +namespace Admin.Core.Service.Admin.Document +{ + /// + /// 映射配置 + /// + public class MapConfig : Profile + { + public MapConfig() + { + CreateMap(); + CreateMap(); + + CreateMap(); + CreateMap(); + CreateMap(); + } + } +} diff --git a/Admin.Core.Services/Admin/LoginLog/Input/LoginLogAddInput.cs b/Admin.Core.Services/Admin/LoginLog/Input/LoginLogAddInput.cs index 087bcb183..96791e078 100644 --- a/Admin.Core.Services/Admin/LoginLog/Input/LoginLogAddInput.cs +++ b/Admin.Core.Services/Admin/LoginLog/Input/LoginLogAddInput.cs @@ -6,9 +6,9 @@ public class LoginLogAddInput { /// - /// 姓名 + /// 昵称 /// - public string RealName { get; set; } + public string NickName { get; set; } /// /// IP diff --git a/Admin.Core.Services/Admin/LoginLog/Output/LoginLogListOutput.cs b/Admin.Core.Services/Admin/LoginLog/Output/LoginLogListOutput.cs index 8858898ce..5f967c7f0 100644 --- a/Admin.Core.Services/Admin/LoginLog/Output/LoginLogListOutput.cs +++ b/Admin.Core.Services/Admin/LoginLog/Output/LoginLogListOutput.cs @@ -10,9 +10,9 @@ public class LoginLogListOutput public long Id { get; set; } /// - /// 姓名 + /// 昵称 /// - public string RealName { get; set; } + public string NickName { get; set; } /// /// 创建者 diff --git a/Admin.Core.Services/Admin/OprationLog/Input/OprationLogAddInput.cs b/Admin.Core.Services/Admin/OprationLog/Input/OprationLogAddInput.cs index 3d085e847..82768cbc0 100644 --- a/Admin.Core.Services/Admin/OprationLog/Input/OprationLogAddInput.cs +++ b/Admin.Core.Services/Admin/OprationLog/Input/OprationLogAddInput.cs @@ -6,9 +6,9 @@ public class OprationLogAddInput { /// - /// 姓名 + /// 昵称 /// - public string RealName { get; set; } + public string NickName { get; set; } /// /// 接口名称 diff --git a/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs b/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs index 618cd5603..fcbe61e52 100644 --- a/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs +++ b/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs @@ -62,7 +62,7 @@ public async Task AddAsync(OprationLogAddInput input) input.Device = device; input.BrowserInfo = ua; - input.RealName = _user.RealName; + input.NickName = _user.NickName; input.IP = IPHelper.GetIP(_context?.HttpContext?.Request); var entity = _mapper.Map(input); diff --git a/Admin.Core.Services/Admin/OprationLog/Output/OprationLogListOutput.cs b/Admin.Core.Services/Admin/OprationLog/Output/OprationLogListOutput.cs index 6541cb334..128f5508a 100644 --- a/Admin.Core.Services/Admin/OprationLog/Output/OprationLogListOutput.cs +++ b/Admin.Core.Services/Admin/OprationLog/Output/OprationLogListOutput.cs @@ -10,9 +10,9 @@ public class OprationLogListOutput public long Id { get; set; } /// - /// 姓名 + /// 昵称 /// - public string RealName { get; set; } + public string NickName { get; set; } /// /// 创建者 diff --git a/Admin.Core.Services/Admin/Permission/Output/PermissionListOutput.cs b/Admin.Core.Services/Admin/Permission/Output/PermissionListOutput.cs index 072f724dd..2a507d5ba 100644 --- a/Admin.Core.Services/Admin/Permission/Output/PermissionListOutput.cs +++ b/Admin.Core.Services/Admin/Permission/Output/PermissionListOutput.cs @@ -1,5 +1,4 @@ -using System; -using Admin.Core.Model.Admin; +using Admin.Core.Model.Admin; namespace Admin.Core.Service.Admin.Permission.Output { diff --git a/Admin.Core.Services/Admin/User/Input/UserAddInput.cs b/Admin.Core.Services/Admin/User/Input/UserAddInput.cs index 29f4975a4..34d695ee9 100644 --- a/Admin.Core.Services/Admin/User/Input/UserAddInput.cs +++ b/Admin.Core.Services/Admin/User/Input/UserAddInput.cs @@ -20,12 +20,6 @@ public class UserAddInput [Required(ErrorMessage = "请输入密码")] public string Password { get; set; } - /// - /// 姓名 - /// - [Required(ErrorMessage = "请输入姓名")] - public string Name { get; set; } - /// /// 昵称 /// diff --git a/Admin.Core.Services/Admin/User/Input/UserUpdateBasicInput.cs b/Admin.Core.Services/Admin/User/Input/UserUpdateBasicInput.cs index 8c32919d0..cfeb867fc 100644 --- a/Admin.Core.Services/Admin/User/Input/UserUpdateBasicInput.cs +++ b/Admin.Core.Services/Admin/User/Input/UserUpdateBasicInput.cs @@ -1,4 +1,5 @@ using Admin.Core.Model; +using System.ComponentModel.DataAnnotations; namespace Admin.Core.Service.Admin.User.Input { @@ -15,6 +16,7 @@ public class UserUpdateBasicInput : Entity /// /// 昵称 /// + [Required(ErrorMessage = "请输入昵称")] public string NickName { get; set; } /// diff --git a/Admin.Core.Services/Admin/User/Input/UserUpdateInput.cs b/Admin.Core.Services/Admin/User/Input/UserUpdateInput.cs index a5a4a9e37..7730812d7 100644 --- a/Admin.Core.Services/Admin/User/Input/UserUpdateInput.cs +++ b/Admin.Core.Services/Admin/User/Input/UserUpdateInput.cs @@ -19,12 +19,6 @@ public partial class UserUpdateInput [Required(ErrorMessage = "请输入账号")] public string UserName { get; set; } - /// - /// 姓名 - /// - [Required(ErrorMessage = "请输入姓名")] - public string Name { get; set; } - /// /// 昵称 /// diff --git a/Admin.Core.Services/Admin/User/UserService.cs b/Admin.Core.Services/Admin/User/UserService.cs index 371278bf3..067245223 100644 --- a/Admin.Core.Services/Admin/User/UserService.cs +++ b/Admin.Core.Services/Admin/User/UserService.cs @@ -60,10 +60,10 @@ public async Task> GetAsync(long id) public async Task PageAsync(PageInput input) { - var key = input.Filter?.Name; + var key = input.Filter?.UserName; var list = await _userRepository.Select - .WhereIf(key.NotNull(), a => a.Status >= 0 && (a.UserName.Contains(key) || a.NickName.Contains(key) || a.Name.Contains(key))) + .WhereIf(key.NotNull(), a => a.Status >= 0 && (a.UserName.Contains(key) || a.NickName.Contains(key))) .Count(out var total) .OrderByDescending(true, a => a.Id) .IncludeMany(a => a.Roles.Select(b => new RoleEntity{ Name = b.Name })) diff --git a/Admin.Core/Admin.Core.Model.xml b/Admin.Core/Admin.Core.Model.xml index 183b31e23..2c209d605 100644 --- a/Admin.Core/Admin.Core.Model.xml +++ b/Admin.Core/Admin.Core.Model.xml @@ -89,14 +89,84 @@ 排序 + + + 文档 + + + + + 父级节点 + + + + + 名称 + + + + + 类型 + + + + + 命名 + + + + + 内容 + + + + + Html + + + + + 启用 + + + + + 打开组 + + + + + 排序 + + + + + 描述 + + + + + 文档类型 + + + + + 分组 + + + + + Markdown文档 + + 日志 - + - 姓名 + 昵称 @@ -339,11 +409,6 @@ 密码 - - - 姓名 - - 昵称 diff --git a/Admin.Core/Admin.Core.Service.xml b/Admin.Core/Admin.Core.Service.xml index 9850d3105..bb9b782ec 100644 --- a/Admin.Core/Admin.Core.Service.xml +++ b/Admin.Core/Admin.Core.Service.xml @@ -242,7 +242,7 @@ 账号 - + 姓名 @@ -365,14 +365,144 @@ 映射配置 + + + 父级节点 + + + + + 类型 + + + + + 名称 + + + + + 命名 + + + + + 打开 + + + + + 父级节点 + + + + + 类型 + + + + + 命名 + + + + + 名称 + + + + + 说明 + + + + + 编号 + + + + + 名称 + + + + + 内容 + + + + + 版本 + + + + + 编号 + + + + + 版本 + + + + + 编号 + + + + + 版本 + + + + + 编号 + + + + + 父级节点 + + + + + 名称 + + + + + 类型 + + + + + 命名 + + + + + 描述 + + + + + 组打开 + + + + + 映射配置 + + 添加 - + - 姓名 + 昵称 @@ -435,9 +565,9 @@ 编号 - + - 姓名 + 昵称 @@ -495,9 +625,9 @@ 添加 - + - 姓名 + 昵称 @@ -570,9 +700,9 @@ 编号 - + - 姓名 + 昵称 @@ -935,11 +1065,6 @@ 密码 - - - 姓名 - - 昵称 @@ -1030,11 +1155,6 @@ 账号 - - - 姓名 - - 昵称 diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index e85538e1d..42339c29d 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -34,9 +34,9 @@ - + - + @@ -58,6 +58,7 @@ + diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index 0ce8ec504..d71f8ed8c 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -218,33 +218,100 @@ - + - 图片管理 + 文档管理 - + - 获取头像 + 查询文档列表 - - + + + - + - 下载图片 + 查询单条分组 + + + + + + + 查询单条菜单 + + + + + + + 查询单条文档内容 + + + + + + + 查询精简文档列表 - - - + + + 新增分组 + + + + + + + 新增菜单 + + + + + + + 修改分组 + + + + + + + 修改菜单 + + + + + + + 修改文档内容 + + + + + + + 删除文档 + + + + + + + 图片管理 + + + - 上传图片 - 支持多图片上传 + 上传头像 + @@ -605,13 +672,12 @@ - + 添加数据库 - diff --git a/Admin.Core/Controllers/Admin/AuthController.cs b/Admin.Core/Controllers/Admin/AuthController.cs index 804a26205..806a56045 100644 --- a/Admin.Core/Controllers/Admin/AuthController.cs +++ b/Admin.Core/Controllers/Admin/AuthController.cs @@ -100,7 +100,7 @@ public async Task Login(AuthLoginInput input) { user = (res as IResponseOutput).Data; loginLogAddInput.CreatedUserId = user.Id; - loginLogAddInput.RealName = user.Name; + loginLogAddInput.NickName = user.NickName; } await _loginLogService.AddAsync(loginLogAddInput); @@ -116,7 +116,7 @@ public async Task Login(AuthLoginInput input) { new Claim(ClaimAttributes.UserId, user.Id.ToString()), new Claim(ClaimAttributes.UserName, user.UserName), - new Claim(ClaimAttributes.UserRealName, user.Name) + new Claim(ClaimAttributes.UserNickName, user.NickName) }); #endregion diff --git a/Admin.Core/Controllers/Admin/DocumentController.cs b/Admin.Core/Controllers/Admin/DocumentController.cs new file mode 100644 index 000000000..c0199ee91 --- /dev/null +++ b/Admin.Core/Controllers/Admin/DocumentController.cs @@ -0,0 +1,144 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Admin.Core.Model.Output; +using Admin.Core.Service.Admin.Document; +using Admin.Core.Service.Admin.Document.Input; + +namespace Admin.Core.Controllers.Admin +{ + /// + /// 文档管理 + /// + public class DocumentController : AreaController + { + private readonly IDocumentService _documentServices; + + public DocumentController(IDocumentService documentServices) + { + _documentServices = documentServices; + } + + /// + /// 查询文档列表 + /// + /// + /// + /// + /// + [HttpGet] + public async Task GetList(string key, DateTime? start, DateTime? end) + { + return await _documentServices.GetListAsync(key,start,end); + } + + /// + /// 查询单条分组 + /// + /// + /// + [HttpGet] + public async Task GetGroup(long id) + { + return await _documentServices.GetGroupAsync(id); + } + + /// + /// 查询单条菜单 + /// + /// + /// + [HttpGet] + public async Task GetMenu(long id) + { + return await _documentServices.GetMenuAsync(id); + } + + /// + /// 查询单条文档内容 + /// + /// + /// + [HttpGet] + public async Task GetContent(long id) + { + return await _documentServices.GetContentAsync(id); + } + + /// + /// 查询精简文档列表 + /// + /// + [HttpGet] + public async Task GetPlainList() + { + return await _documentServices.GetPlainListAsync(); + } + + /// + /// 新增分组 + /// + /// + /// + [HttpPost] + public async Task AddGroup(DocumentAddGroupInput input) + { + return await _documentServices.AddGroupAsync(input); + } + + /// + /// 新增菜单 + /// + /// + /// + [HttpPost] + public async Task AddMenu(DocumentAddMenuInput input) + { + return await _documentServices.AddMenuAsync(input); + } + + /// + /// 修改分组 + /// + /// + /// + [HttpPut] + public async Task UpdateGroup(DocumentUpdateGroupInput input) + { + return await _documentServices.UpdateGroupAsync(input); + } + + /// + /// 修改菜单 + /// + /// + /// + [HttpPut] + public async Task UpdateMenu(DocumentUpdateMenuInput input) + { + return await _documentServices.UpdateMenuAsync(input); + } + + /// + /// 修改文档内容 + /// + /// + /// + [HttpPut] + public async Task UpdateContent(DocumentUpdateContentInput input) + { + return await _documentServices.UpdateContentAsync(input); + } + + /// + /// 删除文档 + /// + /// + /// + [HttpDelete] + public async Task SoftDelete(long id) + { + return await _documentServices.SoftDeleteAsync(id); + } + } +} diff --git a/Admin.Core/Controllers/Admin/ImgController.cs b/Admin.Core/Controllers/Admin/ImgController.cs index d6a48914b..00873310d 100644 --- a/Admin.Core/Controllers/Admin/ImgController.cs +++ b/Admin.Core/Controllers/Admin/ImgController.cs @@ -5,122 +5,108 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; using Admin.Core.Model.Output; using Admin.Core.Attributes; +using Admin.Core.Common.Helpers; +using Admin.Core.Common.Configs; +using Admin.Core.Common.Auth; namespace Admin.Core.Controllers.Admin { /// /// 图片管理 /// - [Area("Admin")] - [Route("api/[area]/[controller]/[action]")] - [ApiController] - [NoOprationLog] - public class ImgController : ControllerBase + public class ImgController : AreaController { - /// - /// 获取头像 - /// - /// - /// - /// - [HttpGet] - [Route("{fileName}")] - public FileStreamResult Avatar([FromServices]IWebHostEnvironment environment, string fileName = "") + private readonly IUser _user; + private readonly UploadConfig _uploadConfig; + + public ImgController(IUser user, IOptionsMonitor uploadConfig) { - string filepath = Path.Combine(environment.WebRootPath,"avatar", fileName); - var stream = System.IO.File.OpenRead(filepath); - string fileExt = Path.GetExtension(filepath); - var contentTypeProvider = new Microsoft.AspNetCore.StaticFiles.FileExtensionContentTypeProvider(); - var contentType = contentTypeProvider.Mappings[fileExt]; - var fileDownloadName = Path.GetFileName(filepath); - - return File(stream, contentType, fileDownloadName); + _user = user; + _uploadConfig = uploadConfig.CurrentValue; } + /* /// - /// 下载图片 + /// 获取头像 /// /// /// /// [HttpGet] [Route("{fileName}")] - public FileStreamResult Download([FromServices]IWebHostEnvironment environment,string fileName = "") + [NoOprationLog] + [AllowAnonymous] + public FileStreamResult Avatar([FromServices]IWebHostEnvironment environment, string fileName = "") { - string filepath = Path.Combine(environment.WebRootPath, "images", fileName); - var stream = System.IO.File.OpenRead(filepath); - string fileExt = Path.GetExtension(filepath); + string filePath = Path.Combine(environment.WebRootPath,"avatar", fileName); + var stream = System.IO.File.OpenRead(filePath); + string fileExt = Path.GetExtension(filePath); var contentTypeProvider = new Microsoft.AspNetCore.StaticFiles.FileExtensionContentTypeProvider(); var contentType = contentTypeProvider.Mappings[fileExt]; - var fileDownloadName = Path.GetFileName(filepath); + var fileDownloadName = Path.GetFileName(filePath); return File(stream, contentType, fileDownloadName); } + */ /// - /// 上传图片 - /// 支持多图片上传 + /// 上传头像 /// /// + /// /// [HttpPost] - public async Task Upload([FromServices]IWebHostEnvironment environment) + [Login] + public async Task AvatarUpload([FromServices]IWebHostEnvironment environment, IFormFile file) { - string path = string.Empty; - string foldername = "images"; - IFormFileCollection files = null; - - try + if(file == null || file.Length < 1) { - files = Request.Form.Files; - } - catch (Exception) - { - files = null; + if (Request.Form.Files != null && Request.Form.Files.Any()) + { + file = Request.Form.Files[0]; + } } - if (files == null || !files.Any()) + if (file == null || file.Length < 1) { - return ResponseOutput.NotOk("请选择上传的文件。"); + return ResponseOutput.NotOk("请上传头像!"); } + var avatar = _uploadConfig.Avatar; + //格式限制 - var allowType = new string[] { "image/jpg", "image/png", "image/jpeg" }; + if (!avatar.ContentType.Contains(file.ContentType)) + { + return ResponseOutput.NotOk("图片格式错误"); + } - string folderpath = Path.Combine(environment.WebRootPath, foldername); - if (!Directory.Exists(folderpath)) + //大小限制 + if (!(file.Length <= avatar.Size)) { - Directory.CreateDirectory(folderpath); + return ResponseOutput.NotOk("图片过大"); } - if (files.Any(c => allowType.Contains(c.ContentType))) + var dateTimeFormat = avatar.DateTimeFormat.NotNull() ? DateTime.Now.ToString(avatar.DateTimeFormat) : ""; + var format = avatar.Format.NotNull() ? string.Format(avatar.Format,_user.Id) : ""; + var savePath = Path.Combine(dateTimeFormat, format); + var fullDirectory = Path.Combine(avatar.Path, savePath); + if (!Directory.Exists(fullDirectory)) { - if (files.Sum(c => c.Length) <= 1024 * 1024 * 4) - { - //foreach (var file in files) - var file = files.FirstOrDefault(); - string strpath = Path.Combine(foldername, DateTime.Now.ToString("MMddHHmmss") + file.FileName); - path = Path.Combine(environment.WebRootPath, strpath); + Directory.CreateDirectory(fullDirectory); + } - using (var stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite)) - { - await file.CopyToAsync(stream); - } + var saveFileName = $"{new Snowfake(0).nextId()}{Path.GetExtension(file.FileName)}"; + var fullPath = Path.Combine(fullDirectory, saveFileName); - return ResponseOutput.Ok(strpath); - } - else - { - return ResponseOutput.NotOk("图片过大"); - } - } - else + using (var stream = new FileStream(fullPath, FileMode.Create)) { - return ResponseOutput.NotOk("图片格式错误"); + await file.CopyToAsync(stream); } + + return ResponseOutput.Ok(Path.Combine(savePath, saveFileName)); } } - } diff --git a/Admin.Core/Db/Data.cs b/Admin.Core/Db/Data.cs index 2f25e4a3e..1604572a1 100644 --- a/Admin.Core/Db/Data.cs +++ b/Admin.Core/Db/Data.cs @@ -14,5 +14,6 @@ public class Data public RoleEntity[] Roles { get; set; } public UserRoleEntity[] UserRoles { get; set; } public RolePermissionEntity[] RolePermissions { get; set; } + public DocumentEntity[] Documents { get; set; } } } diff --git a/Admin.Core/Db/Data/data.json b/Admin.Core/Db/Data/data.json index b17dbcb60..16d2fbdad 100644 --- a/Admin.Core/Db/Data/data.json +++ b/Admin.Core/Db/Data/data.json @@ -1 +1 @@ -{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":4,"label":"图片管理","path":"img","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":27,"parentId":4,"label":"获取头像","path":"/api/admin/img/avatar/{filename}","httpMethods":"get","description":""},{"id":28,"parentId":4,"label":"下载图片","path":"/api/admin/img/download/{filename}","httpMethods":"get","description":""},{"id":29,"parentId":4,"label":"上传图片","path":"/api/admin/img/upload","httpMethods":"post","description":"支持多图片上传"},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/2881099/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":false,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","type":3,"apiId":75,"sort":1,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","name":"管理员","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","name":"小雪转中雪","nickName":"小雪转中雪","avatar":"avatar.gif","remark":""}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":2,"userId":2,"roleId":2}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74}]} \ No newline at end of file +{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":4,"label":"图片管理","path":"img","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":77,"parentId":4,"label":"上传头像","path":"/api/admin/img/avatarupload","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","type":3,"apiId":89,"sort":11,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","nickName":"小雪转中雪","avatar":"","remark":""}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":2,"userId":2,"roleId":2}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92}]} \ No newline at end of file diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index bf0207fc1..5d66cb7fd 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -79,7 +79,8 @@ public static void SyncStructure(IFreeSql db, string msg = null, DbConfig dbConf typeof(UserRoleEntity), typeof(RolePermissionEntity), typeof(OprationLogEntity), - typeof(LoginLogEntity) + typeof(LoginLogEntity), + typeof(DocumentEntity) }); Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} succeed\r\n"); } @@ -201,6 +202,7 @@ public static async Task SyncData(IFreeSql db, DbConfig dbConfig = null) using (var uow = db.CreateUnitOfWork()) using (var tran = uow.GetOrBeginTransaction()) { + await InitDtData(db, data.Documents, tran, dbConfig); await InitDtData(db, data.Dictionaries, tran, dbConfig); await InitDtData(db, data.Apis, tran, dbConfig); await InitDtData(db, data.Views, tran, dbConfig); @@ -302,7 +304,6 @@ public static async Task GenerateSimpleJsonData(IFreeSql db) a.Id, a.UserName, a.Password, - a.Name, a.NickName, a.Avatar, a.Status, diff --git a/Admin.Core/Db/ServiceCollectionExtensions.cs b/Admin.Core/Db/ServiceCollectionExtensions.cs index add8ac78c..a4faf6cb0 100644 --- a/Admin.Core/Db/ServiceCollectionExtensions.cs +++ b/Admin.Core/Db/ServiceCollectionExtensions.cs @@ -16,8 +16,7 @@ public static class ServiceCollectionExtensions /// /// /// - /// - public async static void AddDb(this IServiceCollection services, IHostEnvironment env, AppConfig appConfig) + public async static void AddDb(this IServiceCollection services, IHostEnvironment env) { var dbConfig = new ConfigHelper().Get("dbconfig", env.EnvironmentName); @@ -76,7 +75,10 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen { fsql.Aop.CurdBefore += (s, e) => { - Console.WriteLine($"{e.Sql}\r\n"); + System.Threading.Tasks.Parallel.For(0, 1, body => + { + Console.WriteLine($"{e.Sql}\r\n"); + }); }; } #endregion @@ -126,8 +128,6 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen }; #endregion #endregion - - Console.WriteLine($"{appConfig.Urls}\r\n"); } } } diff --git a/Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs b/Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs new file mode 100644 index 000000000..6c69f7934 --- /dev/null +++ b/Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs @@ -0,0 +1,34 @@ +using System.IO; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Options; +using Microsoft.Extensions.DependencyInjection; +using Admin.Core.Common.Configs; +using Microsoft.Extensions.FileProviders; + +namespace Admin.Core.Extensions +{ + public static class UploadConfigApplicationBuilderExtensions + { + private static void UseAvatar(IApplicationBuilder app, AvatarConfig avatarConfig) + { + if (!Directory.Exists(avatarConfig.Path)) + { + Directory.CreateDirectory(avatarConfig.Path); + } + + app.UseStaticFiles(new StaticFileOptions() + { + RequestPath = avatarConfig.RequestPath, + FileProvider = new PhysicalFileProvider(avatarConfig.Path) + }); + } + + public static void UseUploadConfig(this IApplicationBuilder app) + { + var uploadConfig = app.ApplicationServices.GetRequiredService>(); + var avatar = uploadConfig.Value.Avatar; + UseAvatar(app, avatar); + } + } + +} diff --git a/Admin.Core/Program.cs b/Admin.Core/Program.cs index a77b13931..494159b73 100644 --- a/Admin.Core/Program.cs +++ b/Admin.Core/Program.cs @@ -4,11 +4,11 @@ using Microsoft.Extensions.Logging; using Autofac.Extensions.DependencyInjection; using NLog.Web; -//using NLog; -//using NLog.Extensions.Logging; using Admin.Core.Common.Helpers; using LogLevel = Microsoft.Extensions.Logging.LogLevel; using Admin.Core.Common.Configs; +//using NLog; +//using NLog.Extensions.Logging; //using EnvironmentName = Microsoft.AspNetCore.Hosting.EnvironmentName; namespace Admin.Core diff --git a/Admin.Core/Startup.cs b/Admin.Core/Startup.cs index 409e64c35..bd83cc633 100644 --- a/Admin.Core/Startup.cs +++ b/Admin.Core/Startup.cs @@ -14,7 +14,6 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.PlatformAbstractions; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using Autofac; @@ -30,17 +29,19 @@ using Admin.Core.Filters; using Admin.Core.Db; using Admin.Core.Common.Cache; -using PermissionHandler = Admin.Core.Auth.PermissionHandler; using Admin.Core.Aop; using Admin.Core.Logs; +using PermissionHandler = Admin.Core.Auth.PermissionHandler; +using Microsoft.Extensions.Options; +using Admin.Core.Extensions; namespace Admin.Core { public class Startup { private readonly IHostEnvironment _env; + private static string basePath => AppContext.BaseDirectory; private readonly AppConfig _appConfig; - private static string basePath => PlatformServices.Default.Application.ApplicationBasePath; public Startup(IWebHostEnvironment env) { @@ -53,6 +54,10 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(_appConfig); services.AddSingleton(typeof(ApiHelper)); + //上传配置 + var uploadConfig = new ConfigHelper().Load("uploadconfig", _env.EnvironmentName, true); + services.Configure(uploadConfig); + #region AutoMapper 自动映射 var serviceAssembly = Assembly.Load("Admin.Core.Service"); services.AddAutoMapper(serviceAssembly); @@ -188,7 +193,7 @@ public void ConfigureServices(IServiceCollection services) #endregion //数据库 - services.AddDb(_env, _appConfig); + services.AddDb(_env); #region 缓存 var cacheConfig = new ConfigHelper().Get("cacheconfig", _env.EnvironmentName); @@ -212,7 +217,6 @@ public void ConfigureServices(IServiceCollection services) public void ConfigureContainer(ContainerBuilder builder) { #region AutoFac IOC容器 - try { #region Aop @@ -247,14 +251,20 @@ public void ConfigureContainer(ContainerBuilder builder) #endregion } - public void Configure(IApplicationBuilder app, IHostEnvironment env) + public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifetime) { + //启动事件 + lifetime.ApplicationStarted.Register(() => + { + Console.WriteLine($"{_appConfig.Urls}\r\n"); + }); + #region app配置 //异常 app.UseExceptionHandler("/Error"); //静态文件 - app.UseStaticFiles(); + app.UseUploadConfig(); //路由 app.UseRouting(); diff --git a/Admin.Core/configs/dbconfig.json b/Admin.Core/configs/dbconfig.json index e455bd10b..e43e7ca6c 100644 --- a/Admin.Core/configs/dbconfig.json +++ b/Admin.Core/configs/dbconfig.json @@ -1,4 +1,9 @@ { + //监听所有操作 + "monitorCommand": false, + //监听Curd操作 + "curd": false, + //生成数据 "generateData": false, diff --git a/Admin.Core/configs/jwtconfig.json b/Admin.Core/configs/jwtconfig.json index 732340ea2..dff6557b7 100644 --- a/Admin.Core/configs/jwtconfig.json +++ b/Admin.Core/configs/jwtconfig.json @@ -1,10 +1,10 @@ { //发行者 - "issuer": "http://www.zhontai.com", + "issuer": "https://www.admin.zhontai.com", //订阅者 - "audience": "http://www.zhontai.com", - //秘钥 - "securityKey": "ertJKl#521*a@790asD&", + "audience": "https://www.admin.zhontai.com", + //密钥 + "securityKey": "ertJKl#521*a@790asD&1#", //有效期(分钟) "expires": 120 } diff --git a/Admin.Core/configs/uploadconfig.Development.json b/Admin.Core/configs/uploadconfig.Development.json new file mode 100644 index 000000000..0e0dcd235 --- /dev/null +++ b/Admin.Core/configs/uploadconfig.Development.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/Admin.Core/configs/uploadconfig.json b/Admin.Core/configs/uploadconfig.json new file mode 100644 index 000000000..0e8323128 --- /dev/null +++ b/Admin.Core/configs/uploadconfig.json @@ -0,0 +1,34 @@ +{ + //头像 + "avatar": { + //路径 D:/upload/admin/avatar + "path": "D:/upload/admin/avatar", + //请求路径 + "requestPath": "/upload/admin/avatar", + + //路径日期格式 yyyy/MM/dd + "dateTimeFormat": "", + //{用户编号} + "format": "{0}", + //图片大小 1M = 1024 * 1024 + "size": 1048576, + //图片格式 + "contentType": [ "image/jpg", "image/png", "image/jpeg", "image/gif" ] + }, + //文档 + "document": { + //路径 D:/upload/admin/document + "path": "D:/upload/admin/document", + //请求路径 + "requestPath": "/images", + + //路径日期格式 yyyy/MM/dd + "dateTimeFormat": "", + //{文档编号} + "format": "{0}", + //文件大小 10M = 10 * 1024 * 1024 + "size": 10485760, + //文件格式 + "contentType": [ "image/jpg", "image/png", "image/jpeg", "image/gif" ] + } +} diff --git a/Admin.Core/wwwroot/avatar/avatar.gif b/Admin.Core/wwwroot/avatar/avatar.gif deleted file mode 100644 index ddc4b1998485f081e632c0ecc9aab571e098982f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57566 zcmZ_VXHXMu|LE}~n`}T@lwJ);QxSvoY5-{p7zODdDAG%i-b3#g5TpqP1pz5Wqzf22 zB4`w)m(WoGqo`oZeWLgOc}|%*FLrijXJ72hzPNTj*Y{^+VyLF>;tFwve1kwvinALk z@!9L~c$*7`If+;ro$#?b7I6jR;b;==d*QzJ;Wwv+lP~bqTOqqWI0+6?rFI%k=j4*F zNu>LndVKwOxx3C=2d#N;bey+dMxg$!aJ{rpi@Yd{ra;q_aJPAHll72u;di5(5;bQN zc-L+U?zF?-&k*J-*{a%J8Vq zb9+)1G?-_xm1eO}q5G=FcDu!5A=_=c_{!*`>!0faCPr}IMsU<&pS^L<-|Joh53(B@ zGAHiDkF{ld>WF{YS-##u>V9?S&2ZtyK;nLX#>dy`-{%rGp6Bg9FL*y$^mX?3&$WW- zR}Wq;w$onR|MK$Q=5+PXsjB6%jcmcpnm)?v9mG1vc2%}!|az0>h6b$A0NkeKg?}^nf>{B?w=pC&li_p@9ZwG zF0JpZfBCqy{pH<{Z=3Hw?QZ<|^_%ev0)dEshrW7Kxc^o6{nyV&pNWV}&5VsV zy?$0R@^)ZlZF+8Wb9!h?xTUI`Wp!|8a=vwM^24_Y;SbwWV@C=;-sy_$+<{uQa)Oyb zU(rINDn!x)0`jZp>IUZOnH01XL;u#ci+ogn(5KyMF41Sn;sy_b)UFQp`5qR%r3t=3 z52tY0ng^vlay5-nba}J2pIdrC;77dFZ&pROSJ{Wu8FL4CRx<@`jx+=bT&;eRCo((; zc^-UXvXy~-rJZ~3^GtG^qVKh~%bvrxM2|Ghzi9T2Rgtq#W*18LzH|S! zU9e4ny5dHIi2c{~{vMOlhkx>|vkRT_@<4X)eQInP(RVK??*bRgF{UrA>g{&zXdUfm zt>vEJ7wQF15g+Pa?Io}(y}|V#oPD)AZz=wYfDj4V*BufzawS;@d>FfbJ2GX=`i^gS zc_8*+1{E#u7=;El{`K(vN) zd=GXPzx2*SG2!rKpGO8|kujenLe`+F_Sg;z5z2Ro1v+pSXL$j^bGZ=O2Nmqc0o*pO zBk(vs-WpwYSE|50fnNci?pB*vc9gN3*t|jrdUU=@;x)K!G{}F^I46nQe0Aiw=r2Tv zSca!327!{7WP?{+*7||qQ%)6s-*gRgA;JEThk|b=#%oE6H>X$^KzhF=o)McJ+#C{f zki3x0LyOT(;?kny0WN#YL0ZV;F^ZXqA?qW(19B`E22dHFV?2>-4dGFf-Eunj6+t}{XSx*vhKn5ZX zM`79G=#5Sx&&VU}H)iTkri$|(1=pt7db_mHj}Sua*S{z6JNZPPnv8h=tna19CZy@5 z7J<@taBAA;rrG&zL;|Nw6aL$@UK`{LucO9D=;Lg|j_U;qdI74vX;v2uxla%wy>GO_ zaz61nMU@&%MYsjDmzmGuzHMAPA|A*!r7j~Hl)grNyb$`38hD*RSoy zaa_S+#~qF0wCrxM+EHOV!(3sZNA8S!gm!nYZTsl}y@*?3al&fiZ2PnE>-UGXoYbML z$6Z~zu=HNxFu!D_x*q?gls@=3X^9>?`t+oD;B=9u|4$ zI0S)q)v8m1&su$0ccPZ)q$J6bNv~<%chkS7bWt!8599gu0&y$o-kws8$>(+gT&0Z< z=|PQSi6TVQj!Lj0OpGIXPTg|Ss$_rjSlmd+Q$?9xdeRna&WEbY>g~5blmHI#RrGQ5 z&~=p%tY+b_&t*(S&8?7+K9<8P7A(}^xPqwh*Bc>-qnJ1dj0O=qc0BELKIf9-f&G}P8f}5x+EY5D1I_1%1?_MN4Fo78^(bHuNmAc(;lj%%ED`Pl zAO?%n|J8d?P6JRh{*-Cxa)AWAt?i-&tlI)nJB{C_ksQ;<3g zmqbSbQtkL%?Wv4LQQ56GL`*}y+j)b9Ri}Nech4?MXCMLu4#L3W;K3eU7Bdt9g2%i% z`3B8fJtoU1jv@$t@j4@x>M3Bj3N)LXsQB?E&WfMy&dnG_P>$tJRLX~E+-OxUaw!xd zhLSiv+T&i9RsE8LO0W#0us!%9aHtrKU>tUJIb*vCX;RS<{ZBmNlCJLclpD7wYoMow1V zBJ|z(NyyFrrN%XhtURK!;&aA%nfs1S_mSZ^elG|CDpC%CsKp=dq(32RShA>N2*=W? zv_hA0WXx~^b4?b3pq)7!Y#PhHYAG`+n)G7$-Y~zFOpXf|!;fI&`P$IQs;O~oekgq| z4lfh52SnHyA1HUY3a*_f&K^Mz5@;g>Y+K6~ z@300@6J^hcvl$al24u{_L>YNi$lblK@XZRI#sm;VhRId|wihpay! zbcX-6*S(Il8?$kTsMzZ_Z!WE?si_$gMzzcvn)b9ngck3A#$mp&2Q^zcaFGsOno z75=>w8cSml!9&l&7)xyXr4esGeE=mrv|$HQAiPnx9m=}OM8kMI57#twx) zdrJd5x-?@VQufL>O5%CheG)De_R)4RDJS-6pebM5b71E>%C&q|_I&vC_yVZlDz+p2 zvhN3{*A?m=0i-%MgzGvXVYxU4aT3$Dzz!m-SNJ*2ZN4F0i^dAss#%mV@lW$jx1%L` zI8JuO>j4+bKtPiW zwGJou4#XSJRL*vI56vLu);jc|?*NReO#l0HWv zTBa5V4C5lf;gV#kW3_FPj+0bn(5L&Zse)HQJkitPOeDleTa^U6)RyqmI!UM6^+le`-ZF3z zg7l|?H{HX132|=xv1sF1PL$3GTJkY!vY!nsq7SBy@h?--Nxy2Tg@>|{Ax$!gIs_o4 zE!Jx@IT?-@2Gy-B5{*+sym0Bl#(`eM>wZMp-3^mZfiN`^tWh?@lo)GDf}JF09HS}9 zlMr^!SNaWrL>!EfGbv8hXl0m!=%Fy9BLVj!!Th!=#QY2#%P2SEs{~?5%{z! z&Wnz~(G_v2FpFxyf&w={Au0hZmElvprhtokjD*W0_K)3}k zBY_h#;H4FSxSZjHK^O?$=x)1Z(gJ8=Qa)E?k#iY2GASw21?jRWk*;WGN(FG9>gV`9 z-{l$H5?>U%3sczLPOcTwi)M8h(T8Q;-cHnO@gDRZi@k>(So-= z4i{LE5X*bF0?=Txf%XM#zHnM#w|kDiJ3ccICrd;GkN~S>xCIq%Mu7hqg0p>t(+*wG zbIw^z1+lFpR}w;Q72zz1Fr&Z^Fw)8|kPsGRU{V&0LdQ5MDI(khkk$c@mydln1bwN1 z1RAF8jJSeANJIRkiRI5)V~4-Nku|_G3Ams8U6zhGM`tqy4MbB*Z0&@%k+ZKM0U3${ zN6!GE1hBi6B-|G0>xK6qA|nV$9}IX$1@xhSVPx@XQq$(Kh7U zbP8?~+%rD87auPx06^T~p;Tlv1sURu48|ctNHx(Uq%RiqrbJ45UH3(K1$R_6Jg90& zN7~RJ9B3FV)Mx%ytlNsBB`Pc;HAS>7!jG!(3DlQxi?Cc`fvy z*v99f4mZAh}e*Xd;{gSKBRa_-@2Yjjl-ecrmSMaZPRh}B8x&)$cMIA|IYES@RWa)xUX9urs#wa9=s z=0N~|aCItJceeU@L6kbN>Fg{*@X4c%8A#kQ7!Rb{V#-j*0{p5G_O+w=s}Ry!QaQyM zDoTYa;Gi!2P!tYXJc3X~`#Ql3ADy}9K&l~Md=MrOTs{aIl|&8SYBCZAeP|5iRm!9D z!qrW7L6TF3dW7bq!eN%7!5q@(4u-cJz_q)ddmN1dt-rS5YYAuqyf^|(wG9c@0QqX8 zVoI8!q9SY{)uhRD^SeRaGetL!6(krXE3l+ex6OM4N? zO|H%|p!i*QIuc*#jl5%pbfMS$VtWumK|(T-@zx>k&WLegFf5(I8bz_fRaxUajyMB# zsz?=FkduuG7J_srY2I({QO%ETJQH&e{dDWDJF9U0cyaG*#t1Uh8R?G0`-BF(GxS?_ zL(Ca^uMOfI$Vh7<+)1EkKN%r0>z9LoUmyn-OZd%C0IkQ+zb?Rwq}vbH9G=v@=MdBz zMSbc_9Yy}A*st%b=uG` z$;)ra(2sSYSY@@J4WJ;rYX^qE1lZGhXkaDP3q z#--=Qoq^n4c&Zy-%4?h=LzUQ$S)3X_Qv5)vpptWpeUE&h zbzJhmaiPM>nqzmZN3!OJ$CX;&3WtT%upn{D%mx3omvavL-Z30&u;c^K)4edgJw-J2 zdH_2AeL?yoiQxA?i{9BYCMkB4LB5ktU2zr0*Cl>{=MNnTq+WTLOY+MKIa>Q9OLO{Y zWN=>e^uB?&DHXx4cjQ6U6OVUo1<@9Tjx+borun~vSL&zmm~=1e>q#7S#`~pNLJ!?k z)AK@S8#&%iX_QcfXN`wR-BqWqVcuTyowF>hykD5}(6MC6cFMczK~i)|!&u~vtOo(s z!2$RO_F3VZ8{0Wm{u~8*ZLi?R%{bS8ZbYo$7V^DNGgmXiu z^lkFay8nx}X*!!mWg&CX>Gx$9XwjP*{4D>qyZ;O7pz#S%L~?Rc%739QCo%2jU#LsF zRdR<^e)nEQWhR(hodQ0%-|!Go*T~XXSJT|q-q2D}pV7|J)7yhYHZ>0nw2yS&Y;J9D zdG#`T{Q0w~=_!^O$V1O&FHc0OVh#f!HDZ^%`bbY8(Jj#f=*p_u% z-)-0Ce8m93T7K}h0F}~PB4W>|upPgee9!2FbY=lh(Gym=p;A|)FQP+*m*&OC(wC}} z9}3nrRHRtiJYu!)GCNb)?^LEceyM)JhL$GAZZ@DGCIax~X$79;VEK&aZ?=Ar^UgNSj#;e~pfCKfu ziz;K0O3Mq?qJezBN=~Ls+IdSW8Y%D5$2+t`vlk*Gyp}qI1F>HGp#7q<=k%OhY2@CA zm!%&XbXuRV9Gto^RLGT(;QR4-+S5RdBCV-Sk&0Vo;jb!(P;rP;DtFjVQBeue)isH8 z{*D3IzN8_uwxX+9Qp1JOo$m&FQbm&|?l^LL;Q9_4y&*xN-2G^M4rL{l1nY(GO;isB zXDCuMhWcsn;K$TKo2y^S8P@2?kQ|#uKU)5+IJnW)(onv2M0pQfiE6WwC5T7$8Q6*b zkM|V^c|b3D8^7S!kDdu`EphPd0^PmPoYFIZDcp0AMXC3%s<>(-}% zioDl3{m^!Wvxf=219%s9`(uec?8-d4`Zj~CENf;TsWfDz8>LwK9{X#o%srJZm4Bu0 z;eVtL$W*9H9cVNa3E1=%f~!H@QWi9i4txHW`%a(z!Q?*E7s_k) zuH6W(#6^xo&frCI7?)8t%d#)ts5XwteYEzCzub58z`4ktUcTo$6`p#Ze!T4Zm-`4R z&z;n|lK2bU%fr`g)$X)&t8O}Xebw5e^&z#|)b0i{s5yneeB;w@J+^L!9et@~ygPF7 zavL2+)fKJ-*iN)jdJ*P6U0RbjpU3kk@jrYw_Q5C9LXazpa!RN=TXXSo);pLhzz5m# zgKGA$I^f#AAZnwd?(sY!;dIat-;3%3JuJqA&QoD7;f2p{^Hdm}tP$7sLX#=WJk^b& zg`8(!6_ZdFSK|qSIdDn5<2*Z3&iU1g5b-(~$_etM^HL9-A1BUo8`sX?O%I3NUh2F} zNUSk43)1M+g&ilvL23roxH~!1*009%H9-)^M;AY6c(i?sBZoYSbet#PBTaPT=R@r<6}ShX5klygdh=hd`}j5R}bFjePY_JbWckbA>4=q@>i_X+RTL1Z$M z{Z@Ik4PSU?5+zq8$2I}P-B&PPXM)vSTPb=W{d{0%(I58HTt6QoHFxBgg{LYHiIDyu z^{Y5hkds%T7XIv<*n; z>jE2sGo5-$o}4LPxvKvvL@V|Fi38OVIX9ORFND3Q0yR8(jBE+Y6i*OEs2D#f zZNyWAZt5LEGaiOz-MqbOStN9tV97$wyDv8j8>3Z^AC!7lwfjyNmogI1i-AD!C$6xO zFe%zwP|j=g`S~CU1l%OuxLn=i%?U|3g~`qQD}c_1l3_g@fz`GARv`&ciZUc4QucWx zDxoAxHud8cwRO3|s(kr;^>HG^0ZQ&U<@~PsTD35OHUfF_{XLs@SQgaH8HApF4HlfZ z$L*9+sf}I&{SjD*QmvtwYaE#9`Pw~UKi}L*1{qpc<(V`Bfu=J5rzwZ{58>c)+PW;f zgbxssU6RnIM{AeVJ#G!s93)SH%bIC{BaxNbb#+ffop+Xr7yxcY*C|`YB9uMM7~V6A z&T^^1EfmQ?!GV=i&m$fJCjiypE#4+NM5OMR2@BjA{M?(1qzQp?-yv|j-|wxXQNTZE zyxpkr8*l>(jN?aP&xDq4;x1uP5JH1meeM%^Z>UmrN)T)|Ch!N^A=!ofZcH#gCJBHX}uN9mpQ;tXDJ(IRNS8G+`1O? zV_H%GdZ>wlQ0UZUcfjilI?&(yX>zj^1sTIGN;{)ub-7$v62z#Yp!^mkw_m=6!()|n z?WFK!#k&_0teG?)p(4Rzh00K_1=^o{zhQ|A@{|3{d&x|8-XwIe4AJ{SL4W; z=K~?9MD}V$Wxf@@Y5}B(=eAu@2@78tLGr&CTJNoBz2kSfL%Z%Rv2fzCW4;W}lBa^h z_z9@sXL|C;Q*qA1A+4NU)H>HD@qU0&$Hoy<94D!q;H&)K+`;3vK`+Efnn8lU*xkZ)mbK62R;AVjTYT zSPyFSLThN)9w>Rn(%&!!pA4u|0aPKNMspUsblyNpQ+p+5Kql546L1)Y^Xr{9{w#uWq6QGsZL z`%T*`gKDZ|;2a*I-Ikz63Bn{_V`3mP(}9XGPLl2kO8PN!dYuidk!gX1Gr6fS5lJmKvN}H*!bXgZ z-vrc%nGEe}*t7j}2b=Y?0i>-gK|wZQ?IPH9C^<|CCPM&@p>BK{hHDPPkI`ZK)v(|d znBJZnM~kX_5HRnW#YP5P$yg=>?(f5{g&}aV%$s2cd7;j4)h^Nyn6PYw2f=eABV;92 z7L}%fL73v;7wB-!Fs9NW?C@~D-JJ78bmyHI#L#1J1HvI)qw|Mfo_5&Iwi zJ9y1RGYFTK7aCfXv%sIww`{rBpBC`1{Gsyn|0{oVrO;h?;Ra|4fd`IjFy#;49(zU_ z%vu3(c!cYBgdL4|yasUw2e%~Ui=r9=wAfGy>sBDIlAGeLlZUNuh%CAa*R%tLZB2tg$DTB}bYI1{# zf8RZC{SqX}X+(K3NML~x$s&-XZ(VeZwS)iys7Smbmk%JPi~^4-(lZQ^DlKu71E<10nZ1 z!H5bVLg6<-*uM&>M1?Bhksgry^#vi0=&*zoFr0)8qkvb5epe}=4*}^-g7eTIJUBp` zcwJ*E!4#_{kGXyFK7DL?$PQ@z0-OuuMl#r(eDbnddI8Q6a$9gs;*LzCe%m?3R=0h zQIfg4um-cly1wctIVn`iC_=j8Q|{`=8_*wP?f-Hhwcdq{WpW^|@P9av537&RH!Hl;KfE9gg}F-^$vJIsLHS@+}v*jF`u4PYbW2=>gPiR za%!7zcz3F!m^O&Kif$=jtLv-^Q?ov+hXWZ!;p0c6X3up5;IEZD7qRIorFodGT^*0ON<+G!&$fiZ9rtQiWzzV*Am*Oe2@4Ra zR6FjerQCCeUm?Qb*ShB;kj+Is3Fk@->8(*zWSDbQ-Vntb14?UwoX-jf4E|sjJQzuT zdTbRUf$oLW>496Y9@VG<>+p72ay2qGoPyoVV{R`)uQ*$urA3*9c83uCf>GeI(7=ip zG72}~gOA8diDpuvv8h#8w&hiEG!KhbR2?v91omf zVj=O_m|mS^!AV7$cZHrG-W}@8gZ3-dj~zu`WCt7No?mo8I#Zw``oK?VrmsV}XwR8g zD6H~F4P8zFidTRgHB}XAjWVI7R5q<45Y9L;DIs?eE_Zi$>Nb4Nr^=S3hVp?r>K&<{ zBQ^eOhC~P}C*Qv8)8&XQN~Q10la2gp)$dcrAzL-k@{sa!bEVSKVnSE82I=}tZZ4T zPd~`T-RN}`VS_S9dVG5|w#Tx9PT+R^2*2_9N#6MT=DDwJg{-9As zS%;fRBJaQ}sAo#KW0o>+LL=ceIA0^L3Zsa(*vW~|h_|+(!FH%;)}g_^SqPr4amvq1 zR~kc4!V)wuC@J6a{-OmuyI6IeKUjQdEF*e2l0Q;}HKDsE1mW>Y*ml~X?SVq-WQ37= zneQvd& zOAY0p>#v{5D=w@nm{`>-6^;mK_f1Xnj^fprhs=QLPr~JjyY6K~O-IfzWX&&b&-Z#w zta+4ql=v0H5wn!HT`B!y8Nx|cja-17R?!}<~t8Hbk+)omL>{T-kn&S-d@d-8p6qU%y^e)hb$=Q%quq}S(L4v7Hd@( zw)NXtU#wqqaf8ysvZ1@xu z%Erw4(ZQQ9C~G#4VQni0@@vC;>l3gIxsFZk?sssf=Cx&yDzTMfvzpwP*;}EreCBhW zI-B9Nb#CCj<%>^!91mZF8S{;`>bml{{qx~VsoZt`XIbUPOeILjB zt)&<*dGc@dc5lzdY(@EP=gVxNci;InL`-Ctoid)y_9e_XDTQ4EFOTF%izUo(BE55^ z6C}3sbf$O3K1#++6SI=GcXqB(;`w~1KkMXUHo@7Lk6wq;2mI*286U}JVbGJ2GtyfI z-06tLk4=srSIm)t)<|gyv*1o57oi!sMLN+}x6s z;`AGZrR7Cs4@lMVbxCEJ#kB>sEv zD2t)D&L(hZ@j(L2UMK1qCjj0>O24TKf9x_^roLF&WSmz%Uib+^h^h&y8M}{~j{72` z8*iB;shj+zn(yevdWKiC81K(V_gU`StHz9C^5%g%I-#$9HPssI8}M(BwH#mGvF`Qx z4$jMDRV_E0?70o&zh7TswfjeEXYP{zN@W>xe2dNE@_JE8YxaVv1>pOd?4O`ABJB6E z%Sm*_vDl?0IXh6?E?TtYi`&B%^~*6%kJX1)JGlf9oLv!S0>jzAhhV7W}U-pB&aL+SF zn~Aed!(>s$Iv(a0+s@fArc4i z{bDgZwyyj_#tho!GzAY5Z~8HFJX|!As+%Hc^}5{Pg5rsR!vyMup(2mKgLIUSOT2V0 zl(~N~SYq|#5t2iYicUy#yzg;|!|8E9r-(O%M}#uMn3&eiJHLSJ5>}Jc-9vEiRFJSwq)|L+A@X zfZS?~e0BP)88ngY3+%!N{-&5X1CA>qAN&PPso!(pcKhDf^6emJlj_~5M9U77Q5XE} zNQSe0G7noUGc!~T8tvmV*_u4ezBO^?NT(3Xe=vPR6$YW5?`ZeU-jy&j(5kK=*Q|9I<+r4-aq_l}AMIUgGX|j7YxCWqX(0J%-59iF|(hW(nrZlO5 z(*z59UGMAvC_R7QX|m=RWC>CEykyiAAIB9>Va+@u&YF>O8XtYm!BA0%=Ct{!=MoLl zuaM4B&vp`QjD z=t=YtQ_if?T0G(oU`Vq4x;L%WR88pgA-E(qPG~VjLsR--c0>m6ERFz^gh7!<+6V|f zy0TvGhy1C;YjW4rpJ&I>fWxGodrd36?bV(BH(`A&H~MHiJdPWcAwyD;;$O zPH`D9(Xr0HLi^WPyXd|zjfk;rw!Ecys~O5BHf-wFebY%UH6aH@wO8PI#vZQ!(sAz_ zf+1L#AS8zAV~|+&Gy@i5oezapvHO zds%oqOe~i$a9moKXO5aAfw6*^pfIAQp>OI$X+3W!Futo{fYh)_SC`|2&;%Jc8q0l~ z_NAD^Z#7>lt6oKtTeqNVYmN5?8tGIGg@E`(7=*@h+pdRg^KI82t2h#dMRKHXT}=8x z;RsS>VD)M)AAm`1inF^=`-M+4Qm;l&yO3%6$E3G)jF5xsW%dq zuij3PiKQiBq#|D&J{-pq1mW=A?^sv80X94qWi#Ks1y}6gTuEvT5OI0A32VOp%&ZeDJP?79|^l9r+=+KL;rXMbZz@Ac5LDpx?-QZ zCT0Hl{M3kvjsgt2ug4#Be1zS-y`?F`L`UlP`XhICU#4{bYGov|Gn$^i-8;p3omwuo z%AD@Vzpw+htX?^VCnDQqV$AXQ!w|I_2n$X0(Ldfu2)x1XvAYH`X=r;g_%naB*B*Eo zb8@dBR+0c1k>SVM;?F@&f4t|=Yk5+hp@+oKir4l(nR6*xSh~Om)=#R~@mYpFztqm4qNdf)lp~Ap}VMtB$sR)iD+f z;5Jfof*{|%4i6g+H&2biJD;I9U6v$=p0I)?rY0TVOipZrRR_Y*{g*3NPBF>x^}61> zsz6u;EO9tl&N$Vd#T?RX9RHUb{pm5!hvJ^?A)0{Go=j|{V^2`hj*-)D+rX-s*hslP z%A?zM6||=Sf3Yz}lcuGH%aBV=yKQ`K5w4#EAkVXen5$(uSc46xl6?MJBjXsA*<8Sn z{l&)BYFO1hgdO$TZ(h|SLBP0VCKDU4(6pG?xVjIs4ntr!nK#20d7yR%f3T6-8uED( zao8r}!LUkfDlGoLy&);y`rqD=h++TEY~VnTmFwO|lnz5~usOrMu%O2#Ao#C0l5WWV z#~T;F_+lh+(M@sYg+w!Bu<7D?dVlKWf4z~OtMFfML@W93!dw1&qo?8@Z=|=yD5%^> zW|oHNd}e9*BQ@vW(opTYyXH|`%xbV74Sc;BjChx5NmS*?yC8?mv7qN#Vi3n<8HILa z%=K&e{v^=XIl>I9u1+`8q{6)jga9fcaRq3O&t{UNXHm{(HNp&+tVssSWpRK>R;YTG z6VZ~+Yz&>R6OI-p{%H(L>UZIO27Ln~$Vd?xaThGb@h)74YYx)Xe z)41@tVDSmbq5!%oa*ZjX;YC$oWJ|I6R53^5Uuh(J$Y675tl3OyTy4j6w5z05m9_B4 zq*Q^IQzAckDt!?wP7Kc>sUz%gaX*fNj;p{0TKHi`D)Gf$NXM?lztWibA89;34A=h# zXR|o3hl*uk&3ieCuq7HeVG1u$;il-DT0#gr3__E1=?VqOJEfpQfm=a>t*B9f8$kxh zh?gm#HdR0ydxFV~N8MrCBe8N*;^*nP8rYKt8WG{o5`C)>jb|z?Z~<~*0sA5FL++g(9OGVmxE_+)!Y%PFB7T{BOo5iz!=w+dG5ojd(ctqt=u!t4lEEa+U8D^8HsGHGg!GR{2L4 zA(0Yz86hJHffS&Gsf(zqMFlC{f-#x=S6xE!hiu?z;YI@z^Z*ukDg?erK!)KTx)9+Z zc;s0svYIdJvQg~}C?|S7;P+$Ol-fD({M9@^o5mJUncqGbshy!MgHKT0+QV?MM; zCI*HWJWhGf9SzPR$JzBi$+xD|Aq1ZUO*7(=n@sMhPV2pzU2 z@+72^DT~+#@r5SdD~L>MMr20oqeyIW~cGdO%Yf(Uji*7j)EW`Q}- zYeQv0(H~&p25^MhXy!Wm_4)(uO=kqUfBgLQ(s zZTLYFb9|=Lk?D$b8&Un1XKXNIdaXMF^rE#FS2bQ`hDq)n0g-=Q(b=RX6pk}`aB0*0 zv30^DjoOx>a#v!cPzmy;O>$lp-h|$kZ`~Q{T)cm-rP34b{2UogKngtx_omgjQ)+&M z<(L;x{;(po>oAiQnfnFrx(>g&QUq^XtcrR&UHp?7ypdB3 zW`BsSlXs|N_J^lN!9srIW%mMiD#D!zy5qspks22ac-sq66oGi60#hL(KY9X@lc~Lb zbg@lRZXl^POmfT0ubIFp(Cdgkc9s$-@BMIJV{ng|B9eOT2t*qy!YCB(l#bZ+K=2j7 zO^ky61;(t@{-@WQq+1=ZRJa{BNFwxs6q5>3K&lpyF5%la3)TJ1a27k(j1(eCM_MJe{f0U8IN@ZsuKv-!|VKNi5h9!>#T|Rq9h1`0G z0@)0BQ8zjQVEzV*M3qy{0V@vv|1x7=OI+T8pl*p8zsV5Cn}IyUAb$7aSQUVU_#%b) z;!l@|9Wvm*?>|}eeFC1e74TF9$a*EPeJdbinfDy5J4Yz6TW^TBHAu}KP$9oQUN3*o zVMKz`#!DL6hzd+L6_p-YLW~qaZ=+fIgqsf<_X#%i}LLLbOkW zN}2^Kq`bc5c;9OKxaSq!iAjEE4ucV_!; zlu%ygiCFkZmA=`K4Lhlu%i3Shng5Y;x#?i$t zliMXji=TfdZao3F#=?{9tFWF^Z*vnTrfH7W1@;AtA?=9|x@M|2g9puM_4AW?b~P0R zwB5a#hA~>uchHZ4(d)gpm{JwD^Lv4Jq0F0H#$PshSYT=5HBEFl+$>|ZD=iF9u)&J0 zDy5dSZ)7h;&@en|?X>(Ft!mYnF+Wv5pQ@~Yv}jv4n;RV~E1WD- zwtsxKY^Atr@nZM7C~FNL^T;iG_KP+NbRv%ZP{QLBy&HO{vx{!so0*(* zAvy|J`8lf>-P^XSpB>*Xceo2Nf_M3s&R*Y>Gvm$j7$!e1OYBU2v|jef-mDa$LqF0uokAFIr4FY}i(UHr z=;_m}@g`x5hsqXNF7F=yCxl%lg6;p8O+x<8Hzz?;QlV+-37N#~+(hCZt1ODoyqQx} zP*z+*s>r{adq26Nw6d!5;q3>H?&PGATie?6VI2?a?sxU{!unyrK!4`&^U=<-$MGbWnFSKW^OYf&9eoagbJS2V{AIf%o z5=Iw8-`?f9@MIQ zT)zIZ1t%AQLRK5*pJ;sY%Y^5}Z|j=or;!Z0+x)vQh2?QBp)xDBi4VgKg@N|c)al2` zJxSbyZk|G(zO~Bs`qFgB(btn8CPRArEqy(t{qcr$^y^UCyI$c_A4m6&DrCW?KS{IO z|8U+$CJy$A2zLMeS*i=19&=cVqTGK}$z!-#YV_Jhwr4`bd66UdaFmg@>=HCSN!l(% zZ*8LFnofDEc@WQmkT;&wmuy@TXTC}=Cw?oH6?NnFlC`g*mI+KdMMY-Q7~BItlpr2Yd&^e<+kRx@2YqF75X84{_&o8)0?xR zL|t|z3PJZ$>i5*jv_mgyg#83KG0X_^4Ym&sph!^mQ^ROC5L29X#HMQCzf;&E&bYv9 z(k9Zk&RB)Zl*#cvN;zDSJ7NIBQO5ud1@zhSyOGMF|6`;rOe3|!fcI-+^d7k8`kiBy zvH^#|!ChnkL ztbOBWrEQCSxJ{W-Y6HZ5;^&Y3Bc)`y5JA&^%#^cTs;_sw9r2vOpc|Dk3s;a-sGoWB z!y%c+|1XrnU-a=Ag@Mhv!-tG6`iyy^`wtu?qtEc_Tk4#dq`EbzH?@a|C&0A}dz1%@ z|IbJh%(XHV_7!Y;X&x!~N<-YB|9?Yil1!10Gsg+dJWzv#hoST!;$5hGZ?m1YqQ$cI zdPn?;{yoN`wU(ct)*PglLyJ!6=kvfG+u?UYZ6UTl0qhvAS06}E8D@pC`W$7pxz4hA zw}7wd;W8d^U-($G`61;8RvHE1?QV}Um;4-B;$gsX{zu31%2`jKJ!3bP>}isaRAXP$pln%F z$Wo(h$ugE0`^?xyP4*=kl%0^!KBO$AMk%|-zE-0RE%SYDeENKUzu$SzbDsbF!5oh0 zxbEwEz4LfxnBjcxOfDx(V@f(7MKGQTG_C=n59vX<%LROn447yG6K0kCp7Yskf|6-_ z%n1U8`?84Mw;n>`f@)zC_Lh=T3JGw?lzwkTfQgcBC+|2u^}RbmR{Ah&ld&c&ZsMSzR*w3gu8DJXZaJM~R7HBpccBvb=eai!@m%r!dDOmTlTO(^}^D zYDm1O5-T!SwH@H#gvoaY;1$OxqUrW(H|zW_&6V9`zHxxUPkLt_KAMxkn(f&XHWO-P z;Ge}F%PuKX4A-Z>fx@Q$may3&bE(HrB+>SQsZqzFXq(4oF|>>w%%P5^fv0}^g7dlI z>EQ1ym|2&ptCOvI7SVpOT6{%kH4d8A+rM^X5r zNXTS^w8Q%mZ(hfLb2R(8o2znxP03=bUU{2#=J@9Ym|!vvAw+}#ifFRLPiBS4tp%O8 z@&ojH@1l0G40z7m8F2Smsyh7Jf~Q>Tl*oEEaP8~-sk5Aq>LwZi{&iD`65;)g>fpqs zsFg!6=Itlbsg+MJQ-U+Z-$d%{2$anx^Et5`L}(a5j+p?zo`1K)N4=&z9>!y8C?)&t zO@+bT1)C#uZVt!yO$(!j$RP##bltMU`K5O6<1avU6OX>(3l-*RL1|?f#3lGa;2}1B zhq^H~O2atuki{3oP-d@bQ<`LdSjw1DJI!Kx}uW3?^NS+idGgE6e9w!dWl6SVDXSK-VdVQEPkjg zK49@E3<1N!$FqCk6b_>**_8ed?Dr^^&Z>!kLy6{_)qZ@=B4_V))ZW(+2)|hNO~?ht zpg9ln7a9V4NPYEgcM0bSmVt=*sd$Jmi9d#6v@45cWi;qSG#(PR1330%h=`hLX^|Do zAd4pKObnO*f}sF&KS?%EoX^qE?=v3;Ew}zAL(_(`>j&K({nVHD;!u0tWuKE}T(6O7 z6W=oivOh%m;1C_sKN@x&rbrP>kPtDt02hR`XT6^i#=BI-r?6nSaZ2ANu7C zpC3rmxo#_QWYLna@do^d`Qf6Wc=F}5QV0#l>^yz8c=??wo7xDcJnsfYi6PPz*_tANgTT|2zJ3@)1LR%Fcju=Zg^WvNsi`T~~yjsqGfW@tIQl&Pz5L_PCZ>kV&WC=z50>Vx>N4b)KD%yZRrFqck{Zov}1YJxNgmt(w9MG02SpyLj0+K2;jqR=28^%DDrJ^Z@Ma6EDpgYMsc>0CQPEc zD&QT)F?&VBW!H$EIWPs1%_#^fkcQkjg!F@;oFQ6s_7Qz15q&7wX%+?Ghy%RiKA1$G zVzO5@?$IHEQQes0de?vfLqnzpeR>G%S|Zw)%P=WNbhxVjBu6QrUe*1h~s z%^^F(5*)mvU5LqDAV?*s;}ycs6A{PJDH&}D`;*6%5>K2~)efeDUjXU^E1Yb1(KBSL z#1e|!T6|nZ&I=&$(!JsmJFjhnC4W#3`nWl1-D|trHW&O0#not1-&_Y ze@(g-7+xP?UfvA2asHvXVN0O5*`Ug9)QTQ6P5$`Q947BO?G?V4aOIIg%3IEER?56-y74Ld&++>D7=XY+V%I6GF4b{j)an`_;ePBD zNKtVn2Uu4XnOFbg2;=Jn^X+gI4-;wkzZ4adpo=xqYPgo!cJ)7bw#QDHEyGc~W>GH0 z1P`=wD~IJC!e+Q_xG&2Bow5~fXDKppPBfrH#PfZesV3D<;T}X6gH)Y?>rk@}(Jwm? zQjPXyDcPJ9fVeE}0nQMTeJ;dln*qp6>NgW$v;PuQbjm*jm7&o;4YOt-T^Ve>oFo_{ zSZ9|__BKTYqk!mbipt8)`b$xdoeIegv7bDObY-P$osQDX%XB9wJDoc9+0<7D2OLMk zvcvNou)rxia1;+z>^U5lLbb!^ampezZL&}1p#n+SOCU&XCBXvQJaB-hR+AEc<)l8c>K8bj)NtU)C25NPtkk8Metek5c716Z1d zi@nVPA!vDIAwtd_4rSX-CT#itdY&v$zSB-0%*XK=3A)h;>Zg$P}htWD?f*|&_@Fm zr=xEzMpw0xFz!y<1og{bf|}8dsQ7^hC_80H&q-9M8q5Xa3W_)JDJh?}jZYyiAU=&2 z)6#DUFX{qXlOk)pBC|&TZwCDAJGhPzAcqc@LsxrfrNpfvva8^1$INPbT7r*RG^Iel zMF)t~Oi7);WI_u2UxFsKs>VFJs)F?XUqO=@{C@<^q$FZxHv%&Q6OAZGOOjZvp!Axi z$GrSl3=T?s|0~mGHg0Cx)bevS1<#U@xQg2l$vgj%xC6pd5d~P}kUU3C!*Lq?tr76c zjHJquWG#Vmr|GO9QYsx0$LY=6nYOfKQ#88C-nmIy@*<~MsR4J$IeM+~i`$#v6a>fE z%}QHT0hVwAo*)C~a0XrSvlO#fh2El7@mtyU7j}$>hF2z$xY=!+nKrZ04Qm8?nfCvB znG6C^mvj*lBCASFH6h0T&9p^Lp@WoA6$~sR3C4F6IPnvCHNSLkZw1D?c_{>L>;e5W zB2NP0DV~C7Hfr{6!qfH#H0}tqi-e}Jp7e7JB(5t=+a~d~X& zm|d`DOatBfZXJ8jI^%pHl7%#VYxQTl*T&hiQP4}wMi;6dk9q3a@l*^Qkba=*O;2a# z-VS2G`!6Ok3gK>aWDFKbi+qH;{AG`&uv!Okepj@cqW8yQRni#wg+Km zR7A&!)d^qdr>TSO58)73#AeeC`k4&A|AJF2TonSBYJl3~TSij>Pdkx-=e!!qTi}$b zr$Qo*Jh=4N&qO|#S79ire2s`}-xDEBZBVDvWxi{x6#`A(-4sLFlgE|t|zm7_|9nXb(A zb7+!7kldto`9eg&VA1$^bwS&BojtLjGi>4#n zQzE%gE6-F`*q5e6eA^>xruIqSnsROyv3M+1+j@&vMddp6OBhqfKmPv9`!*7{cGtJg zI$yv@qvWq>%1b{!R3CrBDR%PsjK!;|1CMXu>f_hP%RZSfb**$oUlr|_Xv7y!qaJJP zvSU=V?s?rWy~qGTW!!l3hTsz*&-RelXL6HP0o!FwQx5k#FYvqlv1NxTxa8F6?<- zuDRn%b75r~E6>Q1Y^0piE%D#eLN)QLJxgVeOX2!+Z5jK&nNDHY)6e;)mCsz*dqwkJ z$C;y_X4o^!Q+BVGm5IyD%2@(kyF-5^*5|p6;^UH6Gu{3(FJ7$_R?bA~&f1uN#2@_7 z)jD4YKcMre3+`RoYE^pj=k&L*soVZjg_ToX`nUG4+K->*I!d#{8?u7nq^K77UW*~g4L z!{jWEdi3~i?U~YVsMQsZ_(Ob+8xwN}tv@=5EshZ0= zpLebiKk(O){0ls8j5{fWk#>cV|GNOG^grhww{ht9++!m2D)nmm=G&k96lwYg9daJ6WrufcvNO=RC4sUF_-O!Tu;8AJ$BWhoMWoPH} zo9*uhp5A@l(Un^8`psnXp1M~2uUmGi|rWZ?hCD#L_ z+x`A9KJH<@mePzw#s=yte8jZJ&kv~c$U&q!!}#P+#H(T59z-o;We`6Cvs$uc4&-zW zH8^46zkg10|FEKU2CKxrf9XXhnd7yB=Y$lM=(r&4g<_Z95Zs9}HPKW=Y8D+{GF+~G za^zImk%E=vgBA`0PCA@yK@R+E4rAG&8c-j$SYsNP*F?SRyX({J_oUryu*s5V?U3IK=$k@FI@8wtO-o!Ka?=hAf$1l7P)4S)e_~^!Q zn|iT7-`Y)e;hthj<77?=d?$mt+kcT0E6xx#LRdha@<>Txuj|j=o2SM0Yj@ile&Hq1 zw}IqOcN%Dct!TD8LyF^1{cCL^q8HTW$I|!>6>_~&hD8e_gx;J4txbfutf)Ae<(7<1 zW3PX(;QzY|nHA!_3c)4k#kN11$SeZ3=CyIN#Y@Cu-HHE-=Wg=$BEYwX; zKNls=nVAUwY)HHj%r7AZzb@{=$%7OVF)%`Ed2o7LjdFm(=H?>gEob8DGpR_XD4fSd zC%4_2?=b1u4ntgtqVTDc&}X8a-WWPuVt{}Ua>TbEwVn*x)k3q%#m@zAb9O(YpS78M$}7zN+VD)E&&T0l5;q^N2EG3# zoq|5aH$-l9v?T5mF*Uti1Mn7Fi4iClq)uw_WU2W>H4 zxRPu2=niWZ1jeC{uXRO|e%y8TYF_#$79TRqTk$U@R;M-h+J-`JqX|#@6pKB;JxUHu z79B3=Oe>ixI!i365&}hlJp}MDl7gZaI+6xPYZhZSJ*@pw0&4SCUQaw6gHn++<$4} zsnCrup7wh!dclp0mxGVeDVNgIUFEgN+*6^4?fv-u!p$Xw%Te)}llxG6#Gsr$4#-39 zy@Z?*dyd=|)c~-&6`?z`i4E}CI+KIZ+VqG}M5TB>$yE!)j~b#H_v(C3ji~M%*~E_o zK7R!eKdNxR;K zchB!Lxl{-S^dRH8hgM;l1Va&=!n29*{xKhxL;15bzaK&1Z_G1N%NxE&~`tU2n zQ6@yN0g_a->?Rq@UcfmR7+l$p-^2Hb2$fc<3p+7jzXP5UZy?x2jd)QC+)vIDKM;_n zX3igr$HN3^%(VGmV^UX#o+GQxeHCzI0Wv90z=aOura57ryzBM3|0TO2ZSON2i_9;^ zvtNyC&p|H*McyGMNWE@wlTys!O}4(B?lf*w3{1cj57|+PL!`~aFFtO{jvsK=*k{am z0PZ|tapn<(eLXH#7`S+{!N!{&N@^3%J=b?$AkwtuTnk?2Dh+p}PTO>fx9O%sv!p?V z@dLjT2e=#r(Fb>pFw$2|z;v8^Y%3k73G->4f6!q(u&4NCk_`i5!b6Hzv==J8Jurtd zhq9qLO=73ui&m!_U`U>+!~-N)#Sci5O6`?OK5shAZikMz)=>zj zLY#2j&@(<40nRgor&3z8KsFyvn7H42qKOW@`X}JWzZqN#O`BIlSxvj!~&{}DgW$H=oP zD!2;pph+C|IAC|+Zs;+zpl~9C-2XiNROls>Gxuie_|(o*!#UpU)I*PBKDPV!e8l;$ zCdNN!-`4x{^@ZV!z2K9147tamTxa+hMT>(I`Uq`AWn$vxs4&#v9~iHX0ECUuvY?uh za1hT1wcX)3v>W;j=lKh#YJTG2pZnhU&ece_p|NCz=K(6#j1PM8VMquOLj8?RYB&t_ zH?i=M+j$bd}T{!-9 zo&$ZvaeB$U&{#}nh8Ei$mZ9f^aB?E$wVA6!w4 z%`VOzP7!)DC1-Sg4*t!>*;~DMoEW3c4i7W158DB;vwU>oZ!g}k)r-UK6svRiqT{Un z%rYc|gn60n{(pF?$L4+28sZMa{#7?gQ@@v50Ud=_I#3MH4$UhxW>Pxt(c<;vbjL`@ zcD^fwcy!iFv+bbHM0W(M0#LQ{ z_v=eqB|FWGTG z+2Un2T2ynW0_??o4==l#J{Td_*W|sG;>NX7M&4N^?$M${#ZPYBRv(%@IL*#|p@T7! zWZ>32o=md*l8vMbev^fp)K;_uq7X7*vRS#?DeraEVE?NSFcAL~a)ZM8DQ4|qA^V%+ zE&~@yngND5$?K!=aMtZVi7FU_FI>s=r(v&tO?*AGri+W4E8F|)Wu)}C;6WX6mE54m zh0;SdXT!N{(7lTEN!}(0(AUI*zNX%aF8^jEo>@y8*(TEm?yLP3GU ztKyPB3t0XVvzoMNY|1)Pj+6A~ja;4#9F$c>1+un;O}2@$RpOCtV^hwQqJ{RiGukvZ zB{>dwwZ<5kM)`jyE8qfL6JemPsk^OfqAhF&?QXoMgka+Awsg&eEnU-gTi5(S5Ny>1 zbBM`gG-3#f_HKU)^TIRMM5gk_qh>}6>yQQ`Y@Ex5nw zcs2mrJCT#E@Xk1Rtv7{gn$py1so1GWV5As1l08U@=6S~3l<|#1x&;n2-@tjubVa5% z+ld4?=bZI=YoH0Syw|pg89S#z%$R$|8aWVmJ zG#}JSfQA1{8gYMJO*Ho0Hfdz49~9Nl`U;%|w;>7P_ysusKa}x`>|e?_hVWM$u#Py2 z{G}D&9Tr*-vtCw9cHMS0Z8GHlbu~$<=f5HvO_0{4YXy5i#CT;o7etI#;y}bm$^sGN z=LPCEVm!Fvr95mM84}}?MBbr*JV`pgs~fi8i)v@HDQe1k=Q?4r0eiuhB7*qbvO!Cm z&fXF=vBUs65IGIMT?%&QfE_EFpEDmU$6diZoSO0{{;KeL%8jb1-g$r}O9e4wj7e^2 zN-l^Q>&8^M5rUt9Uq=+5_KAX!uw9HJvAdIJl_>WjHDw+a)1);D8H&pPIT>1 zunH%g)3V9EWCn1XWz;Vgn2T#PR3MYqkbY>=R7&B5IO;U(Jb4!Yf zpsR_AYC`3e+#{=1Wo}bOr3&i1)9D~(9M;A*ifhEL6(xyA-q{z`T7{hNQC+%_PaLLZ zgQ6yr#M*~+21QNkjXxX_H*!NA(YksGu+wOi4%6F|jmZNyA@_D8a6b@mxV0fIX1StF zXbFCXkh_H$Gb~8~o0cYF)6(QKRn}*O2gnE8DhA^QHyPvifqzQya4(p$d90jwptVhg z4*j4ZI_y+$j!`AhAPkt82g*5aDw+cSThY|Kchx{X%)sl`-v-?8e<4O@ph;_-1zPtY zp&&2pMv+sLHxqE{hTDq$zsQ+2TXLpL#U)=eWJCihd8zX8NabTN{zf~<&`G;ZLS!r9 z?nXc?XHv6xu^$8J-k_SGM$vUdu#c1KwgF?!Qgt-5dP=dTrrQ06d0~GkDh7ug zTj}>-#t1%Uk-@-scHQ0?7N|uyEu2rh7hVs|BL>olr9K3%HWJ@*!zN;EsCL8YfrxSH z-z7+@4^1J;4`g0wVC_BJ(k52%Z~DDq4#fz{U}Rv5Nw6D6fFC3hZH{alEP@Udz0on% zWLSzYD#WK6zySOn3R&ZHeKP>Z+%2feS87H!k5oBpHidvaKLeqSi*?g&0YT$|Urie$ zkSx&B#8!n9&D^E|`whwjXYs+%R$?JIJbNHfcH7fr!+)x6ikdaOKyXXGW@VcuC~7uT zOPFSMg5}vF(a2?f^Ey}dJxu-zv6ti-~z&S3p9cS-}*gddI9q1e&pGza(nb9 zWqea;08+-=g{ZfM1|!R`pkGLT)}wp}V&foE=)8?FNEvZW#9we2g zM;4@vR45Nabe9ZFg4PpQqCQ3v-+;=f9`$ySASAyGU*5!ai&UxMLz z;oXbP%NlTH7Eu?{a|{hrWkNZrkYi-Xzah9Pt4o3eRZRk%=m<8JB+i3{45sx-DMN&C z(ChkDfYlsDoam=ZI-zZ#z+7ENE9)SjYN3`w0D~#F* zXT(7TJod|k?N`o?5nDhe7-^YKgY*^g+b85`?(St{xOfI)QL|F1X#a)?Ffg1!DA;eL z+22a(YBdb>?|Ri<1@x@t2M@lwR#of>dFz1&L`>jPRHzhfry5~@V8wnfix8hQAXqfS z=FclrBh6!(H*_Qh$*DD770=~*U!B3crr6~^Dr3L%E{Zy;P~Z|)SZq2-u~S0?t9^bL zY9QZdoR=ofF?>ucsm&a@vl%!RvCk|n*@FQTv|bWkAD*9oWBgRb>x7y=mh7WF)asMz zEuVBE{rz*vQHLV6ThVd^>gbS3;e_Oa{-2|@&aD;?v9>CXR=-D?`3>|(V^5+RI0_pW zyyN{6C^ZcHFdY$RiS(zAKJ_~kOdIWA8cX3E>)$#4q>dPOY%BynRwFq!o!;gbq9e;y^|j(AW<%Zo;<#_v2u<)Nh>tY07(3<55+@}96E z(`o%PIOK-HFqwBGAURz0u?BlQMV6gUVYl8#-zQU+o@~^GvMjU?y_!7cnAuP_?(3>{ z&lM@OKDk%_UQ;WwznZD|>1wa&)Slw-Vaq8f8#&h38Fy>+$AMxYi^3E7#n6d66V6kJ ziJAM+#2l02wZ8kh+#g;S5t}ZKd4KAB^Jnbht1$=m92Z|w)#3S&PmkQBXPNiLzC=%O z>N+0uoLH?Jd*NExvN)aKzp(UjvS5wgx-rM^^kj08_OfpN>)}O)#Kh@|1%m#)!nGml z$6A>G{MzDJj`T#X|Ew+FeD%Z~3DfBt#W!wnF@K0NFXEQs&di=Y*p9mR;k5qp;ZKVy z^*78PFP)NJY~!52IydAw2}J%89gMwDaa6?^IM#K-uLA59;B z^zs6@P(#$6gHy$ymh?-5>SA!M1mA)*w&~1D{ncgZm5;@tN>-nQCZ=dzldCbGO%zI( zCO&b`KMDN*)-1QVViL#|)3?sZP_N|_6kgBF%g?x4RCY7|1}*I>40@}sFb~#Pkyn1F zw!ZC3OXI_)mItM`DsLyW-gwmAQ~mHs)(y&&zN&s|&-=kgt&owDftrE#`^SI441$g^sAQ;u0A|wb(Mx8RsIxDdJOkb;QSOq?Z^sr< z^Rqd2Z=Hh4`DY-qgbexKv&sC926hHD0r`SF?!pQ*F?Bi}AO$^ExJmJp1Jy%!!nIBw zlo%Y`Z3|0m}q5s?H1bl3%t;vi7u#I2o}+j z&j&`$z)1V`{;!NrD7~Q(Uxz4^$a}cp3_5VY8axV<=>7Cuhy4B62Fm)}Z{~m>r zsIDs&J#9+9BW%@Kq|mN7=-1j?^J)B4|HT8pNuWGv9#|oNok{6V4(lO4SNg;aOyb-h zoZGqyGweZZpXoDGl!$(^qOk<$5V={a!>=pF()3|B{O3_afLw@=KBuhOfz@u8pnF>H z#T}rX+*V28#VAo(eu|Kq>hKSd61$V7V(;ohOOzs?If)|>4cOM?+ozw9@tzh8iUHFFC7j5U5|^?QkVpYjN7eHtSvlhx8OO2r{eW1B#}zUaU{)1 zn(YVE`PR2Caud2K8t&+H88CEw!t2E2>|7wmWrI6{Vd4>@4RjdK4?`2bRjSKMspu0^ zC3F-M-g3@bd{ApoLY=azh8C3TAh@)qCEXt?aXn9=@tLkDl>`%ZGy^bb=)(=jHP^9H z9)}jwbHjojyI4>j7_5EOZSI5s!X-gYyxkWont zy}Vn4o2cR}^3pe5%~4qP&2f%b$p$_yXfV>IoZpJH+ZCm346MyoioZvCette9EX%{9 zrmo2BInuzz5%slDanvwI+Pfz{eO_Cr8>&0rvn3kNUW5u4H-n;K$;CBa2t2gnR@F1e zo*FHjIK&jE97-c?iH0oMLm|NshUxHuQ#nA43NEy%tiPC|MV7Ys7WC1Dj6jw=Q0WAJ z{HS68qMZ$~rI;aK4w1wSTaQWN_9R*neWEr=pG%0O?g4udD@Cfp!MVF;kWE2dQAMfRb|=w<=PTrfE)mnf8h+YS`i9(G z&ci7|vP~m7<*ll{Kq_^QORshJST$n!Rt@MHoseBx93`BMbm+M!Xt)K2?ttAA4dY^- zb#01K zY)FXP(C5U$qbQt+v576x=NKya59x#Iez|s4DUVlapRRhj?CFAgH#sC$z%}+Tgf`2N z7lI}25r#laSaG7P)RQm4Nc%Mj8vP*r_^$Qc{749dx8pKNodA7~M+WyE#aH1oP^CEc zGRer7p8qq_ZZqH!3GtF5)5r`wg7f4Lxxb=e0^gQsh)ohlXe9I9%1Ou{!p#}?lX-6u zgo?!6GrIgjzj9do6%7qT9bSxpyiKR*QwZPvMHdqZGI!e?MbK%?+vKSjLRZU>Kf(qs z&h9258x#8w?zHQklFr&suY`gue2L?-PWZyKa=bdHi5&6Q=)`lF2#5W$XxuPt;nUsQ z26TAfDBJ1yF(C4PkoLCNxu`r1##?W%P`Et7csaBy)3E?ATC zo7c}9{6YUkUWtA?IsYkq8}vbKOdZ-fc>M#fo;R2lZ#C?GfJs!yqs{C+a_@cXm5%~i zV54m#jef{N78LH}^@ueRr(!~YqqM=rD-Xt|**|u6>n)mAgui))@uwbVM=yzp#);;H z`ek2y)c5CAD3=YZQ;}Y>;<*L=YQ<_sCl^DtHlbf!W;>JU0A9m^tWzb&c%Mdk#o1ob zmzu$hXw#t=)9;xPjr*KDNDpU?v6Cd#F6r&^-26oxB7a*x2(H!=p@aT23#|8A|$)8xSdLqTw{a!d{VC12Oe&G zufrZM-ng20)qWRH`UAgt69yf-Z4?F#1h8h@r%g}`4p?R6c}=X*rcsC|Z5oBFbB~a| zN}y3ljpfXZ?L#RLFh`2AoMiDq1t(!xN75*}m5gnJ*#^UU%bYCF9{{6lQsUwKB>$Q+ z7&ebQhKiF~H?4CwQUoatk5oQY(*;K#CW?i@c z7TMvtcug%1ePe0luCv+o5x;CdD(<)&$Wq>0C zUz4ER7YwI#CT`Z)culazPFsf|hycqAd}r7dVJOElmCYL4tC{=Y2i8P7ec&JkbYEPb+76fbe7^qj!F1o zO>vaG(Q(is43iJ`l+S)$0jwl%wb(Sjho*VSZ3tUZ-W|alLAzk@wLJIy5WUm5!f^0o zFB^k!j}TR|56KC_JxDfbElgr9>V)$i)8>V&en8h{Rf8H4YN8!*dJhRbi_0fJiqS=}l55`Tw5^+ieT)RlRcdisXDBM!XU6 z`x|113ZvoAMRtNZ;ZP#Xb`$i4+x6yYqVmC+Qsof%Rd=XzwbU~m_zq?$9$g-?)ncO_ zWF7B0e34cj8AkAL!(b4<2B8sR+>xS%@N-*I z;p|eQ+0RRI@+4zf#2K5IRjzRLH6(#WB(R$1y9k2bQ0*Fsf8iZC*kse}I!hZaflW5L zd~aUJs|e%=9bb`AHe6&s@&dT@h&}2UhFDCwIaF?TcN);;RPb6u`V$U$MYc$FL_TS~ zEkL+vLN_N!mWR=^Zh{)<1q5=N^)(;^sUhIrW0Nkj)bW9BZs2*FwxmKmkoB2gZtIzD zJIDmWNk|Q^N_V=lxC#n!!oIEZo(sLqm=(Gp(i)2Q23eoy{YPFP>tj9g#Rgwa4e_E^ zeqh%Y~G%1VGovrt}igtqAusjhk@F9#f(fshPq z?``+hKwrROU~N#i6dt}JXf>G(?Snxfo=~2bs4;HjQH#zoXB3_Ug`@XK&}o)RGO=&P z++~k0+`rjfW+sn^KWnK^uQ9XSrT~MBtUG(UHMmHIgru6|9Tv{Fm~9 zCu07mPAEl#ii59wKM>o1^}pMF*#i1A64rd5c16$UACZs|esbQQnhZ3;^!Apu{4$6B zF!r_BI0v%56sUk0C@qQvAQb(-8b6QK^;LdJRN})*cafQqi^r-fN$@g ztI?#)2xW+fzzab>73Bw)3`Cb-(0#A)M;oeRg z=nfnl`P2U?Po)X2o#orF3V+r9R!>!kvAoeA5OD?N&@UqT0`{lRNF2QV1x!c)yXCz& zT zB7_8c^)u*D($8?4d+(HaOAY=+Et*B-r!_BD6|1YNI=Hr+JD%fJk*S>&>}Qkjxt8bQ zJQ(^1{0AExFpdnbV-E)K4hBT$L=+7^aTgCc+hbKukx(jPyVyIh!K7JPr{ zy|%+pRP>N`(r}^Q?O9ZQ1aE#S*I@L=!OEf$FVSFa`S$^-gp+Ma5h-C67jAVIz6(zp zO{xy#9K7$Hl1m%}Y(y_LEcBo4OR`8BW1vRqMek^94Y5=AmDdIg(#tdpE@E8E78Ksv z4yV4ZD~PNZ&3G{KHa%DQQE^XSlJkKHJFe=M1B1SPA-)IlzwG?b+BZ>>RA4vqKHY4D zn%{K2ZaBVguy7}e{bCs5KU7s$qZ}TZp*z8+|8D)`#I>a1pz#kyhleWDgA@L^a(o)x z^*HnUqtUgU?{++>82eCEC+zbye ziik;_)jc!i%${}oG=_JLaEuwVtr``4Jok_*!qJLSmUI#FXxu+$%J|WkN6h?&*TC?f z{??j#Ld-hT7WYxwOR#R>kUrWxey?6gX^W~O1cW$@bZhu$? z>+b38xz^kF@_JfX{qqM6@2D@pM*8)mn*M=@-9xioWAI-1@^a70BJ6GX(Ad}<^!w81 zkDq?AV84S>_E#L*rR|FB-*9fRK6{_MCVk<2F7`}|AA4Q-#O-k;vQNx3dxzwYNH03BH&4m6pmP{~wlz@KuD~KyRql0;e)fIe;l@dw z9R7^=N5z7d9@9>4?DL!FUl}O=>|{>GVHEYQuo2Sku0-nc{hXkud>lXNw?-f7_j~@n z7^--(;o|r5&i(Bd?7Rx~rm{zKUEQ8~MgHg7MAap~J^^$P=4PVb|6U%2YJ!F(Bw7k|C8*ctMDPC`vf9ujGI zV##(H=_M)}I`N^u@J^z%>rVpRJFa{$0Z&1K5YQd}V*J9Z2Xx^Fjl|&gInQ_P+VBkv2`o( zO!Q>gRTp<0BuTmhaxRwZF#GR{qt%;|XYiYUkmo~34p-)RvZX}Ndy9j|I8wLZpu#8R zI0Tl#a&zh1ck*ebN0i%qQHZPn)8|K37n7vimJiKd#@o0FsJWBg`7ec^%7$#m$rksw z;^d@gWjfU(SbRnJEqrUmvGSi4$3!Gdk7mGYf+YhY7T<7j$TNZvxVWv(K4V@iq20Y9 z;;}+|?cG!Zq_~T$0UX&)T}==^;Xa8FwDMg>>=Zl4c|JJcmU_D|u8npOT^G~7Bd&l(|(l4x9%43$V#K?S<%ThA0#idDIZbryIkB)`~>1RutR?gqs;HjmTL43o%T#- zLYlb#4mis4ulnaJRJeF%IWaKcfMeUJPw)R6aBM8u;azb0Im3|OH8J1H)UEnoI2iYA z*n?K=qIW^A=AQw__ydTZm5B@Ty~brL?xLT#CR;|UM@}R8HA&!+>a7bh^6$Ze(RmTd zYRs$?z3?F&*|*e(K^dk%R?&j_KR+;4Vh zT-qFQBszaTnSJ=qc$I}svNYPqblzp*^r~%h#F6g5Hr>ugmA}{0 zJ!{OBDv)MDtCs*zN9X^N7(0=zxN_~2uV*EAM24o_n*S0Z+J@n{j&3_X>(Bk^g-A=w zE!CoTALE6dIs-_0B}xph{i-J~SnL*bOA4gpH#916Z5~%cZd}fCr)QYaoEjqOJ>XtpS#^wTe)i#PqJPyc@dX;N!vo57 z0#6}oG1Hbu7Ieq&87X*^WRSQH;i_;;2hXqYRTACYA%fj{z`at>?c{5Or{Z(ozNK<) zk9ICGEQdr3gsWf#F4arD->^smpV5*fpJ3whI51ETlFW|QA+n-OJGXycT=_%l8|cdp zf5ana5iNQn+w9Y|^DiAkBOvx)CPTm|83B92DtnbPc~KaQlIfv}_hGWqQrNg(ju+xi zg92XBpMGg70p4^%rcvmHA&*4i!!E_jBj;X1CHhnBzBH1yn`G9W%_jLs1O=^#NrpbO zJauU=>df6|b$o3UYB;NZryj(0*GIB{_eY5T$3(>QAN+@ZEnha2^nr^=q4T>fD(*X? zlXmSU37%sKNX0V{?o8(Wvo!Ki7zx5olGL!FI?L-$5LP9`+ia)IUf2DYg+VAlpJ&Nzfm&PluuLJ z$2boX_4Hn`z!OurmR38j8EH!BpC*}Se>uCOByq*P0GcWUk+V@w*lLooXUt!cxGy?B zJwYp&TH@o;Ib572_idXu@&5#z+#z(2^?H06pX z2w3fkBI#zT(=Ch*MY;oxJZz!M<1$1B&iwH~4`Gl+9fC&kDZ3=v_KmG`3b*xDEx2Yf zDRK-0p;B~$5@xb&$L=lKGl3iPg^Ir(X*ib(Y^}`3E2N0Yl_> zH4_O|pw+^_gEJB8 zbT@8+U#hPj#C)xf!*F|7-v1o^`Nw4LpC$ifn$_LwzYk1fPy(L~_z2XqsinacMM9^= zD{mv0b$2s&*=Q!;{jUzFmPCx*(gDwVg*$j{>VW6HHg&+orkIZ=TPI`C6qz=}oSpvD z+2hMHD#4rWH0lHU%)KI{>>@38RXo>}6~kfeJ|$oCE(g0>@k79dYn#ElRprN@KI7 z!c9#AEd?h=_P{He{51j@9O)M5EhCVSu1MDgg+R7b;#rS72AV93)-5Bj12h5&>4)g? z4urUVj&!94O99-eaL@>}A&Y2{*S%xxO#mB+MsPAL^j}_x{%ZuX4nZ~$ehk2+Ea>cc z)m_*tV0WA`n4r&~9>)SF@xVv13?~}|_z2Us!E!Xw@OQI`JM}6~E9!ig;^&)Iq;8Mx z;#kHk`2iDryHl&qr=gtIa5>cRLrpraC-6z&-SU9hK%UBjNhFm z(@B?v#mMJyfWIA1I3Wn34ak6(V$hV}DggS{-jE&FJ-Gy~H_|=i(Ye8=H;usBeLB_{ji`;V zKPaL*Iy_@7^0dtf&$wKBd`6~OzSCxOd_+G7C|->8Nx9@i(+&oWK*BjKOm2`Fz$uIK)saSm&+L*w3;E&}7xsDbZ&FAzMdc_6{Sy zmV=je;3vT&F*K6kG(4|0^q~B$eW&-4;Hbkm>whjp+XTsB%2=8dfi;9o6?{ns;nx-1 zxt3^<98DAgOn(yga0Gr0MezJ@FHkN2>S2eNE8M%bA z*)2njQebGGWFTu$CGPYH8W-xF#9mLTD&PT)_1P@|2FSQbJiYqq7BM^(nV(x_c+sZj zdc>u@H7LbGI7=S%_wvrrP%(6*20nrpTP1^oX80uKep5e#%~t9zn#e~*GGr|c53LF* zI|#F(+Z&D>Gel4gtnCE?6Z6#;+SEWbkX{Wwm3^`mh5O=K&L2OmgGQv-A+axzsxMkH zogzXi;&WvYXVEA>=AF@fbqBOiCFY0F!KO-!L~zFOVa)?u5E+sj1>^2M1(6}W`jucz z)_l!*bnL4dtrG4#UKrSodB~<0h^gucvx3h6A5PzBdSLHm`2X;L#k!*y-TmL<>dBMqe77Vhr~|sYvT9)!#Fpa%S2G zAiti_1~>nwo`^AE#SwX5M*e;foq~`bf;UXS^Fra)|BO6<-hT z`-29`xiDQCLL6a-rEP&kbIPHOkP~vjB zhTfY2A?X19-X35?ay+w7$jb*9h)iyTr2oC%$U^1*Z)k|3Fwp@#P-zzrM4<(+uZCyX zZ3MA;Rq_z@&f`s2@L@cFBEx5G0#S`AIF05d}m)`J6hoqSX<;-;37aX&_{xxG+H2{5*iYijH9 z8tOS8D))3EtGhSb7x6qb=}Gekc?Y5#UmX)adRPz*X&4P^Iz&ZhLY=~cyc$ECrSIrB zm3XDRK3e(O3H{ooG3XNVm0~Z{6w?D&Bkc6kv-4V#nsPF*I>jytLF3wlUfbv-1%glF zedh!iSLUF-W$vs^GhQLmwlT?@pWw?pp0o1i;+yf*nsG1YR~PJa%Z8!fagnQ1sM6riXPQP!dH^;T;Ot$~dkME!KLrrz-Og#|#g8*hnG?RhLqn(!D($nqs zQ_plJTWTg_cP1Y_$*=RCYD<|O_nrzDn0hb>yEC2L*B?KuQ%CkLte=SIX0LC5lgVv1 zK{XG_|1A#`iap=H_R$&d4+$hG6d$d8SNMBk&KMUd{g%*DW{sZ#&6M2`8RxSNK|Psa z*_gpM!XKP|$JbQCGn2hulk|~pUr1ShTgOsRjR54%bJCpkwAR@X^TJos1xrsRXIN&s zhiSE*(`H_c6W-HP9Mj7585PkQTJHQi&)k`d(^EQAW@Zb$)AQ{$b4Ofc`JwOJ1n#6c%oeV%2)8e9 zo3Gq!pUn~(kD|X{&0i?mSp6})YQs0XU-bR4BXe~HYt_25Uc>%j-fQBz6)M@U4={gd ziChD5&eH9%`$lfv$j{*HEf_CWSOfWBkuyR6?{VP&hsng2mg=(BrxYeI7}nK8?CBrq zt$b9{K_&OV#$LVZdNu%o3=TAc?t<_2zqq-uGyt1i`>;N_x-s24*xCQ=_3Q4T(ywp6 zf+6fs6*Q675(7u@PQ_bHsV6MeDR?G)6l`$(MZR!3_~V=^fsHH1EX$J5C}4j|Qn>N( z^fRAs)t0L)zRn#f5+_*=;V;tE9F?RZ?Z!u4EIkdp5051gK}^vfkVX-k6m(bS>^YC^ zzU_RQoAooRys$Xgdx1^YVW7U+yu%&X<*Ux{wus^4)Lzl1__(yex2vqZK|YtN z2*YU#Ui|gGoh7CZj!$k!6IfImzg#X;d`wv0k1E&2+O2==urT0GUvF&YNq{ z@dlPnJrt0+ngQ>x?UOE}KWY8)+rcZag?jUvXz zL)}5K>_;WDI~>g;Wk#?5n>ixXgYe;s@T$d(eH$x_nPA2!;?1LsQN-#az$jwdcelKa zu^`I6fDd{I5!dij3A~;c`720TvZ^xyo*X<=P=W3N3GaTX+vSW=L_|SYo@}#3`oghpiQ44@!*Q*kckE4hei9 zcgt>P?Ac>}{l^~jZ|(@Va5PT=xnnUsQr3v$81}`rXQoKdMjAreF^=Dvp{`c3y$1TX zjXY#Q^*hY2?ny1aVHv$mfu0A=c2dzmsz|wlIUCE*qXzKB%90sbyyj7>mApge#K{6G zNUR;Z>4!_lA4q44$GzUg6TKLXWbTT}(vgR(_4XGk|6N9e>Ox1Gczx7si-W|wfMrC# z080FSml2I_Sbxaz6d*-$h6*%mipRD8yNrlM$jUh}7v0T)3aQR~$!9pkqoQBh@C;B1fYc%I)mF^HI8VF$O(pw_WK2sQ7P5Wu z79#T}us^vetuNA}#;0!vzfNiWz32;580UK``sV3hUv34YvfUMM*aUZQa9-2I0Gnx) z7&dirn*&xEe05@RpG-SggaR(ERqf~@t(82qPjUPTk_3RF^r%$lmb{An;ABtP?d z2o%RhJA)k@=wLQN$1rDfuzlEnrN!Z~@ym-AuDYOTScT0=(GMWVj~B%mL9Q`H8fj3; zrYj$Z#vdGmqf(lxz{n{&a~q9ev(A!W&fC-pvd6NSg=Y^s0l1jCFVXvv1B{(4c5*=4 zS|RibX_r~Vry2}h5g1%iQV})B7<0$4eOhj1Q{UQcCvPVXu)A(19lIg0|I&NNdzQ}- zLN&T0zCntoQ`TDPToGxvolLp?J$C`+GOi?~ua_-{Jj_`T!X%od7+VoAA^Rwa;C=m3 z?(497Fj)#{tlQgEYDh})eVGMc2Lv#3&G?mf~>vTJt_+8zb5ofR|W^Eyy)<=2XF!u$VhBhs1n{Q#9A6lBzD z)XqN+2@GY7BaU>P=h^sB{;|Y{J;ua}x9Kh{B24;R_Jo#eOg-#=h%rbWdm+n*n=tvy zQ|{jKg*STSvIjRhy@rxc2Mnb8xb2Q3TJMe{A`>8?ru8j96brgO@Uc5xRg%1cP>xFU212ubJ>GlA#sN8c@ zWwqU9MFe0LLGRYr*pBljf-o5PVcs!#?sysZ#$*MZVY8;dj6)_fV1kzS2p2Uiu3kxp zT-pESNxBOjWJm_fswA_q$mo|8h!I$soj~2y0JV3NeYMlfRRm-VdYp|gn(lzex{isK zO3!hcWrdpHJJ!RuNr|ew%Bq-Xe$!K<#hfWHKlcM*ia6Y;Lyy^$D<&L$6(-*95zPB#q&%P$x8GMGi)#RQG*)Mth3 zA_p)?ZYIDh^R`WR&nr`O_9Qc!=^G89v#rNM>-Mj*cOyvMbq`9=@btb+h~-A7L1Q>o zSc+-!iU;)Cz$W?`vow=Zdf5i(D+Vmb76Os_=E!vdZrt;l94}J+woL6w<(e05`SQT2 zOKUp!nY|*`E+az!H?v4sd0oOPj+n{PD`)w6;csSfe+s}Xicc~dtABCATl4pa+WOyL zuS8wiNWO!CngA=P-J5V_YzK$ari+UjE8%e50?33G?5IbA>JY@)L$M+JO=Jk0r1q>B zxuY~qMePRM8uT`UT`(yQ93fd2ldL?1g`-`ylPqtKT z-cZmtJDaJ^3vNIriH0kW7qB-y*AaOA^-}$O+fFTjFJgUv&IJRLiOav{M4pByiXHqe zsRd+`V&6J4!!{q6{itDhWk?+y?#zD)^&Cu47Z!YVkiXP1;>7oDV==G@I##grOw{yp z`?sOSn5{yt2!>bYrCP)*H9Q38$4LcoppDTqnBOLRTP@Oi6CPp-H=#wcBAMK5LIj(l z1rwuzPM4HH)FIobrt+v?JK@g~!oG0h{Gq0=-2Ctfo=50-@OLX17K!kn;eq}jmJIVO z@y=KdySp4FMudsEM~S;fNi#=01E?er%&=Z7+Qvtn2no!Ds9U=DoV3bpI1%L^`?)vP zf);oXrL*8-`%h^(Ei>|Myt9vGm`Ng`_YDD;80NbP)4zIAni@kSFiOh=+r-moLxTlJ z!ILUcfMsU4v`p+(tu#8h*IAA?NmR%B*FyAx&T^wo!cJzw*93Uqs{|QTTmrC;NKV>I zD249^WF9vhJ`Za>lvG>dJrM+%-t8=tcRS1DK|vnDIzVSx(jd8e=VoAqPL8wHIV12` zFiwh`LVsYJ*wd6EM?MktEm-iC)&&e4OS~SVLP&QzDN9c2c2Atd-Bi19fo7!xM3lfl zqBwKRtj$qsV%Xdcte+bF>3&JzeaSR}FG4M0G`e-tM_{R1`LIo=N?0E!ukff5P)15nIhJgroaG$Bxh zE>`n6@LpD#ke&5UR(WSjE3p68d3@$q2G^K=awU=0U=9S8H9$~_yz8?URD!a{RkLl5 zn}fgKYROFS0cpNS(!?xS$GK&k$7TUsBcUSy66tt93>qj9=}n6=$LeZe&TCPjSQG-N z4z|9BFhLmWh@Iav0P(gt^#+hre#2e3BtXm)$S>N0-BwirxW@DG`EUF4fshi(iarC< z-r|e&Ajf*3qMS+a>mbC7?*+QJ3*B4!*5s`3l|b1DateJiCj(|emx(Dcfxoz@9?oo} zNCrEAV9`C`iR^qUaz;E$5%NdQlSi>eZ{dFUA`?Nx%%Xh&4VLp*-T{<8bq)9fZ?Y|CI#{2K&?jpp7;ESz-vQ!E{i@^KZ?)zT(OS&WzMBOflhiF` zi?12n%T~_=@We~B_=~dehd^9O%CfI0f~sp?X2slBj@%+S2xP~xhN zFBNhK0|CmuE@+stDOjCcY3-gEumeq~gcul9(XGh@$zz)83+gq7unVNhSlh&~od9EE z(EpfBq*at%3eRbb%KQ!wBO^lbh-+B5n;3#e0v2N&9NL&88TyGGe0zv@* zLa~_N-y%LvsJLz#W*)1J2lf(4fA$guCm%*oA6g03310Tl6N;bZ^LGL$PHLT!5G;7~ z1TF@KkO6z0gLoZ+00s?p(3OCTk%DjY+(AiPY!9zyS$Z_ZhYvO~ip(VXLr0K4&}6py zXDo5kH{f)XC(@t8AlRG=(W62$C!s(c71+g=%zVsn!Pa6%lNr?Zd!jJD9xgGN_gn^O!TaOhKr}FMBR6z4 zE#bgqBJ&F9fEeJLVFKH_JFLJ$EF+CQB14D|3Px3o*31FJ^IlqM^(7KWD+LE(!%Kyk ziBB_uw375tG8X=vKN0{Oy=ZOE!{RiM(B<>+>oml5F)%ak$|@=!oBf`tCqpq;gn?q zI7c}A!vQ=aw4^*yz~LOa@%K+h3FO4iF2jT5RIl2eS8Hf@%!GdW87Ui%pnreXHCbr1 z*~)NQV~av)c>v?+r42v(y{8Y6?nYuvIvz$D1DIoAF2X?D_!KalxP}ir9Rt>g4An$% z!L4nCne2!UjPTLv<()yB*8$A&U|7GHCnB8O?`3)Pgis97X!Zi?%$wJ}K0E-@ZootX z%skql{eV(4M;1aA9T5;gU@Ww{et2WeDa!h@$H&AERxD25uc>~Df zPb6m#Af2HE6_kfggbsTL2aB%1NdHW?I&)mgBTV5$@8gs5@ZR9DlwN3PW^nR)&`}J8 z$T5LTkyOS&&Mda`pkJJQc>XV82=k+0ug36+0YY8STZ52&k(*M09w#cR4&K zAw1tW^zrch8*Y3VL02W(`7!p$6ekj@Hz8Ce@h$tKDN|HXnMjI~X2QL`yYb%d zas+0+4d3l{o3RTaWQWvAO2BQAZ+kNdi#2JiK2f90wBJp%FHhbDRD}IT#7JHp&TLL= zb}RDU?EY+1#FyN~C)=*o)DcMcC^Z#~maXlOPc5C5Yge$Cld0`U2y$P_EL~cD%W}2r zw{4L`6WosscT{heahN+ExuCQ$x5(FiOt<~0!<-_0PSs&fu&wk0{gH`BslZ6KY*O|} zb_1Kx5`lf`%8w=&MIx}5sIR+pY8+;ViOJQNF>`-M4~4SzSLQx zAKfI;)ijHO9E7RU5)6HNI{X-`1^+ib4OA?^hYi}+<5;&bSb{z{k%oN z!^jWT1sg@2YX>*Fb#*ru+i70(d+VaB>UIlj1sf|H8{b7g-WQ$COwB$#xH?Z?`%tic zC3(|BF>0B<2tKhns!pSR+sxtIoacOx4qM*;?o(*Na;gt5$G=`4V5grnJ-0pfYR#rq4lsiE@hY7zkUQ><(faCbcVnegXPeDh z;lk6iT;p*+9>^~=dOqFo8ax^s-<2p3G%__>ceUfZ(wX6*N5?UbYnkrQ`K%1!FAGkr zN;Uh{dpwUhd*bV*%ik7;b*|gln=CR*8Q7>KyKo`5PJPl9hG zpkj7l|E*R^{Jhz~nJ6&>on{EAdz5D$bMFbLF>V_TY-q~#MkTg@RV_24 zEEY6yqv><2*K(Kh+M%#zrXpwTZdeGOnD99l8*9~|l2xDQIEWA)c~|eY<|pu7PA0o5!7S~K#Oblc^hg0Xz_(PVSnpo z80V%)L4}OEFggWOd^Lt4QaNy-aEaZ-U`+}YppV6j10oew2O8X>Pal4}sdc(p>GB(( zbsB+cL`Gr=g++%v!UGQZO}O5`=iqny%}tj6$0V`RoDDfNS0?T!{wqVGbBNn@7| ziQXpl>U{p>bB1A3p$d;-`cDwGBm-oefh9xAjk)6hJ-Zwk^pfMPG^UC}^CVMn^U$+Q6_1Y-~)_(C7UM|+tD`RMc0#=62k_hHz76Wl^7PrXcSOkm` zt-ukzOhj_GtNzRM(O(pEarC*gx87`<;kQp+T%{jm?I0mgcaN}HQ$QeGL!1IW<{o3o z5H0SniD8&jdX&a!;_z{_0I{!|m7N4JH;mz%LLp9v=#@e?JwU5VXIfqKNCe4Sr}B@T zuI^C@R|dkuHdYWgW7a53A@+?7?E*a9+sY@<_?Rmu{>$xAc+9I3Zd6zaBP+Crp+T&2 z59O&eCf|v7xDSsyg~QM0-AXwEfr`cOSk4;RnV|RiY(vGZDEA?oE<7`uoLuQ0m&RA| zUJz2R_V@~?sBLY^S5)I{5dLwX0oW<2Wc+Xq6)w+@LB(o}1OWYJHGRC-GmHeI-wZ~A zIDzehJqLB{&m5L$I%r7jn%ZZ)O&3-ISzK3X4oIjUcb)i5VpgXMkrEe$hPbEHxMuR1 zK%$lsCx$vahu7a%V6eLq>X0#ky|8fB=pPC7>@9wy>ti=5OwS^htzpA+NkGAwKMm7; z=#PXN(3hH0l!WcvEz0`41z;2~w<#c@2C_ohT?H~DE0oCwykV|mUgXZdD&CVQ9a+p( zUM_MsaQ{0i?0iGL4rGN433aIaxu`!9>d%l}33Z4?VAUG@p03Roofk(|W%)V}iLF&g1M5ZoRnc8>l0OJ+M}b-r}WvgcK;=VE|Kg*TEQs&4Ww zD)a&u{{|4`|C+NpynXj&${L`d89;S^W{H`Ik?C7quqNK+Auai8m%jz0)V_7-QDPOx z^Vp8`g1Li6pvectS+u!Y25QjTikKpVaBp4BNr&AfL+8Ynv3`7f)g2}$a~<5{N1_cP zGLEax$k_2`KK{Aoc`OD>p%a6OK`O!>Oq`qFdf9$|l6^Tj01O!l&ro*SdjWn?W~A%( z2{HXNkKc=gTWF{zK3>)8_a~xp?AWtZSh2t3y4OK1fieuZsmp$YgwUxKq2l3|NM?sb z1EC-Ec-0DBE+4f19KbKe_Wt1)ks*CsBA=a`w3obfgB}`BUl%D9V_%H)OueE3lc6~C z(8$5DJ%DGK)p|oYpD<-Ol>Th zD?PGo2v5+i7yW5L^*xAIBb@vfVN^86g=RSTAcHV!k>?X4dk{fDIJhzjEYAGPFV0Ko zJ`Fs*3h;|Wgg3x1Qm*fdb>8|fzc~Ikzj)3#`fPa!#yHS@6Ykm&EkpIQ*&Q`h-y1a~ zo_=q1e(t5}1+l{b#Tc65rbaPlP>jep2E~YXgJ)uK0L4g>Pvc9tZ9{m1Kxn2b9zmh~ z)UHcW6D(z7+{P2+C>qjez0YwPhk#u}l9xEtzw)rQHVGVI8!s`Q;BITay=@${r=hlt zq^L!=@4(y^!3Q4^I8oQ-FiEnONg1}_JfQT9yxw7juKv69+}Inhi-$Z=k4bY+sx&m0 zNLRyR2-Y@)lPmCjCU6%q*_F@AM^Ji=rQq>I2FpkX<_#yez_MfwfZw~Idd2ywmKxry z&7Db2OzmqayQDE;$s#Z88Z`tq^sGPL8WTTE=IG(H*xAcFuz@&XCAM>KAY|4lTa&EKf% ze?4Hl-!%DrSetWM5t(N4bdF{+~!@!ZIn^xr^<6BZL4Jw!|Fxc?CsVN<% zcr8mDmvsq*a)Uu_z5_OCc^$Oj{`c0F-0rqU%!?n~1gF++1LB*OpE86YmawT$yXyM+n_zGFckS7Gm+ zll9REeQd7E7wB3ugK_+LB+p?!c)K|?3W3MA(sBroU+$dHjx8Ine0b^5(;n?vp#$*3ST!;>`tO~KmlzHyLbU?i3hON3ThUnZ6 z6IF}iONce2X)2O{6@6TIIh=SgFx;&;!ll@Svca|T5`d^_TzM5fJ0VSwc$y-T# z(@O{7Uc@Q@Pn?oPgpy!bX)x=G*l~=XSQAtescMDJ^8h7>2Nyb>gL`JwN&u-L{=wb| zVqZ&j1i2dgv%2q;^MGyM8=JtjRL(!LMSo7LhE)e$R7AsM zmT=eI^S(~l0KwICvldoF`FNwNvYk&HEe@A*G3U+7dxXsN|fh146@k1iUXfpAj0; z9#qXv}@!%^xjE{AfWnE=l5z-Gwd$59SQTonQr zoe9W7ngQ3!n^EJWy=FA(OfukF!B^W+T`Nsv%TLDwu9ZI41SiscUsRPBr7W{s}0v1BYDhEUp6k-_me#scEq+`6lF%~6?kSC3mWnc$Dvb!8MokCs1T z(jo`QlYyjAyBfxn1hc3513@9)uFRBzjm?8<_QJxjFjGw8MQu5&RzC_be@KF92Kz00 zh#x~il!^VvsL})QC+go12~n6NU6`&9A@tbcRn-G}yM~qhz}{ur5&R)0=q88@FT(U% zmTOb}m>2}$BPCGRrNzoQ^&8^VuV?xD8Dnb6byx+qzP?Tv{UX&E?8T(ADW*c{(IO4} z(~lm;|GR>icT-s%QDuvSaEmbkVd1#nbEe0GdwHRq1ccoU@@wk(UQ7DP;pjpS|GLpi zXSE>9t?LIi{W&soZ~*B@e4apj&hS*D`m_?t?6D!%6lmz^m^U(QDbDlNueQC>PuCs_o6EVH`>fY9NY)<(2&-vR=7qR-hmUxt z+@G@!JIX%Hd+xENd4&@uK-=x5Oz?G0^VeRNUe^`(+LK-{yVab1Q>j|s>)h*kPOXm% z3=yLC_r}1OcIcIN<%jXYud>{t4Zq!b_U1JxWSpQAa&s7}nOxSn^GY-Mx|jl16%jPX zT0ebl{6a(L?1@brYvbkADDOY>Jc8i7Up1U>ga zqFWxgy`fv6{#nu_B$B2lL__G(j8>j{q9=0{CSuLU^Qz?0<2iy3Zv|#ZP5G0*Q{XQ| zX2}ubg>=@cY`57H7sqw`=jaL(jq9^@zh_e#r#vkSe-BTdXrBG``(4iy8r&hTG5P+t z);9arsov(Pt;&T@H47HC4L#m@Dx$Q@o^=+wg`4@)AD%4Qjm&IKw+-6QJGM9Itt}i- zU%dSW?unnW)h#x&n4S??w%=Hk$Y~(SEZ#PrGZ>!~0-DOH3ujUnzpYOZ+GpO>On)3+ zVzQ`}xekc-xv!Iz2ELb?aTl+mV7O_abzmS!>jI(f)bO)wyutOQjnMb*x{-2`t2Np4>56Nx)b~lEYwh#}Fz4cVhniyVS#8nzv$eEf zhYyzkM8DBuo?bJb*1nv!F*n4StgE|ztYCg{l9pt&s_znsvdEWdWa!4WGGr zi;aHz#&*H1ki+;{j}6k3j}8&5B{gf~Gjo55Za{t4HClqe!6Cry8j$#RD3lch0?7kU zkTdWAA?SG6pJ%DRK7}$z$OJ+0{6zf9+m3)Ygw|Ob`1b4qA9&oR> zDhBdB+Gwu5dgnUw64qd%?$pPTuBO*V8k0VMK76+_*q72CesJ!>6i#XWDJs3rIq5+B z`2D5PCsOxqlxfe5&$BhOwbXeIrHUWh$iu8m74GD542Au;|Ng1-u~yNMw_<)zC^v-M z@(&o@oEANk^PxxU`%F*Pqo*T^zi^8)`i{YhKf^Ib?=Z_V!taDMzVj=0w=U~yfBZb( z<2Xdplh9rIeEjSZ|1pFx#ma2Bl!JMr3E}h#7;DvA;9TS6a{PiME%nn7h zgd`*>>=Z;vA6 zgHfN9`CZbrJuqWV+ihFc$^HG0JD5y`uQB8*jtio~t1?m-`Bu~QID7z}u`CbZ8JSq# zYPj49JBllJz2t|>xueGL21wb|5+TAFW+>VOHjlU|(M ze-evA{);nGEU0I@;)F)XSE7D^x})I?oUt2CH~D$8ewSxl46=iBBQlRi^NKX~m+|JE zQ?3!H$vA1SKO}vs>|hx7wxPheirq>z?HJc($$fMAtXx7XF8b9(Fq^)Wa`#IEOxwzs zl@hBP-*II4?UZ@z>-~B;Xnod*TY*SXTXDcYkz1o* zY)bXyotmR<;b?}C z2kMo!SSD%IYFN%^ecn=<<`MOdaQa)Jm9a)$>I+ch2bR>k7z~8h#LJJHfiL1Ue(MZI z5$DsVNSG61Xz%kH{2k0DlqW}Vjy5%2ubvW2)aqDyd7iy`fNiPuvUG3QP z?Dn4^cXNU&O*_TU9OU_G{F!zQdwjXh)4QR+3wX6L& zotkghDXk|kK%IC2=E31FSzZ(8dH7k0ZT=RE2|h+omWsP2dG(O;vi!3m5bP=x%xQ#W zVv{HN<_l*XU2ZmWRehPQ3+VvPi4ylLSxqHoxdk(l&j$vQ54uJb&suJ&M=wtLRqR;cnr(|$Q zU7b7hwv$)>*}elSGCC)k+t2L3o0>0i6Lf+oV{`QMvBTgQ>7vsam7k5ZD!TOcf7tsAnj2blv-+AsK z%yRRUD9sZ7Ucmyvj=^&t_#P)J<_vem%?rz+@SM~=w@Ub8Tq!4s%=FF9R4+5m`eE;> z^XG0~Valac*P_93FbeD7=DnE=alZpH@{j|))k?zRB15ETfx{JMLZq*EELPSt8H%z)8>9gkD7@Y zgjo2c&k+y{qCdWn&8ShYe3jxlpvrzlzxdeNC7XlcD7`8>>goP2FpuE(&Sh<;ge^2p z07PT5|J)_KU+rDpQ8{?}CZ13GqN=2d9;O9?EJmiOi0!0$4JeK3sBZPJDEJXvgN!mhJcDLYIfe>)*${vH17-Nf z)Uxh7ZAz9L-9x>;xym$-H3H$3QFy%i&73RtdzF<8Fe>4J-M_VhC)#GwxjuoZt z2~`FiRGGcdB^+n(Rsr)IsVb7i(Qm{M30=nux2g^P5vpLE+1;98nkXEX>I|VYBi;8P z3e0CT0+X^6eE0pe3Ud&JkRd(GY%KGV@*T1zIWD|(+&5(KA(c?GaWQV<^(^O?@O7QS zM=)D5aFc-=r|2#o=&+K#tlKyiewnr^b4G(1N8PTyJi9gp^r5rKHFdsgYxW=YSL^Wv z$-kz?LRB^6FOnb%q-Y0s97Oo*h-#1=ooC_5y8!!%Hi#7MiG#C=HgMR$DXZkOnKtUb z%^krVHS^i(r_oI74uv^JQBA93~(6V$VGIZG6>50qJaF+)TaetV4Gom{M+zl1LYF^1SUy0aWCC7iGu2C} zU{w>cnl>Ca7#|o7NS$e6A-!R1yKMKUxMZ6Hh+98wY?EB!4MM~JP8r)L5W0u3)|iw<%1=Bwvlv2L7nQs za-dLYJcD7hvW+`UMzb0^OdBejKRTQWhMDqcnk|}Xk)bx2IIBd+_a3!1pkj>QHGzBXg!{cQPdX3t z?eq~7Gxd6WW~~b%D|X|qdt6;&($D&{rBF=(XAE`^TMG{JMkkl`1y^Q8()}^;)J4LM z8knU4JXir9Xu2td(FTylH$fKi&N|r*YBp~yPSr!!Vj(N;alK79pO>CFt)huV!+p`o z*VPH`GuGEI#J zUjy3Lq}xi!L>p}U0gc=8q%-?4HpPt4GK3Eoz3E2KO@v>eoKBu6M)a9$qW*-IR)2?< zGRM--5D`vPXo9~*61VC>%QUI?kn5XpHA_{?KT4J~*T2!m9|YgiV`nq!aquJ@uStTB zrIHU)0l7%*FW28i8|h%T?2LaROUFm*7X%Q#Kx9e8e)oqsyvLgv!Hef10N$7a;EkJU zXa3-gnc1qDB7vsh{;=!c;C${xAmz-A)sGGEHr9Z-0aa{t+>=U}?7Z#m33wV~m{CiE zbOyj1JuE}5C$dND0sywLl;!T}ggmiEh!!YCB<@baa+sbi(VznEY-!DQ4{`<>+&Yo_ z6!;#Ig@apAK=HgB9AV}f%G~b^oq*e0S`j7ktjQS@mH9uqA*aZC_8G7fiSSZfq&GIR zeHqsE$WopRJA-jnr{uPo!pyE^d=eV{lpE2qB{|F~h;aU@sANP_;3j8Y4_a89}{QwPg z0DV|pEzY_RIzA6x4Jlkj6fFuO&bpPvswXOA1OL}xu<)U7N-m&@Tio)0Z^5I$(tqJI+4K}+S>`#L5HO6LR-9O1>hfxYj2;ohw4y8a3@%tZ=iLs`@Ln-h>$cO_- z?798eLnMPKXS(+3%b{GX4e@L6!T<=_xLW0U1CUDsAUOv4fMwVJoH>|3HDTyUdN4L# z(!TtdQ!7S13sM%=VvlLW2}N*_YJf~~q9x>1SrSoUqc(He$CFiD)6;`;+L z@}R=@ftUi359~JGr$Zo9rsq-yV4qGY{YnliQ}gvgw}?0Sm7Q*J+>Iqe23y{;M&y>e zu{_gv!M0k4hBoCQFg>9iT4Ai%r+r$@fQ&_%`N<2mCji3uDHPtalhd5Z7~=Goi+ShS zVuON5BH<59LpZUFeb5QkrYL6U`ss(BLXS#u5i+6p3w&)xVsKN^+3$3r2f@^Q#p>p% zYtW3{L{iEl6vF6UcU|2~EBzjb7G^kE_E#GK0Hb#+g8M_l+GY6T){@p`QgiR)O}W5Y z=`bf^>nT*EP5ILxq%S}(e%0*RVF+1zaKy+EN|+xOt}9gYLJ+PcU-QBPHWCV(TnJZ1 z;Z?~YS_I2Z2%<%+@9|(Op$!pX!vn&lrRo=)QRZ%=DVSDfN+( zjlVHT;d31VaIi#agH^E|W}A(zS!gs8W>MZ>^sE19u(ZTc2}ED0Up7<3ScU0!UpTr4 zgBt2G>j5A|t~&y-1aU#J-S`m&f?%BJ5YX@$Wr%fVBj3dKdeyKmA;%&*q1ny!tQ{VNp5Q#-BEKF{kgE9VobRz25JgA1P?SF%`$6r9>G zJ3n`E_VDmDuh7gFr-#iuBq=%xp8D?lk%i#Ow>8rv!u)G^m6hJkY_TMvID?|E>gLRvTdd~RF8xed+YDR2II;$hoFDqV=1bZLy9-}T z6@4VTG27>`d?)hZkj1lW+hMc;2aD19uS3T9dV zu>PS;;r=JxjoE7-zxqT+3@p$#K0+USylwIEubFbzr<+?N3(m5e{Tv_R2R|Noe#fMC zGehwIk~cE{2W3o2y+ype>ru(f%FfA+V<{*kkVtu@u?05^E357Ua)s>58zuSoV`>}k z3$;`WJxpzH>PYA)Z0YIk>tX4CQl0py`$c=%=-^Plu<-cX;g|KJ{gnf+p3N^#Obx9} z^nMU}TwcVy(6jMox^d^t+Sk`YYwP2~5}6+hpMpSCKvMEc{!PgVt}U+wAgJ}8o*1s@UXOW?R@5s>uI*(~yy zndc8z4m+T#-*5kj#>?>zbbg1NQ^dS4w>&ge9k|F(H1SETjz z7<*UU)w|a|=}%?1)GrRCTpzMXy~ z4S$MfeC$u%xy>Yjm%H?_us^p&#rSzkN06h(%qt_o1cYP<38*{Mm3w2tur{&yAFv6w zGw@fSs{&V?E2TtC%|N3m4K-4Q-l&S+j#~%}%3+_%RAXi+-`kR5_Q>#u&v=7;W}or- ze-IZAnR>-bR75%Nd6#AWc$X=_#kukr1i|8tpl^WV$$d+=|Cw0)unHCV!BkaXE47O#O0spATv6Xe6!)#xyP(d-Uf%DnynaK` zqezN}n4fvpj@sfKJb^ww|DUpfO1($_$K+$-^OLbw2Z3^<8rz} z9C!Y_?AEKI8<7oRFY_ahg&iHI#H`W#TCklgirP9_C5;DbTm~$+6}CGrE}=S^CCwb- z`9jko+-iS5Xj6W`=rUJZ>xh03^HJ$X#<^o+oHYPEu}_FfdR%dGA{A?VpRuW^RxZxK z6AuELimEy;K5RpSJheg3lv6Kw3 zNM=5hIhYTPAiu&DmpeJN71|&tSx-e+anlgY`@PR2~ZyI85}| zR8O5fY1hH!N9tzV#JJ=dh}T-1oRqZvlx*AmmQBGj8esx#1GhOIayt)UI9D`<9p2si zW}y05*&RR<5z+L&?aBf?VT--z==+G#2b`bmGKnCFzn(Mkdb-J5MgoW|U^`T4v>AwU zf2vXlB!ID=et5V@BItcM<`nt|@OGzNo|Ii|;QEHKyVjf?<|8BN{aOsy>>RCrQH-qe z^>ZR6PYijP$a%&RpIug8yizUmocEk}&apdFve$UyY*~$Sr-sgQ0iqSZUC~N32uuTs z$g;U3?dMU>KE;?hB#ab3~p6!30K$4*rc8E3pyx`6o26T9dAvkLV>W2uK@b7?}m3 zs^^XvKBF8whT~(?dVKVtv!3CfrZSyTRlY3mOK@|AelT^@RS~0xdf(~)6!NW0T5Qj* zVt4^$ic$nlWT!J-CQBaFo?z+xf!!5s--QyKm%!OfO&{WO^-kHVbdOcsGsVeSM&G*zN&mg zP2v^@c47f(fc-yR-TOb&eIEz#+2K1nNQWyrX~`9JgJxmpRO_ zF^4&?xv&W>Q7p0+BGHs`tk#vx<}^1KQeC+_DOc^fzq@uldOWWCU-I9Opi|!u>k2=V^YD;XJLtTn676IWa~UK3+6? z!cwbG28ZQ0HK>A!tO>zeD3H`096mGwX{Ll zw`u8r_c&ua+pjkM4S=0nR=A&Db=%J{4b!)A+DX}fGSErZ=6B2yUE((kj-_8LaGbT* zWj@LF1902`ZGViT=J?}<_V>!RL2V))F^fi;^;>KEN^Nu4P)fxZ1AnI7JY{4S+x=EN zP4b9;F)993{`TwpP!Q4k<`4L#mf=yiu*J{B#FVJMn@eb1v%wSXsJMMT3hWA8zatw} zdT(MOjOZ+vjR7sI?LUNaTYHWk&iGV^DQHZ$MuxKyfeRQkPUi-WmMLjpxlH@SC9{oI zO}#5V*vaf*M^=&vsm13pa*ngpyB^rr#o@nBZ2PONC-Hp5-LCM_8g)SN2m@$FcAD?D z+Z)#FgiTB_J;vVmaaF*8x?B-tpjZgLm3ajue;7a*cz(e(+Qftjqru&4}bonO9G|qytpg& zeg>W8bZX1h$YxJC0mlTmsf1>DA`Sk*+<}d>P~9-&&%rC>VZru0VCgP&2BA8&uF~z7 zNJ|L)K%E3$a8!s(3a=RLFHS+HrE6myOxPJvA!Do$JP`^g&PVb*9dgY*)x*noW>TSm zVga2I#m!)Lx*{trj~+;)TmytGnutgv&&N|004rrD`k}LWgjuYa<937rr4-G;oE>88 zlYG>cwWs#e_E^JQFF}oqcom}Af;nawrqY|8+@YDXQ|!7DbIcb)KTOOmZr-JZSll%r zQ_rF`@`&H}gXSZQe-4@zCi6H{EFN$d!^J2Iz4sc=p@|j=5Qa^4kmRc~ilb1HP~EyH zcD=M8-#@T72$K>9%eF42y~1TTYof#rhlqM%>U-ujqzm88Pj9P*2i8AKfwG@uLEVeb zyW`)V&GmwIT7(5qKykD?UmZ}~^fD@`+wJgPfESZi&&d-;WP2(soSb*>oR9o~L#=_# z?+AlZgHog%-$ROmuG*mxBB=mTtEyiFCX4{zNkqOV#}BJS9hK$x(Tnk_DdxfhguMDd z&Q{|Dkx%x$nfM^~;Z~@AQ4vmRDWXF3hb>8Yk925>^)`yf^GYbeQ63N7ToA=xj0>4H z+*-)}@b(*-NMAn9sw z#)ks#=7i^Vas~dbQ8h=$|XvYKK=*FC4visG{<6arEX-9 zcWFq=NhzI_HEqkXE;qq(EBAgVJTzTa4^L0yF26P zRB1_f3Djm-AFlxR`dH3+Bay!d_whBL;>C*fKm~+;?7HvhN4#1;F24qe-=GV5FgWoa z@x#!eot7x3$Uq!vEU{j&^{-pU7tH`(k%+n=jZO2L5m4XaJe`0MwEW$-=-kK6A>k=P z0g;{7zyccP$Wre_8*HQJFv{SNC`Ag(f_9kM)qdRl_~U>wu1tBdNx2@~%Gvk!yY}Iu zRoaIUoB|O~z07iK+;{h)Di(Ltl_=A~`J@n?#uqLj$2T;px$nn|jalpIu4pF75E=N> zEm1~oJR8lKj-VWhUZQg+;?G+U_jy*`j;AC;+*c6?{K|_?vIRC%5;N@@)z)|J*GRSX zW%fokf3QExZi(czP&3Lv%~T2n8OTQVSlp?IL+ARo?eF96$224e1&{hv$wP%5FsfI$ z(z`tXN*?lC-%r8}z^Hg(>wELNreMpsE32uwT+kC{W*r>}GjN5)!d&h|Ge{8fL2q0Q zA)io8XP1y-054d3fKK&lw~kdIsH8Ylo+rf$8*jyrBsHglgr+lg{)Qv!M4!l>X0Ej9f~Y2q@#X%6)pylM-?>Q zJ8JzPqJ0Tw@hCEAIzm5l^Zkx1aO8sohL~{V(b*g^M1159@-Du{Dm-k(JPd(_J+*{| zFWX|y-ee`ob~uB;-xZNqhhooACkCq>Mjq4#qL@Xf9sQ{mc%dci5yX3E)x4+Bf_Se< zp>ao{@x^h2LojGJvTgM|Y#Fvo@by&GZjCiq_@QX{E|BU*K-4emQ|Af;+2~LPE!MX8 z(QVofJIuo&+XIoyi;=nOf}m^U+KsT^c0X2Xh*P7vGz$?EqRxs z@^F?&(3FJbYrM`8dF<-Hk`T5uhAPk5KH)_USyn$aQ5g#1p0Ec-g&~AJE3g_4$F?`* zY+vHi`&u(0=43=z2CBXY$rXVUO-ULNNPHKqyo)y4kIGv1n@d)uycGPQ4djY)95cZ1 z+caScr$;yD-fLR>4Dg174B4gMaJj$oH4XC^d~6ljxpTmD({=wZz}!%UYukX0G;dWF zZNs-{Czs1w=-&=viOxnTMWnP2qh_y+0poSo-Rtsh3a*)$Tn$R(5bMgR*4c)-ysa|u z#{I$*y4T6#Xby>|Ei1XFt3-SIoNv_pi5!!bIxD?zlyH7jN@yDtea;GNyT;8LAY)$m z*U)0xqPea0+*Vm>TTAITnV^R3CPoFLODBTw@|McK&dCI$@*8cklP1~qb6NCUT3+Ii zXLosZVhwL5ig7#s0|C85L8EyM-1>stJkQzk;j-b3YFRjTn93e7T^ymj$$CJ7_^I?> zqP%cXe#4&C_HFEuEen35I3=+ymfBl36D8d0#~Ywk^$siHQwOj{{Oj!iJThu$6> z-&C$JG`*!+t3R%VOZqqbW|InT)Xx e52Pq(q^D;Cv!*)HV}y0t(`7T6W3*%#% Date: Sun, 26 Apr 2020 21:50:13 +0800 Subject: [PATCH 29/53] =?UTF-8?q?=E6=9B=B4=E6=96=B0Freesql=E5=8C=85?= =?UTF-8?q?=E5=88=B0=E6=9C=80=E6=96=B0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core/Controllers/Admin/ImgController.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Admin.Core/Controllers/Admin/ImgController.cs b/Admin.Core/Controllers/Admin/ImgController.cs index 00873310d..69b1f51d2 100644 --- a/Admin.Core/Controllers/Admin/ImgController.cs +++ b/Admin.Core/Controllers/Admin/ImgController.cs @@ -2,7 +2,6 @@ using System.IO; using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; @@ -60,7 +59,7 @@ public FileStreamResult Avatar([FromServices]IWebHostEnvironment environment, st /// [HttpPost] [Login] - public async Task AvatarUpload([FromServices]IWebHostEnvironment environment, IFormFile file) + public async Task AvatarUpload(IFormFile file) { if(file == null || file.Length < 1) { From a323f674511fc77d50e05c674260dfca6af025df Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Sun, 26 Apr 2020 22:12:20 +0800 Subject: [PATCH 30/53] =?UTF-8?q?=E6=9B=B4=E6=96=B0FSql=20Nuget=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 12 ++++++------ Admin.Core/Controllers/Admin/ImgController.cs | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 00787ee82..58c7a2b38 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -6,12 +6,12 @@ - - - - - - + + + + + + diff --git a/Admin.Core/Controllers/Admin/ImgController.cs b/Admin.Core/Controllers/Admin/ImgController.cs index 69b1f51d2..71082074d 100644 --- a/Admin.Core/Controllers/Admin/ImgController.cs +++ b/Admin.Core/Controllers/Admin/ImgController.cs @@ -54,7 +54,6 @@ public FileStreamResult Avatar([FromServices]IWebHostEnvironment environment, st /// /// 上传头像 /// - /// /// /// [HttpPost] From 09bbcde6d6edb86660c16e1e827ba229630b30f0 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Sun, 26 Apr 2020 22:17:50 +0800 Subject: [PATCH 31/53] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E5=86=97=E4=BD=99=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Model/Admin/ApiEntity.cs | 1 - Admin.Core.Model/Admin/DictionaryEntity.cs | 1 - Admin.Core.Model/Admin/DocumentEntity.cs | 1 - Admin.Core.Model/Admin/LogAbstract.cs | 1 - Admin.Core.Model/Admin/OprationLogEntity.cs | 1 - Admin.Core.Model/Admin/PermissionEntity.cs | 1 - Admin.Core.Model/Admin/RoleEntity.cs | 3 +-- Admin.Core.Model/Admin/UserEntity.cs | 1 - Admin.Core.Model/Admin/ViewEntity.cs | 1 - Admin.Core/Admin.Core.xml | 3 +-- 10 files changed, 2 insertions(+), 12 deletions(-) diff --git a/Admin.Core.Model/Admin/ApiEntity.cs b/Admin.Core.Model/Admin/ApiEntity.cs index a069746d7..65346d7ff 100644 --- a/Admin.Core.Model/Admin/ApiEntity.cs +++ b/Admin.Core.Model/Admin/ApiEntity.cs @@ -1,6 +1,5 @@ using System; using FreeSql.DataAnnotations; -using System.ComponentModel.DataAnnotations; namespace Admin.Core.Model.Admin { diff --git a/Admin.Core.Model/Admin/DictionaryEntity.cs b/Admin.Core.Model/Admin/DictionaryEntity.cs index 2cc0127c8..36cae4269 100644 --- a/Admin.Core.Model/Admin/DictionaryEntity.cs +++ b/Admin.Core.Model/Admin/DictionaryEntity.cs @@ -1,5 +1,4 @@ using FreeSql.DataAnnotations; -using System.ComponentModel.DataAnnotations; namespace Admin.Core.Model.Admin { diff --git a/Admin.Core.Model/Admin/DocumentEntity.cs b/Admin.Core.Model/Admin/DocumentEntity.cs index ce579c8aa..674619c97 100644 --- a/Admin.Core.Model/Admin/DocumentEntity.cs +++ b/Admin.Core.Model/Admin/DocumentEntity.cs @@ -1,4 +1,3 @@ -using System.ComponentModel.DataAnnotations; using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin diff --git a/Admin.Core.Model/Admin/LogAbstract.cs b/Admin.Core.Model/Admin/LogAbstract.cs index 58ef68bfa..444af8961 100644 --- a/Admin.Core.Model/Admin/LogAbstract.cs +++ b/Admin.Core.Model/Admin/LogAbstract.cs @@ -1,5 +1,4 @@ using FreeSql.DataAnnotations; -using System.ComponentModel.DataAnnotations; namespace Admin.Core.Model.Admin { diff --git a/Admin.Core.Model/Admin/OprationLogEntity.cs b/Admin.Core.Model/Admin/OprationLogEntity.cs index 5b4693b8a..85675fd5a 100644 --- a/Admin.Core.Model/Admin/OprationLogEntity.cs +++ b/Admin.Core.Model/Admin/OprationLogEntity.cs @@ -1,4 +1,3 @@ -using System.ComponentModel.DataAnnotations; using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin diff --git a/Admin.Core.Model/Admin/PermissionEntity.cs b/Admin.Core.Model/Admin/PermissionEntity.cs index 18be41d2c..226798ffd 100644 --- a/Admin.Core.Model/Admin/PermissionEntity.cs +++ b/Admin.Core.Model/Admin/PermissionEntity.cs @@ -1,4 +1,3 @@ -using System.ComponentModel.DataAnnotations; using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin diff --git a/Admin.Core.Model/Admin/RoleEntity.cs b/Admin.Core.Model/Admin/RoleEntity.cs index cf7b95c49..7cc70a610 100644 --- a/Admin.Core.Model/Admin/RoleEntity.cs +++ b/Admin.Core.Model/Admin/RoleEntity.cs @@ -1,6 +1,5 @@ using System; using FreeSql.DataAnnotations; -using System.ComponentModel.DataAnnotations; using System.Collections.Generic; namespace Admin.Core.Model.Admin @@ -15,7 +14,7 @@ public class RoleEntity: EntityBase /// /// 名称 /// - [MaxLength(50)] + [Column(StringLength = 50)] public string Name { get; set; } /// diff --git a/Admin.Core.Model/Admin/UserEntity.cs b/Admin.Core.Model/Admin/UserEntity.cs index d72de3748..19401dcdd 100644 --- a/Admin.Core.Model/Admin/UserEntity.cs +++ b/Admin.Core.Model/Admin/UserEntity.cs @@ -1,6 +1,5 @@ using System; using FreeSql.DataAnnotations; -using System.ComponentModel.DataAnnotations; using System.Collections.Generic; namespace Admin.Core.Model.Admin diff --git a/Admin.Core.Model/Admin/ViewEntity.cs b/Admin.Core.Model/Admin/ViewEntity.cs index 4e43cbc5a..dd1e7eb40 100644 --- a/Admin.Core.Model/Admin/ViewEntity.cs +++ b/Admin.Core.Model/Admin/ViewEntity.cs @@ -1,6 +1,5 @@ using System; using FreeSql.DataAnnotations; -using System.ComponentModel.DataAnnotations; namespace Admin.Core.Model.Admin { diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index d71f8ed8c..802f3e1ea 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -306,11 +306,10 @@ 图片管理 - + 上传头像 - From b5b0f4e4c4ce219da292c01b2102565ba3e810c1 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Mon, 27 Apr 2020 11:27:24 +0800 Subject: [PATCH 32/53] =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=B7=A8=E4=BB=93?= =?UTF-8?q?=E5=82=A8=E4=BA=8B=E7=89=A9=E4=BC=A0=E6=92=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Attributes/TransactionAttribute.cs | 5 ++++- .../Extensions/MethodInfoExtensions.cs | 7 ++++++- Admin.Core.Repository/Admin/Api/ApiRepository.cs | 2 +- .../Admin/Dictionary/DictionaryRepository.cs | 2 +- .../Admin/Document/DocumentRepository.cs | 2 +- .../Admin/LoginLog/LoginLogRepository.cs | 2 +- .../Admin/OprationLog/OprationLogRepository.cs | 2 +- .../Admin/Permission/PermissionRepository.cs | 2 +- .../Admin/Role/RoleRepository.cs | 2 +- .../RolePermission/RolePermissionRepository.cs | 2 +- .../Admin/User/UserRepository.cs | 2 +- .../Admin/UserRole/UserRoleRepository.cs | 2 +- .../Admin/View/ViewRepositoryRepository.cs | 2 +- Admin.Core.Repository/Base/RepositoryBase.cs | 7 +++---- Admin.Core.Services/Admin/User/UserService.cs | 4 ++-- Admin.Core/Admin.Core.xml | 3 ++- Admin.Core/Aop/TransactionInterceptor.cs | 14 +++++++++----- Admin.Core/Db/ServiceCollectionExtensions.cs | 7 +++++-- Admin.Core/Startup.cs | 16 ++++++++-------- 19 files changed, 50 insertions(+), 35 deletions(-) diff --git a/Admin.Core.Common/Attributes/TransactionAttribute.cs b/Admin.Core.Common/Attributes/TransactionAttribute.cs index fc6059554..b7b19c37a 100644 --- a/Admin.Core.Common/Attributes/TransactionAttribute.cs +++ b/Admin.Core.Common/Attributes/TransactionAttribute.cs @@ -1,4 +1,6 @@ using System; +using System.Data; +using FreeSql; namespace Admin.Core.Common { @@ -8,6 +10,7 @@ namespace Admin.Core.Common [AttributeUsage(AttributeTargets.Method, Inherited = true)] public class TransactionAttribute : Attribute { - + public Propagation Propagation { get; set; } = Propagation.Requierd; + public IsolationLevel? IsolationLevel { get; set; } } } diff --git a/Admin.Core.Common/Extensions/MethodInfoExtensions.cs b/Admin.Core.Common/Extensions/MethodInfoExtensions.cs index 0f2458a61..009ac8d8d 100644 --- a/Admin.Core.Common/Extensions/MethodInfoExtensions.cs +++ b/Admin.Core.Common/Extensions/MethodInfoExtensions.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Reflection; using System.Threading.Tasks; @@ -9,7 +10,11 @@ public static class MethodInfoExtensions public static bool HasAttribute(this MethodInfo method) { return method.GetCustomAttributes(typeof(T), false).FirstOrDefault() is T; + } + public static T GetAttribute(this MethodInfo method) where T : Attribute + { + return method.GetCustomAttributes(typeof(T), false).FirstOrDefault() as T; } public static bool IsAsync(this MethodInfo method) diff --git a/Admin.Core.Repository/Admin/Api/ApiRepository.cs b/Admin.Core.Repository/Admin/Api/ApiRepository.cs index 3cacca985..187134931 100644 --- a/Admin.Core.Repository/Admin/Api/ApiRepository.cs +++ b/Admin.Core.Repository/Admin/Api/ApiRepository.cs @@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin { public class ApiRepository : RepositoryBase, IApiRepository { - public ApiRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + public ApiRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user) { } } diff --git a/Admin.Core.Repository/Admin/Dictionary/DictionaryRepository.cs b/Admin.Core.Repository/Admin/Dictionary/DictionaryRepository.cs index 58e62ecc5..41491a4d5 100644 --- a/Admin.Core.Repository/Admin/Dictionary/DictionaryRepository.cs +++ b/Admin.Core.Repository/Admin/Dictionary/DictionaryRepository.cs @@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin { public class DictionaryRepository : RepositoryBase, IDictionaryRepository { - public DictionaryRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + public DictionaryRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user) { } } diff --git a/Admin.Core.Repository/Admin/Document/DocumentRepository.cs b/Admin.Core.Repository/Admin/Document/DocumentRepository.cs index 00a1d9774..3cfd84ba5 100644 --- a/Admin.Core.Repository/Admin/Document/DocumentRepository.cs +++ b/Admin.Core.Repository/Admin/Document/DocumentRepository.cs @@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin { public class DocumentRepository : RepositoryBase, IDocumentRepository { - public DocumentRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + public DocumentRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user) { } } diff --git a/Admin.Core.Repository/Admin/LoginLog/LoginLogRepository.cs b/Admin.Core.Repository/Admin/LoginLog/LoginLogRepository.cs index cd431f33a..2cc1c6005 100644 --- a/Admin.Core.Repository/Admin/LoginLog/LoginLogRepository.cs +++ b/Admin.Core.Repository/Admin/LoginLog/LoginLogRepository.cs @@ -7,7 +7,7 @@ namespace Admin.Core.Repository.Admin { public class LoginLogRepository : RepositoryBase, ILoginLogRepository { - public LoginLogRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + public LoginLogRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user) { } } diff --git a/Admin.Core.Repository/Admin/OprationLog/OprationLogRepository.cs b/Admin.Core.Repository/Admin/OprationLog/OprationLogRepository.cs index e04b510aa..509836a45 100644 --- a/Admin.Core.Repository/Admin/OprationLog/OprationLogRepository.cs +++ b/Admin.Core.Repository/Admin/OprationLog/OprationLogRepository.cs @@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin { public class OprationLogRepository : RepositoryBase, IOprationLogRepository { - public OprationLogRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + public OprationLogRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user) { } } diff --git a/Admin.Core.Repository/Admin/Permission/PermissionRepository.cs b/Admin.Core.Repository/Admin/Permission/PermissionRepository.cs index 0d5d2f8f6..7d24ea5d0 100644 --- a/Admin.Core.Repository/Admin/Permission/PermissionRepository.cs +++ b/Admin.Core.Repository/Admin/Permission/PermissionRepository.cs @@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin { public class PermissionRepository : RepositoryBase, IPermissionRepository { - public PermissionRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + public PermissionRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user) { } } diff --git a/Admin.Core.Repository/Admin/Role/RoleRepository.cs b/Admin.Core.Repository/Admin/Role/RoleRepository.cs index aad0b2057..fffc1621c 100644 --- a/Admin.Core.Repository/Admin/Role/RoleRepository.cs +++ b/Admin.Core.Repository/Admin/Role/RoleRepository.cs @@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin { public class RoleRepository : RepositoryBase, IRoleRepository { - public RoleRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + public RoleRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user) { } } diff --git a/Admin.Core.Repository/Admin/RolePermission/RolePermissionRepository.cs b/Admin.Core.Repository/Admin/RolePermission/RolePermissionRepository.cs index 7b073e01d..dadb9cabe 100644 --- a/Admin.Core.Repository/Admin/RolePermission/RolePermissionRepository.cs +++ b/Admin.Core.Repository/Admin/RolePermission/RolePermissionRepository.cs @@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin { public class RolePermissionRepository : RepositoryBase, IRolePermissionRepository { - public RolePermissionRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + public RolePermissionRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user) { } } diff --git a/Admin.Core.Repository/Admin/User/UserRepository.cs b/Admin.Core.Repository/Admin/User/UserRepository.cs index f6d94db35..c256209db 100644 --- a/Admin.Core.Repository/Admin/User/UserRepository.cs +++ b/Admin.Core.Repository/Admin/User/UserRepository.cs @@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin { public class UserRepository : RepositoryBase, IUserRepository { - public UserRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + public UserRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user) { } } diff --git a/Admin.Core.Repository/Admin/UserRole/UserRoleRepository.cs b/Admin.Core.Repository/Admin/UserRole/UserRoleRepository.cs index ff7f312d2..c87041341 100644 --- a/Admin.Core.Repository/Admin/UserRole/UserRoleRepository.cs +++ b/Admin.Core.Repository/Admin/UserRole/UserRoleRepository.cs @@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin { public class UserRoleRepository : RepositoryBase, IUserRoleRepository { - public UserRoleRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + public UserRoleRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user) { } } diff --git a/Admin.Core.Repository/Admin/View/ViewRepositoryRepository.cs b/Admin.Core.Repository/Admin/View/ViewRepositoryRepository.cs index 2b7d2fff9..dc88e15fb 100644 --- a/Admin.Core.Repository/Admin/View/ViewRepositoryRepository.cs +++ b/Admin.Core.Repository/Admin/View/ViewRepositoryRepository.cs @@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin { public class ViewRepository : RepositoryBase, IViewRepository { - public ViewRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + public ViewRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user) { } diff --git a/Admin.Core.Repository/Base/RepositoryBase.cs b/Admin.Core.Repository/Base/RepositoryBase.cs index f594dd744..93be4246f 100644 --- a/Admin.Core.Repository/Base/RepositoryBase.cs +++ b/Admin.Core.Repository/Base/RepositoryBase.cs @@ -11,10 +11,9 @@ namespace Admin.Core.Repository public abstract class RepositoryBase : BaseRepository where TEntity : class,new() { private readonly IUser _user; - protected RepositoryBase(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, null, null) + protected RepositoryBase(UnitOfWorkManager uowm, IUser user) : base(uowm.Orm, null, null) { - uow.Close(); - UnitOfWork = uow; + uowm.Binding(this); _user = user; } @@ -54,7 +53,7 @@ await UpdateDiy public abstract class RepositoryBase : RepositoryBase where TEntity : class, new() { - protected RepositoryBase(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user) + protected RepositoryBase(UnitOfWorkManager uowm, IUser user) : base(uowm, user) { } } diff --git a/Admin.Core.Services/Admin/User/UserService.cs b/Admin.Core.Services/Admin/User/UserService.cs index 067245223..67bccd8a9 100644 --- a/Admin.Core.Services/Admin/User/UserService.cs +++ b/Admin.Core.Services/Admin/User/UserService.cs @@ -79,7 +79,7 @@ public async Task PageAsync(PageInput input) return ResponseOutput.Ok(data); } - [Transaction] + [Transaction(Propagation = FreeSql.Propagation.Requierd)] public async Task AddAsync(UserAddInput input) { if (input.Password.IsNull()) @@ -96,7 +96,7 @@ public async Task AddAsync(UserAddInput input) { return ResponseOutput.NotOk(); } - + if (input.RoleIds != null && input.RoleIds.Any()) { var roles = input.RoleIds.Select(d => new UserRoleEntity(user.Id, d)); diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index 802f3e1ea..f7cca1f9d 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -671,12 +671,13 @@ - + 添加数据库 + diff --git a/Admin.Core/Aop/TransactionInterceptor.cs b/Admin.Core/Aop/TransactionInterceptor.cs index 95850cf31..dc1ece1d6 100644 --- a/Admin.Core/Aop/TransactionInterceptor.cs +++ b/Admin.Core/Aop/TransactionInterceptor.cs @@ -5,26 +5,30 @@ using Admin.Core.Common; using Admin.Core.Extensions; using Admin.Core.Model.Output; - +using System.Data; namespace Admin.Core.Aop { public class TransactionInterceptor : IInterceptor { - private readonly IUnitOfWork _unitOfWork; - public TransactionInterceptor(IUnitOfWork unitOfWork) + IUnitOfWork _unitOfWork; + private readonly UnitOfWorkManager _unitOfWorkManager; + + public TransactionInterceptor(UnitOfWorkManager unitOfWorkManager) { - _unitOfWork = unitOfWork; + _unitOfWorkManager = unitOfWorkManager; } public async void Intercept(IInvocation invocation) { var method = invocation.MethodInvocationTarget ?? invocation.Method; + if (method.HasAttribute()) { try { - _unitOfWork.Open(); + var transaction = method.GetAttribute(); + _unitOfWork = _unitOfWorkManager.Begin(transaction.Propagation, transaction.IsolationLevel); invocation.Proceed(); if (method.IsAsync()) diff --git a/Admin.Core/Db/ServiceCollectionExtensions.cs b/Admin.Core/Db/ServiceCollectionExtensions.cs index a4faf6cb0..c6b5d13da 100644 --- a/Admin.Core/Db/ServiceCollectionExtensions.cs +++ b/Admin.Core/Db/ServiceCollectionExtensions.cs @@ -16,7 +16,8 @@ public static class ServiceCollectionExtensions /// /// /// - public async static void AddDb(this IServiceCollection services, IHostEnvironment env) + /// + public async static void AddDb(this IServiceCollection services, IHostEnvironment env, AppConfig appConfig) { var dbConfig = new ConfigHelper().Get("dbconfig", env.EnvironmentName); @@ -47,7 +48,7 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen var fsql = freeSqlBuilder.Build(); services.AddFreeRepository(filter => filter.Apply("SoftDelete", a => a.IsDeleted == false)); - services.AddScoped(sp => fsql.CreateUnitOfWork()); + services.AddScoped(); services.AddSingleton(fsql); #region 初始化数据库 @@ -128,6 +129,8 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen }; #endregion #endregion + + Console.WriteLine($"{appConfig.Urls}\r\n"); } } } diff --git a/Admin.Core/Startup.cs b/Admin.Core/Startup.cs index bd83cc633..861fa6721 100644 --- a/Admin.Core/Startup.cs +++ b/Admin.Core/Startup.cs @@ -32,7 +32,6 @@ using Admin.Core.Aop; using Admin.Core.Logs; using PermissionHandler = Admin.Core.Auth.PermissionHandler; -using Microsoft.Extensions.Options; using Admin.Core.Extensions; namespace Admin.Core @@ -193,7 +192,7 @@ public void ConfigureServices(IServiceCollection services) #endregion //数据库 - services.AddDb(_env); + services.AddDb(_env,_appConfig); #region 缓存 var cacheConfig = new ConfigHelper().Get("cacheconfig", _env.EnvironmentName); @@ -251,13 +250,14 @@ public void ConfigureContainer(ContainerBuilder builder) #endregion } - public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifetime) + public void Configure(IApplicationBuilder app) { - //启动事件 - lifetime.ApplicationStarted.Register(() => - { - Console.WriteLine($"{_appConfig.Urls}\r\n"); - }); + //启动事件 + //, IHostApplicationLifetime lifetime + //lifetime.ApplicationStarted.Register(() => + //{ + // Console.WriteLine($"{_appConfig.Urls}\r\n"); + //}); #region app配置 //异常 From eb7a473137c7fd22f3261ac33244e01bb97fd2cc Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Mon, 27 Apr 2020 11:34:00 +0800 Subject: [PATCH 33/53] =?UTF-8?q?=E4=BA=8B=E7=89=A9=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Attributes/TransactionAttribute.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Admin.Core.Common/Attributes/TransactionAttribute.cs b/Admin.Core.Common/Attributes/TransactionAttribute.cs index b7b19c37a..2dc7f3799 100644 --- a/Admin.Core.Common/Attributes/TransactionAttribute.cs +++ b/Admin.Core.Common/Attributes/TransactionAttribute.cs @@ -10,7 +10,14 @@ namespace Admin.Core.Common [AttributeUsage(AttributeTargets.Method, Inherited = true)] public class TransactionAttribute : Attribute { + /// + /// 事务传播方式 + /// public Propagation Propagation { get; set; } = Propagation.Requierd; + + /// + /// 事务隔离级别 + /// public IsolationLevel? IsolationLevel { get; set; } } } From b464ad54e400ee7d520924253b3f506d22475f77 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Tue, 28 Apr 2020 11:46:17 +0800 Subject: [PATCH 34/53] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8D=95=E4=BE=8B?= =?UTF-8?q?=E6=B3=A8=E5=85=A5=E7=89=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Attributes/SingletonAttribute.cs | 12 ++++++++++++ .../Attributes/TransactionAttribute.cs | 2 +- Admin.Core.Common/Configs/UploadConfig.cs | 5 +++++ Admin.Core.Common/Extensions/GuidExtensions.cs | 2 +- Admin.Core.Services/Admin/Api/ApiService.cs | 2 +- .../Admin/Permission/PermissionService.cs | 3 +-- Admin.Core.Services/Admin/User/UserService.cs | 4 ++-- Admin.Core.Services/Admin/View/ViewService.cs | 2 +- Admin.Core/Aop/TransactionInterceptor.cs | 3 +-- Admin.Core/Db/ServiceCollectionExtensions.cs | 2 +- Admin.Core/Logs/ApiHelper.cs | 2 ++ Admin.Core/Startup.cs | 17 ++++++++++++----- Admin.Core/configs/uploadconfig.json | 2 ++ 13 files changed, 42 insertions(+), 16 deletions(-) create mode 100644 Admin.Core.Common/Attributes/SingletonAttribute.cs diff --git a/Admin.Core.Common/Attributes/SingletonAttribute.cs b/Admin.Core.Common/Attributes/SingletonAttribute.cs new file mode 100644 index 000000000..0f67acbba --- /dev/null +++ b/Admin.Core.Common/Attributes/SingletonAttribute.cs @@ -0,0 +1,12 @@ +using System; + +namespace Admin.Core.Common.Attributes +{ + /// + /// 单例注入 + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property)] + public class SingleInstanceAttribute : Attribute + { + } +} diff --git a/Admin.Core.Common/Attributes/TransactionAttribute.cs b/Admin.Core.Common/Attributes/TransactionAttribute.cs index 2dc7f3799..61a1d7d66 100644 --- a/Admin.Core.Common/Attributes/TransactionAttribute.cs +++ b/Admin.Core.Common/Attributes/TransactionAttribute.cs @@ -2,7 +2,7 @@ using System.Data; using FreeSql; -namespace Admin.Core.Common +namespace Admin.Core.Common.Attributes { /// /// 启用事物 diff --git a/Admin.Core.Common/Configs/UploadConfig.cs b/Admin.Core.Common/Configs/UploadConfig.cs index 42e1c6a93..4ce8edb7a 100644 --- a/Admin.Core.Common/Configs/UploadConfig.cs +++ b/Admin.Core.Common/Configs/UploadConfig.cs @@ -74,6 +74,11 @@ public class DocumentConfig /// public long Size { get; set; } + /// + /// 最大允许上传个数 -1不限制 + /// + public int Limit { get; set; } = -1; + /// /// 文件格式 /// diff --git a/Admin.Core.Common/Extensions/GuidExtensions.cs b/Admin.Core.Common/Extensions/GuidExtensions.cs index dba34ea74..610ff5fc9 100644 --- a/Admin.Core.Common/Extensions/GuidExtensions.cs +++ b/Admin.Core.Common/Extensions/GuidExtensions.cs @@ -1,6 +1,6 @@ using System; -namespace Admin.Core +namespace Admin.Core.Extensions { public static class GuidExtensions { diff --git a/Admin.Core.Services/Admin/Api/ApiService.cs b/Admin.Core.Services/Admin/Api/ApiService.cs index 9403d6ca7..a4fa4b2fe 100644 --- a/Admin.Core.Services/Admin/Api/ApiService.cs +++ b/Admin.Core.Services/Admin/Api/ApiService.cs @@ -2,13 +2,13 @@ using System.Threading.Tasks; using System.Collections.Generic; using AutoMapper; -using Admin.Core.Common; using Admin.Core.Model.Input; using Admin.Core.Model.Output; using Admin.Core.Model.Admin; using Admin.Core.Repository.Admin; using Admin.Core.Service.Admin.Api.Input; using Admin.Core.Service.Admin.Api.Output; +using Admin.Core.Common.Attributes; namespace Admin.Core.Service.Admin.Api { diff --git a/Admin.Core.Services/Admin/Permission/PermissionService.cs b/Admin.Core.Services/Admin/Permission/PermissionService.cs index 53b4c78d9..c3d06f881 100644 --- a/Admin.Core.Services/Admin/Permission/PermissionService.cs +++ b/Admin.Core.Services/Admin/Permission/PermissionService.cs @@ -3,14 +3,13 @@ using System.Threading.Tasks; using System.Collections.Generic; using AutoMapper; -using Admin.Core.Common; using Admin.Core.Repository.Admin; using Admin.Core.Model.Admin; using Admin.Core.Model.Output; using Admin.Core.Service.Admin.Permission.Input; using Admin.Core.Service.Admin.Permission.Output; using Admin.Core.Common.Cache; - +using Admin.Core.Common.Attributes; namespace Admin.Core.Service.Admin.Permission { diff --git a/Admin.Core.Services/Admin/User/UserService.cs b/Admin.Core.Services/Admin/User/UserService.cs index 67bccd8a9..976873a32 100644 --- a/Admin.Core.Services/Admin/User/UserService.cs +++ b/Admin.Core.Services/Admin/User/UserService.cs @@ -2,7 +2,6 @@ using System.Threading.Tasks; using System.Collections.Generic; using AutoMapper; -using Admin.Core.Common; using Admin.Core.Common.Helpers; using Admin.Core.Common.Auth; using Admin.Core.Common.Cache; @@ -13,6 +12,7 @@ using Admin.Core.Service.Admin.User; using Admin.Core.Service.Admin.User.Input; using Admin.Core.Service.Admin.User.Output; +using Admin.Core.Common.Attributes; namespace Admin.Core.FrameWork.Service.User { @@ -79,7 +79,7 @@ public async Task PageAsync(PageInput input) return ResponseOutput.Ok(data); } - [Transaction(Propagation = FreeSql.Propagation.Requierd)] + [Transaction] public async Task AddAsync(UserAddInput input) { if (input.Password.IsNull()) diff --git a/Admin.Core.Services/Admin/View/ViewService.cs b/Admin.Core.Services/Admin/View/ViewService.cs index 42bedf73a..6dd7d998a 100644 --- a/Admin.Core.Services/Admin/View/ViewService.cs +++ b/Admin.Core.Services/Admin/View/ViewService.cs @@ -2,13 +2,13 @@ using System.Collections.Generic; using System.Threading.Tasks; using AutoMapper; -using Admin.Core.Common; using Admin.Core.Model.Output; using Admin.Core.Model.Input; using Admin.Core.Model.Admin; using Admin.Core.Repository.Admin; using Admin.Core.Service.Admin.View.Input; using Admin.Core.Service.Admin.View.Output; +using Admin.Core.Common.Attributes; namespace Admin.Core.Service.Admin.View { diff --git a/Admin.Core/Aop/TransactionInterceptor.cs b/Admin.Core/Aop/TransactionInterceptor.cs index dc1ece1d6..184e11c22 100644 --- a/Admin.Core/Aop/TransactionInterceptor.cs +++ b/Admin.Core/Aop/TransactionInterceptor.cs @@ -2,10 +2,9 @@ using System.Threading.Tasks; using Castle.DynamicProxy; using FreeSql; -using Admin.Core.Common; using Admin.Core.Extensions; using Admin.Core.Model.Output; -using System.Data; +using Admin.Core.Common.Attributes; namespace Admin.Core.Aop { diff --git a/Admin.Core/Db/ServiceCollectionExtensions.cs b/Admin.Core/Db/ServiceCollectionExtensions.cs index c6b5d13da..2e4b137de 100644 --- a/Admin.Core/Db/ServiceCollectionExtensions.cs +++ b/Admin.Core/Db/ServiceCollectionExtensions.cs @@ -46,7 +46,7 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen #endregion var fsql = freeSqlBuilder.Build(); - + //fsql.GlobalFilter.Apply("SoftDelete", a => a.IsDeleted == false); services.AddFreeRepository(filter => filter.Apply("SoftDelete", a => a.IsDeleted == false)); services.AddScoped(); services.AddSingleton(fsql); diff --git a/Admin.Core/Logs/ApiHelper.cs b/Admin.Core/Logs/ApiHelper.cs index b73ba96aa..5b52a1ac8 100644 --- a/Admin.Core/Logs/ApiHelper.cs +++ b/Admin.Core/Logs/ApiHelper.cs @@ -4,12 +4,14 @@ using Newtonsoft.Json; using Admin.Core.Common.Helpers; using Admin.Core.Db; +using Admin.Core.Common.Attributes; namespace Admin.Core.Logs { /// /// Api帮助类 /// + [SingleInstance] public class ApiHelper { private List _apis; diff --git a/Admin.Core/Startup.cs b/Admin.Core/Startup.cs index 861fa6721..40bff8c79 100644 --- a/Admin.Core/Startup.cs +++ b/Admin.Core/Startup.cs @@ -33,6 +33,7 @@ using Admin.Core.Logs; using PermissionHandler = Admin.Core.Auth.PermissionHandler; using Admin.Core.Extensions; +using Admin.Core.Common.Attributes; namespace Admin.Core { @@ -51,7 +52,6 @@ public Startup(IWebHostEnvironment env) public void ConfigureServices(IServiceCollection services) { services.AddSingleton(_appConfig); - services.AddSingleton(typeof(ApiHelper)); //上传配置 var uploadConfig = new ConfigHelper().Load("uploadconfig", _env.EnvironmentName, true); @@ -228,8 +228,8 @@ public void ConfigureContainer(ContainerBuilder builder) #endregion #region Service - var assemblysServices = Assembly.Load("Admin.Core.Service"); - builder.RegisterAssemblyTypes(assemblysServices) + var assemblyServices = Assembly.Load("Admin.Core.Service"); + builder.RegisterAssemblyTypes(assemblyServices) .AsImplementedInterfaces() .InstancePerDependency() .EnableInterfaceInterceptors() @@ -237,11 +237,18 @@ public void ConfigureContainer(ContainerBuilder builder) #endregion #region Repository - var assemblysRepository = Assembly.Load("Admin.Core.Repository"); - builder.RegisterAssemblyTypes(assemblysRepository) + var assemblyRepository = Assembly.Load("Admin.Core.Repository"); + builder.RegisterAssemblyTypes(assemblyRepository) .AsImplementedInterfaces() .InstancePerDependency(); #endregion + + //单例注入 + var assemblyCore = Assembly.Load("Admin.Core"); + var assemblyCommon = Assembly.Load("Admin.Core.Common"); + builder.RegisterAssemblyTypes(assemblyCore,assemblyCommon) + .Where(t => t.GetCustomAttribute() != null) + .SingleInstance(); } catch (Exception ex) { diff --git a/Admin.Core/configs/uploadconfig.json b/Admin.Core/configs/uploadconfig.json index 0e8323128..b3092860d 100644 --- a/Admin.Core/configs/uploadconfig.json +++ b/Admin.Core/configs/uploadconfig.json @@ -28,6 +28,8 @@ "format": "{0}", //文件大小 10M = 10 * 1024 * 1024 "size": 10485760, + //最大允许上传个数,-1不限制 + "limit": -1, //文件格式 "contentType": [ "image/jpg", "image/png", "image/jpeg", "image/gif" ] } From 74398bf60bda278bc0bb17a82ac09a2ebcb8b4e5 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Sat, 2 May 2020 00:30:44 +0800 Subject: [PATCH 35/53] =?UTF-8?q?=E6=9B=B4=E6=96=B01.1.1=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 1 + Admin.Core.Common/Configs/AppConfig.cs | 16 ++ Admin.Core.Common/Configs/UploadConfig.cs | 46 +---- .../Extensions/EnumExtensions.cs | 54 ++++++ .../Extensions/GuidExtensions.cs | 2 +- .../Extensions/MethodInfoExtensions.cs | 2 +- .../Extensions/StringExtensions.cs | 8 + Admin.Core.Common/Files/FileInfo.cs | 77 ++++++++ Admin.Core.Common/Files/FileSize.cs | 81 +++++++++ Admin.Core.Common/Files/FileSizeUnit.cs | 31 ++++ Admin.Core.Common/Helpers/StringHelper.cs | 29 ++++ Admin.Core.Common/Helpers/UploadHelper.cs | 86 +++++++++ Admin.Core.Common/Helpers/UtilConvert.cs | 21 ++- Admin.Core.Common/Helpers/VerifyCodeHelper.cs | 17 +- .../Input/PageInput.cs | 4 +- .../Output/IResponseOutput.cs | 6 +- Admin.Core.Common/Output/OptionOutput.cs | 28 +++ .../Output/PageOutput.cs | 4 +- .../Output/ResponseOutput.cs | 6 +- Admin.Core.Model/Admin/DocumentImageEntity.cs | 24 +++ .../DocumentImage/DocumentImageRepository.cs | 13 ++ .../DocumentImage/IDocumentImageRepository.cs | 9 + Admin.Core.Services/Admin/Api/ApiService.cs | 4 +- Admin.Core.Services/Admin/Api/IApiService.cs | 4 +- Admin.Core.Services/Admin/Auth/AuthService.cs | 7 +- .../Admin/Auth/IAuthService.cs | 2 +- .../Admin/Cache/CacheService.cs | 2 +- .../Admin/Cache/ICacheService.cs | 2 +- .../Admin/Dictionary/DictionaryService.cs | 4 +- .../Admin/Dictionary/IDictionaryService.cs | 4 +- .../Admin/Document/DocumentService.cs | 68 +++++--- .../Admin/Document/IDocumentService.cs | 6 +- .../Document/Input/DocumentAddImageInput.cs | 15 ++ .../Input/DocumentUpdateContentInput.cs | 5 + .../Input/DocumentUploadImageInput.cs | 17 ++ .../Output/DocumentGetContentOutput.cs | 22 ++- .../Admin/Document/_MapConfig.cs | 1 + .../Admin/LoginLog/ILoginLogService.cs | 4 +- .../Admin/LoginLog/LoginLogService.cs | 4 +- .../Admin/OprationLog/IOprationLogService.cs | 4 +- .../Admin/OprationLog/OprationLogService.cs | 4 +- .../Admin/Permission/IPermissionService.cs | 2 +- .../Admin/Permission/PermissionService.cs | 2 +- .../Admin/Role/IRoleService.cs | 4 +- Admin.Core.Services/Admin/Role/RoleService.cs | 4 +- .../Admin/User/IUserService.cs | 4 +- Admin.Core.Services/Admin/User/UserService.cs | 6 +- .../Admin/View/IViewService.cs | 4 +- Admin.Core.Services/Admin/View/ViewService.cs | 4 +- Admin.Core.Tests/Controller.Tests/ApiTest.cs | 2 +- Admin.Core/Admin.Core.Model.xml | 164 ++---------------- Admin.Core/Admin.Core.Service.xml | 47 ++++- Admin.Core/Admin.Core.xml | 28 ++- Admin.Core/Aop/AopHelper.cs | 10 +- Admin.Core/Aop/TransactionInterceptor.cs | 36 +++- .../Attributes/ValidateInputAttribute.cs | 2 +- .../Auth/ResponseAuthenticationHandler.cs | 5 +- Admin.Core/Controllers/Admin/ApiController.cs | 4 +- .../Controllers/Admin/AuthController.cs | 2 +- .../Controllers/Admin/CacheController.cs | 2 +- .../Controllers/Admin/DictionaryController.cs | 4 +- .../Controllers/Admin/DocumentController.cs | 51 +++++- Admin.Core/Controllers/Admin/ImgController.cs | 68 ++------ .../Controllers/Admin/LoginLogController.cs | 4 +- .../Admin/OprationLogController.cs | 4 +- .../Controllers/Admin/PermissionController.cs | 2 +- .../Controllers/Admin/RoleController.cs | 4 +- .../Controllers/Admin/UserController.cs | 4 +- .../Controllers/Admin/ViewController.cs | 4 +- Admin.Core/Db/Data/data.json | 2 +- Admin.Core/Db/DbHelper.cs | 8 +- ...ploadConfigApplicationBuilderExtensions.cs | 14 +- Admin.Core/Filters/AdminExceptionFilter.cs | 5 +- Admin.Core/Logs/ApiHelper.cs | 2 +- Admin.Core/Logs/LogHandler.cs | 2 +- Admin.Core/configs/appconfig.json | 10 +- Admin.Core/configs/dbconfig.json | 1 + Admin.Core/configs/uploadconfig.json | 28 +-- 78 files changed, 905 insertions(+), 388 deletions(-) create mode 100644 Admin.Core.Common/Extensions/EnumExtensions.cs create mode 100644 Admin.Core.Common/Files/FileInfo.cs create mode 100644 Admin.Core.Common/Files/FileSize.cs create mode 100644 Admin.Core.Common/Files/FileSizeUnit.cs create mode 100644 Admin.Core.Common/Helpers/UploadHelper.cs rename {Admin.Core.Model => Admin.Core.Common}/Input/PageInput.cs (85%) rename {Admin.Core.Model => Admin.Core.Common}/Output/IResponseOutput.cs (84%) create mode 100644 Admin.Core.Common/Output/OptionOutput.cs rename {Admin.Core.Model => Admin.Core.Common}/Output/PageOutput.cs (83%) rename {Admin.Core.Model => Admin.Core.Common}/Output/ResponseOutput.cs (97%) create mode 100644 Admin.Core.Model/Admin/DocumentImageEntity.cs create mode 100644 Admin.Core.Repository/Admin/DocumentImage/DocumentImageRepository.cs create mode 100644 Admin.Core.Repository/Admin/DocumentImage/IDocumentImageRepository.cs create mode 100644 Admin.Core.Services/Admin/Document/Input/DocumentAddImageInput.cs create mode 100644 Admin.Core.Services/Admin/Document/Input/DocumentUploadImageInput.cs diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 58c7a2b38..5b8165151 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -9,6 +9,7 @@ + diff --git a/Admin.Core.Common/Configs/AppConfig.cs b/Admin.Core.Common/Configs/AppConfig.cs index dc7fcf467..dd2372dfd 100644 --- a/Admin.Core.Common/Configs/AppConfig.cs +++ b/Admin.Core.Common/Configs/AppConfig.cs @@ -24,6 +24,11 @@ public class AppConfig /// 日志配置 /// public LogConfig Log { get; set; } + + /// + /// 验证码配置 + /// + public VarifyCodeConfig VarifyCode { get; set; } } /// @@ -47,4 +52,15 @@ public class LogConfig /// public bool Operation { get; set; } } + + /// + /// 验证码配置 + /// + public class VarifyCodeConfig + { + /// + /// 操作日志 + /// + public string[] Font { get; set; } + } } diff --git a/Admin.Core.Common/Configs/UploadConfig.cs b/Admin.Core.Common/Configs/UploadConfig.cs index 4ce8edb7a..085f24cb0 100644 --- a/Admin.Core.Common/Configs/UploadConfig.cs +++ b/Admin.Core.Common/Configs/UploadConfig.cs @@ -5,54 +5,26 @@ /// public class UploadConfig { - public AvatarConfig Avatar { get; set; } - public AvatarConfig Document { get; set; } - } - - /// - /// 头像配置 - /// - public class AvatarConfig - { - /// - /// 路径 - /// - public string Path { get; set; } - /// - /// 请求路径 + /// 头像上传配置 /// - public string RequestPath { get; set; } + public FileUploadConfig Avatar { get; set; } /// - /// 路径格式 + /// 文档图片上传配置 /// - public string Format { get; set; } - /// - /// 路径日期格式 - /// - public string DateTimeFormat { get; set; } - - /// - /// 图片大小 1M = 1024 * 1024 - /// - public long Size { get; set; } - - /// - /// 图片格式 - /// - public string[] ContentType { get; set; } + public FileUploadConfig Document { get; set; } } /// - /// 文档配置 + /// 文件上传配置 /// - public class DocumentConfig + public class FileUploadConfig { /// - /// 路径 + /// 上传路径 /// - public string Path { get; set; } + public string UploadPath { get; set; } /// /// 请求路径 @@ -72,7 +44,7 @@ public class DocumentConfig /// /// 文件大小 10M = 10 * 1024 * 1024 /// - public long Size { get; set; } + public long MaxSize { get; set; } /// /// 最大允许上传个数 -1不限制 diff --git a/Admin.Core.Common/Extensions/EnumExtensions.cs b/Admin.Core.Common/Extensions/EnumExtensions.cs new file mode 100644 index 000000000..4ad2c76ab --- /dev/null +++ b/Admin.Core.Common/Extensions/EnumExtensions.cs @@ -0,0 +1,54 @@ +using Admin.Core.Common.Output; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Reflection; + +namespace Admin.Core.Common.Extensions +{ + public static class EnumExtensions + { + public static string ToDescription(this Enum item) + { + string name = item.ToString(); + var desc = item.GetType().GetField(name)?.GetCustomAttribute(); + return desc?.Description ?? name; + } + + public static long ToInt64(this Enum item) + { + return Convert.ToInt64(item); + } + + public static List ToList(this Enum value, bool ignoreUnKnown = false) + { + var enumType = value.GetType(); + + if (!enumType.IsEnum) + return null; + + return Enum.GetValues(enumType).Cast() + .Where(m => !ignoreUnKnown || !m.ToString().Equals("UnKnown")).Select(x => new OptionOutput + { + Label = x.ToDescription(), + Value = x + }).ToList(); + } + + public static List ToList(bool ignoreUnKnown = false) + { + var enumType = typeof(T); + + if (!enumType.IsEnum) + return null; + + return Enum.GetValues(enumType).Cast() + .Where(m => !ignoreUnKnown || !m.ToString().Equals("UnKnown")).Select(x => new OptionOutput + { + Label = x.ToDescription(), + Value = x + }).ToList(); + } + } +} diff --git a/Admin.Core.Common/Extensions/GuidExtensions.cs b/Admin.Core.Common/Extensions/GuidExtensions.cs index 610ff5fc9..4d6902f88 100644 --- a/Admin.Core.Common/Extensions/GuidExtensions.cs +++ b/Admin.Core.Common/Extensions/GuidExtensions.cs @@ -1,6 +1,6 @@ using System; -namespace Admin.Core.Extensions +namespace Admin.Core.Common.Extensions { public static class GuidExtensions { diff --git a/Admin.Core.Common/Extensions/MethodInfoExtensions.cs b/Admin.Core.Common/Extensions/MethodInfoExtensions.cs index 009ac8d8d..0d7645f47 100644 --- a/Admin.Core.Common/Extensions/MethodInfoExtensions.cs +++ b/Admin.Core.Common/Extensions/MethodInfoExtensions.cs @@ -3,7 +3,7 @@ using System.Reflection; using System.Threading.Tasks; -namespace Admin.Core.Extensions +namespace Admin.Core.Common.Extensions { public static class MethodInfoExtensions { diff --git a/Admin.Core.Common/Extensions/StringExtensions.cs b/Admin.Core.Common/Extensions/StringExtensions.cs index 2317349cb..1748a91a3 100644 --- a/Admin.Core.Common/Extensions/StringExtensions.cs +++ b/Admin.Core.Common/Extensions/StringExtensions.cs @@ -89,5 +89,13 @@ public static string ToBase64(this string s, Encoding encoding) var bytes = encoding.GetBytes(s); return bytes.ToBase64(); } + + public static string ToPath(this string s) + { + if (s.IsNull()) + return string.Empty; + + return s.Replace(@"\", "/"); + } } } diff --git a/Admin.Core.Common/Files/FileInfo.cs b/Admin.Core.Common/Files/FileInfo.cs new file mode 100644 index 000000000..f1eb4c65d --- /dev/null +++ b/Admin.Core.Common/Files/FileInfo.cs @@ -0,0 +1,77 @@ +namespace Admin.Core.Common.Files +{ + /// + /// 文件信息 + /// + public class FileInfo + { + public FileInfo() { } + + /// + /// 初始化文件信息 + /// + /// 文件名称 + /// 大小 + public FileInfo(string fileName, long size = 0L) + { + FileName = fileName; + Size = new FileSize(size); + Extension = System.IO.Path.GetExtension(FileName)?.TrimStart('.'); + } + + /// + /// 上传路径 + /// + public string UploadPath { get; set; } + + /// + /// 相对路径 + /// + public string RelativePath { get; set; } + + /// + /// 文件名 + /// + public string FileName { get; set; } + + /// + /// 保存名 + /// + public string SaveName { get; set; } + + /// + /// 文件大小 + /// + public FileSize Size { get; set; } + + /// + /// 扩展名 + /// + public string Extension { get; set; } + + /// + /// 请求路径 + /// + public string RequestPath { get; set; } + + /// + /// 文件请求路径 + /// + public string FileRequestPath => System.IO.Path.Combine(RequestPath, RelativePath, SaveName).ToPath(); + + /// + /// 文件相对路径 + /// + public string FileRelativePath => System.IO.Path.Combine(RelativePath, SaveName).ToPath(); + + /// + /// 文件目录 + /// + public string FileDirectory => System.IO.Path.Combine(UploadPath, RelativePath).ToPath(); + + /// + /// 文件路径 + /// + public string FilePath => System.IO.Path.Combine(UploadPath, RelativePath, SaveName).ToPath(); + } +} diff --git a/Admin.Core.Common/Files/FileSize.cs b/Admin.Core.Common/Files/FileSize.cs new file mode 100644 index 000000000..8160b61b6 --- /dev/null +++ b/Admin.Core.Common/Files/FileSize.cs @@ -0,0 +1,81 @@ +using Admin.Core.Common.Extensions; + +namespace Admin.Core.Common.Files +{ + /// + /// 文件大小 + /// + public struct FileSize + { + /// + /// 初始化文件大小 + /// + /// 文件大小 + /// 文件大小单位 + public FileSize(long size, FileSizeUnit unit = FileSizeUnit.Byte) + { + switch (unit) + { + case FileSizeUnit.K: + Size = size * 1024; break; + case FileSizeUnit.M: + Size = size * 1024 * 1024; break; + case FileSizeUnit.G: + Size = size * 1024 * 1024 * 1024; break; + default: + Size = size; break; + } + } + + /// + /// 文件字节长度 + /// + public long Size { get; } + + /// + /// 获取文件大小,单位:字节 + /// + public long GetSize() + { + return Size; + } + + /// + /// 获取文件大小,单位:K + /// + public double GetSizeByK() + { + return (Size / 1024.0).ToDouble(2); + } + + /// + /// 获取文件大小,单位:M + /// + public double GetSizeByM() + { + return (Size / 1024.0 / 1024.0).ToDouble(2); + } + + /// + /// 获取文件大小,单位:G + /// + public double GetSizeByG() + { + return (Size / 1024.0 / 1024.0 / 1024.0).ToDouble(2); + } + + /// + /// 输出描述 + /// + public override string ToString() + { + if (Size >= 1024 * 1024 * 1024) + return $"{GetSizeByG()} {FileSizeUnit.G.ToDescription()}"; + if (Size >= 1024 * 1024) + return $"{GetSizeByM()} {FileSizeUnit.M.ToDescription()}"; + if (Size >= 1024) + return $"{GetSizeByK()} {FileSizeUnit.K.ToDescription()}"; + return $"{Size} {FileSizeUnit.Byte.ToDescription()}"; + } + } +} \ No newline at end of file diff --git a/Admin.Core.Common/Files/FileSizeUnit.cs b/Admin.Core.Common/Files/FileSizeUnit.cs new file mode 100644 index 000000000..b1c6fde1d --- /dev/null +++ b/Admin.Core.Common/Files/FileSizeUnit.cs @@ -0,0 +1,31 @@ +using System.ComponentModel; + +namespace Admin.Core.Common.Files +{ + /// + /// 文件大小单位 + /// + public enum FileSizeUnit + { + /// + /// 字节 + /// + [Description("B")] + Byte, + /// + /// K字节 + /// + [Description("KB")] + K, + /// + /// M字节 + /// + [Description("MB")] + M, + /// + /// G字节 + /// + [Description("GB")] + G + } +} \ No newline at end of file diff --git a/Admin.Core.Common/Helpers/StringHelper.cs b/Admin.Core.Common/Helpers/StringHelper.cs index c11ff0c47..700f88b5f 100644 --- a/Admin.Core.Common/Helpers/StringHelper.cs +++ b/Admin.Core.Common/Helpers/StringHelper.cs @@ -1,5 +1,6 @@ using System; using System.Text; +using System.Text.RegularExpressions; namespace Admin.Core.Common.Helpers { @@ -41,5 +42,33 @@ public static string GenerateRandomNumber(int length = 6) } return newRandom.ToString(); } + + public static string Format(string str, object obj) + { + if (str.IsNull()) + { + return str; + } + string s = str; + if (obj.GetType().Name == "JObject") + { + foreach (var item in (Newtonsoft.Json.Linq.JObject)obj) + { + var k = item.Key.ToString(); + var v = item.Value.ToString(); + s = Regex.Replace(s, "\\{" + k + "\\}", v, RegexOptions.IgnoreCase); + } + } + else + { + foreach (System.Reflection.PropertyInfo p in obj.GetType().GetProperties()) + { + var xx = p.Name; + var yy = p.GetValue(obj).ToString(); + s = Regex.Replace(s, "\\{" + xx + "\\}", yy, RegexOptions.IgnoreCase); + } + } + return s; + } } } diff --git a/Admin.Core.Common/Helpers/UploadHelper.cs b/Admin.Core.Common/Helpers/UploadHelper.cs new file mode 100644 index 000000000..46ee39d38 --- /dev/null +++ b/Admin.Core.Common/Helpers/UploadHelper.cs @@ -0,0 +1,86 @@ +using Admin.Core.Common.Attributes; +using Admin.Core.Common.Configs; +using Admin.Core.Common.Output; +using Microsoft.AspNetCore.Http; +using System; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using FileInfo = Admin.Core.Common.Files.FileInfo; + +namespace Admin.Core.Common.Helpers +{ + /// + /// 文件上传帮助类 + /// + [SingleInstance] + public class UploadHelper + { + /// + /// 上传单文件 + /// + /// + /// + /// + /// + /// + public async Task> UploadAsync(IFormFile file, FileUploadConfig config, object args, CancellationToken cancellationToken = default) + { + var res = new ResponseOutput(); + + if (file == null || file.Length < 1) + { + return res.NotOk("请上传文件!"); + } + + //格式限制 + if (!config.ContentType.Contains(file.ContentType)) + { + return res.NotOk("文件格式错误"); + } + + //大小限制 + if (!(file.Length <= config.MaxSize)) + { + return res.NotOk("文件过大"); + } + + var fileInfo = new FileInfo(file.FileName, file.Length) + { + UploadPath = config.UploadPath, + RequestPath = config.RequestPath + }; + + var dateTimeFormat = config.DateTimeFormat.NotNull() ? DateTime.Now.ToString(config.DateTimeFormat) : ""; + var format = config.Format.NotNull() ? StringHelper.Format(config.Format, args) : ""; + fileInfo.RelativePath = Path.Combine(dateTimeFormat, format).ToPath(); + + if (!Directory.Exists(fileInfo.FileDirectory)) + { + Directory.CreateDirectory(fileInfo.FileDirectory); + } + + fileInfo.SaveName = $"{new Snowfake(0).nextId()}.{fileInfo.Extension}"; + + await SaveAsync(file, fileInfo.FilePath, cancellationToken); + + return res.Ok(fileInfo); + } + + /// + /// 保存文件 + /// + /// + /// + /// + /// + public async Task SaveAsync(IFormFile file, string filePath, CancellationToken cancellationToken = default) + { + using (var stream = new FileStream(filePath, FileMode.Create)) + { + await file.CopyToAsync(stream, cancellationToken); + } + } + } +} diff --git a/Admin.Core.Common/Helpers/UtilConvert.cs b/Admin.Core.Common/Helpers/UtilConvert.cs index 8af15256a..d8eb9418b 100644 --- a/Admin.Core.Common/Helpers/UtilConvert.cs +++ b/Admin.Core.Common/Helpers/UtilConvert.cs @@ -69,7 +69,26 @@ public static string ToString(this object thisValue, string errorValue) if (thisValue != null) return thisValue.ToString().Trim(); return errorValue; } - + + /// + /// 转换成Double/Single + /// + /// + /// 小数位数 + /// + public static double ToDouble(this object s, int? digits = null) + { + if (s == null || s == DBNull.Value) + return 0d; + + double.TryParse(s.ToString(), out double result); + + if (digits == null) + return result; + + return Math.Round(result, digits.Value); + } + public static decimal ToDecimal(this object thisValue) { decimal reval; diff --git a/Admin.Core.Common/Helpers/VerifyCodeHelper.cs b/Admin.Core.Common/Helpers/VerifyCodeHelper.cs index 489adc5d3..a28086284 100644 --- a/Admin.Core.Common/Helpers/VerifyCodeHelper.cs +++ b/Admin.Core.Common/Helpers/VerifyCodeHelper.cs @@ -3,12 +3,21 @@ using System.Text; using System.Drawing; using System.Drawing.Imaging; +using Admin.Core.Common.Attributes; +using Admin.Core.Common.Configs; namespace Admin.Core.Common.Helpers { + [SingleInstance] public class VerifyCodeHelper { - private static string GenerateRandom(int length) + private readonly AppConfig _appConfig; + public VerifyCodeHelper(AppConfig appConfig) + { + _appConfig = appConfig; + } + + private string GenerateRandom(int length) { var chars = new StringBuilder(); //验证码的字符集,去掉了一些容易混淆的字符 @@ -22,7 +31,7 @@ private static string GenerateRandom(int length) return chars.ToString(); } - public static byte[] Draw(out string code, int length = 4) + public byte[] Draw(out string code, int length = 4) { int codeW = 110; int codeH = 36; @@ -31,7 +40,7 @@ public static byte[] Draw(out string code, int length = 4) //颜色列表,用于验证码、噪线、噪点 Color[] color = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue }; //字体列表,用于验证码 - string[] font = { "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" }; + string[] font = _appConfig.VarifyCode.Font; code = GenerateRandom(length); @@ -73,7 +82,7 @@ public static byte[] Draw(out string code, int length = 4) } } - public static string GetBase64String(out string code, int length = 4) + public string GetBase64String(out string code, int length = 4) { return Convert.ToBase64String(Draw(out code, length)); } diff --git a/Admin.Core.Model/Input/PageInput.cs b/Admin.Core.Common/Input/PageInput.cs similarity index 85% rename from Admin.Core.Model/Input/PageInput.cs rename to Admin.Core.Common/Input/PageInput.cs index ec81f0248..5765fe2bb 100644 --- a/Admin.Core.Model/Input/PageInput.cs +++ b/Admin.Core.Common/Input/PageInput.cs @@ -1,7 +1,7 @@ -namespace Admin.Core.Model.Input +namespace Admin.Core.Common.Input { /// - /// 通用分页信息输入类 + /// 分页信息输入 /// public class PageInput { diff --git a/Admin.Core.Model/Output/IResponseOutput.cs b/Admin.Core.Common/Output/IResponseOutput.cs similarity index 84% rename from Admin.Core.Model/Output/IResponseOutput.cs rename to Admin.Core.Common/Output/IResponseOutput.cs index f0402a68e..998af36c0 100644 --- a/Admin.Core.Model/Output/IResponseOutput.cs +++ b/Admin.Core.Common/Output/IResponseOutput.cs @@ -1,9 +1,9 @@ using System.Text.Json.Serialization; -namespace Admin.Core.Model.Output +namespace Admin.Core.Common.Output { /// - /// 输出数据接口 + /// 响应数据输出接口 /// public interface IResponseOutput { @@ -20,7 +20,7 @@ public interface IResponseOutput } /// - /// 响应数据泛型接口 + /// 响应数据输出泛型接口 /// /// public interface IResponseOutput : IResponseOutput diff --git a/Admin.Core.Common/Output/OptionOutput.cs b/Admin.Core.Common/Output/OptionOutput.cs new file mode 100644 index 000000000..154ba2621 --- /dev/null +++ b/Admin.Core.Common/Output/OptionOutput.cs @@ -0,0 +1,28 @@ +namespace Admin.Core.Common.Output +{ + /// + /// 下拉选项输出 + /// + public class OptionOutput + { + /// + /// 名称 + /// + public string Label { get; set; } + + /// + /// 值 + /// + public object Value { get; set; } + + /// + /// 禁用 + /// + public bool Disabled { get; set; } + + /// + /// 额外数据 + /// + public object Data { get; set; } + } +} diff --git a/Admin.Core.Model/Output/PageOutput.cs b/Admin.Core.Common/Output/PageOutput.cs similarity index 83% rename from Admin.Core.Model/Output/PageOutput.cs rename to Admin.Core.Common/Output/PageOutput.cs index 688b9e6fd..505e5bbec 100644 --- a/Admin.Core.Model/Output/PageOutput.cs +++ b/Admin.Core.Common/Output/PageOutput.cs @@ -1,9 +1,9 @@ using System.Collections.Generic; -namespace Admin.Core.Model.Output +namespace Admin.Core.Common.Output { /// - /// 通用分页信息输出类 + /// 分页信息输出 /// public class PageOutput { diff --git a/Admin.Core.Model/Output/ResponseOutput.cs b/Admin.Core.Common/Output/ResponseOutput.cs similarity index 97% rename from Admin.Core.Model/Output/ResponseOutput.cs rename to Admin.Core.Common/Output/ResponseOutput.cs index 8283d4517..d99afa0aa 100644 --- a/Admin.Core.Model/Output/ResponseOutput.cs +++ b/Admin.Core.Common/Output/ResponseOutput.cs @@ -1,9 +1,9 @@ using Newtonsoft.Json; -namespace Admin.Core.Model.Output +namespace Admin.Core.Common.Output { /// - /// 输出数据 + /// 响应数据输出 /// public class ResponseOutput : IResponseOutput { @@ -59,7 +59,7 @@ public ResponseOutput Ok(T data, string msg = null) } /// - /// 输出数据静态类 + /// 响应数据静态输出 /// public static partial class ResponseOutput { diff --git a/Admin.Core.Model/Admin/DocumentImageEntity.cs b/Admin.Core.Model/Admin/DocumentImageEntity.cs new file mode 100644 index 000000000..00084386d --- /dev/null +++ b/Admin.Core.Model/Admin/DocumentImageEntity.cs @@ -0,0 +1,24 @@ +using FreeSql.DataAnnotations; + +namespace Admin.Core.Model.Admin +{ + /// + /// 文档图片 + /// + [Table(Name = "ad_document_image")] + [Index("uk_document_image_documentid_url", nameof(DocumentId) + "," + nameof(Url), true)] + public class DocumentImageEntity: EntityAdd + { + /// + /// 用户Id + /// + public long DocumentId { get; set; } + + public DocumentEntity Document { get; set; } + + /// + /// 请求路径 + /// + public string Url { get; set; } + } +} diff --git a/Admin.Core.Repository/Admin/DocumentImage/DocumentImageRepository.cs b/Admin.Core.Repository/Admin/DocumentImage/DocumentImageRepository.cs new file mode 100644 index 000000000..7be796fcb --- /dev/null +++ b/Admin.Core.Repository/Admin/DocumentImage/DocumentImageRepository.cs @@ -0,0 +1,13 @@ +using FreeSql; +using Admin.Core.Model.Admin; +using Admin.Core.Common.Auth; + +namespace Admin.Core.Repository.Admin +{ + public class DocumentImageRepository : RepositoryBase, IDocumentImageRepository + { + public DocumentImageRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user) + { + } + } +} diff --git a/Admin.Core.Repository/Admin/DocumentImage/IDocumentImageRepository.cs b/Admin.Core.Repository/Admin/DocumentImage/IDocumentImageRepository.cs new file mode 100644 index 000000000..4d96f7e4d --- /dev/null +++ b/Admin.Core.Repository/Admin/DocumentImage/IDocumentImageRepository.cs @@ -0,0 +1,9 @@ + +using Admin.Core.Model.Admin; + +namespace Admin.Core.Repository.Admin +{ + public partial interface IDocumentImageRepository : IRepositoryBase + { + } +} \ No newline at end of file diff --git a/Admin.Core.Services/Admin/Api/ApiService.cs b/Admin.Core.Services/Admin/Api/ApiService.cs index a4fa4b2fe..f5eb061c1 100644 --- a/Admin.Core.Services/Admin/Api/ApiService.cs +++ b/Admin.Core.Services/Admin/Api/ApiService.cs @@ -2,8 +2,8 @@ using System.Threading.Tasks; using System.Collections.Generic; using AutoMapper; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Repository.Admin; using Admin.Core.Service.Admin.Api.Input; diff --git a/Admin.Core.Services/Admin/Api/IApiService.cs b/Admin.Core.Services/Admin/Api/IApiService.cs index 246f4bfe4..af1a8dbe1 100644 --- a/Admin.Core.Services/Admin/Api/IApiService.cs +++ b/Admin.Core.Services/Admin/Api/IApiService.cs @@ -1,7 +1,7 @@ -using Admin.Core.Model.Input; +using Admin.Core.Common.Input; using Admin.Core.Service.Admin.Api.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using System.Threading.Tasks; diff --git a/Admin.Core.Services/Admin/Auth/AuthService.cs b/Admin.Core.Services/Admin/Auth/AuthService.cs index cd03e938f..d952e71f9 100644 --- a/Admin.Core.Services/Admin/Auth/AuthService.cs +++ b/Admin.Core.Services/Admin/Auth/AuthService.cs @@ -2,7 +2,7 @@ using System.Linq; using System.Threading.Tasks; using Admin.Core.Model.Admin; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Admin.Core.Repository.Admin; using Admin.Core.Common.Helpers; using Admin.Core.Common.Auth; @@ -18,6 +18,7 @@ public class AuthService : IAuthService private readonly IUser _user; private readonly ICache _cache; private readonly IMapper _mapper; + private readonly VerifyCodeHelper _verifyCodeHelper; private readonly IUserRepository _userRepository; private readonly IPermissionRepository _permissionRepository; private readonly IRolePermissionRepository _rolePermissionRepository; @@ -26,6 +27,7 @@ public AuthService( IUser user, ICache cache, IMapper mapper, + VerifyCodeHelper verifyCodeHelper, IUserRepository userRepository, IPermissionRepository permissionRepository, IRolePermissionRepository rolePermissionRepository @@ -34,6 +36,7 @@ IRolePermissionRepository rolePermissionRepository _user = user; _cache = cache; _mapper = mapper; + _verifyCodeHelper = verifyCodeHelper; _userRepository = userRepository; _permissionRepository = permissionRepository; _rolePermissionRepository = rolePermissionRepository; @@ -148,7 +151,7 @@ public async Task GetUserInfoAsync() public async Task GetVerifyCodeAsync(string lastKey) { - var img = VerifyCodeHelper.GetBase64String(out string code); + var img = _verifyCodeHelper.GetBase64String(out string code); //删除上次缓存的验证码 if (lastKey.NotNull()) diff --git a/Admin.Core.Services/Admin/Auth/IAuthService.cs b/Admin.Core.Services/Admin/Auth/IAuthService.cs index 208558e83..5fa04e869 100644 --- a/Admin.Core.Services/Admin/Auth/IAuthService.cs +++ b/Admin.Core.Services/Admin/Auth/IAuthService.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Admin.Core.Service.Admin.Auth.Input; namespace Admin.Core.Service.Admin.Auth diff --git a/Admin.Core.Services/Admin/Cache/CacheService.cs b/Admin.Core.Services/Admin/Cache/CacheService.cs index a46cbbc3b..a01f3bf0b 100644 --- a/Admin.Core.Services/Admin/Cache/CacheService.cs +++ b/Admin.Core.Services/Admin/Cache/CacheService.cs @@ -1,6 +1,6 @@ using Admin.Core.Common.Auth; using Admin.Core.Common.Cache; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Microsoft.Extensions.Logging; using System.Collections.Generic; using System.ComponentModel; diff --git a/Admin.Core.Services/Admin/Cache/ICacheService.cs b/Admin.Core.Services/Admin/Cache/ICacheService.cs index a802eb801..a56877b1c 100644 --- a/Admin.Core.Services/Admin/Cache/ICacheService.cs +++ b/Admin.Core.Services/Admin/Cache/ICacheService.cs @@ -1,6 +1,6 @@ -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using System.Threading.Tasks; namespace Admin.Core.Service.Admin.Cache diff --git a/Admin.Core.Services/Admin/Dictionary/DictionaryService.cs b/Admin.Core.Services/Admin/Dictionary/DictionaryService.cs index 9f4e6b1cb..cbb51a61e 100644 --- a/Admin.Core.Services/Admin/Dictionary/DictionaryService.cs +++ b/Admin.Core.Services/Admin/Dictionary/DictionaryService.cs @@ -1,7 +1,7 @@ using System.Threading.Tasks; using AutoMapper; -using Admin.Core.Model.Output; -using Admin.Core.Model.Input; +using Admin.Core.Common.Output; +using Admin.Core.Common.Input; using Admin.Core.Model.Admin; using Admin.Core.Repository.Admin; using Admin.Core.Service.Admin.Dictionary.Input; diff --git a/Admin.Core.Services/Admin/Dictionary/IDictionaryService.cs b/Admin.Core.Services/Admin/Dictionary/IDictionaryService.cs index 96eceff30..0d1730d12 100644 --- a/Admin.Core.Services/Admin/Dictionary/IDictionaryService.cs +++ b/Admin.Core.Services/Admin/Dictionary/IDictionaryService.cs @@ -1,7 +1,7 @@ using Admin.Core.Model; using System.Threading.Tasks; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Service.Admin.Dictionary.Input; diff --git a/Admin.Core.Services/Admin/Document/DocumentService.cs b/Admin.Core.Services/Admin/Document/DocumentService.cs index a63ccd509..1ac21bc7f 100644 --- a/Admin.Core.Services/Admin/Document/DocumentService.cs +++ b/Admin.Core.Services/Admin/Document/DocumentService.cs @@ -4,7 +4,7 @@ using AutoMapper; using Admin.Core.Repository.Admin; using Admin.Core.Model.Admin; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Admin.Core.Service.Admin.Document.Input; using Admin.Core.Service.Admin.Document.Output; using Admin.Core.Common.Cache; @@ -15,42 +15,42 @@ namespace Admin.Core.Service.Admin.Document public class DocumentService : IDocumentService { private readonly IMapper _mapper; - private readonly ICache _cache; - private readonly IDocumentRepository _DocumentRepository; + private readonly IDocumentRepository _documentRepository; + private readonly IDocumentImageRepository _documentImageRepository; public DocumentService( IMapper mapper, - ICache cache, - IDocumentRepository DocumentRepository + IDocumentRepository DocumentRepository, + IDocumentImageRepository documentImageRepository ) { _mapper = mapper; - _cache = cache; - _DocumentRepository = DocumentRepository; + _documentRepository = DocumentRepository; + _documentImageRepository = documentImageRepository; } public async Task GetAsync(long id) { - var result = await _DocumentRepository.GetAsync(id); + var result = await _documentRepository.GetAsync(id); return ResponseOutput.Ok(result); } public async Task GetGroupAsync(long id) { - var result = await _DocumentRepository.GetAsync(id); + var result = await _documentRepository.GetAsync(id); return ResponseOutput.Ok(result); } public async Task GetMenuAsync(long id) { - var result = await _DocumentRepository.GetAsync(id); + var result = await _documentRepository.GetAsync(id); return ResponseOutput.Ok(result); } public async Task GetContentAsync(long id) { - var result = await _DocumentRepository.GetAsync(id); + var result = await _documentRepository.GetAsync(id); return ResponseOutput.Ok(result); } @@ -61,7 +61,7 @@ public async Task GetListAsync(string key, DateTime? start, Dat end = end.Value.AddDays(1); } - var data = await _DocumentRepository + var data = await _documentRepository .WhereIf(key.NotNull(), a => a.Name.Contains(key) || a.Label.Contains(key)) .WhereIf(start.HasValue && end.HasValue, a => a.CreatedTime.Value.BetweenEnd(start.Value, end.Value)) .OrderBy(a => a.ParentId) @@ -71,20 +71,38 @@ public async Task GetListAsync(string key, DateTime? start, Dat return ResponseOutput.Ok(data); } + public async Task GetImageListAsync(long id) + { + var result = await _documentImageRepository.Select + .Where(a => a.DocumentId == id) + .OrderByDescending(a=>a.Id) + .ToListAsync(a => a.Url); + + return ResponseOutput.Ok(result); + } + public async Task AddGroupAsync(DocumentAddGroupInput input) { var entity = _mapper.Map(input); - var id = (await _DocumentRepository.InsertAsync(entity)).Id; + var id = (await _documentRepository.InsertAsync(entity)).Id; - return ResponseOutput.Ok(id > 0); + return ResponseOutput.Result(id > 0); } public async Task AddMenuAsync(DocumentAddMenuInput input) { var entity = _mapper.Map(input); - var id = (await _DocumentRepository.InsertAsync(entity)).Id; + var id = (await _documentRepository.InsertAsync(entity)).Id; + + return ResponseOutput.Result(id > 0); + } + + public async Task AddImageAsync(DocumentAddImageInput input) + { + var entity = _mapper.Map(input); + var id = (await _documentImageRepository.InsertAsync(entity)).Id; - return ResponseOutput.Ok(id > 0); + return ResponseOutput.Result(id > 0); } public async Task UpdateGroupAsync(DocumentUpdateGroupInput input) @@ -92,9 +110,9 @@ public async Task UpdateGroupAsync(DocumentUpdateGroupInput inp var result = false; if (input != null && input.Id > 0) { - var entity = await _DocumentRepository.GetAsync(input.Id); + var entity = await _documentRepository.GetAsync(input.Id); entity = _mapper.Map(input, entity); - result = (await _DocumentRepository.UpdateAsync(entity)) > 0; + result = (await _documentRepository.UpdateAsync(entity)) > 0; } return ResponseOutput.Result(result); @@ -105,9 +123,9 @@ public async Task UpdateMenuAsync(DocumentUpdateMenuInput input var result = false; if (input != null && input.Id > 0) { - var entity = await _DocumentRepository.GetAsync(input.Id); + var entity = await _documentRepository.GetAsync(input.Id); entity = _mapper.Map(input, entity); - result = (await _DocumentRepository.UpdateAsync(entity)) > 0; + result = (await _documentRepository.UpdateAsync(entity)) > 0; } return ResponseOutput.Result(result); @@ -118,9 +136,9 @@ public async Task UpdateContentAsync(DocumentUpdateContentInput var result = false; if (input != null && input.Id > 0) { - var entity = await _DocumentRepository.GetAsync(input.Id); + var entity = await _documentRepository.GetAsync(input.Id); entity = _mapper.Map(input, entity); - result = (await _DocumentRepository.UpdateAsync(entity)) > 0; + result = (await _documentRepository.UpdateAsync(entity)) > 0; } return ResponseOutput.Result(result); @@ -131,7 +149,7 @@ public async Task DeleteAsync(long id) var result = false; if (id > 0) { - result = (await _DocumentRepository.DeleteAsync(m => m.Id == id)) > 0; + result = (await _documentRepository.DeleteAsync(m => m.Id == id)) > 0; } return ResponseOutput.Result(result); @@ -139,13 +157,13 @@ public async Task DeleteAsync(long id) public async Task SoftDeleteAsync(long id) { - var result = await _DocumentRepository.SoftDeleteAsync(id); + var result = await _documentRepository.SoftDeleteAsync(id); return ResponseOutput.Result(result); } public async Task GetPlainListAsync() { - var documents = await _DocumentRepository.Select + var documents = await _documentRepository.Select .OrderBy(a => a.ParentId) .OrderBy(a => a.Sort) .ToListAsync(a => new { a.Id, a.ParentId, a.Label, a.Type, a.Opened }); diff --git a/Admin.Core.Services/Admin/Document/IDocumentService.cs b/Admin.Core.Services/Admin/Document/IDocumentService.cs index 7c8734f9a..1888334f4 100644 --- a/Admin.Core.Services/Admin/Document/IDocumentService.cs +++ b/Admin.Core.Services/Admin/Document/IDocumentService.cs @@ -1,7 +1,7 @@  using System; using System.Threading.Tasks; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Admin.Core.Service.Admin.Document.Input; namespace Admin.Core.Service.Admin.Document @@ -10,6 +10,8 @@ public partial interface IDocumentService { Task GetAsync(long id); + Task GetImageListAsync(long id); + Task GetGroupAsync(long id); Task GetMenuAsync(long id); @@ -24,6 +26,8 @@ public partial interface IDocumentService Task AddMenuAsync(DocumentAddMenuInput input); + Task AddImageAsync(DocumentAddImageInput input); + Task UpdateGroupAsync(DocumentUpdateGroupInput input); Task UpdateMenuAsync(DocumentUpdateMenuInput input); diff --git a/Admin.Core.Services/Admin/Document/Input/DocumentAddImageInput.cs b/Admin.Core.Services/Admin/Document/Input/DocumentAddImageInput.cs new file mode 100644 index 000000000..0af80bb15 --- /dev/null +++ b/Admin.Core.Services/Admin/Document/Input/DocumentAddImageInput.cs @@ -0,0 +1,15 @@ +namespace Admin.Core.Service.Admin.Document.Input +{ + public class DocumentAddImageInput + { + /// + /// ûId + /// + public long DocumentId { get; set; } + + /// + /// · + /// + public string Url { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/Document/Input/DocumentUpdateContentInput.cs b/Admin.Core.Services/Admin/Document/Input/DocumentUpdateContentInput.cs index 31165fe11..8a44f9b67 100644 --- a/Admin.Core.Services/Admin/Document/Input/DocumentUpdateContentInput.cs +++ b/Admin.Core.Services/Admin/Document/Input/DocumentUpdateContentInput.cs @@ -18,6 +18,11 @@ public class DocumentUpdateContentInput /// public string Content { get; set; } + /// + /// Html + /// + public string Html { get; set; } + /// /// 汾 /// diff --git a/Admin.Core.Services/Admin/Document/Input/DocumentUploadImageInput.cs b/Admin.Core.Services/Admin/Document/Input/DocumentUploadImageInput.cs new file mode 100644 index 000000000..985399fac --- /dev/null +++ b/Admin.Core.Services/Admin/Document/Input/DocumentUploadImageInput.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Http; + +namespace Admin.Core.Service.Admin.Document.Input +{ + public class DocumentUploadImageInput + { + /// + /// ϴļ + /// + public IFormFile File { get; set; } + + /// + /// ĵ + /// + public long Id { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/Document/Output/DocumentGetContentOutput.cs b/Admin.Core.Services/Admin/Document/Output/DocumentGetContentOutput.cs index 9fc6b4a0d..f004e63df 100644 --- a/Admin.Core.Services/Admin/Document/Output/DocumentGetContentOutput.cs +++ b/Admin.Core.Services/Admin/Document/Output/DocumentGetContentOutput.cs @@ -1,9 +1,29 @@ using Admin.Core.Service.Admin.Document.Input; +using Newtonsoft.Json; namespace Admin.Core.Service.Admin.Document.Output { - public class DocumentGetContentOutput : DocumentUpdateContentInput + public class DocumentGetContentOutput { + /// + /// + /// + public long Id { get; set; } + + /// + /// + /// + public string Label { get; set; } + + /// + /// + /// + public string Content { get; set; } + + /// + /// 汾 + /// + public long Version { get; set; } } } diff --git a/Admin.Core.Services/Admin/Document/_MapConfig.cs b/Admin.Core.Services/Admin/Document/_MapConfig.cs index 7b464b76c..253477312 100644 --- a/Admin.Core.Services/Admin/Document/_MapConfig.cs +++ b/Admin.Core.Services/Admin/Document/_MapConfig.cs @@ -13,6 +13,7 @@ public MapConfig() { CreateMap(); CreateMap(); + CreateMap(); CreateMap(); CreateMap(); diff --git a/Admin.Core.Services/Admin/LoginLog/ILoginLogService.cs b/Admin.Core.Services/Admin/LoginLog/ILoginLogService.cs index 778c9c780..f65cbbb10 100644 --- a/Admin.Core.Services/Admin/LoginLog/ILoginLogService.cs +++ b/Admin.Core.Services/Admin/LoginLog/ILoginLogService.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Service.Admin.LoginLog.Input; diff --git a/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs b/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs index be4efb04d..d62e5cfaf 100644 --- a/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs +++ b/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs @@ -1,8 +1,8 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using AutoMapper; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Repository.Admin; using Admin.Core.Service.Admin.LoginLog.Input; diff --git a/Admin.Core.Services/Admin/OprationLog/IOprationLogService.cs b/Admin.Core.Services/Admin/OprationLog/IOprationLogService.cs index 6d2954625..cac83a037 100644 --- a/Admin.Core.Services/Admin/OprationLog/IOprationLogService.cs +++ b/Admin.Core.Services/Admin/OprationLog/IOprationLogService.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Service.Admin.OprationLog.Input; diff --git a/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs b/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs index fcbe61e52..bdcb59ea7 100644 --- a/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs +++ b/Admin.Core.Services/Admin/OprationLog/OprationLogService.cs @@ -2,8 +2,8 @@ using Microsoft.AspNetCore.Http; using AutoMapper; using Admin.Core.Common.Auth; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Repository.Admin; using Admin.Core.Service.Admin.OprationLog.Input; diff --git a/Admin.Core.Services/Admin/Permission/IPermissionService.cs b/Admin.Core.Services/Admin/Permission/IPermissionService.cs index 0d97b029d..d6028a7ad 100644 --- a/Admin.Core.Services/Admin/Permission/IPermissionService.cs +++ b/Admin.Core.Services/Admin/Permission/IPermissionService.cs @@ -1,7 +1,7 @@  using System; using System.Threading.Tasks; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Admin.Core.Service.Admin.Permission.Input; namespace Admin.Core.Service.Admin.Permission diff --git a/Admin.Core.Services/Admin/Permission/PermissionService.cs b/Admin.Core.Services/Admin/Permission/PermissionService.cs index c3d06f881..e8ce8f889 100644 --- a/Admin.Core.Services/Admin/Permission/PermissionService.cs +++ b/Admin.Core.Services/Admin/Permission/PermissionService.cs @@ -5,7 +5,7 @@ using AutoMapper; using Admin.Core.Repository.Admin; using Admin.Core.Model.Admin; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Admin.Core.Service.Admin.Permission.Input; using Admin.Core.Service.Admin.Permission.Output; using Admin.Core.Common.Cache; diff --git a/Admin.Core.Services/Admin/Role/IRoleService.cs b/Admin.Core.Services/Admin/Role/IRoleService.cs index 65b57114f..155e53bab 100644 --- a/Admin.Core.Services/Admin/Role/IRoleService.cs +++ b/Admin.Core.Services/Admin/Role/IRoleService.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Service.Admin.Role.Input; diff --git a/Admin.Core.Services/Admin/Role/RoleService.cs b/Admin.Core.Services/Admin/Role/RoleService.cs index 33fa277a8..e0c8d14f8 100644 --- a/Admin.Core.Services/Admin/Role/RoleService.cs +++ b/Admin.Core.Services/Admin/Role/RoleService.cs @@ -1,8 +1,8 @@ using System.Threading.Tasks; using AutoMapper; using Admin.Core.Common.Auth; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Repository.Admin; using Admin.Core.Service.Admin.Role.Input; diff --git a/Admin.Core.Services/Admin/User/IUserService.cs b/Admin.Core.Services/Admin/User/IUserService.cs index d4cfd02f4..b0a4fb141 100644 --- a/Admin.Core.Services/Admin/User/IUserService.cs +++ b/Admin.Core.Services/Admin/User/IUserService.cs @@ -1,8 +1,8 @@ using System.Collections.Generic; using System.Threading.Tasks; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Service.Admin.User.Input; using Admin.Core.Service.Admin.User.Output; diff --git a/Admin.Core.Services/Admin/User/UserService.cs b/Admin.Core.Services/Admin/User/UserService.cs index 976873a32..67f78aeea 100644 --- a/Admin.Core.Services/Admin/User/UserService.cs +++ b/Admin.Core.Services/Admin/User/UserService.cs @@ -5,8 +5,8 @@ using Admin.Core.Common.Helpers; using Admin.Core.Common.Auth; using Admin.Core.Common.Cache; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Repository.Admin; using Admin.Core.Service.Admin.User; @@ -122,7 +122,7 @@ public async Task UpdateAsync(UserUpdateInput input) _mapper.Map(input, entity); await _userRepository.UpdateAsync(entity); - await _userRoleRepository.Where(m => m.UserId == entity.Id).ToDelete().ExecuteAffrowsAsync(); + await _userRoleRepository.DeleteAsync(a => a.UserId == entity.Id); if (input.RoleIds != null && input.RoleIds.Any()) { var roles = input.RoleIds.Select(d => new UserRoleEntity(entity.Id, d)); diff --git a/Admin.Core.Services/Admin/View/IViewService.cs b/Admin.Core.Services/Admin/View/IViewService.cs index 24474e896..812f67877 100644 --- a/Admin.Core.Services/Admin/View/IViewService.cs +++ b/Admin.Core.Services/Admin/View/IViewService.cs @@ -1,7 +1,7 @@ using System.Threading.Tasks; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Service.Admin.View.Input; diff --git a/Admin.Core.Services/Admin/View/ViewService.cs b/Admin.Core.Services/Admin/View/ViewService.cs index 6dd7d998a..d8f0ed112 100644 --- a/Admin.Core.Services/Admin/View/ViewService.cs +++ b/Admin.Core.Services/Admin/View/ViewService.cs @@ -2,8 +2,8 @@ using System.Collections.Generic; using System.Threading.Tasks; using AutoMapper; -using Admin.Core.Model.Output; -using Admin.Core.Model.Input; +using Admin.Core.Common.Output; +using Admin.Core.Common.Input; using Admin.Core.Model.Admin; using Admin.Core.Repository.Admin; using Admin.Core.Service.Admin.View.Input; diff --git a/Admin.Core.Tests/Controller.Tests/ApiTest.cs b/Admin.Core.Tests/Controller.Tests/ApiTest.cs index fa1c1520b..28ce097f4 100644 --- a/Admin.Core.Tests/Controller.Tests/ApiTest.cs +++ b/Admin.Core.Tests/Controller.Tests/ApiTest.cs @@ -2,7 +2,7 @@ using Moq; using Admin.Core.Model.Admin; using Admin.Core.Service.Admin.Api; -using Admin.Core.Model.Input; +using Admin.Core.Common.Input; using Admin.Core.Controllers.Admin; namespace Admin.Core.Tests.Controller.Tests diff --git a/Admin.Core/Admin.Core.Model.xml b/Admin.Core/Admin.Core.Model.xml index 2c209d605..c56757cf7 100644 --- a/Admin.Core/Admin.Core.Model.xml +++ b/Admin.Core/Admin.Core.Model.xml @@ -144,6 +144,21 @@ 描述 + + + 文档图片 + + + + + 用户Id + + + + + 请求路径 + + 文档类型 @@ -604,154 +619,5 @@ 版本 - - - 通用分页信息输入类 - - - - - 当前页标 - - - - - 每页大小 - - - - - 查询条件 - - - - - 输出数据接口 - - - - - 是否成功 - - - - - 消息 - - - - - 响应数据泛型接口 - - - - - - 返回数据 - - - - - 通用分页信息输出类 - - - - - 数据总数 - - - - - 数据 - - - - - 输出数据 - - - - - 是否成功标记 - - - - - 状态码 - - - - - 消息 - - - - - 数据 - - - - - 成功 - - 数据 - 消息 - - - - 失败 - - 消息 - 数据 - - - - - 输出数据静态类 - - - - - 成功 - - 数据 - 消息 - - - - - 成功 - - - - - - 失败 - - 消息 - 数据 - - - - - 失败 - - 消息 - - - - - 根据布尔值返回结果 - - - - - - - 根据布尔值返回结果 - - - - diff --git a/Admin.Core/Admin.Core.Service.xml b/Admin.Core/Admin.Core.Service.xml index bb9b782ec..627c9ef9f 100644 --- a/Admin.Core/Admin.Core.Service.xml +++ b/Admin.Core/Admin.Core.Service.xml @@ -23,7 +23,7 @@ - + 获得分页 @@ -390,6 +390,16 @@ 打开 + + + 用户Id + + + + + 请求路径 + + 父级节点 @@ -430,6 +440,11 @@ 内容 + + + Html + + 版本 @@ -455,6 +470,36 @@ 版本 + + + 上传文件 + + + + + 文档编号 + + + + + 编号 + + + + + 名称 + + + + + 内容 + + + + + 版本 + + 编号 diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index f7cca1f9d..840271774 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -79,7 +79,7 @@ - + 查询分页接口 @@ -190,7 +190,7 @@ - + 查询分页数据字典 @@ -232,6 +232,13 @@ + + + 查询文档图片列表 + + + + 查询单条分组 @@ -301,6 +308,13 @@ + + + 上传文档图片 + + + + 图片管理 @@ -318,7 +332,7 @@ 登录日志管理 - + 查询分页登录日志 @@ -330,7 +344,7 @@ 操作日志管理 - + 查询分页操作日志 @@ -453,7 +467,7 @@ - + 查询分页角色 @@ -506,7 +520,7 @@ - + 查询分页用户 @@ -574,7 +588,7 @@ - + 查询分页视图 diff --git a/Admin.Core/Aop/AopHelper.cs b/Admin.Core/Aop/AopHelper.cs index a909d8fe4..af691633a 100644 --- a/Admin.Core/Aop/AopHelper.cs +++ b/Admin.Core/Aop/AopHelper.cs @@ -8,7 +8,7 @@ namespace Admin.Core.Aop { public class AopHelper { - public static async Task ExecuteGenericMethod(Task returnValue, Action callBackAction, Action exceptionAction) + public static async Task ExecuteGenericMethod(Task returnValue, Action callBackAction, Action exceptionAction, Action finallyAction) { try { @@ -21,14 +21,18 @@ public static async Task ExecuteGenericMethod(Task returnValue, Action< exceptionAction?.Invoke(ex); throw; } + finally + { + finallyAction?.Invoke(); + } } - public static object CallGenericMethod(IInvocation invocation, Action callBackAction, Action exceptionAction) + public static object CallGenericMethod(IInvocation invocation, Action callBackAction, Action exceptionAction, Action finallyAction) { return typeof(AopHelper) .GetMethod("ExecuteGenericMethod", BindingFlags.Public | BindingFlags.Static) .MakeGenericMethod(invocation.Method.ReturnType.GenericTypeArguments[0]) - .Invoke(null, new object[] { invocation.ReturnValue, callBackAction, exceptionAction }); + .Invoke(null, new object[] { invocation.ReturnValue, callBackAction, exceptionAction, finallyAction }); } } } diff --git a/Admin.Core/Aop/TransactionInterceptor.cs b/Admin.Core/Aop/TransactionInterceptor.cs index 184e11c22..2401169ba 100644 --- a/Admin.Core/Aop/TransactionInterceptor.cs +++ b/Admin.Core/Aop/TransactionInterceptor.cs @@ -2,8 +2,8 @@ using System.Threading.Tasks; using Castle.DynamicProxy; using FreeSql; -using Admin.Core.Extensions; -using Admin.Core.Model.Output; +using Admin.Core.Common.Extensions; +using Admin.Core.Common.Output; using Admin.Core.Common.Attributes; namespace Admin.Core.Aop @@ -34,8 +34,20 @@ public async void Intercept(IInvocation invocation) { if (invocation.Method.ReturnType == typeof(Task)) { - await (Task)invocation.ReturnValue; - _unitOfWork.Commit(); + try + { + await (Task)invocation.ReturnValue; + _unitOfWork.Commit(); + } + catch (Exception ex) + { + _unitOfWork.Rollback(); + throw ex; + } + finally + { + _unitOfWork.Dispose(); + } } else { @@ -53,11 +65,18 @@ public async void Intercept(IInvocation invocation) { _unitOfWork.Rollback(); } - _unitOfWork.Commit(); + else + { + _unitOfWork.Commit(); + } }, ex => { _unitOfWork.Rollback(); + }, + ()=> + { + _unitOfWork.Dispose(); }); } } @@ -70,6 +89,13 @@ public async void Intercept(IInvocation invocation) { _unitOfWork.Rollback(); } + else + { + _unitOfWork.Commit(); + } + } + else + { _unitOfWork.Commit(); } } diff --git a/Admin.Core/Attributes/ValidateInputAttribute.cs b/Admin.Core/Attributes/ValidateInputAttribute.cs index 0526eb51a..7209d070c 100644 --- a/Admin.Core/Attributes/ValidateInputAttribute.cs +++ b/Admin.Core/Attributes/ValidateInputAttribute.cs @@ -1,6 +1,6 @@ using System; using System.Linq; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; diff --git a/Admin.Core/Auth/ResponseAuthenticationHandler.cs b/Admin.Core/Auth/ResponseAuthenticationHandler.cs index 07af41883..191964c37 100644 --- a/Admin.Core/Auth/ResponseAuthenticationHandler.cs +++ b/Admin.Core/Auth/ResponseAuthenticationHandler.cs @@ -9,6 +9,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using StatusCodes = Admin.Core.Enums.StatusCodes; +using Admin.Core.Common.Extensions; namespace Admin.Core.Auth { @@ -39,7 +40,7 @@ await Response.WriteAsync(JsonConvert.SerializeObject( new ResponseStatusData { Code = StatusCodes.Status401Unauthorized, - Msg = StatusCodes.Status401Unauthorized.ToDescriptionOrString() + Msg = StatusCodes.Status401Unauthorized.ToDescription() }, new JsonSerializerSettings() { @@ -56,7 +57,7 @@ await Response.WriteAsync(JsonConvert.SerializeObject( new ResponseStatusData { Code = StatusCodes.Status403Forbidden, - Msg = StatusCodes.Status403Forbidden.ToDescriptionOrString() + Msg = StatusCodes.Status403Forbidden.ToDescription() }, new JsonSerializerSettings() { diff --git a/Admin.Core/Controllers/Admin/ApiController.cs b/Admin.Core/Controllers/Admin/ApiController.cs index cbdbbe3c1..8543f99da 100644 --- a/Admin.Core/Controllers/Admin/ApiController.cs +++ b/Admin.Core/Controllers/Admin/ApiController.cs @@ -1,7 +1,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Service.Admin.Api; using Admin.Core.Service.Admin.Api.Input; diff --git a/Admin.Core/Controllers/Admin/AuthController.cs b/Admin.Core/Controllers/Admin/AuthController.cs index 806a56045..e42736a57 100644 --- a/Admin.Core/Controllers/Admin/AuthController.cs +++ b/Admin.Core/Controllers/Admin/AuthController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using Admin.Core.Attributes; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Admin.Core.Service.Admin.Auth; using Admin.Core.Service.Admin.Auth.Input; using Admin.Core.Service.Admin.Auth.Output; diff --git a/Admin.Core/Controllers/Admin/CacheController.cs b/Admin.Core/Controllers/Admin/CacheController.cs index 7519d45ef..95992b1ab 100644 --- a/Admin.Core/Controllers/Admin/CacheController.cs +++ b/Admin.Core/Controllers/Admin/CacheController.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Admin.Core.Service.Admin.Cache; namespace Admin.Core.Controllers.Admin diff --git a/Admin.Core/Controllers/Admin/DictionaryController.cs b/Admin.Core/Controllers/Admin/DictionaryController.cs index b2c48feeb..0fca94cea 100644 --- a/Admin.Core/Controllers/Admin/DictionaryController.cs +++ b/Admin.Core/Controllers/Admin/DictionaryController.cs @@ -1,8 +1,8 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Admin.Core.Service.Admin.Dictionary; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Service.Admin.Dictionary.Input; diff --git a/Admin.Core/Controllers/Admin/DocumentController.cs b/Admin.Core/Controllers/Admin/DocumentController.cs index c0199ee91..2f7cf650f 100644 --- a/Admin.Core/Controllers/Admin/DocumentController.cs +++ b/Admin.Core/Controllers/Admin/DocumentController.cs @@ -1,9 +1,12 @@ using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Admin.Core.Service.Admin.Document; using Admin.Core.Service.Admin.Document.Input; +using Admin.Core.Common.Configs; +using Microsoft.Extensions.Options; +using Admin.Core.Common.Helpers; namespace Admin.Core.Controllers.Admin { @@ -13,10 +16,18 @@ namespace Admin.Core.Controllers.Admin public class DocumentController : AreaController { private readonly IDocumentService _documentServices; + private readonly UploadConfig _uploadConfig; + private readonly UploadHelper _uploadHelper; - public DocumentController(IDocumentService documentServices) + public DocumentController( + IDocumentService documentServices, + IOptionsMonitor uploadConfig, + UploadHelper uploadHelper + ) { _documentServices = documentServices; + _uploadConfig = uploadConfig.CurrentValue; + _uploadHelper = uploadHelper; } /// @@ -32,6 +43,17 @@ public async Task GetList(string key, DateTime? start, DateTime return await _documentServices.GetListAsync(key,start,end); } + /// + /// 查询文档图片列表 + /// + /// + /// + [HttpGet] + public async Task GetImageList(long id) + { + return await _documentServices.GetImageListAsync(id); + } + /// /// 查询单条分组 /// @@ -140,5 +162,30 @@ public async Task SoftDelete(long id) { return await _documentServices.SoftDeleteAsync(id); } + + /// + /// 上传文档图片 + /// + /// + /// + [HttpPost] + public async Task UploadImage([FromForm]DocumentUploadImageInput input) + { + var config = _uploadConfig.Document; + var res = await _uploadHelper.UploadAsync(input.File, config, new { input.Id }); + if (res.Success) + { + //保存文档图片 + var r = await _documentServices.AddImageAsync(new DocumentAddImageInput + { + DocumentId = input.Id, + Url = res.Data.FileRequestPath + }); + if(r.Success) + return ResponseOutput.Ok(res.Data.FileRequestPath); + } + + return ResponseOutput.NotOk("上传失败!"); + } } } diff --git a/Admin.Core/Controllers/Admin/ImgController.cs b/Admin.Core/Controllers/Admin/ImgController.cs index 71082074d..ab0ddbe70 100644 --- a/Admin.Core/Controllers/Admin/ImgController.cs +++ b/Admin.Core/Controllers/Admin/ImgController.cs @@ -1,11 +1,8 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Admin.Core.Attributes; using Admin.Core.Common.Helpers; using Admin.Core.Common.Configs; @@ -20,11 +17,17 @@ public class ImgController : AreaController { private readonly IUser _user; private readonly UploadConfig _uploadConfig; - - public ImgController(IUser user, IOptionsMonitor uploadConfig) + private readonly UploadHelper _uploadHelper; + + public ImgController( + IUser user, + IOptionsMonitor uploadConfig, + UploadHelper uploadHelper + ) { _user = user; _uploadConfig = uploadConfig.CurrentValue; + _uploadHelper = uploadHelper; } /* @@ -40,7 +43,7 @@ public ImgController(IUser user, IOptionsMonitor uploadConfig) [AllowAnonymous] public FileStreamResult Avatar([FromServices]IWebHostEnvironment environment, string fileName = "") { - string filePath = Path.Combine(environment.WebRootPath,"avatar", fileName); + string filePath = Path.Combine(environment.WebRootPath,"avatar", fileName).ToPath(); var stream = System.IO.File.OpenRead(filePath); string fileExt = Path.GetExtension(filePath); var contentTypeProvider = new Microsoft.AspNetCore.StaticFiles.FileExtensionContentTypeProvider(); @@ -58,53 +61,16 @@ public FileStreamResult Avatar([FromServices]IWebHostEnvironment environment, st /// [HttpPost] [Login] - public async Task AvatarUpload(IFormFile file) + public async Task AvatarUpload([FromForm]IFormFile file) { - if(file == null || file.Length < 1) - { - if (Request.Form.Files != null && Request.Form.Files.Any()) - { - file = Request.Form.Files[0]; - } - } - - if (file == null || file.Length < 1) - { - return ResponseOutput.NotOk("请上传头像!"); - } - - var avatar = _uploadConfig.Avatar; - - //格式限制 - if (!avatar.ContentType.Contains(file.ContentType)) - { - return ResponseOutput.NotOk("图片格式错误"); - } - - //大小限制 - if (!(file.Length <= avatar.Size)) - { - return ResponseOutput.NotOk("图片过大"); - } - - var dateTimeFormat = avatar.DateTimeFormat.NotNull() ? DateTime.Now.ToString(avatar.DateTimeFormat) : ""; - var format = avatar.Format.NotNull() ? string.Format(avatar.Format,_user.Id) : ""; - var savePath = Path.Combine(dateTimeFormat, format); - var fullDirectory = Path.Combine(avatar.Path, savePath); - if (!Directory.Exists(fullDirectory)) - { - Directory.CreateDirectory(fullDirectory); - } - - var saveFileName = $"{new Snowfake(0).nextId()}{Path.GetExtension(file.FileName)}"; - var fullPath = Path.Combine(fullDirectory, saveFileName); - - using (var stream = new FileStream(fullPath, FileMode.Create)) + var config = _uploadConfig.Avatar; + var res = await _uploadHelper.UploadAsync(file, config, new { _user.Id }); + if (res.Success) { - await file.CopyToAsync(stream); + return ResponseOutput.Ok(res.Data.FileRelativePath); } - return ResponseOutput.Ok(Path.Combine(savePath, saveFileName)); + return ResponseOutput.NotOk("上传失败!"); } } } diff --git a/Admin.Core/Controllers/Admin/LoginLogController.cs b/Admin.Core/Controllers/Admin/LoginLogController.cs index 607a54d52..19da90935 100644 --- a/Admin.Core/Controllers/Admin/LoginLogController.cs +++ b/Admin.Core/Controllers/Admin/LoginLogController.cs @@ -1,7 +1,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Service.Admin.LoginLog; diff --git a/Admin.Core/Controllers/Admin/OprationLogController.cs b/Admin.Core/Controllers/Admin/OprationLogController.cs index 7afe580fe..deb39ec1f 100644 --- a/Admin.Core/Controllers/Admin/OprationLogController.cs +++ b/Admin.Core/Controllers/Admin/OprationLogController.cs @@ -1,7 +1,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Service.Admin.OprationLog; diff --git a/Admin.Core/Controllers/Admin/PermissionController.cs b/Admin.Core/Controllers/Admin/PermissionController.cs index c4327d788..4227bb6e7 100644 --- a/Admin.Core/Controllers/Admin/PermissionController.cs +++ b/Admin.Core/Controllers/Admin/PermissionController.cs @@ -1,7 +1,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Admin.Core.Service.Admin.Permission; using Admin.Core.Service.Admin.Permission.Input; diff --git a/Admin.Core/Controllers/Admin/RoleController.cs b/Admin.Core/Controllers/Admin/RoleController.cs index a8deeabfe..fec258b04 100644 --- a/Admin.Core/Controllers/Admin/RoleController.cs +++ b/Admin.Core/Controllers/Admin/RoleController.cs @@ -1,7 +1,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Service.Admin.Role; using Admin.Core.Service.Admin.Role.Input; diff --git a/Admin.Core/Controllers/Admin/UserController.cs b/Admin.Core/Controllers/Admin/UserController.cs index c3d06f08f..6d07c3487 100644 --- a/Admin.Core/Controllers/Admin/UserController.cs +++ b/Admin.Core/Controllers/Admin/UserController.cs @@ -1,7 +1,7 @@ using System.Threading.Tasks; using Admin.Core.Service.Admin.User; -using Admin.Core.Model.Output; -using Admin.Core.Model.Input; +using Admin.Core.Common.Output; +using Admin.Core.Common.Input; using Admin.Core.Model.Admin; using Admin.Core.Service.Admin.User.Input; using Microsoft.AspNetCore.Mvc; diff --git a/Admin.Core/Controllers/Admin/ViewController.cs b/Admin.Core/Controllers/Admin/ViewController.cs index 7b76f3def..0a325a367 100644 --- a/Admin.Core/Controllers/Admin/ViewController.cs +++ b/Admin.Core/Controllers/Admin/ViewController.cs @@ -1,8 +1,8 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Admin.Core.Model.Admin; -using Admin.Core.Model.Input; -using Admin.Core.Model.Output; +using Admin.Core.Common.Input; +using Admin.Core.Common.Output; using Admin.Core.Service.Admin.View; using Admin.Core.Service.Admin.View.Input; diff --git a/Admin.Core/Db/Data/data.json b/Admin.Core/Db/Data/data.json index 16d2fbdad..249f909f3 100644 --- a/Admin.Core/Db/Data/data.json +++ b/Admin.Core/Db/Data/data.json @@ -1 +1 @@ -{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":4,"label":"图片管理","path":"img","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":77,"parentId":4,"label":"上传头像","path":"/api/admin/img/avatarupload","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","type":3,"apiId":89,"sort":11,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","nickName":"小雪转中雪","avatar":"","remark":""}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":2,"userId":2,"roleId":2}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92}]} \ No newline at end of file +{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":4,"label":"图片管理","path":"img","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":77,"parentId":4,"label":"上传头像","path":"/api/admin/img/avatarupload","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""},{"id":90,"parentId":78,"label":"上传文档图片","path":"/api/admin/document/uploadimage","httpMethods":"post","description":""},{"id":91,"parentId":78,"label":"查询文档图片列表","path":"/api/admin/document/getimagelist","httpMethods":"get","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","type":3,"apiId":89,"sort":11,"description":""},{"id":93,"parentId":75,"label":"上传文档图片","type":3,"apiId":90,"sort":0,"description":""},{"id":94,"parentId":75,"label":"查询文档图片列表","type":3,"apiId":91,"sort":0,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","nickName":"小雪转中雪","avatar":"2/14753102362214400.gif","remark":""}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":2,"userId":2,"roleId":2}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":168,"roleId":1,"permissionId":94},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92},{"id":167,"roleId":2,"permissionId":93},{"id":169,"roleId":2,"permissionId":94}]} \ No newline at end of file diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index 5d66cb7fd..eaf3688e4 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -80,7 +80,8 @@ public static void SyncStructure(IFreeSql db, string msg = null, DbConfig dbConf typeof(RolePermissionEntity), typeof(OprationLogEntity), typeof(LoginLogEntity), - typeof(DocumentEntity) + typeof(DocumentEntity), + typeof(DocumentImageEntity) }); Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} succeed\r\n"); } @@ -194,8 +195,7 @@ public static async Task SyncData(IFreeSql db, DbConfig dbConfig = null) Console.WriteLine("\r\nsync data started"); db.Aop.AuditValue += SyncDataAuditValue; - - var filePath = Path.Combine(Directory.GetCurrentDirectory(), @"Db\Data\data.json"); + var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Db/Data/data.json").ToPath(); var jsonData = FileHelper.ReadFile(filePath); var data = JsonConvert.DeserializeObject(jsonData); @@ -365,7 +365,7 @@ public static async Task GenerateSimpleJsonData(IFreeSql db) //Formatting.Indented, settings ); - var filePath = Path.Combine(Directory.GetCurrentDirectory(), @"Db\Data\data.json"); + var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Db/Data/data.json").ToPath(); FileHelper.WriteFile(filePath, jsonData); #endregion diff --git a/Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs b/Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs index 6c69f7934..876d2da02 100644 --- a/Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs +++ b/Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs @@ -9,25 +9,25 @@ namespace Admin.Core.Extensions { public static class UploadConfigApplicationBuilderExtensions { - private static void UseAvatar(IApplicationBuilder app, AvatarConfig avatarConfig) + private static void UseFileUploadConfig(IApplicationBuilder app, FileUploadConfig config) { - if (!Directory.Exists(avatarConfig.Path)) + if (!Directory.Exists(config.UploadPath)) { - Directory.CreateDirectory(avatarConfig.Path); + Directory.CreateDirectory(config.UploadPath); } app.UseStaticFiles(new StaticFileOptions() { - RequestPath = avatarConfig.RequestPath, - FileProvider = new PhysicalFileProvider(avatarConfig.Path) + RequestPath = config.RequestPath, + FileProvider = new PhysicalFileProvider(config.UploadPath) }); } public static void UseUploadConfig(this IApplicationBuilder app) { var uploadConfig = app.ApplicationServices.GetRequiredService>(); - var avatar = uploadConfig.Value.Avatar; - UseAvatar(app, avatar); + UseFileUploadConfig(app, uploadConfig.Value.Avatar); + UseFileUploadConfig(app, uploadConfig.Value.Document); } } diff --git a/Admin.Core/Filters/AdminExceptionFilter.cs b/Admin.Core/Filters/AdminExceptionFilter.cs index 661b9a6a6..3835c3c89 100644 --- a/Admin.Core/Filters/AdminExceptionFilter.cs +++ b/Admin.Core/Filters/AdminExceptionFilter.cs @@ -3,8 +3,9 @@ using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using System.Threading.Tasks; +using Admin.Core.Common.Extensions; namespace Admin.Core.Filters { @@ -27,7 +28,7 @@ public void OnException(ExceptionContext context) string message; if (_env.IsProduction()) { - message = Enums.StatusCodes.Status500InternalServerError.ToDescriptionOrString(); + message = Enums.StatusCodes.Status500InternalServerError.ToDescription(); } else { diff --git a/Admin.Core/Logs/ApiHelper.cs b/Admin.Core/Logs/ApiHelper.cs index 5b52a1ac8..38df712f9 100644 --- a/Admin.Core/Logs/ApiHelper.cs +++ b/Admin.Core/Logs/ApiHelper.cs @@ -28,7 +28,7 @@ public List GetApis() return _apis; _apis = new List(); - var filePath = Path.Combine(Directory.GetCurrentDirectory(), @"Db\Data\data.json"); + var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Db/Data/data.json").ToPath(); var jsonData = FileHelper.ReadFile(filePath); var apis = JsonConvert.DeserializeObject(jsonData).Apis; foreach (var api in apis) diff --git a/Admin.Core/Logs/LogHandler.cs b/Admin.Core/Logs/LogHandler.cs index 12987f158..59cdbc4f4 100644 --- a/Admin.Core/Logs/LogHandler.cs +++ b/Admin.Core/Logs/LogHandler.cs @@ -1,7 +1,7 @@ using System.Linq; using System.Diagnostics; using System.Threading.Tasks; -using Admin.Core.Model.Output; +using Admin.Core.Common.Output; using Admin.Core.Service.Admin.OprationLog; using Admin.Core.Service.Admin.OprationLog.Input; using Microsoft.AspNetCore.Mvc.Filters; diff --git a/Admin.Core/configs/appconfig.json b/Admin.Core/configs/appconfig.json index 9d1dbfee8..ed8dfc1f4 100644 --- a/Admin.Core/configs/appconfig.json +++ b/Admin.Core/configs/appconfig.json @@ -1,16 +1,20 @@ { - //Swagger文档 - "swagger": false, //Api地址 "urls": "http://*:8888", + //Swagger文档 + "swagger": false, //面向切面编程 "aop": { //事物 - "transaction": false + "transaction": true }, //日志 "log": { //操作日志 "operation": true + }, + //验证码 + "varifyCode": { + "font": [ "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" ] } } diff --git a/Admin.Core/configs/dbconfig.json b/Admin.Core/configs/dbconfig.json index e43e7ca6c..16cbecd5e 100644 --- a/Admin.Core/configs/dbconfig.json +++ b/Admin.Core/configs/dbconfig.json @@ -24,6 +24,7 @@ //SqlServer "CREATE DATABASE [admindb]" "createDbSql": "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'", + //数据库配置 https://github.com/dotnetcore/FreeSql/wiki/入门 //数据库类型 MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4, OdbcOracle = 5, OdbcSqlServer = 6, OdbcMySql = 7, OdbcPostgreSQL = 8, Odbc = 9, OdbcDameng = 10, MsAccess = 11 "type": 4, //连接字符串 diff --git a/Admin.Core/configs/uploadconfig.json b/Admin.Core/configs/uploadconfig.json index b3092860d..ac9751c5b 100644 --- a/Admin.Core/configs/uploadconfig.json +++ b/Admin.Core/configs/uploadconfig.json @@ -1,36 +1,38 @@ { //头像 "avatar": { - //路径 D:/upload/admin/avatar - "path": "D:/upload/admin/avatar", + //上传路径 D:/upload/admin/avatar + "uploadPath": "D:/upload/admin/avatar", //请求路径 "requestPath": "/upload/admin/avatar", //路径日期格式 yyyy/MM/dd "dateTimeFormat": "", //{用户编号} - "format": "{0}", - //图片大小 1M = 1024 * 1024 - "size": 1048576, + "format": "{Id}", + //图片大小不超过 1M = 1024 * 1024 + "maxSize": 1048576, + //最大允许上传张数,-1不限制 + "limit": 1, //图片格式 "contentType": [ "image/jpg", "image/png", "image/jpeg", "image/gif" ] }, - //文档 + //文档图片 "document": { - //路径 D:/upload/admin/document - "path": "D:/upload/admin/document", + //上传路径 D:/upload/admin/document + "uploadPath": "D:/upload/admin/document", //请求路径 "requestPath": "/images", //路径日期格式 yyyy/MM/dd "dateTimeFormat": "", //{文档编号} - "format": "{0}", - //文件大小 10M = 10 * 1024 * 1024 - "size": 10485760, - //最大允许上传个数,-1不限制 + "format": "{Id}", + //图片大小不超过 10M = 10 * 1024 * 1024 + "maxSize": 10485760, + //最大允许上传张数,-1不限制 "limit": -1, - //文件格式 + //图片格式 "contentType": [ "image/jpg", "image/png", "image/jpeg", "image/gif" ] } } From 88b120ae94c571ee54ffad63c95d2704aaee375b Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Wed, 6 May 2020 22:54:23 +0800 Subject: [PATCH 36/53] =?UTF-8?q?=E6=9B=B4=E6=96=B01.1.2=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 4 +- Admin.Core.Common/Files/FileInfo.cs | 14 +- Admin.Core.Common/Helpers/Snowfake.cs | 85 ----------- Admin.Core.Common/Helpers/Snowflake.cs | 143 ++++++++++++++++++ Admin.Core.Common/Helpers/UploadHelper.cs | 2 +- .../Admin/Document/DocumentService.cs | 11 ++ .../Admin/Document/IDocumentService.cs | 2 + Admin.Core/Admin.Core.csproj | 2 +- Admin.Core/Admin.Core.xml | 8 + .../Controllers/Admin/DocumentController.cs | 21 ++- Admin.Core/Db/Data.cs | 1 - Admin.Core/Db/Data/data.json | 2 +- Admin.Core/Db/DbHelper.cs | 1 - Admin.Core/Startup.cs | 8 +- Admin.Core/configs/appconfig.json | 1 + Admin.Core/configs/uploadconfig.json | 4 +- 16 files changed, 202 insertions(+), 107 deletions(-) delete mode 100644 Admin.Core.Common/Helpers/Snowfake.cs create mode 100644 Admin.Core.Common/Helpers/Snowflake.cs diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 5b8165151..c06496a51 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -17,9 +17,9 @@ - + - + diff --git a/Admin.Core.Common/Files/FileInfo.cs b/Admin.Core.Common/Files/FileInfo.cs index f1eb4c65d..1e171d1eb 100644 --- a/Admin.Core.Common/Files/FileInfo.cs +++ b/Admin.Core.Common/Files/FileInfo.cs @@ -24,6 +24,11 @@ public FileInfo(string fileName, long size = 0L) /// public string UploadPath { get; set; } + /// + /// 请求路径 + /// + public string RequestPath { get; set; } + /// /// 相对路径 /// @@ -50,9 +55,9 @@ public FileInfo(string fileName, long size = 0L) public string Extension { get; set; } /// - /// 请求路径 + /// 文件目录 /// - public string RequestPath { get; set; } + public string FileDirectory => System.IO.Path.Combine(UploadPath, RelativePath).ToPath(); /// /// 文件请求路径 @@ -64,11 +69,6 @@ public FileInfo(string fileName, long size = 0L) /// public string FileRelativePath => System.IO.Path.Combine(RelativePath, SaveName).ToPath(); - /// - /// 文件目录 - /// - public string FileDirectory => System.IO.Path.Combine(UploadPath, RelativePath).ToPath(); - /// /// 文件路径 /// diff --git a/Admin.Core.Common/Helpers/Snowfake.cs b/Admin.Core.Common/Helpers/Snowfake.cs deleted file mode 100644 index 157ddc1cd..000000000 --- a/Admin.Core.Common/Helpers/Snowfake.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; - -namespace Admin.Core.Common.Helpers -{ - public class Snowfake - { - public static Snowfake Default { get; } = new Snowfake(0); - - //机器ID - private static long workerId; - private static long twepoch = 687888001020L; //唯一时间,这是一个避免重复的随机量,自行设定不要大于当前时间戳 - private static long sequence = 0L; - private static int workerIdBits = 4; //机器码字节数。4个字节用来保存机器码(定义为Long类型会出现,最大偏移64位,所以左移64位没有意义) - public static long maxWorkerId = -1L ^ -1L << workerIdBits; //最大机器ID - private static int sequenceBits = 10; //计数器字节数,10个字节用来保存计数码 - private static int workerIdShift = sequenceBits; //机器码数据左移位数,就是后面计数器占用的位数 - private static int timestampLeftShift = sequenceBits + workerIdBits; //时间戳左移动位数就是机器码和计数器总字节数 - public static long sequenceMask = -1L ^ -1L << sequenceBits; //一微秒内可以产生计数,如果达到该值则等到下一微妙在进行生成 - private long lastTimestamp = -1L; - - /// - /// 机器码 - /// - /// - public Snowfake(long workerId) - { - if (workerId > maxWorkerId || workerId < 0) - throw new Exception(string.Format("worker Id can't be greater than {0} or less than 0 ", workerId)); - Snowfake.workerId = workerId; - } - - public long nextId() - { - lock (this) - { - long timestamp = timeGen(); - if (lastTimestamp == timestamp) - { //同一微妙中生成ID - sequence = (sequence + 1) & sequenceMask; //用&运算计算该微秒内产生的计数是否已经到达上限 - if (sequence == 0) - { - //一微妙内产生的ID计数已达上限,等待下一微妙 - timestamp = tillNextMillis(lastTimestamp); - } - } - else - { //不同微秒生成ID - sequence = 0; //计数清0 - } - if (timestamp < lastTimestamp) - { //如果当前时间戳比上一次生成ID时时间戳还小,抛出异常,因为不能保证现在生成的ID之前没有生成过 - throw new Exception(string.Format("Clock moved backwards. Refusing to generate id for {0} milliseconds", - lastTimestamp - timestamp)); - } - lastTimestamp = timestamp; //把当前时间戳保存为最后生成ID的时间戳 - long nextId = (timestamp - twepoch << timestampLeftShift) | workerId << workerIdShift | sequence; - return nextId; - } - } - - /// - /// 获取下一微秒时间戳 - /// - /// - /// - private long tillNextMillis(long lastTimestamp) - { - long timestamp = timeGen(); - while (timestamp <= lastTimestamp) - { - timestamp = timeGen(); - } - return timestamp; - } - - /// - /// 生成当前时间戳 - /// - /// - private long timeGen() - { - return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; - } - } -} diff --git a/Admin.Core.Common/Helpers/Snowflake.cs b/Admin.Core.Common/Helpers/Snowflake.cs new file mode 100644 index 000000000..3ff015e09 --- /dev/null +++ b/Admin.Core.Common/Helpers/Snowflake.cs @@ -0,0 +1,143 @@ +using System; + +namespace Admin.Core.Common.Helpers +{ + public class Snowflake + { + //基准时间 + private static long StartStmp = 1288834974657L; + //private const long START_STMP = 1480166465631L; + /*每一部分占用的位数*/ + //机器标识位数 + const int MachineIdBits = 5; + //数据标志位数 + const int DatacenterIdBits = 5; + //序列号识位数 + const int SequenceBits = 12; + + /* 每一部分的最大值*/ + //机器ID最大值 + const long MaxMachineNum = -1L ^ (-1L << MachineIdBits); + //数据标志ID最大值 + const long MaxDatacenterNum = -1L ^ (-1L << DatacenterIdBits); + //序列号ID最大值 + private const long MaxSequenceNum = -1L ^ (-1L << SequenceBits); + + /*每一部分向左的位移*/ + //机器ID偏左移12位 + private const int MachineShift = SequenceBits; + //数据ID偏左移17位 + private const int DatacenterIdShift = SequenceBits + MachineIdBits; + //时间毫秒左移22位 + public const int TimestampLeftShift = SequenceBits + MachineIdBits + DatacenterIdBits; + + + private long _sequence = 0L;//序列号 + private long _lastTimestamp = -1L;//上一次时间戳 + public long MachineId { get; protected set; }//机器标识 + public long DatacenterId { get; protected set; }//数据中心 + //public long Sequence = 0L;//序列号 + //{ + // get { return _sequence; } + // internal set { _sequence = value; } + //} + + private readonly DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + private readonly object _lock = new Object(); + public Snowflake(long machineId, long datacenterId) + { + // 如果超出范围就抛出异常 + if (machineId > MaxMachineNum || machineId < 0) + { + throw new ArgumentException(string.Format("machineId 必须大于0,MaxMachineNum: {0}", MaxMachineNum)); + } + + if (datacenterId > MaxDatacenterNum || datacenterId < 0) + { + throw new ArgumentException(string.Format("datacenterId必须大于0,且不能大于MaxDatacenterNum: {0}", MaxDatacenterNum)); + } + + //先检验再赋值 + MachineId = machineId; + DatacenterId = datacenterId; + //_sequence = sequence; + } + + //public static Init(long machineId, long datacenterId) + //{ + + //} + public long NextId() + { + lock (_lock) + { + var timestamp = TimeGen(); + if (timestamp < _lastTimestamp) + { + throw new Exception(string.Format("时间戳必须大于上一次生成ID的时间戳. 拒绝为{0}毫秒生成id", _lastTimestamp - timestamp)); + } + + //如果上次生成时间和当前时间相同,在同一毫秒内 + if (_lastTimestamp == timestamp) + { + //sequence自增,和sequenceMask相与一下,去掉高位 + _sequence = (_sequence + 1) & MaxSequenceNum; + //判断是否溢出,也就是每毫秒内超过1024,当为1024时,与sequenceMask相与,sequence就等于0 + if (_sequence == 0L) + { + //等待到下一毫秒 + timestamp = TilNextMillis(_lastTimestamp); + } + } + else + { + //如果和上次生成时间不同,重置sequence,就是下一毫秒开始,sequence计数重新从0开始累加, + //为了保证尾数随机性更大一些,最后一位可以设置一个随机数 + _sequence = 0L;//new Random().Next(10); + } + + _lastTimestamp = timestamp; + return ((timestamp - StartStmp) << TimestampLeftShift) | (DatacenterId << DatacenterIdShift) | (MachineId << MachineShift) | _sequence; + } + } + + // 防止产生的时间比之前的时间还要小(由于NTP回拨等问题),保持增量的趋势. + protected virtual long TilNextMillis(long lastTimestamp) + { + var timestamp = TimeGen(); + while (timestamp <= lastTimestamp) + { + timestamp = TimeGen(); + } + return timestamp; + } + + // 获取当前的时间戳 + protected virtual long TimeGen() + { + //return TimeExtensions.CurrentTimeMillis(); + return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds; + } + } + + public class IdWorkerHelper + { + private static Snowflake _idWorker= null; + private IdWorkerHelper() + { + + } + + static IdWorkerHelper() + { + _idWorker = new Snowflake(1, 1); + } + + public static long GenId64() + { + return _idWorker.NextId(); + + } + } + +} diff --git a/Admin.Core.Common/Helpers/UploadHelper.cs b/Admin.Core.Common/Helpers/UploadHelper.cs index 46ee39d38..93a084c8f 100644 --- a/Admin.Core.Common/Helpers/UploadHelper.cs +++ b/Admin.Core.Common/Helpers/UploadHelper.cs @@ -61,7 +61,7 @@ public async Task> UploadAsync(IFormFile file, FileUpl Directory.CreateDirectory(fileInfo.FileDirectory); } - fileInfo.SaveName = $"{new Snowfake(0).nextId()}.{fileInfo.Extension}"; + fileInfo.SaveName = $"{IdWorkerHelper.GenId64()}.{fileInfo.Extension}"; await SaveAsync(file, fileInfo.FilePath, cancellationToken); diff --git a/Admin.Core.Services/Admin/Document/DocumentService.cs b/Admin.Core.Services/Admin/Document/DocumentService.cs index 1ac21bc7f..94618e6e5 100644 --- a/Admin.Core.Services/Admin/Document/DocumentService.cs +++ b/Admin.Core.Services/Admin/Document/DocumentService.cs @@ -155,6 +155,17 @@ public async Task DeleteAsync(long id) return ResponseOutput.Result(result); } + public async Task DeleteImageAsync(long documentId, string url) + { + var result = false; + if (documentId > 0 && url.NotNull()) + { + result = (await _documentImageRepository.DeleteAsync(m => m.DocumentId == documentId && m.Url == url)) > 0; + } + + return ResponseOutput.Result(result); + } + public async Task SoftDeleteAsync(long id) { var result = await _documentRepository.SoftDeleteAsync(id); diff --git a/Admin.Core.Services/Admin/Document/IDocumentService.cs b/Admin.Core.Services/Admin/Document/IDocumentService.cs index 1888334f4..2f3eba750 100644 --- a/Admin.Core.Services/Admin/Document/IDocumentService.cs +++ b/Admin.Core.Services/Admin/Document/IDocumentService.cs @@ -36,6 +36,8 @@ public partial interface IDocumentService Task DeleteAsync(long id); + Task DeleteImageAsync(long documentId, string url); + Task SoftDeleteAsync(long id); } diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index 42339c29d..0e79e1396 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -34,7 +34,7 @@ - + diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index 840271774..e518fc186 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -308,6 +308,14 @@ + + + 删除图片 + + + + + 上传文档图片 diff --git a/Admin.Core/Controllers/Admin/DocumentController.cs b/Admin.Core/Controllers/Admin/DocumentController.cs index 2f7cf650f..8331e03e4 100644 --- a/Admin.Core/Controllers/Admin/DocumentController.cs +++ b/Admin.Core/Controllers/Admin/DocumentController.cs @@ -163,6 +163,18 @@ public async Task SoftDelete(long id) return await _documentServices.SoftDeleteAsync(id); } + /// + /// 删除图片 + /// + /// + /// + /// + [HttpDelete] + public async Task DeleteImage(long documentId, string url) + { + return await _documentServices.DeleteImageAsync(documentId, url); + } + /// /// 上传文档图片 /// @@ -176,13 +188,16 @@ public async Task UploadImage([FromForm]DocumentUploadImageInpu if (res.Success) { //保存文档图片 - var r = await _documentServices.AddImageAsync(new DocumentAddImageInput + var r = await _documentServices.AddImageAsync( + new DocumentAddImageInput { DocumentId = input.Id, Url = res.Data.FileRequestPath }); - if(r.Success) - return ResponseOutput.Ok(res.Data.FileRequestPath); + if (r.Success) + { + return ResponseOutput.Ok(res.Data.FileRequestPath); + } } return ResponseOutput.NotOk("上传失败!"); diff --git a/Admin.Core/Db/Data.cs b/Admin.Core/Db/Data.cs index 1604572a1..2f25e4a3e 100644 --- a/Admin.Core/Db/Data.cs +++ b/Admin.Core/Db/Data.cs @@ -14,6 +14,5 @@ public class Data public RoleEntity[] Roles { get; set; } public UserRoleEntity[] UserRoles { get; set; } public RolePermissionEntity[] RolePermissions { get; set; } - public DocumentEntity[] Documents { get; set; } } } diff --git a/Admin.Core/Db/Data/data.json b/Admin.Core/Db/Data/data.json index 249f909f3..7f222a394 100644 --- a/Admin.Core/Db/Data/data.json +++ b/Admin.Core/Db/Data/data.json @@ -1 +1 @@ -{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":4,"label":"图片管理","path":"img","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":77,"parentId":4,"label":"上传头像","path":"/api/admin/img/avatarupload","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""},{"id":90,"parentId":78,"label":"上传文档图片","path":"/api/admin/document/uploadimage","httpMethods":"post","description":""},{"id":91,"parentId":78,"label":"查询文档图片列表","path":"/api/admin/document/getimagelist","httpMethods":"get","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","type":3,"apiId":89,"sort":11,"description":""},{"id":93,"parentId":75,"label":"上传文档图片","type":3,"apiId":90,"sort":0,"description":""},{"id":94,"parentId":75,"label":"查询文档图片列表","type":3,"apiId":91,"sort":0,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","nickName":"小雪转中雪","avatar":"2/14753102362214400.gif","remark":""}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":2,"userId":2,"roleId":2}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":168,"roleId":1,"permissionId":94},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92},{"id":167,"roleId":2,"permissionId":93},{"id":169,"roleId":2,"permissionId":94}]} \ No newline at end of file +{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":4,"label":"图片管理","path":"img","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":77,"parentId":4,"label":"上传头像","path":"/api/admin/img/avatarupload","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""},{"id":90,"parentId":78,"label":"上传文档图片","path":"/api/admin/document/uploadimage","httpMethods":"post","description":""},{"id":91,"parentId":78,"label":"查询文档图片列表","path":"/api/admin/document/getimagelist","httpMethods":"get","description":""},{"id":92,"parentId":78,"label":"删除图片","path":"/api/admin/document/deleteimage","httpMethods":"delete","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","type":3,"apiId":89,"sort":11,"description":""},{"id":93,"parentId":75,"label":"上传文档图片","type":3,"apiId":90,"sort":0,"description":""},{"id":94,"parentId":75,"label":"查询文档图片列表","type":3,"apiId":91,"sort":0,"description":""},{"id":95,"parentId":75,"label":"删除图片","type":3,"apiId":92,"sort":0,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","nickName":"小雪转中雪","avatar":"2/14753102362214400.gif","remark":""}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":3,"userId":2,"roleId":2}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":168,"roleId":1,"permissionId":94},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92},{"id":167,"roleId":2,"permissionId":93},{"id":169,"roleId":2,"permissionId":94},{"id":170,"roleId":2,"permissionId":95}]} \ No newline at end of file diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index eaf3688e4..90e0061d2 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -202,7 +202,6 @@ public static async Task SyncData(IFreeSql db, DbConfig dbConfig = null) using (var uow = db.CreateUnitOfWork()) using (var tran = uow.GetOrBeginTransaction()) { - await InitDtData(db, data.Documents, tran, dbConfig); await InitDtData(db, data.Dictionaries, tran, dbConfig); await InitDtData(db, data.Apis, tran, dbConfig); await InitDtData(db, data.Views, tran, dbConfig); diff --git a/Admin.Core/Startup.cs b/Admin.Core/Startup.cs index 40bff8c79..f274d79a0 100644 --- a/Admin.Core/Startup.cs +++ b/Admin.Core/Startup.cs @@ -51,6 +51,7 @@ public Startup(IWebHostEnvironment env) public void ConfigureServices(IServiceCollection services) { + //应用配置 services.AddSingleton(_appConfig); //上传配置 @@ -243,12 +244,13 @@ public void ConfigureContainer(ContainerBuilder builder) .InstancePerDependency(); #endregion - //单例注入 + #region SingleInstance var assemblyCore = Assembly.Load("Admin.Core"); var assemblyCommon = Assembly.Load("Admin.Core.Common"); - builder.RegisterAssemblyTypes(assemblyCore,assemblyCommon) + builder.RegisterAssemblyTypes(assemblyCore, assemblyCommon) .Where(t => t.GetCustomAttribute() != null) - .SingleInstance(); + .SingleInstance(); + #endregion } catch (Exception ex) { diff --git a/Admin.Core/configs/appconfig.json b/Admin.Core/configs/appconfig.json index ed8dfc1f4..7fc4dddea 100644 --- a/Admin.Core/configs/appconfig.json +++ b/Admin.Core/configs/appconfig.json @@ -15,6 +15,7 @@ }, //验证码 "varifyCode": { + // 字体 "font": [ "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" ] } } diff --git a/Admin.Core/configs/uploadconfig.json b/Admin.Core/configs/uploadconfig.json index ac9751c5b..dd3a59037 100644 --- a/Admin.Core/configs/uploadconfig.json +++ b/Admin.Core/configs/uploadconfig.json @@ -28,8 +28,8 @@ "dateTimeFormat": "", //{文档编号} "format": "{Id}", - //图片大小不超过 10M = 10 * 1024 * 1024 - "maxSize": 10485760, + //图片大小不超过 10M = 1 * 1024 * 1024 + "maxSize": 1048576, //最大允许上传张数,-1不限制 "limit": -1, //图片格式 From 03af3dc642d5f147503d974178fd6744a2b54259 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Sat, 9 May 2020 23:02:47 +0800 Subject: [PATCH 37/53] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC1.2.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 7 +- Admin.Core.Common/Auth/User.cs | 1 + .../BaseModel}/Entity.cs | 2 +- .../BaseModel}/EntityAdd.cs | 10 +- .../BaseModel}/EntityBase.cs | 18 +- .../BaseModel}/EntitySoftDelete.cs | 2 +- .../BaseModel}/EntityUpdate.cs | 12 +- .../BaseModel}/EntityVersion.cs | 2 +- Admin.Core.Common/BaseModel/IEntityAdd.cs | 11 + .../BaseModel}/IEntitySoftDelete.cs | 2 +- Admin.Core.Common/BaseModel/IEntityUpdate.cs | 11 + .../BaseModel}/IEntityVersion.cs | 5 +- Admin.Core.Common/Cache/MemoryCache.cs | 1 + Admin.Core.Common/Configs/AppConfig.cs | 4 +- Admin.Core.Common/Configs/JwtConfig.cs | 2 +- Admin.Core.Common/Configs/UploadConfig.cs | 25 +- .../Extensions/StringExtensions.cs | 1 + Admin.Core.Common/Files/FileSize.cs | 1 + Admin.Core.Common/Helpers/ConfigHelper.cs | 5 +- Admin.Core.Common/Helpers/UtilConvert.cs | 2 +- Admin.Core.Model/Admin.Core.Model.csproj | 2 +- Admin.Core.Model/Admin/ApiEntity.cs | 1 + Admin.Core.Model/Admin/DictionaryEntity.cs | 1 + Admin.Core.Model/Admin/DocumentEntity.cs | 1 + Admin.Core.Model/Admin/DocumentImageEntity.cs | 1 + Admin.Core.Model/Admin/LogAbstract.cs | 1 + Admin.Core.Model/Admin/PermissionEntity.cs | 1 + Admin.Core.Model/Admin/RoleEntity.cs | 8 +- .../Admin/RolePermissionEntity.cs | 1 + Admin.Core.Model/Admin/UserEntity.cs | 3 +- Admin.Core.Model/Admin/UserRoleEntity.cs | 11 +- Admin.Core.Model/Admin/ViewEntity.cs | 1 + Admin.Core.Model/Base/IEntityAdd.cs | 11 - Admin.Core.Model/Base/IEntityUpdate.cs | 11 - Admin.Core.Services/Admin.Core.Service.csproj | 4 +- Admin.Core.Services/Admin/Auth/AuthService.cs | 7 +- .../Admin/Permission/PermissionService.cs | 1 + .../User/Input/UserChangePasswordInput.cs | 4 +- .../Admin/User/Input/UserUpdateBasicInput.cs | 2 +- Admin.Core.Services/Admin/User/UserService.cs | 118 +- Admin.Core/Admin.Core.Model.xml | 623 -------- Admin.Core/Admin.Core.Service.xml | 1407 ----------------- Admin.Core/Admin.Core.csproj | 8 +- Admin.Core/Admin.Core.xml | 793 ---------- Admin.Core/Controllers/Admin/ImgController.cs | 76 - .../Controllers/Admin/UserController.cs | 39 +- Admin.Core/Db/Data/data.json | 2 +- Admin.Core/Db/DbHelper.cs | 4 +- Admin.Core/Db/ServiceCollectionExtensions.cs | 2 +- Admin.Core/Logs/ApiHelper.cs | 6 +- Admin.Core/Startup.cs | 5 + Admin.Core/configs/logconfig.json | 6 +- Admin.Core/nlog.config | 6 +- 53 files changed, 232 insertions(+), 3059 deletions(-) rename {Admin.Core.Model/Base => Admin.Core.Common/BaseModel}/Entity.cs (90%) rename {Admin.Core.Model/Base => Admin.Core.Common/BaseModel}/EntityAdd.cs (75%) rename {Admin.Core.Model/Base => Admin.Core.Common/BaseModel}/EntityBase.cs (74%) rename {Admin.Core.Model/Base => Admin.Core.Common/BaseModel}/EntitySoftDelete.cs (91%) rename {Admin.Core.Model/Base => Admin.Core.Common/BaseModel}/EntityUpdate.cs (73%) rename {Admin.Core.Model/Base => Admin.Core.Common/BaseModel}/EntityVersion.cs (91%) create mode 100644 Admin.Core.Common/BaseModel/IEntityAdd.cs rename {Admin.Core.Model/Base => Admin.Core.Common/BaseModel}/IEntitySoftDelete.cs (81%) create mode 100644 Admin.Core.Common/BaseModel/IEntityUpdate.cs rename {Admin.Core.Model/Base => Admin.Core.Common/BaseModel}/IEntityVersion.cs (63%) delete mode 100644 Admin.Core.Model/Base/IEntityAdd.cs delete mode 100644 Admin.Core.Model/Base/IEntityUpdate.cs delete mode 100644 Admin.Core/Admin.Core.Model.xml delete mode 100644 Admin.Core/Admin.Core.Service.xml delete mode 100644 Admin.Core/Admin.Core.xml delete mode 100644 Admin.Core/Controllers/Admin/ImgController.cs diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index c06496a51..6e5a05672 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -4,8 +4,13 @@ netcoreapp3.1 + + ..\Admin.Core\bin\Debug\netcoreapp3.1\Admin.Core.Common.xml + 1701;1702;1591 + + - + diff --git a/Admin.Core.Common/Auth/User.cs b/Admin.Core.Common/Auth/User.cs index 33224d00f..fc8890360 100644 --- a/Admin.Core.Common/Auth/User.cs +++ b/Admin.Core.Common/Auth/User.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Http; +using Admin.Core.Common.Helpers; namespace Admin.Core.Common.Auth { diff --git a/Admin.Core.Model/Base/Entity.cs b/Admin.Core.Common/BaseModel/Entity.cs similarity index 90% rename from Admin.Core.Model/Base/Entity.cs rename to Admin.Core.Common/BaseModel/Entity.cs index 082bab75f..5639eeaae 100644 --- a/Admin.Core.Model/Base/Entity.cs +++ b/Admin.Core.Common/BaseModel/Entity.cs @@ -1,6 +1,6 @@ using FreeSql.DataAnnotations; -namespace Admin.Core.Model +namespace Admin.Core.Common.BaseModel { public interface IEntity { diff --git a/Admin.Core.Model/Base/EntityAdd.cs b/Admin.Core.Common/BaseModel/EntityAdd.cs similarity index 75% rename from Admin.Core.Model/Base/EntityAdd.cs rename to Admin.Core.Common/BaseModel/EntityAdd.cs index 5c1c38575..e96f92cb4 100644 --- a/Admin.Core.Model/Base/EntityAdd.cs +++ b/Admin.Core.Common/BaseModel/EntityAdd.cs @@ -1,19 +1,19 @@ -using FreeSql.DataAnnotations; -using System; +using System; using System.ComponentModel.DataAnnotations; +using FreeSql.DataAnnotations; -namespace Admin.Core.Model +namespace Admin.Core.Common.BaseModel { /// /// 实体创建审计 /// - public class EntityAdd : Entity, IEntityAdd + public class EntityAdd : Entity, IEntityAdd where TKey : struct { /// /// 创建者Id /// [Column(Position = -3, CanUpdate = false)] - public long? CreatedUserId { get; set; } + public TKey? CreatedUserId { get; set; } /// /// 创建者 diff --git a/Admin.Core.Model/Base/EntityBase.cs b/Admin.Core.Common/BaseModel/EntityBase.cs similarity index 74% rename from Admin.Core.Model/Base/EntityBase.cs rename to Admin.Core.Common/BaseModel/EntityBase.cs index 6e5849aeb..851def3bc 100644 --- a/Admin.Core.Model/Base/EntityBase.cs +++ b/Admin.Core.Common/BaseModel/EntityBase.cs @@ -1,13 +1,13 @@ -using FreeSql.DataAnnotations; -using System; +using System; using System.ComponentModel.DataAnnotations; +using FreeSql.DataAnnotations; -namespace Admin.Core.Model +namespace Admin.Core.Common.BaseModel { /// /// 实体审计 /// - public class EntityBase : Entity, IEntityVersion, IEntitySoftDelete,IEntityAdd,IEntityUpdate + public class EntityBase : Entity, IEntityVersion, IEntitySoftDelete, IEntityAdd, IEntityUpdate where TKey : struct { /// /// 版本 @@ -25,12 +25,12 @@ public class EntityBase : Entity, IEntityVersion, IEntitySoftDelete, /// 创建者Id /// [Column(Position = -7, CanUpdate = false)] - public long? CreatedUserId { get; set; } + public TKey? CreatedUserId { get; set; } /// /// 创建者 /// - [Column(Position = -6, CanUpdate = false),MaxLength(50)] + [Column(Position = -6, CanUpdate = false), MaxLength(50)] public string CreatedUserName { get; set; } /// @@ -43,18 +43,18 @@ public class EntityBase : Entity, IEntityVersion, IEntitySoftDelete, /// 修改者Id /// [Column(Position = -4, CanInsert = false)] - public long? ModifiedUserId { get; set; } + public TKey? ModifiedUserId { get; set; } /// /// 修改者 /// - [Column(Position = -2, CanInsert = false),MaxLength(50)] + [Column(Position = -2, CanInsert = false), MaxLength(50)] public string ModifiedUserName { get; set; } /// /// 修改时间 /// - [Column(Position = -1, CanInsert = false,ServerTime = DateTimeKind.Local)] + [Column(Position = -1, CanInsert = false, ServerTime = DateTimeKind.Local)] public DateTime? ModifiedTime { get; set; } } diff --git a/Admin.Core.Model/Base/EntitySoftDelete.cs b/Admin.Core.Common/BaseModel/EntitySoftDelete.cs similarity index 91% rename from Admin.Core.Model/Base/EntitySoftDelete.cs rename to Admin.Core.Common/BaseModel/EntitySoftDelete.cs index eb18f5f28..1de695a3c 100644 --- a/Admin.Core.Model/Base/EntitySoftDelete.cs +++ b/Admin.Core.Common/BaseModel/EntitySoftDelete.cs @@ -1,6 +1,6 @@ using FreeSql.DataAnnotations; -namespace Admin.Core.Model +namespace Admin.Core.Common.BaseModel { /// /// 实体软删除 diff --git a/Admin.Core.Model/Base/EntityUpdate.cs b/Admin.Core.Common/BaseModel/EntityUpdate.cs similarity index 73% rename from Admin.Core.Model/Base/EntityUpdate.cs rename to Admin.Core.Common/BaseModel/EntityUpdate.cs index cf2072cfd..316801e3a 100644 --- a/Admin.Core.Model/Base/EntityUpdate.cs +++ b/Admin.Core.Common/BaseModel/EntityUpdate.cs @@ -1,19 +1,19 @@ -using FreeSql.DataAnnotations; -using System; +using System; using System.ComponentModel.DataAnnotations; +using FreeSql.DataAnnotations; -namespace Admin.Core.Model +namespace Admin.Core.Common.BaseModel { /// /// 实体修改审计 /// - public class EntityUpdate : Entity, IEntityUpdate + public class EntityUpdate : Entity, IEntityUpdate where TKey : struct { /// /// 修改者Id /// [Column(Position = -3, CanInsert = false)] - public long? ModifiedUserId { get; set; } + public TKey? ModifiedUserId { get; set; } /// /// 修改者 @@ -24,7 +24,7 @@ public class EntityUpdate : Entity, IEntityUpdate /// /// 修改时间 /// - [Column(Position = -1, CanInsert = false,ServerTime = DateTimeKind.Local)] + [Column(Position = -1, CanInsert = false, ServerTime = DateTimeKind.Local)] public DateTime? ModifiedTime { get; set; } } diff --git a/Admin.Core.Model/Base/EntityVersion.cs b/Admin.Core.Common/BaseModel/EntityVersion.cs similarity index 91% rename from Admin.Core.Model/Base/EntityVersion.cs rename to Admin.Core.Common/BaseModel/EntityVersion.cs index 95d8ab06b..3775c6191 100644 --- a/Admin.Core.Model/Base/EntityVersion.cs +++ b/Admin.Core.Common/BaseModel/EntityVersion.cs @@ -1,6 +1,6 @@ using FreeSql.DataAnnotations; -namespace Admin.Core.Model +namespace Admin.Core.Common.BaseModel { /// /// 实体版本 diff --git a/Admin.Core.Common/BaseModel/IEntityAdd.cs b/Admin.Core.Common/BaseModel/IEntityAdd.cs new file mode 100644 index 000000000..7ace39cac --- /dev/null +++ b/Admin.Core.Common/BaseModel/IEntityAdd.cs @@ -0,0 +1,11 @@ +using System; + +namespace Admin.Core.Common.BaseModel +{ + public interface IEntityAdd where TKey: struct + { + TKey? CreatedUserId { get; set; } + string CreatedUserName { get; set; } + DateTime? CreatedTime { get; set; } + } +} diff --git a/Admin.Core.Model/Base/IEntitySoftDelete.cs b/Admin.Core.Common/BaseModel/IEntitySoftDelete.cs similarity index 81% rename from Admin.Core.Model/Base/IEntitySoftDelete.cs rename to Admin.Core.Common/BaseModel/IEntitySoftDelete.cs index f5e58212f..9b93e10df 100644 --- a/Admin.Core.Model/Base/IEntitySoftDelete.cs +++ b/Admin.Core.Common/BaseModel/IEntitySoftDelete.cs @@ -1,5 +1,5 @@  -namespace Admin.Core.Model +namespace Admin.Core.Common.BaseModel { public interface IEntitySoftDelete { diff --git a/Admin.Core.Common/BaseModel/IEntityUpdate.cs b/Admin.Core.Common/BaseModel/IEntityUpdate.cs new file mode 100644 index 000000000..465a90611 --- /dev/null +++ b/Admin.Core.Common/BaseModel/IEntityUpdate.cs @@ -0,0 +1,11 @@ +using System; + +namespace Admin.Core.Common.BaseModel +{ + public interface IEntityUpdate where TKey : struct + { + TKey? ModifiedUserId { get; set; } + string ModifiedUserName { get; set; } + DateTime? ModifiedTime { get; set; } + } +} diff --git a/Admin.Core.Model/Base/IEntityVersion.cs b/Admin.Core.Common/BaseModel/IEntityVersion.cs similarity index 63% rename from Admin.Core.Model/Base/IEntityVersion.cs rename to Admin.Core.Common/BaseModel/IEntityVersion.cs index 0c547eeeb..df9d54397 100644 --- a/Admin.Core.Model/Base/IEntityVersion.cs +++ b/Admin.Core.Common/BaseModel/IEntityVersion.cs @@ -1,7 +1,4 @@ -using FreeSql.DataAnnotations; -using Newtonsoft.Json; - -namespace Admin.Core.Model +namespace Admin.Core.Common.BaseModel { public interface IEntityVersion { diff --git a/Admin.Core.Common/Cache/MemoryCache.cs b/Admin.Core.Common/Cache/MemoryCache.cs index 93188bd2a..590db614f 100644 --- a/Admin.Core.Common/Cache/MemoryCache.cs +++ b/Admin.Core.Common/Cache/MemoryCache.cs @@ -7,6 +7,7 @@ using System.Text.RegularExpressions; using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; +using Admin.Core.Common.Helpers; namespace Admin.Core.Common.Cache { diff --git a/Admin.Core.Common/Configs/AppConfig.cs b/Admin.Core.Common/Configs/AppConfig.cs index dd2372dfd..f84553089 100644 --- a/Admin.Core.Common/Configs/AppConfig.cs +++ b/Admin.Core.Common/Configs/AppConfig.cs @@ -11,9 +11,9 @@ public class AppConfig public bool Swagger { get; set; } /// - /// Api地址,默认 http://*:8081 + /// Api地址,默认 http://*:8888 /// - public string Urls { get; set; } = "http://*:8081"; + public string Urls { get; set; } = "http://*:8888"; /// /// Aop配置 diff --git a/Admin.Core.Common/Configs/JwtConfig.cs b/Admin.Core.Common/Configs/JwtConfig.cs index 67b75b967..d0ee2a630 100644 --- a/Admin.Core.Common/Configs/JwtConfig.cs +++ b/Admin.Core.Common/Configs/JwtConfig.cs @@ -19,7 +19,7 @@ public class JwtConfig public string Audience { get; set; } /// - /// 秘钥 + /// 密钥 /// public string SecurityKey { get; set; } diff --git a/Admin.Core.Common/Configs/UploadConfig.cs b/Admin.Core.Common/Configs/UploadConfig.cs index 085f24cb0..779ec4bcd 100644 --- a/Admin.Core.Common/Configs/UploadConfig.cs +++ b/Admin.Core.Common/Configs/UploadConfig.cs @@ -1,4 +1,7 @@ -namespace Admin.Core.Common.Configs +using System; +using System.IO; + +namespace Admin.Core.Common.Configs { /// /// 上传配置 @@ -21,10 +24,28 @@ public class UploadConfig /// public class FileUploadConfig { + private string _uploadPath; /// /// 上传路径 /// - public string UploadPath { get; set; } + public string UploadPath + { + get + { + if (_uploadPath.IsNull()) + { + _uploadPath = Path.Combine(AppContext.BaseDirectory, "upload").ToPath(); + } + + if (!Path.IsPathRooted(_uploadPath)) + { + _uploadPath = Path.Combine(AppContext.BaseDirectory, _uploadPath).ToPath(); + } + + return _uploadPath; + } + set => _uploadPath = value; + } /// /// 请求路径 diff --git a/Admin.Core.Common/Extensions/StringExtensions.cs b/Admin.Core.Common/Extensions/StringExtensions.cs index 1748a91a3..af639b552 100644 --- a/Admin.Core.Common/Extensions/StringExtensions.cs +++ b/Admin.Core.Common/Extensions/StringExtensions.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Text; +using Admin.Core.Common.Helpers; namespace Admin.Core { diff --git a/Admin.Core.Common/Files/FileSize.cs b/Admin.Core.Common/Files/FileSize.cs index 8160b61b6..1d32f03d9 100644 --- a/Admin.Core.Common/Files/FileSize.cs +++ b/Admin.Core.Common/Files/FileSize.cs @@ -1,4 +1,5 @@ using Admin.Core.Common.Extensions; +using Admin.Core.Common.Helpers; namespace Admin.Core.Common.Files { diff --git a/Admin.Core.Common/Helpers/ConfigHelper.cs b/Admin.Core.Common/Helpers/ConfigHelper.cs index c94174f52..a02f1a5ad 100644 --- a/Admin.Core.Common/Helpers/ConfigHelper.cs +++ b/Admin.Core.Common/Helpers/ConfigHelper.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; using Microsoft.Extensions.Configuration; namespace Admin.Core.Common.Helpers @@ -28,7 +29,7 @@ public ImgController(IOptionsMonitor uploadConfig) /// public IConfiguration Load(string fileName, string environmentName = "", bool reloadOnChange = false) { - var filePath = Path.Combine(Directory.GetCurrentDirectory(), "configs"); + var filePath = Path.Combine(AppContext.BaseDirectory, "configs"); if (!Directory.Exists(filePath)) return null; diff --git a/Admin.Core.Common/Helpers/UtilConvert.cs b/Admin.Core.Common/Helpers/UtilConvert.cs index d8eb9418b..3de304e7f 100644 --- a/Admin.Core.Common/Helpers/UtilConvert.cs +++ b/Admin.Core.Common/Helpers/UtilConvert.cs @@ -1,7 +1,7 @@ using System; using System.Text; -namespace Admin.Core +namespace Admin.Core.Common.Helpers { /// /// 数据类型转换 diff --git a/Admin.Core.Model/Admin.Core.Model.csproj b/Admin.Core.Model/Admin.Core.Model.csproj index 88040e312..f6625c576 100644 --- a/Admin.Core.Model/Admin.Core.Model.csproj +++ b/Admin.Core.Model/Admin.Core.Model.csproj @@ -5,7 +5,7 @@ - ..\Admin.Core\Admin.Core.Model.xml + ..\Admin.Core\bin\Debug\netcoreapp3.1\Admin.Core.Model.xml 1701;1702;1591 diff --git a/Admin.Core.Model/Admin/ApiEntity.cs b/Admin.Core.Model/Admin/ApiEntity.cs index 65346d7ff..d6d1dd3d4 100644 --- a/Admin.Core.Model/Admin/ApiEntity.cs +++ b/Admin.Core.Model/Admin/ApiEntity.cs @@ -1,4 +1,5 @@ using System; +using Admin.Core.Common.BaseModel; using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin diff --git a/Admin.Core.Model/Admin/DictionaryEntity.cs b/Admin.Core.Model/Admin/DictionaryEntity.cs index 36cae4269..eb0742267 100644 --- a/Admin.Core.Model/Admin/DictionaryEntity.cs +++ b/Admin.Core.Model/Admin/DictionaryEntity.cs @@ -1,3 +1,4 @@ +using Admin.Core.Common.BaseModel; using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin diff --git a/Admin.Core.Model/Admin/DocumentEntity.cs b/Admin.Core.Model/Admin/DocumentEntity.cs index 674619c97..eb49dc180 100644 --- a/Admin.Core.Model/Admin/DocumentEntity.cs +++ b/Admin.Core.Model/Admin/DocumentEntity.cs @@ -1,3 +1,4 @@ +using Admin.Core.Common.BaseModel; using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin diff --git a/Admin.Core.Model/Admin/DocumentImageEntity.cs b/Admin.Core.Model/Admin/DocumentImageEntity.cs index 00084386d..862cb95ec 100644 --- a/Admin.Core.Model/Admin/DocumentImageEntity.cs +++ b/Admin.Core.Model/Admin/DocumentImageEntity.cs @@ -1,3 +1,4 @@ +using Admin.Core.Common.BaseModel; using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin diff --git a/Admin.Core.Model/Admin/LogAbstract.cs b/Admin.Core.Model/Admin/LogAbstract.cs index 444af8961..ea18c2c32 100644 --- a/Admin.Core.Model/Admin/LogAbstract.cs +++ b/Admin.Core.Model/Admin/LogAbstract.cs @@ -1,3 +1,4 @@ +using Admin.Core.Common.BaseModel; using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin diff --git a/Admin.Core.Model/Admin/PermissionEntity.cs b/Admin.Core.Model/Admin/PermissionEntity.cs index 226798ffd..e02d395da 100644 --- a/Admin.Core.Model/Admin/PermissionEntity.cs +++ b/Admin.Core.Model/Admin/PermissionEntity.cs @@ -1,3 +1,4 @@ +using Admin.Core.Common.BaseModel; using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin diff --git a/Admin.Core.Model/Admin/RoleEntity.cs b/Admin.Core.Model/Admin/RoleEntity.cs index 7cc70a610..182c02b8b 100644 --- a/Admin.Core.Model/Admin/RoleEntity.cs +++ b/Admin.Core.Model/Admin/RoleEntity.cs @@ -1,6 +1,7 @@ using System; -using FreeSql.DataAnnotations; using System.Collections.Generic; +using Admin.Core.Common.BaseModel; +using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin { @@ -34,7 +35,10 @@ public class RoleEntity: EntityBase public int Sort { get; set; } [Navigate(ManyToMany = typeof(UserRoleEntity))] - public virtual ICollection Users { get; set; } + public ICollection Users { get; set; } + + [Navigate(ManyToMany = typeof(RolePermissionEntity))] + public ICollection Permissions { get; set; } } } diff --git a/Admin.Core.Model/Admin/RolePermissionEntity.cs b/Admin.Core.Model/Admin/RolePermissionEntity.cs index 871636307..15b498bf6 100644 --- a/Admin.Core.Model/Admin/RolePermissionEntity.cs +++ b/Admin.Core.Model/Admin/RolePermissionEntity.cs @@ -1,3 +1,4 @@ +using Admin.Core.Common.BaseModel; using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin diff --git a/Admin.Core.Model/Admin/UserEntity.cs b/Admin.Core.Model/Admin/UserEntity.cs index 19401dcdd..578e6ea87 100644 --- a/Admin.Core.Model/Admin/UserEntity.cs +++ b/Admin.Core.Model/Admin/UserEntity.cs @@ -1,6 +1,7 @@ using System; -using FreeSql.DataAnnotations; using System.Collections.Generic; +using Admin.Core.Common.BaseModel; +using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin { diff --git a/Admin.Core.Model/Admin/UserRoleEntity.cs b/Admin.Core.Model/Admin/UserRoleEntity.cs index 56908c415..83b68a006 100644 --- a/Admin.Core.Model/Admin/UserRoleEntity.cs +++ b/Admin.Core.Model/Admin/UserRoleEntity.cs @@ -1,3 +1,4 @@ +using Admin.Core.Common.BaseModel; using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin @@ -6,17 +7,9 @@ namespace Admin.Core.Model.Admin /// 用户角色 /// [Table(Name = "ad_user_role")] - [Index("uk_role_userid_roleid", nameof(UserId) + "," + nameof(RoleId), true)] + [Index("uk_user_role_userid_roleid", nameof(UserId) + "," + nameof(RoleId), true)] public class UserRoleEntity: EntityAdd { - public UserRoleEntity() { } - - public UserRoleEntity(long userId, long roleId) - { - UserId = userId; - RoleId = roleId; - } - /// /// 用户Id /// diff --git a/Admin.Core.Model/Admin/ViewEntity.cs b/Admin.Core.Model/Admin/ViewEntity.cs index dd1e7eb40..74c24129a 100644 --- a/Admin.Core.Model/Admin/ViewEntity.cs +++ b/Admin.Core.Model/Admin/ViewEntity.cs @@ -1,4 +1,5 @@ using System; +using Admin.Core.Common.BaseModel; using FreeSql.DataAnnotations; namespace Admin.Core.Model.Admin diff --git a/Admin.Core.Model/Base/IEntityAdd.cs b/Admin.Core.Model/Base/IEntityAdd.cs deleted file mode 100644 index 9cc8b16e9..000000000 --- a/Admin.Core.Model/Base/IEntityAdd.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace Admin.Core.Model -{ - public interface IEntityAdd - { - long? CreatedUserId { get; set; } - string CreatedUserName { get; set; } - DateTime? CreatedTime { get; set; } - } -} diff --git a/Admin.Core.Model/Base/IEntityUpdate.cs b/Admin.Core.Model/Base/IEntityUpdate.cs deleted file mode 100644 index 33963fb77..000000000 --- a/Admin.Core.Model/Base/IEntityUpdate.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace Admin.Core.Model -{ - public interface IEntityUpdate - { - long? ModifiedUserId { get; set; } - string ModifiedUserName { get; set; } - DateTime? ModifiedTime { get; set; } - } -} diff --git a/Admin.Core.Services/Admin.Core.Service.csproj b/Admin.Core.Services/Admin.Core.Service.csproj index a0e86d7d9..a37306530 100644 --- a/Admin.Core.Services/Admin.Core.Service.csproj +++ b/Admin.Core.Services/Admin.Core.Service.csproj @@ -5,8 +5,8 @@ - ..\Admin.Core\bin\Debug\ - ..\Admin.Core\Admin.Core.Service.xml + + ..\Admin.Core\bin\Debug\netcoreapp3.1\Admin.Core.Service.xml 1701;1702;1591 diff --git a/Admin.Core.Services/Admin/Auth/AuthService.cs b/Admin.Core.Services/Admin/Auth/AuthService.cs index d952e71f9..2e63c1c28 100644 --- a/Admin.Core.Services/Admin/Auth/AuthService.cs +++ b/Admin.Core.Services/Admin/Auth/AuthService.cs @@ -21,7 +21,6 @@ public class AuthService : IAuthService private readonly VerifyCodeHelper _verifyCodeHelper; private readonly IUserRepository _userRepository; private readonly IPermissionRepository _permissionRepository; - private readonly IRolePermissionRepository _rolePermissionRepository; public AuthService( IUser user, @@ -29,8 +28,7 @@ public AuthService( IMapper mapper, VerifyCodeHelper verifyCodeHelper, IUserRepository userRepository, - IPermissionRepository permissionRepository, - IRolePermissionRepository rolePermissionRepository + IPermissionRepository permissionRepository ) { _user = user; @@ -39,7 +37,6 @@ IRolePermissionRepository rolePermissionRepository _verifyCodeHelper = verifyCodeHelper; _userRepository = userRepository; _permissionRepository = permissionRepository; - _rolePermissionRepository = rolePermissionRepository; } public async Task LoginAsync(AuthLoginInput input) @@ -123,7 +120,7 @@ public async Task GetUserInfoAsync() var menus = await _permissionRepository.Select .Where(a => new[] { PermissionType.Group, PermissionType.Menu }.Contains(a.Type)) .Where(a => - _rolePermissionRepository.Select + _permissionRepository.Orm.Select() .InnerJoin((b, c) => b.RoleId == c.RoleId && c.UserId == _user.Id) .Where(b => b.PermissionId == a.Id) .Any() diff --git a/Admin.Core.Services/Admin/Permission/PermissionService.cs b/Admin.Core.Services/Admin/Permission/PermissionService.cs index e8ce8f889..257a540bb 100644 --- a/Admin.Core.Services/Admin/Permission/PermissionService.cs +++ b/Admin.Core.Services/Admin/Permission/PermissionService.cs @@ -10,6 +10,7 @@ using Admin.Core.Service.Admin.Permission.Output; using Admin.Core.Common.Cache; using Admin.Core.Common.Attributes; +using Admin.Core.Common.Helpers; namespace Admin.Core.Service.Admin.Permission { diff --git a/Admin.Core.Services/Admin/User/Input/UserChangePasswordInput.cs b/Admin.Core.Services/Admin/User/Input/UserChangePasswordInput.cs index 2ea0fa1b6..e8850e32d 100644 --- a/Admin.Core.Services/Admin/User/Input/UserChangePasswordInput.cs +++ b/Admin.Core.Services/Admin/User/Input/UserChangePasswordInput.cs @@ -1,5 +1,5 @@ -using Admin.Core.Model; -using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations; +using Admin.Core.Common.BaseModel; namespace Admin.Core.Service.Admin.User.Input { diff --git a/Admin.Core.Services/Admin/User/Input/UserUpdateBasicInput.cs b/Admin.Core.Services/Admin/User/Input/UserUpdateBasicInput.cs index cfeb867fc..c78d04ab0 100644 --- a/Admin.Core.Services/Admin/User/Input/UserUpdateBasicInput.cs +++ b/Admin.Core.Services/Admin/User/Input/UserUpdateBasicInput.cs @@ -1,4 +1,4 @@ -using Admin.Core.Model; +using Admin.Core.Common.BaseModel; using System.ComponentModel.DataAnnotations; namespace Admin.Core.Service.Admin.User.Input diff --git a/Admin.Core.Services/Admin/User/UserService.cs b/Admin.Core.Services/Admin/User/UserService.cs index 67f78aeea..cfaec217a 100644 --- a/Admin.Core.Services/Admin/User/UserService.cs +++ b/Admin.Core.Services/Admin/User/UserService.cs @@ -58,6 +58,38 @@ public async Task> GetAsync(long id) return res.Ok(entityDto); } + public async Task GetBasicAsync() + { + if (!(_user?.Id > 0)) + { + return ResponseOutput.NotOk("未登录!"); + } + + var data = await _userRepository.GetAsync(_user.Id); + return ResponseOutput.Ok(data); + } + + public async Task> GetPermissionsAsync() + { + var key = string.Format(CacheKey.UserPermissions, _user.Id); + if (await _cache.ExistsAsync(key)) + { + return await _cache.GetAsync>(key); + } + else + { + var userPermissoins = await _rolePermissionRepository.Select + .InnerJoin((a, b) => a.RoleId == b.RoleId && b.UserId == _user.Id && a.Permission.Type == PermissionType.Api) + .Include(a => a.Permission.Api) + .Distinct() + .ToListAsync(a => a.Permission.Api.Path); + + await _cache.SetAsync(key, userPermissoins); + + return userPermissoins; + } + } + public async Task PageAsync(PageInput input) { var key = input.Filter?.UserName; @@ -99,7 +131,7 @@ public async Task AddAsync(UserAddInput input) if (input.RoleIds != null && input.RoleIds.Any()) { - var roles = input.RoleIds.Select(d => new UserRoleEntity(user.Id, d)); + var roles = input.RoleIds.Select(a => new UserRoleEntity { UserId = user.Id, RoleId = a }); await _userRoleRepository.InsertAsync(roles); } @@ -114,45 +146,29 @@ public async Task UpdateAsync(UserUpdateInput input) return ResponseOutput.NotOk(); } - var entity = await _userRepository.GetAsync(input.Id); - if (!(entity?.Id > 0)) + var user = await _userRepository.GetAsync(input.Id); + if (!(user?.Id > 0)) { return ResponseOutput.NotOk("用户不存在!"); } - _mapper.Map(input, entity); - await _userRepository.UpdateAsync(entity); - await _userRoleRepository.DeleteAsync(a => a.UserId == entity.Id); + _mapper.Map(input, user); + await _userRepository.UpdateAsync(user); + await _userRoleRepository.DeleteAsync(a => a.UserId == user.Id); if (input.RoleIds != null && input.RoleIds.Any()) { - var roles = input.RoleIds.Select(d => new UserRoleEntity(entity.Id, d)); + var roles = input.RoleIds.Select(a => new UserRoleEntity { UserId = user.Id, RoleId = a }); await _userRoleRepository.InsertAsync(roles); } return ResponseOutput.Ok(); } - public async Task DeleteAsync(long id) - { - var result = false; - if (id > 0) - { - result = (await _userRepository.DeleteAsync(m => m.Id == id)) > 0; - } - - return ResponseOutput.Result(result); - } - - public async Task SoftDeleteAsync(long id) - { - var result = await _userRepository.SoftDeleteAsync(id); - - return ResponseOutput.Result(result); - } - - public async Task BatchSoftDeleteAsync(long[] ids) + public async Task UpdateBasicAsync(UserUpdateBasicInput input) { - var result = await _userRepository.SoftDeleteAsync(ids); + var entity = await _userRepository.GetAsync(input.Id); + entity = _mapper.Map(input, entity); + var result = (await _userRepository.UpdateAsync(entity)) > 0; return ResponseOutput.Result(result); } @@ -163,7 +179,7 @@ public async Task ChangePasswordAsync(UserChangePasswordInput i { return ResponseOutput.NotOk("新密码和确认密码不一致!"); } - + var entity = await _userRepository.GetAsync(input.Id); var oldPassword = MD5Encrypt.Encrypt32(input.OldPassword); if (oldPassword != entity.Password) @@ -172,52 +188,36 @@ public async Task ChangePasswordAsync(UserChangePasswordInput i } input.Password = MD5Encrypt.Encrypt32(input.NewPassword); - - entity = _mapper.Map(input, entity); - var result = (await _userRepository.UpdateAsync(entity))>0; - - return ResponseOutput.Result(result); - } - public async Task UpdateBasicAsync(UserUpdateBasicInput input) - { - var entity = await _userRepository.GetAsync(input.Id); entity = _mapper.Map(input, entity); var result = (await _userRepository.UpdateAsync(entity)) > 0; return ResponseOutput.Result(result); } - public async Task GetBasicAsync() + public async Task DeleteAsync(long id) { - if (!(_user?.Id > 0)) + var result = false; + if (id > 0) { - return ResponseOutput.NotOk("未登录!"); + result = (await _userRepository.DeleteAsync(m => m.Id == id)) > 0; } - var data = await _userRepository.Select.WhereDynamic(_user.Id).ToOneAsync(); - return ResponseOutput.Ok(data); + return ResponseOutput.Result(result); } - public async Task> GetPermissionsAsync() + public async Task SoftDeleteAsync(long id) { - var key = string.Format(CacheKey.UserPermissions, _user.Id); - if(await _cache.ExistsAsync(key)) - { - return await _cache.GetAsync>(key); - } - else - { - var userPermissoins = await _rolePermissionRepository.Select - .InnerJoin((a, b) => a.RoleId == b.RoleId && b.UserId == _user.Id && a.Permission.Type == PermissionType.Api) - .Include(a => a.Permission.Api) - .Distinct() - .ToListAsync(a => a.Permission.Api.Path); + var result = await _userRepository.SoftDeleteAsync(id); - await _cache.SetAsync(key, userPermissoins); - - return userPermissoins; - } + return ResponseOutput.Result(result); + } + + public async Task BatchSoftDeleteAsync(long[] ids) + { + var result = await _userRepository.SoftDeleteAsync(ids); + + return ResponseOutput.Result(result); } } } diff --git a/Admin.Core/Admin.Core.Model.xml b/Admin.Core/Admin.Core.Model.xml deleted file mode 100644 index c56757cf7..000000000 --- a/Admin.Core/Admin.Core.Model.xml +++ /dev/null @@ -1,623 +0,0 @@ - - - - Admin.Core.Model - - - - - 接口管理 - - - - - 所属模块 - - - - - 接口命名 - - - - - 接口名称 - - - - - 接口地址 - - - - - 接口提交方法 - - - - - 说明 - - - - - 排序 - - - - - 启用 - - - - - 数据字典 - - - - - 字典父级 - - - - - 字典名称 - - - - - 字典编码 - - - - - 字典值 - - - - - 描述 - - - - - 启用 - - - - - 排序 - - - - - 文档 - - - - - 父级节点 - - - - - 名称 - - - - - 类型 - - - - - 命名 - - - - - 内容 - - - - - Html - - - - - 启用 - - - - - 打开组 - - - - - 排序 - - - - - 描述 - - - - - 文档图片 - - - - - 用户Id - - - - - 请求路径 - - - - - 文档类型 - - - - - 分组 - - - - - Markdown文档 - - - - - 日志 - - - - - 昵称 - - - - - IP - - - - - 浏览器 - - - - - 操作系统 - - - - - 设备 - - - - - 浏览器信息 - - - - - 耗时(毫秒) - - - - - 操作状态 - - - - - 操作消息 - - - - - 操作结果 - - - - - 操作日志 - - - - - 操作日志 - - - - - 接口名称 - - - - - 接口地址 - - - - - 接口提交方法 - - - - - 操作参数 - - - - - 权限 - - - - - 父级节点 - - - - - 权限名称 - - - - - 权限类型 - - - - - 视图 - - - - - 接口 - - - - - 菜单访问地址 - - - - - 图标 - - - - - 隐藏 - - - - - 启用 - - - - - 可关闭 - - - - - 打开组 - - - - - 打开新窗口 - - - - - 链接外显 - - - - - 排序 - - - - - 描述 - - - - - 权限类型 - - - - - 分组 - - - - - 菜单 - - - - - 接口 - - - - - 角色 - - - - - 名称 - - - - - 说明 - - - - - 启用 - - - - - 排序 - - - - - 角色权限 - - - - - 角色Id - - - - - 权限Id - - - - - 角色 - - - - - 权限 - - - - - 用户 - - - - - 账号 - - - - - 密码 - - - - - 昵称 - - - - - 头像 - - - - - 状态 - - - - - 备注 - - - - - 用户角色 - - - - - 用户Id - - - - - 角色Id - - - - - 视图管理 - - - - - 所属节点 - - - - - 视图命名 - - - - - 视图名称 - - - - - 视图路径 - - - - - 说明 - - - - - 启用 - - - - - 排序 - - - - - 编号 - - - - - 实体创建审计 - - - - - 创建者Id - - - - - 创建者 - - - - - 创建时间 - - - - - 实体审计 - - - - - 版本 - - - - - 是否删除 - - - - - 创建者Id - - - - - 创建者 - - - - - 创建时间 - - - - - 修改者Id - - - - - 修改者 - - - - - 修改时间 - - - - - 实体软删除 - - - - - 是否删除 - - - - - 实体修改审计 - - - - - 修改者Id - - - - - 修改者 - - - - - 修改时间 - - - - - 实体版本 - - - - - 版本 - - - - - 是否删除 - - - - - 版本 - - - - diff --git a/Admin.Core/Admin.Core.Service.xml b/Admin.Core/Admin.Core.Service.xml deleted file mode 100644 index 627c9ef9f..000000000 --- a/Admin.Core/Admin.Core.Service.xml +++ /dev/null @@ -1,1407 +0,0 @@ - - - - Admin.Core.Service - - - - - 接口服务 - - - - - 获得一条记录 - - - - - - - 获得列表 - - - - - - - 获得分页 - - - - - - - 添加 - - - - - - - 修改 - - - - - - - 删除 - - - - - - - 软删除 - - - - - - - 批量软删除 - - - - - - - 同步 - - - - - - - 添加 - - - - - 所属模块 - - - - - 接口名称 - - - - - 接口地址 - - - - - 接口提交方法 - - - - - 说明 - - - - - 启用 - - - - - 接口同步Dto - - - - - 接口名称 - - - - - 接口地址 - - - - - 父级路径 - - - - - 接口提交方法 - - - - - 接口同步 - - - - - 修改 - - - - - 接口Id - - - - - 版本 - - - - - 接口Id - - - - - 接口父级 - - - - - 接口命名 - - - - - 接口名称 - - - - - 接口地址 - - - - - 接口提交方法 - - - - - 说明 - - - - - 启用 - - - - - 映射配置 - - - - - 权限服务 - - - - - 登录信息 - - - - - 账号 - - - - - 密码 - - - - - 密码键 - - - - - 验证码 - - - - - 验证码键 - - - - - 主键Id - - - - - 账号 - - - - - 姓名 - - - - - 映射配置 - - - - - 缓存服务 - - - - - 缓存列表 - - - - - - 清除缓存 - - - - - - - 添加 - - - - - 字典父级 - - - - - 字典名称 - - - - - 字典编码 - - - - - 字典值 - - - - - 描述 - - - - - 启用 - - - - - 修改 - - - - - 主键Id - - - - - 版本 - - - - - 主键Id - - - - - 字典父级 - - - - - 字典名称 - - - - - 字典编码 - - - - - 字典值 - - - - - 描述 - - - - - 启用 - - - - - 创建时间 - - - - - 映射配置 - - - - - 父级节点 - - - - - 类型 - - - - - 名称 - - - - - 命名 - - - - - 打开 - - - - - 用户Id - - - - - 请求路径 - - - - - 父级节点 - - - - - 类型 - - - - - 命名 - - - - - 名称 - - - - - 说明 - - - - - 编号 - - - - - 名称 - - - - - 内容 - - - - - Html - - - - - 版本 - - - - - 编号 - - - - - 版本 - - - - - 编号 - - - - - 版本 - - - - - 上传文件 - - - - - 文档编号 - - - - - 编号 - - - - - 名称 - - - - - 内容 - - - - - 版本 - - - - - 编号 - - - - - 父级节点 - - - - - 名称 - - - - - 类型 - - - - - 命名 - - - - - 描述 - - - - - 组打开 - - - - - 映射配置 - - - - - 添加 - - - - - 昵称 - - - - - IP - - - - - 浏览器 - - - - - 操作系统 - - - - - 设备 - - - - - 浏览器信息 - - - - - 耗时(毫秒) - - - - - 操作状态 - - - - - 操作消息 - - - - - 操作结果 - - - - - 创建者Id - - - - - 创建者 - - - - - 编号 - - - - - 昵称 - - - - - 创建者 - - - - - IP - - - - - 浏览器 - - - - - 操作系统 - - - - - 设备 - - - - - 耗时(毫秒) - - - - - 操作状态 - - - - - 操作消息 - - - - - 创建时间 - - - - - 映射配置 - - - - - 添加 - - - - - 昵称 - - - - - 接口名称 - - - - - 接口地址 - - - - - 接口提交方法 - - - - - IP - - - - - 浏览器 - - - - - 操作系统 - - - - - 设备 - - - - - 浏览器信息 - - - - - 耗时(毫秒) - - - - - 操作状态 - - - - - 操作消息 - - - - - 操作参数 - - - - - 操作结果 - - - - - 编号 - - - - - 昵称 - - - - - 创建者 - - - - - 接口名称 - - - - - 接口地址 - - - - - 接口提交方法 - - - - - IP - - - - - 浏览器 - - - - - 操作系统 - - - - - 设备 - - - - - 耗时(毫秒) - - - - - 操作状态 - - - - - 操作消息 - - - - - 创建时间 - - - - - 映射配置 - - - - - 权限类型 - - - - - 父级节点 - - - - - 接口 - - - - - 权限名称 - - - - - 说明 - - - - - 隐藏 - - - - - 图标 - - - - - 权限类型 - - - - - 父级节点 - - - - - 权限名称 - - - - - 隐藏 - - - - - 图标 - - - - - 打开 - - - - - 权限类型 - - - - - 父级节点 - - - - - 视图 - - - - - 访问地址 - - - - - 权限名称 - - - - - 说明 - - - - - 隐藏 - - - - - 图标 - - - - - 可关闭 - - - - - 打开新窗口 - - - - - 链接外显 - - - - - 权限Id - - - - - 版本 - - - - - 权限Id - - - - - 版本 - - - - - 权限Id - - - - - 版本 - - - - - 权限Id - - - - - 父级节点 - - - - - 权限名称 - - - - - 权限命名 - - - - - 权限类型 - - - - - 访问地址 - - - - - 接口路径 - - - - - 描述 - - - - - 图标 - - - - - 组打开 - - - - - 隐藏 - - - - - 启用 - - - - - 映射配置 - - - - - 添加 - - - - - 名称 - - - - - 说明 - - - - - 启用 - - - - - 修改 - - - - - 接口Id - - - - - 版本 - - - - - 主键 - - - - - 名称 - - - - - 说明 - - - - - 启用 - - - - - 创建时间 - - - - - 映射配置 - - - - - 添加 - - - - - 账号 - - - - - 密码 - - - - - 昵称 - - - - - 状态 - - - - - 备注 - - - - - 角色 - - - - - 修改密码 - - - - - 旧密码 - - - - - 新密码 - - - - - 确认新密码 - - - - - 密码 - - - - - 版本 - - - - - 更新基本信息 - - - - - 头像 - - - - - 昵称 - - - - - 备注 - - - - - 版本 - - - - - 修改 - - - - - 主键Id - - - - - 账号 - - - - - 昵称 - - - - - 状态 - - - - - 备注 - - - - - 角色 - - - - - 版本 - - - - - 用户服务 - - - - - 主键Id - - - - - 账号 - - - - - 姓名 - - - - - 昵称 - - - - - 状态 - - - - - 角色 - - - - - 备注 - - - - - 创建时间 - - - - - 映射配置 - 双向映射 .ReverseMap() - - - - - 添加 - - - - - 所属节点 - - - - - 视图命名 - - - - - 视图名称 - - - - - 视图路径 - - - - - 说明 - - - - - 启用 - - - - - 视图命名 - - - - - 名称 - - - - - 地址 - - - - - 父级路径 - - - - - 修改 - - - - - 视图Id - - - - - 版本 - - - - - 映射配置 - - - - - 视图服务 - - - - - 获得一条记录 - - - - - - - 视图Id - - - - - 视图父级 - - - - - 视图命名 - - - - - 视图名称 - - - - - 视图路径 - - - - - 启用 - - - - - 说明 - - - - - 用户服务 - - - - diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index 0e79e1396..7d21f7dfb 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -7,7 +7,7 @@ - ..\Admin.Core\Admin.Core.xml + ..\Admin.Core\bin\Debug\netcoreapp3.1\Admin.Core.xml 1701;1702;1591 @@ -48,12 +48,6 @@ Always - - Always - - - Always - diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml deleted file mode 100644 index e518fc186..000000000 --- a/Admin.Core/Admin.Core.xml +++ /dev/null @@ -1,793 +0,0 @@ - - - - Admin.Core - - - - - 启用登录 - - - - - 禁用操作日志 - - - - - 启用权限 - - - - - 输入模型验证 - - - - - 自定义路由 /api/{version}/[area]/[controler]/[action] - - - - - 权限处理接口 - - - - - 权限验证 - - - - - - - - 权限处理 - - - - - 权限验证 - - 接口路径 - http请求方法 - - - - - 响应认证处理器 - - - - - 接口管理 - - - - - 查询单条接口 - - - - - - - 查询全部接口 - - - - - - - 查询分页接口 - - 分页模型 - - - - - 新增接口 - - - - - - - 修改接口 - - - - - - - 删除接口 - - - - - - - 批量删除接口 - - - - - - - 同步接口 - 支持新增和修改接口 - 根据接口是否存在自动禁用和启用api - - - - - - - 域控制器 - - - - - 授权管理 - - - - - 获取验证码 - - 上次验证码键 - - - - - 获取密钥 - - - - - - 查询用户信息 - - - - - - 用户登录 - 根据登录信息生成Token - - 登录信息 - - - - - 缓存管理 - - - - - 获取缓存列表 - - - - - - 清除缓存 - - - - - - - 数据字典 - - - - - 查询单条数据字典 - - - - - - - 查询分页数据字典 - - - - - - - 新增数据字典 - - - - - - - 修改数据字典 - - - - - - - 删除数据字典 - - - - - - - 文档管理 - - - - - 查询文档列表 - - - - - - - - - 查询文档图片列表 - - - - - - - 查询单条分组 - - - - - - - 查询单条菜单 - - - - - - - 查询单条文档内容 - - - - - - - 查询精简文档列表 - - - - - - 新增分组 - - - - - - - 新增菜单 - - - - - - - 修改分组 - - - - - - - 修改菜单 - - - - - - - 修改文档内容 - - - - - - - 删除文档 - - - - - - - 删除图片 - - - - - - - - 上传文档图片 - - - - - - - 图片管理 - - - - - 上传头像 - - - - - - - 登录日志管理 - - - - - 查询分页登录日志 - - - - - - - 操作日志管理 - - - - - 查询分页操作日志 - - - - - - - 权限管理 - - - - - 查询权限列表 - - - - - - - - - 查询单条分组 - - - - - - - 查询单条菜单 - - - - - - - 查询单条接口 - - - - - - - 查询角色权限-权限列表 - - - - - - 查询角色权限 - - - - - - - 新增分组 - - - - - - - 新增菜单 - - - - - - - 新增接口 - - - - - - - 修改分组 - - - - - - - 修改菜单 - - - - - - - 修改接口 - - - - - - - 删除权限 - - - - - - - 保存角色权限 - - - - - - - 角色管理 - - - - - 查询单条角色 - - - - - - - 查询分页角色 - - - - - - - 新增角色 - - - - - - - 修改角色 - - - - - - - 删除角色 - - - - - - - 批量删除角色 - - - - - - - 用户管理 - - - - - 查询用户基本信息 - - - - - - 查询单条用户 - - - - - - - 查询分页用户 - - - - - - - 新增用户 - - - - - - - 修改用户 - - - - - - - 删除用户 - - - - - - - 批量删除用户 - - - - - - - 更新用户密码 - - - - - - - 更新用户基本信息 - - - - - - - 视图管理 - - - - - 查询单条视图 - - - - - - - 查询全部视图 - - - - - - - 查询分页视图 - - 分页模型 - - - - - 新增视图 - - - - - - - 修改视图 - - - - - - - 删除视图 - - - - - - - 批量删除视图 - - - - - - - 同步视图 - 支持新增和修改视图 - 根据视图是否存在自动禁用和启用视图 - - - - - - - 基础控制器 - - - - - 数据 - - - - - 创建数据库 - - - - - - - 同步结构 - - - - - 初始化数据表数据 - - - - - - - - - - - 同步数据审计方法 - - - - - - - 同步数据 - - - - - - 生成极简数据 - - - - - - - 添加数据库 - - - - - - - - 接口版本 - - - - - V1 版本 - - - - - V2 版本 - - - - - 状态码枚举 - - - - - 操作失败 - - - - - 操作成功 - - - - - 未登录(需要重新登录) - - - - - 权限不足 - - - - - 资源不存在 - - - - - 系统内部错误(非业务代码里显式抛出的异常,例如由于数据不正确导致空指针异常、数据库异常等等) - - - - - Admin异常错误过滤 - - - - - Api帮助类 - - - - - 接口名称 - - - - - 接口地址 - - - - - 操作日志处理接口 - - - - - 写操作日志 - - - - - - - - 操作日志处理 - - - - diff --git a/Admin.Core/Controllers/Admin/ImgController.cs b/Admin.Core/Controllers/Admin/ImgController.cs deleted file mode 100644 index ab0ddbe70..000000000 --- a/Admin.Core/Controllers/Admin/ImgController.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Options; -using Admin.Core.Common.Output; -using Admin.Core.Attributes; -using Admin.Core.Common.Helpers; -using Admin.Core.Common.Configs; -using Admin.Core.Common.Auth; - -namespace Admin.Core.Controllers.Admin -{ - /// - /// 图片管理 - /// - public class ImgController : AreaController - { - private readonly IUser _user; - private readonly UploadConfig _uploadConfig; - private readonly UploadHelper _uploadHelper; - - public ImgController( - IUser user, - IOptionsMonitor uploadConfig, - UploadHelper uploadHelper - ) - { - _user = user; - _uploadConfig = uploadConfig.CurrentValue; - _uploadHelper = uploadHelper; - } - - /* - /// - /// 获取头像 - /// - /// - /// - /// - [HttpGet] - [Route("{fileName}")] - [NoOprationLog] - [AllowAnonymous] - public FileStreamResult Avatar([FromServices]IWebHostEnvironment environment, string fileName = "") - { - string filePath = Path.Combine(environment.WebRootPath,"avatar", fileName).ToPath(); - var stream = System.IO.File.OpenRead(filePath); - string fileExt = Path.GetExtension(filePath); - var contentTypeProvider = new Microsoft.AspNetCore.StaticFiles.FileExtensionContentTypeProvider(); - var contentType = contentTypeProvider.Mappings[fileExt]; - var fileDownloadName = Path.GetFileName(filePath); - - return File(stream, contentType, fileDownloadName); - } - */ - - /// - /// 上传头像 - /// - /// - /// - [HttpPost] - [Login] - public async Task AvatarUpload([FromForm]IFormFile file) - { - var config = _uploadConfig.Avatar; - var res = await _uploadHelper.UploadAsync(file, config, new { _user.Id }); - if (res.Success) - { - return ResponseOutput.Ok(res.Data.FileRelativePath); - } - - return ResponseOutput.NotOk("上传失败!"); - } - } -} diff --git a/Admin.Core/Controllers/Admin/UserController.cs b/Admin.Core/Controllers/Admin/UserController.cs index 6d07c3487..f8f63d7a9 100644 --- a/Admin.Core/Controllers/Admin/UserController.cs +++ b/Admin.Core/Controllers/Admin/UserController.cs @@ -5,6 +5,12 @@ using Admin.Core.Model.Admin; using Admin.Core.Service.Admin.User.Input; using Microsoft.AspNetCore.Mvc; +using Admin.Core.Attributes; +using Microsoft.AspNetCore.Http; +using Admin.Core.Common.Auth; +using Admin.Core.Common.Configs; +using Admin.Core.Common.Helpers; +using Microsoft.Extensions.Options; namespace Admin.Core.Controllers.Admin { @@ -13,10 +19,22 @@ namespace Admin.Core.Controllers.Admin /// public class UserController : AreaController { + private readonly IUser _user; + private readonly UploadConfig _uploadConfig; + private readonly UploadHelper _uploadHelper; + private readonly IUserService _userServices; - public UserController(IUserService userServices) + public UserController( + IUser user, + IOptionsMonitor uploadConfig, + UploadHelper uploadHelper, + IUserService userServices + ) { + _user = user; + _uploadConfig = uploadConfig.CurrentValue; + _uploadHelper = uploadHelper; _userServices = userServices; } @@ -118,5 +136,24 @@ public async Task UpdateBasic(UserUpdateBasicInput input) { return await _userServices.UpdateBasicAsync(input); } + + /// + /// 上传头像 + /// + /// + /// + [HttpPost] + [Login] + public async Task AvatarUpload([FromForm]IFormFile file) + { + var config = _uploadConfig.Avatar; + var res = await _uploadHelper.UploadAsync(file, config, new { _user.Id }); + if (res.Success) + { + return ResponseOutput.Ok(res.Data.FileRelativePath); + } + + return ResponseOutput.NotOk("上传失败!"); + } } } \ No newline at end of file diff --git a/Admin.Core/Db/Data/data.json b/Admin.Core/Db/Data/data.json index 7f222a394..f613340ea 100644 --- a/Admin.Core/Db/Data/data.json +++ b/Admin.Core/Db/Data/data.json @@ -1 +1 @@ -{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":4,"label":"图片管理","path":"img","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":77,"parentId":4,"label":"上传头像","path":"/api/admin/img/avatarupload","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""},{"id":90,"parentId":78,"label":"上传文档图片","path":"/api/admin/document/uploadimage","httpMethods":"post","description":""},{"id":91,"parentId":78,"label":"查询文档图片列表","path":"/api/admin/document/getimagelist","httpMethods":"get","description":""},{"id":92,"parentId":78,"label":"删除图片","path":"/api/admin/document/deleteimage","httpMethods":"delete","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","type":3,"apiId":89,"sort":11,"description":""},{"id":93,"parentId":75,"label":"上传文档图片","type":3,"apiId":90,"sort":0,"description":""},{"id":94,"parentId":75,"label":"查询文档图片列表","type":3,"apiId":91,"sort":0,"description":""},{"id":95,"parentId":75,"label":"删除图片","type":3,"apiId":92,"sort":0,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","nickName":"小雪转中雪","avatar":"2/14753102362214400.gif","remark":""}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":3,"userId":2,"roleId":2}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":168,"roleId":1,"permissionId":94},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92},{"id":167,"roleId":2,"permissionId":93},{"id":169,"roleId":2,"permissionId":94},{"id":170,"roleId":2,"permissionId":95}]} \ No newline at end of file +{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""},{"id":90,"parentId":78,"label":"上传文档图片","path":"/api/admin/document/uploadimage","httpMethods":"post","description":""},{"id":91,"parentId":78,"label":"查询文档图片列表","path":"/api/admin/document/getimagelist","httpMethods":"get","description":""},{"id":92,"parentId":78,"label":"删除图片","path":"/api/admin/document/deleteimage","httpMethods":"delete","description":""},{"id":93,"parentId":7,"label":"上传头像","path":"/api/admin/user/avatarupload","httpMethods":"post","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","type":3,"apiId":89,"sort":11,"description":""},{"id":93,"parentId":75,"label":"上传文档图片","type":3,"apiId":90,"sort":0,"description":""},{"id":94,"parentId":75,"label":"查询文档图片列表","type":3,"apiId":91,"sort":0,"description":""},{"id":95,"parentId":75,"label":"删除图片","type":3,"apiId":92,"sort":0,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","nickName":"小雪转中雪","avatar":"2/14753102362214400.gif","remark":""},{"id":3,"userName":"jack","password":"96E79218965EB72C92A549DD5A33112","nickName":"杰克"}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""},{"id":3,"name":"文档管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":3,"userId":2,"roleId":2},{"id":6,"userId":3,"roleId":3}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":168,"roleId":1,"permissionId":94},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92},{"id":167,"roleId":2,"permissionId":93},{"id":169,"roleId":2,"permissionId":94},{"id":170,"roleId":2,"permissionId":95},{"id":173,"roleId":3,"permissionId":4},{"id":174,"roleId":3,"permissionId":47},{"id":189,"roleId":3,"permissionId":48},{"id":190,"roleId":3,"permissionId":49},{"id":191,"roleId":3,"permissionId":50},{"id":171,"roleId":3,"permissionId":66},{"id":172,"roleId":3,"permissionId":75},{"id":179,"roleId":3,"permissionId":76},{"id":182,"roleId":3,"permissionId":77},{"id":183,"roleId":3,"permissionId":78},{"id":184,"roleId":3,"permissionId":79},{"id":185,"roleId":3,"permissionId":80},{"id":186,"roleId":3,"permissionId":81},{"id":180,"roleId":3,"permissionId":82},{"id":181,"roleId":3,"permissionId":83},{"id":178,"roleId":3,"permissionId":90},{"id":187,"roleId":3,"permissionId":91},{"id":188,"roleId":3,"permissionId":92},{"id":176,"roleId":3,"permissionId":93},{"id":177,"roleId":3,"permissionId":94},{"id":175,"roleId":3,"permissionId":95}]} \ No newline at end of file diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index 90e0061d2..26c8ee126 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -10,6 +10,7 @@ using Admin.Core.Common.Configs; using Admin.Core.Common.Helpers; using Admin.Core.Model.Admin; +using System.Reflection; namespace Admin.Core.Db { @@ -195,7 +196,8 @@ public static async Task SyncData(IFreeSql db, DbConfig dbConfig = null) Console.WriteLine("\r\nsync data started"); db.Aop.AuditValue += SyncDataAuditValue; - var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Db/Data/data.json").ToPath(); + + var filePath = Path.Combine(AppContext.BaseDirectory, "Db/Data/data.json").ToPath(); var jsonData = FileHelper.ReadFile(filePath); var data = JsonConvert.DeserializeObject(jsonData); diff --git a/Admin.Core/Db/ServiceCollectionExtensions.cs b/Admin.Core/Db/ServiceCollectionExtensions.cs index 2e4b137de..affb2d70b 100644 --- a/Admin.Core/Db/ServiceCollectionExtensions.cs +++ b/Admin.Core/Db/ServiceCollectionExtensions.cs @@ -4,8 +4,8 @@ using FreeSql; using Admin.Core.Common.Configs; using Admin.Core.Common.Helpers; -using Admin.Core.Model; using Admin.Core.Common.Auth; +using Admin.Core.Common.BaseModel; namespace Admin.Core.Db { diff --git a/Admin.Core/Logs/ApiHelper.cs b/Admin.Core/Logs/ApiHelper.cs index 38df712f9..159712a4e 100644 --- a/Admin.Core/Logs/ApiHelper.cs +++ b/Admin.Core/Logs/ApiHelper.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; using System.Linq; using System.Collections.Generic; using Newtonsoft.Json; @@ -6,6 +7,7 @@ using Admin.Core.Db; using Admin.Core.Common.Attributes; + namespace Admin.Core.Logs { /// @@ -28,7 +30,7 @@ public List GetApis() return _apis; _apis = new List(); - var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Db/Data/data.json").ToPath(); + var filePath = Path.Combine(AppContext.BaseDirectory, "Db/Data/data.json").ToPath(); var jsonData = FileHelper.ReadFile(filePath); var apis = JsonConvert.DeserializeObject(jsonData).Apis; foreach (var api in apis) diff --git a/Admin.Core/Startup.cs b/Admin.Core/Startup.cs index f274d79a0..67df690ff 100644 --- a/Admin.Core/Startup.cs +++ b/Admin.Core/Startup.cs @@ -94,6 +94,9 @@ public void ConfigureServices(IServiceCollection services) var xmlPath = Path.Combine(basePath, "Admin.Core.xml"); c.IncludeXmlComments(xmlPath, true); + var xmlCommonPath = Path.Combine(basePath, "Admin.Core.Common.xml"); + c.IncludeXmlComments(xmlCommonPath, true); + var xmlModelPath = Path.Combine(basePath, "Admin.Core.Model.xml"); c.IncludeXmlComments(xmlModelPath); @@ -305,6 +308,8 @@ public void Configure(IApplicationBuilder app) c.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"Admin.Core {version}"); }); c.RoutePrefix = "";//直接根目录访问 + c.DocExpansion(Swashbuckle.AspNetCore.SwaggerUI.DocExpansion.None);//折叠Api + c.DefaultModelsExpandDepth(-1);//不显示Models }); } #endregion diff --git a/Admin.Core/configs/logconfig.json b/Admin.Core/configs/logconfig.json index a875f891a..f0ddd5ecf 100644 --- a/Admin.Core/configs/logconfig.json +++ b/Admin.Core/configs/logconfig.json @@ -30,19 +30,19 @@ //调试 "debug": { "type": "File", - "fileName": "logs\\debug-${shortdate}.log", + "fileName": "logs/debug-${shortdate}.log", "layout": "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" }, //警告 "warn": { "type": "File", - "fileName": "logs\\warn-${shortdate}.log", + "fileName": "logs/warn-${shortdate}.log", "layout": "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" }, //错误 "error": { "type": "File", - "fileName": "logs\\error-${shortdate}.log", + "fileName": "logs/error-${shortdate}.log", "layout": "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" } }, diff --git a/Admin.Core/nlog.config b/Admin.Core/nlog.config index c1a0ce190..01de97018 100644 --- a/Admin.Core/nlog.config +++ b/Admin.Core/nlog.config @@ -7,11 +7,11 @@ - + - + - + From baec7a75bfcbe022e92961768f6c49a9e3ac54d0 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Sun, 10 May 2020 00:21:48 +0800 Subject: [PATCH 38/53] =?UTF-8?q?=E6=9B=B4=E6=96=B0Freesql=E5=8C=85?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=AE=9E=E4=BD=93=E5=9F=BA=E7=B1=BB?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E6=97=A0=E6=B3=95=E5=90=8C=E6=AD=A5=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 17 +- Admin.Core.Common/BaseModel/Entity.cs | 2 + Admin.Core.Common/BaseModel/EntityAdd.cs | 4 + Admin.Core.Common/BaseModel/EntityBase.cs | 9 + .../BaseModel/EntitySoftDelete.cs | 2 + Admin.Core.Common/BaseModel/EntityUpdate.cs | 4 + Admin.Core.Common/BaseModel/EntityVersion.cs | 2 + Admin.Core.Model/Admin.Core.Model.csproj | 2 +- Admin.Core.Services/Admin.Core.Service.csproj | 2 +- Admin.Core/Admin.Core.Common.xml | 1209 ++++++++++++++ Admin.Core/Admin.Core.Model.xml | 503 ++++++ Admin.Core/Admin.Core.Service.xml | 1407 +++++++++++++++++ Admin.Core/Admin.Core.csproj | 11 +- Admin.Core/Admin.Core.xml | 788 +++++++++ Admin.Core/Startup.cs | 2 +- 15 files changed, 3952 insertions(+), 12 deletions(-) create mode 100644 Admin.Core/Admin.Core.Common.xml create mode 100644 Admin.Core/Admin.Core.Model.xml create mode 100644 Admin.Core/Admin.Core.Service.xml create mode 100644 Admin.Core/Admin.Core.xml diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 6e5a05672..0a81367a6 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -5,19 +5,20 @@ - ..\Admin.Core\bin\Debug\netcoreapp3.1\Admin.Core.Common.xml + ..\Admin.Core\Admin.Core.Common.xml 1701;1702;1591 + - - - - - - - + + + + + + + diff --git a/Admin.Core.Common/BaseModel/Entity.cs b/Admin.Core.Common/BaseModel/Entity.cs index 5639eeaae..0961d1e87 100644 --- a/Admin.Core.Common/BaseModel/Entity.cs +++ b/Admin.Core.Common/BaseModel/Entity.cs @@ -1,4 +1,5 @@ using FreeSql.DataAnnotations; +using System.ComponentModel; namespace Admin.Core.Common.BaseModel { @@ -11,6 +12,7 @@ public class Entity : IEntity /// /// 编号 /// + [Description("编号")] [Column(Position = 1, IsIdentity = true)] public virtual TKey Id { get; set; } } diff --git a/Admin.Core.Common/BaseModel/EntityAdd.cs b/Admin.Core.Common/BaseModel/EntityAdd.cs index e96f92cb4..49a4d026b 100644 --- a/Admin.Core.Common/BaseModel/EntityAdd.cs +++ b/Admin.Core.Common/BaseModel/EntityAdd.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.ComponentModel.DataAnnotations; using FreeSql.DataAnnotations; @@ -12,18 +13,21 @@ public class EntityAdd : Entity, IEntityAdd where TKey : struc /// /// 创建者Id /// + [Description("创建者Id")] [Column(Position = -3, CanUpdate = false)] public TKey? CreatedUserId { get; set; } /// /// 创建者 /// + [Description("创建者")] [Column(Position = -2, CanUpdate = false), MaxLength(50)] public string CreatedUserName { get; set; } /// /// 创建时间 /// + [Description("创建时间")] [Column(Position = -1, CanUpdate = false, ServerTime = DateTimeKind.Local)] public DateTime? CreatedTime { get; set; } } diff --git a/Admin.Core.Common/BaseModel/EntityBase.cs b/Admin.Core.Common/BaseModel/EntityBase.cs index 851def3bc..806a4750f 100644 --- a/Admin.Core.Common/BaseModel/EntityBase.cs +++ b/Admin.Core.Common/BaseModel/EntityBase.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.ComponentModel.DataAnnotations; using FreeSql.DataAnnotations; @@ -12,48 +13,56 @@ public class EntityBase : Entity, IEntityVersion, IEntitySoftDelete, /// /// 版本 /// + [Description("版本")] [Column(Position = -9, IsVersion = true)] public long Version { get; set; } /// /// 是否删除 /// + [Description("是否删除")] [Column(Position = -8)] public bool IsDeleted { get; set; } = false; /// /// 创建者Id /// + [Description("创建者Id")] [Column(Position = -7, CanUpdate = false)] public TKey? CreatedUserId { get; set; } /// /// 创建者 /// + [Description("创建者")] [Column(Position = -6, CanUpdate = false), MaxLength(50)] public string CreatedUserName { get; set; } /// /// 创建时间 /// + [Description("创建时间")] [Column(Position = -5, CanUpdate = false, ServerTime = DateTimeKind.Local)] public DateTime? CreatedTime { get; set; } /// /// 修改者Id /// + [Description("修改者Id")] [Column(Position = -4, CanInsert = false)] public TKey? ModifiedUserId { get; set; } /// /// 修改者 /// + [Description("修改者")] [Column(Position = -2, CanInsert = false), MaxLength(50)] public string ModifiedUserName { get; set; } /// /// 修改时间 /// + [Description("修改时间")] [Column(Position = -1, CanInsert = false, ServerTime = DateTimeKind.Local)] public DateTime? ModifiedTime { get; set; } } diff --git a/Admin.Core.Common/BaseModel/EntitySoftDelete.cs b/Admin.Core.Common/BaseModel/EntitySoftDelete.cs index 1de695a3c..3c7f2527c 100644 --- a/Admin.Core.Common/BaseModel/EntitySoftDelete.cs +++ b/Admin.Core.Common/BaseModel/EntitySoftDelete.cs @@ -1,4 +1,5 @@ using FreeSql.DataAnnotations; +using System.ComponentModel; namespace Admin.Core.Common.BaseModel { @@ -10,6 +11,7 @@ public class EntitySoftDelete : Entity,IEntitySoftDelete /// /// 是否删除 /// + [Description("是否删除")] [Column(Position = -1)] public bool IsDeleted { get; set; } = false; } diff --git a/Admin.Core.Common/BaseModel/EntityUpdate.cs b/Admin.Core.Common/BaseModel/EntityUpdate.cs index 316801e3a..fa631dcd2 100644 --- a/Admin.Core.Common/BaseModel/EntityUpdate.cs +++ b/Admin.Core.Common/BaseModel/EntityUpdate.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.ComponentModel.DataAnnotations; using FreeSql.DataAnnotations; @@ -12,18 +13,21 @@ public class EntityUpdate : Entity, IEntityUpdate where TKey : /// /// 修改者Id /// + [Description("修改者Id")] [Column(Position = -3, CanInsert = false)] public TKey? ModifiedUserId { get; set; } /// /// 修改者 /// + [Description("修改者")] [Column(Position = -2, CanInsert = false), MaxLength(50)] public string ModifiedUserName { get; set; } /// /// 修改时间 /// + [Description("修改时间")] [Column(Position = -1, CanInsert = false, ServerTime = DateTimeKind.Local)] public DateTime? ModifiedTime { get; set; } } diff --git a/Admin.Core.Common/BaseModel/EntityVersion.cs b/Admin.Core.Common/BaseModel/EntityVersion.cs index 3775c6191..0b7038da0 100644 --- a/Admin.Core.Common/BaseModel/EntityVersion.cs +++ b/Admin.Core.Common/BaseModel/EntityVersion.cs @@ -1,4 +1,5 @@ using FreeSql.DataAnnotations; +using System.ComponentModel; namespace Admin.Core.Common.BaseModel { @@ -10,6 +11,7 @@ public class EntityVersion : Entity, IEntityVersion /// /// 版本 /// + [Description("版本")] [Column(Position = -1, IsVersion = true)] public long Version { get; set; } } diff --git a/Admin.Core.Model/Admin.Core.Model.csproj b/Admin.Core.Model/Admin.Core.Model.csproj index f6625c576..88040e312 100644 --- a/Admin.Core.Model/Admin.Core.Model.csproj +++ b/Admin.Core.Model/Admin.Core.Model.csproj @@ -5,7 +5,7 @@ - ..\Admin.Core\bin\Debug\netcoreapp3.1\Admin.Core.Model.xml + ..\Admin.Core\Admin.Core.Model.xml 1701;1702;1591 diff --git a/Admin.Core.Services/Admin.Core.Service.csproj b/Admin.Core.Services/Admin.Core.Service.csproj index a37306530..5d0eee109 100644 --- a/Admin.Core.Services/Admin.Core.Service.csproj +++ b/Admin.Core.Services/Admin.Core.Service.csproj @@ -6,7 +6,7 @@ - ..\Admin.Core\bin\Debug\netcoreapp3.1\Admin.Core.Service.xml + ..\Admin.Core\Admin.Core.Service.xml 1701;1702;1591 diff --git a/Admin.Core/Admin.Core.Common.xml b/Admin.Core/Admin.Core.Common.xml new file mode 100644 index 000000000..8eecabdf7 --- /dev/null +++ b/Admin.Core/Admin.Core.Common.xml @@ -0,0 +1,1209 @@ + + + + Admin.Core.Common + + + + + 单例注入 + + + + + 启用事物 + + + + + 事务传播方式 + + + + + 事务隔离级别 + + + + + 用户信息接口 + + + + + 主键 + + + + + 用户名 + + + + + 昵称 + + + + + 用户信息 + + + + + 用户Id + + + + + 用户名 + + + + + 昵称 + + + + + Claim属性 + + + + + 用户Id + + + + + 用户名 + + + + + 姓名 + + + + + 编号 + + + + + 实体创建审计 + + + + + 创建者Id + + + + + 创建者 + + + + + 创建时间 + + + + + 实体审计 + + + + + 版本 + + + + + 是否删除 + + + + + 创建者Id + + + + + 创建者 + + + + + 创建时间 + + + + + 修改者Id + + + + + 修改者 + + + + + 修改时间 + + + + + 实体软删除 + + + + + 是否删除 + + + + + 实体修改审计 + + + + + 修改者Id + + + + + 修改者 + + + + + 修改时间 + + + + + 实体版本 + + + + + 版本 + + + + + 是否删除 + + + + + 版本 + + + + + 缓存键 + + + + + 验证码 admin:verify:code:guid + + + + + 密码加密 admin:password:encrypt:guid + + + + + 用户权限 admin:user:用户主键:permissions + + + + + 缓存类型 + + + + + 缓存接口 + + + + + 用于在 key 存在时删除 key + + 键 + + + + 用于在 key 存在时删除 key + + 键 + + + + + 用于在 key 模板存在时删除 + + key模板 + + + + + 检查给定 key 是否存在 + + 键 + + + + + 检查给定 key 是否存在 + + 键 + + + + + 获取指定 key 的值 + + 键 + + + + + 获取指定 key 的值 + + byte[] 或其他类型 + 键 + + + + + 获取指定 key 的值 + + 键 + + + + + 获取指定 key 的值 + + byte[] 或其他类型 + 键 + + + + + 设置指定 key 的值,所有写入参数object都支持string | byte[] | 数值 | 对象 + + 键 + 值 + + + + 设置指定 key 的值,所有写入参数object都支持string | byte[] | 数值 | 对象 + + 键 + 值 + 有效期 + + + + 设置指定 key 的值,所有写入参数object都支持string | byte[] | 数值 | 对象 + + 键 + 值 + + + + + 设置指定 key 的值,所有写入参数object都支持string | byte[] | 数值 | 对象 + + 键 + 值 + 有效期 + + + + + 内存缓存 + + + + + Redis缓存 + + + + + 应用配置 + + + + + Swagger文档 + + + + + Api地址,默认 http://*:8888 + + + + + Aop配置 + + + + + 日志配置 + + + + + 验证码配置 + + + + + Aop配置 + + + + + 事物 + + + + + 日志配置 + + + + + 操作日志 + + + + + 验证码配置 + + + + + 操作日志 + + + + + 缓存配置 + + + + + 缓存类型 + + + + + Redis配置 + + + + + 连接字符串 + + + + + 数据库配置 + + + + + 数据库类型 + + + + + 数据库字符串 + + + + + 生成数据 + + + + + 同步结构 + + + + + 同步数据 + + + + + 建库 + + + + + 建库连接字符串 + + + + + 建库脚本 + + + + + 监听所有操作 + + + + + 监听Curd操作 + + + + + Jwt配置 + + + + + 发行者 + + + + + 订阅者 + + + + + 密钥 + + + + + 有效期(分钟) + + + + + 上传配置 + + + + + 头像上传配置 + + + + + 文档图片上传配置 + + + + + 文件上传配置 + + + + + 上传路径 + + + + + 请求路径 + + + + + 路径格式 + + + + + 路径日期格式 + + + + + 文件大小 10M = 10 * 1024 * 1024 + + + + + 最大允许上传个数 -1不限制 + + + + + 文件格式 + + + + + 判断Guid是否为空 + + + + + + + 判断Guid是否不为空 + + + + + + + 文件信息 + + + + + 初始化文件信息 + + 文件名称 + 大小 + + + + 上传路径 + + + + + 请求路径 + + + + + 相对路径 + + + + + 文件名 + + + + + 保存名 + + + + + 文件大小 + + + + + 扩展名 + + + + + 文件目录 + + + + + 文件请求路径 + + + + + 文件相对路径 + + + + + 文件路径 + + + + + 文件大小 + + + + + 初始化文件大小 + + 文件大小 + 文件大小单位 + + + + 文件字节长度 + + + + + 获取文件大小,单位:字节 + + + + + 获取文件大小,单位:K + + + + + 获取文件大小,单位:M + + + + + 获取文件大小,单位:G + + + + + 输出描述 + + + + + 文件大小单位 + + + + + 字节 + + + + + K字节 + + + + + M字节 + + + + + G字节 + + + + + 配置帮助类 + + + + + 加载配置文件 + + 文件名称 + 环境名称 + 自动更新 + + + + + 获得配置信息 + + 配置信息 + 文件名称 + 环境名称 + 自动更新 + + + + + 绑定实例配置信息 + + 文件名称 + 实例配置 + 环境名称 + 自动更新 + + + + 打印错误信息 + + 待打印的字符串 + 想要打印的颜色 + + + + 打印警告信息 + + 待打印的字符串 + 想要打印的颜色 + + + + 打印正常信息 + + 待打印的字符串 + 想要打印的颜色 + + + + 打印成功的信息 + + 待打印的字符串 + 想要打印的颜色 + + + + Des加解密 + + + + + DES+Base64加密 + 采用ECB、PKCS7 + + 加密字符串 + 秘钥 + + + + + DES+Base64解密 + 采用ECB、PKCS7 + + 解密字符串 + 秘钥 + + + + + DES+16进制加密 + 采用ECB、PKCS7 + + 加密字符串 + 秘钥 + 是否小写 + + + + + DES+16进制解密 + 采用ECB、PKCS7 + + 解密字符串 + 秘钥 + + + + + DES加密 + + + + + + + + + + DES解密 + + + + + + + + + 写文件 + + 文件路径 + 文件内容 + + + + 写文件 + + 文件路径 + 文件内容 + 编码格式 + + + + 读文件 + + 文件路径 + + + + + 读文件 + + 文件路径 + 编码格式 + + + + + 是否为ip + + + + + + + MD5加密 + + + + + 16位MD5加密 + + + + + + + 32位MD5加密 + + + + + + + 64位MD5加密 + + + + + + + 字符串帮助类 + + + + + 生成随机字符串,默认32位 + + 随机数长度 + + + + + 生成随机字符串,只包含数字 + + + + + + + 字符串转Unicode码 + + The to unicode. + Value. + + + + Unicode转字符串 + + The to string. + Unicode. + + + + 文件上传帮助类 + + + + + 上传单文件 + + + + + + + + + + 保存文件 + + + + + + + + + 数据类型转换 + + + + + 转换成Double/Single + + + 小数位数 + + + + + 转换为16进制 + + + 是否小写 + + + + + 16进制转字节数组 + + + + + + + 转换为Base64 + + + + + + + 分页信息输入 + + + + + 当前页标 + + + + + 每页大小 + + + + + 查询条件 + + + + + 响应数据输出接口 + + + + + 是否成功 + + + + + 消息 + + + + + 响应数据输出泛型接口 + + + + + + 返回数据 + + + + + 下拉选项输出 + + + + + 名称 + + + + + 值 + + + + + 禁用 + + + + + 额外数据 + + + + + 分页信息输出 + + + + + 数据总数 + + + + + 数据 + + + + + 响应数据输出 + + + + + 是否成功标记 + + + + + 状态码 + + + + + 消息 + + + + + 数据 + + + + + 成功 + + 数据 + 消息 + + + + 失败 + + 消息 + 数据 + + + + + 响应数据静态输出 + + + + + 成功 + + 数据 + 消息 + + + + + 成功 + + + + + + 失败 + + 消息 + 数据 + + + + + 失败 + + 消息 + + + + + 根据布尔值返回结果 + + + + + + + 根据布尔值返回结果 + + + + + + + 判断字符串是否为Null、空 + + + + + + + 判断字符串是否不为Null、空 + + + + + + + 与字符串进行比较,忽略大小写 + + + + + + + + 首字母转小写 + + + + + + + 首字母转大写 + + + + + + + 转为Base64,UTF-8格式 + + + + + + + 转为Base64 + + + 编码 + + + + diff --git a/Admin.Core/Admin.Core.Model.xml b/Admin.Core/Admin.Core.Model.xml new file mode 100644 index 000000000..33732cb32 --- /dev/null +++ b/Admin.Core/Admin.Core.Model.xml @@ -0,0 +1,503 @@ + + + + Admin.Core.Model + + + + + 接口管理 + + + + + 所属模块 + + + + + 接口命名 + + + + + 接口名称 + + + + + 接口地址 + + + + + 接口提交方法 + + + + + 说明 + + + + + 排序 + + + + + 启用 + + + + + 数据字典 + + + + + 字典父级 + + + + + 字典名称 + + + + + 字典编码 + + + + + 字典值 + + + + + 描述 + + + + + 启用 + + + + + 排序 + + + + + 文档 + + + + + 父级节点 + + + + + 名称 + + + + + 类型 + + + + + 命名 + + + + + 内容 + + + + + Html + + + + + 启用 + + + + + 打开组 + + + + + 排序 + + + + + 描述 + + + + + 文档图片 + + + + + 用户Id + + + + + 请求路径 + + + + + 文档类型 + + + + + 分组 + + + + + Markdown文档 + + + + + 日志 + + + + + 昵称 + + + + + IP + + + + + 浏览器 + + + + + 操作系统 + + + + + 设备 + + + + + 浏览器信息 + + + + + 耗时(毫秒) + + + + + 操作状态 + + + + + 操作消息 + + + + + 操作结果 + + + + + 操作日志 + + + + + 操作日志 + + + + + 接口名称 + + + + + 接口地址 + + + + + 接口提交方法 + + + + + 操作参数 + + + + + 权限 + + + + + 父级节点 + + + + + 权限名称 + + + + + 权限类型 + + + + + 视图 + + + + + 接口 + + + + + 菜单访问地址 + + + + + 图标 + + + + + 隐藏 + + + + + 启用 + + + + + 可关闭 + + + + + 打开组 + + + + + 打开新窗口 + + + + + 链接外显 + + + + + 排序 + + + + + 描述 + + + + + 权限类型 + + + + + 分组 + + + + + 菜单 + + + + + 接口 + + + + + 角色 + + + + + 名称 + + + + + 说明 + + + + + 启用 + + + + + 排序 + + + + + 角色权限 + + + + + 角色Id + + + + + 权限Id + + + + + 角色 + + + + + 权限 + + + + + 用户 + + + + + 账号 + + + + + 密码 + + + + + 昵称 + + + + + 头像 + + + + + 状态 + + + + + 备注 + + + + + 用户角色 + + + + + 用户Id + + + + + 角色Id + + + + + 视图管理 + + + + + 所属节点 + + + + + 视图命名 + + + + + 视图名称 + + + + + 视图路径 + + + + + 说明 + + + + + 启用 + + + + + 排序 + + + + diff --git a/Admin.Core/Admin.Core.Service.xml b/Admin.Core/Admin.Core.Service.xml new file mode 100644 index 000000000..627c9ef9f --- /dev/null +++ b/Admin.Core/Admin.Core.Service.xml @@ -0,0 +1,1407 @@ + + + + Admin.Core.Service + + + + + 接口服务 + + + + + 获得一条记录 + + + + + + + 获得列表 + + + + + + + 获得分页 + + + + + + + 添加 + + + + + + + 修改 + + + + + + + 删除 + + + + + + + 软删除 + + + + + + + 批量软删除 + + + + + + + 同步 + + + + + + + 添加 + + + + + 所属模块 + + + + + 接口名称 + + + + + 接口地址 + + + + + 接口提交方法 + + + + + 说明 + + + + + 启用 + + + + + 接口同步Dto + + + + + 接口名称 + + + + + 接口地址 + + + + + 父级路径 + + + + + 接口提交方法 + + + + + 接口同步 + + + + + 修改 + + + + + 接口Id + + + + + 版本 + + + + + 接口Id + + + + + 接口父级 + + + + + 接口命名 + + + + + 接口名称 + + + + + 接口地址 + + + + + 接口提交方法 + + + + + 说明 + + + + + 启用 + + + + + 映射配置 + + + + + 权限服务 + + + + + 登录信息 + + + + + 账号 + + + + + 密码 + + + + + 密码键 + + + + + 验证码 + + + + + 验证码键 + + + + + 主键Id + + + + + 账号 + + + + + 姓名 + + + + + 映射配置 + + + + + 缓存服务 + + + + + 缓存列表 + + + + + + 清除缓存 + + + + + + + 添加 + + + + + 字典父级 + + + + + 字典名称 + + + + + 字典编码 + + + + + 字典值 + + + + + 描述 + + + + + 启用 + + + + + 修改 + + + + + 主键Id + + + + + 版本 + + + + + 主键Id + + + + + 字典父级 + + + + + 字典名称 + + + + + 字典编码 + + + + + 字典值 + + + + + 描述 + + + + + 启用 + + + + + 创建时间 + + + + + 映射配置 + + + + + 父级节点 + + + + + 类型 + + + + + 名称 + + + + + 命名 + + + + + 打开 + + + + + 用户Id + + + + + 请求路径 + + + + + 父级节点 + + + + + 类型 + + + + + 命名 + + + + + 名称 + + + + + 说明 + + + + + 编号 + + + + + 名称 + + + + + 内容 + + + + + Html + + + + + 版本 + + + + + 编号 + + + + + 版本 + + + + + 编号 + + + + + 版本 + + + + + 上传文件 + + + + + 文档编号 + + + + + 编号 + + + + + 名称 + + + + + 内容 + + + + + 版本 + + + + + 编号 + + + + + 父级节点 + + + + + 名称 + + + + + 类型 + + + + + 命名 + + + + + 描述 + + + + + 组打开 + + + + + 映射配置 + + + + + 添加 + + + + + 昵称 + + + + + IP + + + + + 浏览器 + + + + + 操作系统 + + + + + 设备 + + + + + 浏览器信息 + + + + + 耗时(毫秒) + + + + + 操作状态 + + + + + 操作消息 + + + + + 操作结果 + + + + + 创建者Id + + + + + 创建者 + + + + + 编号 + + + + + 昵称 + + + + + 创建者 + + + + + IP + + + + + 浏览器 + + + + + 操作系统 + + + + + 设备 + + + + + 耗时(毫秒) + + + + + 操作状态 + + + + + 操作消息 + + + + + 创建时间 + + + + + 映射配置 + + + + + 添加 + + + + + 昵称 + + + + + 接口名称 + + + + + 接口地址 + + + + + 接口提交方法 + + + + + IP + + + + + 浏览器 + + + + + 操作系统 + + + + + 设备 + + + + + 浏览器信息 + + + + + 耗时(毫秒) + + + + + 操作状态 + + + + + 操作消息 + + + + + 操作参数 + + + + + 操作结果 + + + + + 编号 + + + + + 昵称 + + + + + 创建者 + + + + + 接口名称 + + + + + 接口地址 + + + + + 接口提交方法 + + + + + IP + + + + + 浏览器 + + + + + 操作系统 + + + + + 设备 + + + + + 耗时(毫秒) + + + + + 操作状态 + + + + + 操作消息 + + + + + 创建时间 + + + + + 映射配置 + + + + + 权限类型 + + + + + 父级节点 + + + + + 接口 + + + + + 权限名称 + + + + + 说明 + + + + + 隐藏 + + + + + 图标 + + + + + 权限类型 + + + + + 父级节点 + + + + + 权限名称 + + + + + 隐藏 + + + + + 图标 + + + + + 打开 + + + + + 权限类型 + + + + + 父级节点 + + + + + 视图 + + + + + 访问地址 + + + + + 权限名称 + + + + + 说明 + + + + + 隐藏 + + + + + 图标 + + + + + 可关闭 + + + + + 打开新窗口 + + + + + 链接外显 + + + + + 权限Id + + + + + 版本 + + + + + 权限Id + + + + + 版本 + + + + + 权限Id + + + + + 版本 + + + + + 权限Id + + + + + 父级节点 + + + + + 权限名称 + + + + + 权限命名 + + + + + 权限类型 + + + + + 访问地址 + + + + + 接口路径 + + + + + 描述 + + + + + 图标 + + + + + 组打开 + + + + + 隐藏 + + + + + 启用 + + + + + 映射配置 + + + + + 添加 + + + + + 名称 + + + + + 说明 + + + + + 启用 + + + + + 修改 + + + + + 接口Id + + + + + 版本 + + + + + 主键 + + + + + 名称 + + + + + 说明 + + + + + 启用 + + + + + 创建时间 + + + + + 映射配置 + + + + + 添加 + + + + + 账号 + + + + + 密码 + + + + + 昵称 + + + + + 状态 + + + + + 备注 + + + + + 角色 + + + + + 修改密码 + + + + + 旧密码 + + + + + 新密码 + + + + + 确认新密码 + + + + + 密码 + + + + + 版本 + + + + + 更新基本信息 + + + + + 头像 + + + + + 昵称 + + + + + 备注 + + + + + 版本 + + + + + 修改 + + + + + 主键Id + + + + + 账号 + + + + + 昵称 + + + + + 状态 + + + + + 备注 + + + + + 角色 + + + + + 版本 + + + + + 用户服务 + + + + + 主键Id + + + + + 账号 + + + + + 姓名 + + + + + 昵称 + + + + + 状态 + + + + + 角色 + + + + + 备注 + + + + + 创建时间 + + + + + 映射配置 + 双向映射 .ReverseMap() + + + + + 添加 + + + + + 所属节点 + + + + + 视图命名 + + + + + 视图名称 + + + + + 视图路径 + + + + + 说明 + + + + + 启用 + + + + + 视图命名 + + + + + 名称 + + + + + 地址 + + + + + 父级路径 + + + + + 修改 + + + + + 视图Id + + + + + 版本 + + + + + 映射配置 + + + + + 视图服务 + + + + + 获得一条记录 + + + + + + + 视图Id + + + + + 视图父级 + + + + + 视图命名 + + + + + 视图名称 + + + + + 视图路径 + + + + + 启用 + + + + + 说明 + + + + + 用户服务 + + + + diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index 7d21f7dfb..5a5c09b30 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -7,7 +7,7 @@ - ..\Admin.Core\bin\Debug\netcoreapp3.1\Admin.Core.xml + ..\Admin.Core\Admin.Core.xml 1701;1702;1591 @@ -45,9 +45,18 @@ + + Always + Always + + Always + + + Always + diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml new file mode 100644 index 000000000..3e9c80ca2 --- /dev/null +++ b/Admin.Core/Admin.Core.xml @@ -0,0 +1,788 @@ + + + + Admin.Core + + + + + 启用登录 + + + + + 禁用操作日志 + + + + + 启用权限 + + + + + 输入模型验证 + + + + + 自定义路由 /api/{version}/[area]/[controler]/[action] + + + + + 权限处理接口 + + + + + 权限验证 + + + + + + + + 权限处理 + + + + + 权限验证 + + 接口路径 + http请求方法 + + + + + 响应认证处理器 + + + + + 接口管理 + + + + + 查询单条接口 + + + + + + + 查询全部接口 + + + + + + + 查询分页接口 + + 分页模型 + + + + + 新增接口 + + + + + + + 修改接口 + + + + + + + 删除接口 + + + + + + + 批量删除接口 + + + + + + + 同步接口 + 支持新增和修改接口 + 根据接口是否存在自动禁用和启用api + + + + + + + 域控制器 + + + + + 授权管理 + + + + + 获取验证码 + + 上次验证码键 + + + + + 获取密钥 + + + + + + 查询用户信息 + + + + + + 用户登录 + 根据登录信息生成Token + + 登录信息 + + + + + 缓存管理 + + + + + 获取缓存列表 + + + + + + 清除缓存 + + + + + + + 数据字典 + + + + + 查询单条数据字典 + + + + + + + 查询分页数据字典 + + + + + + + 新增数据字典 + + + + + + + 修改数据字典 + + + + + + + 删除数据字典 + + + + + + + 文档管理 + + + + + 查询文档列表 + + + + + + + + + 查询文档图片列表 + + + + + + + 查询单条分组 + + + + + + + 查询单条菜单 + + + + + + + 查询单条文档内容 + + + + + + + 查询精简文档列表 + + + + + + 新增分组 + + + + + + + 新增菜单 + + + + + + + 修改分组 + + + + + + + 修改菜单 + + + + + + + 修改文档内容 + + + + + + + 删除文档 + + + + + + + 删除图片 + + + + + + + + 上传文档图片 + + + + + + + 登录日志管理 + + + + + 查询分页登录日志 + + + + + + + 操作日志管理 + + + + + 查询分页操作日志 + + + + + + + 权限管理 + + + + + 查询权限列表 + + + + + + + + + 查询单条分组 + + + + + + + 查询单条菜单 + + + + + + + 查询单条接口 + + + + + + + 查询角色权限-权限列表 + + + + + + 查询角色权限 + + + + + + + 新增分组 + + + + + + + 新增菜单 + + + + + + + 新增接口 + + + + + + + 修改分组 + + + + + + + 修改菜单 + + + + + + + 修改接口 + + + + + + + 删除权限 + + + + + + + 保存角色权限 + + + + + + + 角色管理 + + + + + 查询单条角色 + + + + + + + 查询分页角色 + + + + + + + 新增角色 + + + + + + + 修改角色 + + + + + + + 删除角色 + + + + + + + 批量删除角色 + + + + + + + 用户管理 + + + + + 查询用户基本信息 + + + + + + 查询单条用户 + + + + + + + 查询分页用户 + + + + + + + 新增用户 + + + + + + + 修改用户 + + + + + + + 删除用户 + + + + + + + 批量删除用户 + + + + + + + 更新用户密码 + + + + + + + 更新用户基本信息 + + + + + + + 上传头像 + + + + + + + 视图管理 + + + + + 查询单条视图 + + + + + + + 查询全部视图 + + + + + + + 查询分页视图 + + 分页模型 + + + + + 新增视图 + + + + + + + 修改视图 + + + + + + + 删除视图 + + + + + + + 批量删除视图 + + + + + + + 同步视图 + 支持新增和修改视图 + 根据视图是否存在自动禁用和启用视图 + + + + + + + 基础控制器 + + + + + 数据 + + + + + 创建数据库 + + + + + + + 同步结构 + + + + + 初始化数据表数据 + + + + + + + + + + + 同步数据审计方法 + + + + + + + 同步数据 + + + + + + 生成极简数据 + + + + + + + 添加数据库 + + + + + + + + 接口版本 + + + + + V1 版本 + + + + + V2 版本 + + + + + 状态码枚举 + + + + + 操作失败 + + + + + 操作成功 + + + + + 未登录(需要重新登录) + + + + + 权限不足 + + + + + 资源不存在 + + + + + 系统内部错误(非业务代码里显式抛出的异常,例如由于数据不正确导致空指针异常、数据库异常等等) + + + + + Admin异常错误过滤 + + + + + Api帮助类 + + + + + 接口名称 + + + + + 接口地址 + + + + + 操作日志处理接口 + + + + + 写操作日志 + + + + + + + + 操作日志处理 + + + + diff --git a/Admin.Core/Startup.cs b/Admin.Core/Startup.cs index 67df690ff..2295d316f 100644 --- a/Admin.Core/Startup.cs +++ b/Admin.Core/Startup.cs @@ -309,7 +309,7 @@ public void Configure(IApplicationBuilder app) }); c.RoutePrefix = "";//直接根目录访问 c.DocExpansion(Swashbuckle.AspNetCore.SwaggerUI.DocExpansion.None);//折叠Api - c.DefaultModelsExpandDepth(-1);//不显示Models + //c.DefaultModelsExpandDepth(-1);//不显示Models }); } #endregion From 591f91361174ac6c18586d087abb02ff9bd05f7e Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Mon, 11 May 2020 22:04:57 +0800 Subject: [PATCH 39/53] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=98=AF=E8=A6=81Postg?= =?UTF-8?q?reSQL=E6=97=A0=E6=B3=95=E8=AE=BF=E6=8E=A5=E5=8F=A3=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core/Startup.cs | 6 +++--- Admin.Core/configs/dbconfig.json | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Admin.Core/Startup.cs b/Admin.Core/Startup.cs index 2295d316f..d9331a7a1 100644 --- a/Admin.Core/Startup.cs +++ b/Admin.Core/Startup.cs @@ -51,6 +51,9 @@ public Startup(IWebHostEnvironment env) public void ConfigureServices(IServiceCollection services) { + //数据库 + services.AddDb(_env, _appConfig); + //应用配置 services.AddSingleton(_appConfig); @@ -195,9 +198,6 @@ public void ConfigureServices(IServiceCollection services) }); #endregion - //数据库 - services.AddDb(_env,_appConfig); - #region 缓存 var cacheConfig = new ConfigHelper().Get("cacheconfig", _env.EnvironmentName); if (cacheConfig.Type == CacheType.Redis) diff --git a/Admin.Core/configs/dbconfig.json b/Admin.Core/configs/dbconfig.json index 16cbecd5e..91ff43364 100644 --- a/Admin.Core/configs/dbconfig.json +++ b/Admin.Core/configs/dbconfig.json @@ -18,6 +18,7 @@ //建库连接字符串 //MySql "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;" //SqlServer "Data Source=.;Integrated Security=True;Initial Catalog=master;Pooling=true;Min Pool Size=1" + //PostgreSQL "CREATE DATABASE \"admindb\" WITH ENCODING = 'UTF8'" "createDbConnectionString": "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;", //建库脚本 //MySql "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'" @@ -31,5 +32,6 @@ //MySql "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;" //SqlServer "Data Source=.;Integrated Security=True;Initial Catalog=admindb;Pooling=true;Min Pool Size=1" //Sqlite "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" + //PostgreSQL "Host=localhost;Port=5432;Username=postgres;Password=; Database=admindb;Pooling=true;Minimum Pool Size=1" "connectionString": "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" } From c6bef2cd4ad2008003dba9657edd2feeced239ca Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Tue, 12 May 2020 00:12:04 +0800 Subject: [PATCH 40/53] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Nuget=E5=8C=85=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 10 ++++++++++ Admin.Core.Model/Admin.Core.Model.csproj | 10 ++++++++++ Admin.Core.Repository/Admin.Core.Repository.csproj | 10 ++++++++++ Admin.Core.Services/Admin.Core.Service.csproj | 10 ++++++++++ Admin.Core/Admin.Core.csproj | 12 ++++++++++++ 5 files changed, 52 insertions(+) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 0a81367a6..2b934ec87 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -2,6 +2,16 @@ netcoreapp3.1 + true + 1.2.0 + xiaoxue + xiaoxue + 中台Admin后端通用库 + ZhonTai Admin;WebApi + git + https://github.com/zhontai/Admin.Core + https://github.com/zhontai/Admin.Core + MIT diff --git a/Admin.Core.Model/Admin.Core.Model.csproj b/Admin.Core.Model/Admin.Core.Model.csproj index 88040e312..ba9b1ccb9 100644 --- a/Admin.Core.Model/Admin.Core.Model.csproj +++ b/Admin.Core.Model/Admin.Core.Model.csproj @@ -2,6 +2,16 @@ netcoreapp3.1 + true + 1.2.0 + xiaoxue + xiaoxue + 中台Admin后端实体库 + MIT + https://github.com/zhontai/Admin.Core + https://github.com/zhontai/Admin.Core + git + ZhonTai Admin;WebApi diff --git a/Admin.Core.Repository/Admin.Core.Repository.csproj b/Admin.Core.Repository/Admin.Core.Repository.csproj index 68e7f58ad..8f634cb11 100644 --- a/Admin.Core.Repository/Admin.Core.Repository.csproj +++ b/Admin.Core.Repository/Admin.Core.Repository.csproj @@ -2,6 +2,16 @@ netcoreapp3.1 + 1.2.0 + xiaoxue + xiaoxue + 中台Admin后端仓储库 + MIT + https://github.com/zhontai/Admin.Core + https://github.com/zhontai/Admin.Core + git + ZhonTai Admin;WebApi + true diff --git a/Admin.Core.Services/Admin.Core.Service.csproj b/Admin.Core.Services/Admin.Core.Service.csproj index 5d0eee109..a5ce42ce3 100644 --- a/Admin.Core.Services/Admin.Core.Service.csproj +++ b/Admin.Core.Services/Admin.Core.Service.csproj @@ -2,6 +2,16 @@ netcoreapp3.1 + true + 1.2.0 + xiaoxue + xiaoxue + 中台Admin后端服务库 + MIT + https://github.com/zhontai/Admin.Core + https://github.com/zhontai/Admin.Core + git + ZhonTai Admin;WebApi diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index 5a5c09b30..d13cd692b 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -4,6 +4,18 @@ netcoreapp3.1 OutOfProcess + false + 1.2.0 + MIT + xiaoxue + xiaoxue + git + 中台Admin后端WebApi + https://github.com/zhontai/Admin.Core + https://github.com/zhontai/Admin.Core + ZhonTai Admin;WebApi + Admin.Core + Admin.Core From 4686a9228cf541cc75f57671e5c30206fd799cf1 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Sat, 23 May 2020 17:58:26 +0800 Subject: [PATCH 41/53] =?UTF-8?q?=E6=9B=B4=E6=96=B01.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 8 +- ...ttribute.cs => SingleInstanceAttribute.cs} | 0 Admin.Core.Common/Auth/UserToken.cs | 2 + Admin.Core.Common/Cache/CacheType.cs | 6 + Admin.Core.Common/Configs/AppConfig.cs | 20 +- Admin.Core.Common/Configs/CacheConfig.cs | 9 +- Admin.Core.Common/Configs/DbConfig.cs | 16 +- Admin.Core.Common/Configs/JwtConfig.cs | 8 +- Admin.Core.Common/Helpers/HtmlHelper.cs | 416 ++++++++++++++++++ Admin.Core.Common/Input/PageInput.cs | 5 + Admin.Core.Model/Admin.Core.Model.csproj | 2 +- Admin.Core.Model/Admin/ViewEntity.cs | 2 +- .../Admin.Core.Repository.csproj | 2 +- Admin.Core.Repository/Base/RepositoryBase.cs | 12 +- Admin.Core.Services/Admin.Core.Service.csproj | 2 +- .../Admin/Permission/PermissionService.cs | 6 +- Admin.Core.Services/Admin/User/UserService.cs | 1 + Admin.Core/Admin.Core.Common.xml | 124 +++++- Admin.Core/Admin.Core.csproj | 6 +- Admin.Core/Aop/AopHelper.cs | 2 +- Admin.Core/Aop/TransactionInterceptor.cs | 113 ++--- .../Attributes/VersionRouteAttribute.cs | 3 +- Admin.Core/Auth/PermissionHandler.cs | 2 + Admin.Core/Db/DbHelper.cs | 1 - Admin.Core/Db/ServiceCollectionExtensions.cs | 6 +- Admin.Core/Filters/LogActionFilter.cs | 4 +- Admin.Core/Logs/LogHandler.cs | 1 - Admin.Core/Startup.cs | 75 ++-- Admin.Core/configs/dbconfig.json | 5 +- Admin.Core/configs/jwtconfig.json | 4 +- 30 files changed, 698 insertions(+), 165 deletions(-) rename Admin.Core.Common/Attributes/{SingletonAttribute.cs => SingleInstanceAttribute.cs} (100%) create mode 100644 Admin.Core.Common/Helpers/HtmlHelper.cs diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 2b934ec87..0ddc04dd8 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.2.0 + 1.3.0 xiaoxue xiaoxue 中台Admin后端通用库 @@ -30,9 +30,9 @@ - - - + + + diff --git a/Admin.Core.Common/Attributes/SingletonAttribute.cs b/Admin.Core.Common/Attributes/SingleInstanceAttribute.cs similarity index 100% rename from Admin.Core.Common/Attributes/SingletonAttribute.cs rename to Admin.Core.Common/Attributes/SingleInstanceAttribute.cs diff --git a/Admin.Core.Common/Auth/UserToken.cs b/Admin.Core.Common/Auth/UserToken.cs index 480e684f5..35204142a 100644 --- a/Admin.Core.Common/Auth/UserToken.cs +++ b/Admin.Core.Common/Auth/UserToken.cs @@ -5,9 +5,11 @@ using System.IdentityModel.Tokens.Jwt; using Microsoft.IdentityModel.Tokens; using Admin.Core.Common.Configs; +using Admin.Core.Common.Attributes; namespace Admin.Core.Common.Auth { + [SingleInstance] public class UserToken : IUserToken { private readonly JwtConfig _jwtConfig; diff --git a/Admin.Core.Common/Cache/CacheType.cs b/Admin.Core.Common/Cache/CacheType.cs index 70639fbff..afa606d85 100644 --- a/Admin.Core.Common/Cache/CacheType.cs +++ b/Admin.Core.Common/Cache/CacheType.cs @@ -6,7 +6,13 @@ namespace Admin.Core.Common.Cache /// public enum CacheType { + /// + /// 内存缓存 + /// Memory, + /// + /// Redis缓存 + /// Redis } } diff --git a/Admin.Core.Common/Configs/AppConfig.cs b/Admin.Core.Common/Configs/AppConfig.cs index f84553089..49c351269 100644 --- a/Admin.Core.Common/Configs/AppConfig.cs +++ b/Admin.Core.Common/Configs/AppConfig.cs @@ -6,29 +6,29 @@ public class AppConfig { /// - /// Swagger文档 + /// Api地址,默认 http://*:8888 /// - public bool Swagger { get; set; } + public string Urls { get; set; } = "http://*:8888"; /// - /// Api地址,默认 http://*:8888 + /// Swagger文档 /// - public string Urls { get; set; } = "http://*:8888"; + public bool Swagger { get; set; } = false; /// /// Aop配置 /// - public AopConfig Aop { get; set; } + public AopConfig Aop { get; set; } = new AopConfig(); /// /// 日志配置 /// - public LogConfig Log { get; set; } + public LogConfig Log { get; set; } = new LogConfig(); /// /// 验证码配置 /// - public VarifyCodeConfig VarifyCode { get; set; } + public VarifyCodeConfig VarifyCode { get; set; } = new VarifyCodeConfig(); } /// @@ -39,7 +39,7 @@ public class AopConfig /// /// 事物 /// - public bool Transaction { get; set; } + public bool Transaction { get; set; } = true; } /// @@ -50,7 +50,7 @@ public class LogConfig /// /// 操作日志 /// - public bool Operation { get; set; } + public bool Operation { get; set; } = true; } /// @@ -61,6 +61,6 @@ public class VarifyCodeConfig /// /// 操作日志 /// - public string[] Font { get; set; } + public string[] Font { get; set; } = { "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" }; } } diff --git a/Admin.Core.Common/Configs/CacheConfig.cs b/Admin.Core.Common/Configs/CacheConfig.cs index 32c665520..cdea865f9 100644 --- a/Admin.Core.Common/Configs/CacheConfig.cs +++ b/Admin.Core.Common/Configs/CacheConfig.cs @@ -12,19 +12,22 @@ public class CacheConfig /// /// 缓存类型 /// - public CacheType Type { get; set; } + public CacheType Type { get; set; } = CacheType.Memory; /// /// Redis配置 /// - public RedisConfig Redis { get; set; } + public RedisConfig Redis { get; set; } = new RedisConfig(); } + /// + /// Redis配置 + /// public class RedisConfig { /// /// 连接字符串 /// - public string ConnectionString { get; set; } + public string ConnectionString { get; set; } = "127.0.0.1:6379,password=,defaultDatabase=2"; } } diff --git a/Admin.Core.Common/Configs/DbConfig.cs b/Admin.Core.Common/Configs/DbConfig.cs index 5e28160f8..2bfd88ff9 100644 --- a/Admin.Core.Common/Configs/DbConfig.cs +++ b/Admin.Core.Common/Configs/DbConfig.cs @@ -11,32 +11,32 @@ public class DbConfig /// /// 数据库类型 /// - public DataType Type { get; set; } + public DataType Type { get; set; } = DataType.Sqlite; /// /// 数据库字符串 /// - public string ConnectionString { get; set; } + public string ConnectionString { get; set; } = "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1"; /// /// 生成数据 /// - public bool GenerateData { get; set; } + public bool GenerateData { get; set; } = false; /// /// 同步结构 /// - public bool SyncStructure { get; set; } + public bool SyncStructure { get; set; } = true; /// /// 同步数据 /// - public bool SyncData { get; set; } + public bool SyncData { get; set; } = true; /// /// 建库 /// - public bool CreateDb { get; set; } + public bool CreateDb { get; set; } = true; /// /// 建库连接字符串 @@ -51,11 +51,11 @@ public class DbConfig /// /// 监听所有操作 /// - public bool MonitorCommand { get; set; } + public bool MonitorCommand { get; set; } = false; /// /// 监听Curd操作 /// - public bool Curd { get; set; } + public bool Curd { get; set; } = false; } } diff --git a/Admin.Core.Common/Configs/JwtConfig.cs b/Admin.Core.Common/Configs/JwtConfig.cs index d0ee2a630..54cbb54e7 100644 --- a/Admin.Core.Common/Configs/JwtConfig.cs +++ b/Admin.Core.Common/Configs/JwtConfig.cs @@ -11,21 +11,21 @@ public class JwtConfig /// /// 发行者 /// - public string Issuer { get; set; } + public string Issuer { get; set; } = "http://127.0.0.1:8888"; /// /// 订阅者 /// - public string Audience { get; set; } + public string Audience { get; set; } = "http://127.0.0.1:8888"; /// /// 密钥 /// - public string SecurityKey { get; set; } + public string SecurityKey { get; set; } = "ertJKl#521*a@790asD&1#"; /// /// 有效期(分钟) /// - public int Expires { get; set; } + public int Expires { get; set; } = 120; } } diff --git a/Admin.Core.Common/Helpers/HtmlHelper.cs b/Admin.Core.Common/Helpers/HtmlHelper.cs new file mode 100644 index 000000000..a197e2db9 --- /dev/null +++ b/Admin.Core.Common/Helpers/HtmlHelper.cs @@ -0,0 +1,416 @@ +using System; +using System.Text; +using System.Net; +using System.IO; +using System.Threading; +using System.Text.RegularExpressions; +using Admin.Core.Common.Attributes; + +namespace Admin.Core.Common.Helpers +{ + /// + /// Html操作相关类 + /// + [SingleInstance] + public class HtmlHelper + { + #region 私有字段 + private readonly string _ContentType = "application/x-www-form-urlencoded"; + private readonly string _Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-silverlight-2-b1, */*"; + private readonly string _UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)"; + private int _Delay = 1000; + private int _CurrentTry = 0; + #endregion + + #region 公有属性 + /// + /// Cookie + /// + public CookieContainer CookieContainer { get; } = new CookieContainer(); + + /// + /// 语言 + /// + public Encoding Encoding { get; set; } = Encoding.GetEncoding("utf-8"); + + public int NetworkDelay + { + get + { + Random r = new Random(); + return r.Next(_Delay, _Delay * 2); + } + set + { + _Delay = value; + } + } + + public int MaxTry { get; set; } = 300; + #endregion + + #region 获取HTML + /// + /// 获取HTML + /// + /// 地址 + /// post 提交的字符串 + /// 是否是post + /// CookieContainer + public string GetHtml(string url, string postData, bool isPost, CookieContainer cookieContainer) + { + if (string.IsNullOrEmpty(postData)) return GetHtml(url, cookieContainer); + Thread.Sleep(NetworkDelay); + _CurrentTry++; + HttpWebRequest httpWebRequest = null; + HttpWebResponse httpWebResponse = null; + try + { + byte[] byteRequest = Encoding.Default.GetBytes(postData); + httpWebRequest = (HttpWebRequest)WebRequest.Create(url); + httpWebRequest.CookieContainer = cookieContainer; + httpWebRequest.ContentType = _ContentType; + httpWebRequest.ServicePoint.ConnectionLimit = MaxTry; + httpWebRequest.Referer = url; + httpWebRequest.Accept = _Accept; + httpWebRequest.UserAgent = _UserAgent; + httpWebRequest.Method = isPost ? "POST" : "GET"; + httpWebRequest.ContentLength = byteRequest.Length; + Stream stream = httpWebRequest.GetRequestStream(); + stream.Write(byteRequest, 0, byteRequest.Length); + stream.Close(); + httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); + Stream responseStream = httpWebResponse.GetResponseStream(); + StreamReader streamReader = new StreamReader(responseStream, Encoding); + string html = streamReader.ReadToEnd(); + streamReader.Close(); + responseStream.Close(); + _CurrentTry = 0; + httpWebRequest.Abort(); + httpWebResponse.Close(); + return html; + } + catch + { + if (_CurrentTry <= MaxTry) GetHtml(url, postData, isPost, cookieContainer); + _CurrentTry--; + if (httpWebRequest != null) httpWebRequest.Abort(); + if (httpWebResponse != null) httpWebResponse.Close(); + return string.Empty; + } + } + + /// + /// 获取HTML + /// + /// 地址 + /// CookieContainer + public string GetHtml(string url, CookieContainer cookieContainer) + { + Thread.Sleep(NetworkDelay); + _CurrentTry++; + HttpWebRequest httpWebRequest = null; + HttpWebResponse httpWebResponse = null; + try + { + httpWebRequest = (HttpWebRequest)WebRequest.Create(url); + httpWebRequest.CookieContainer = cookieContainer; + httpWebRequest.ContentType = _ContentType; + httpWebRequest.ServicePoint.ConnectionLimit = MaxTry; + httpWebRequest.Referer = url; + httpWebRequest.Accept = _Accept; + httpWebRequest.UserAgent = _UserAgent; + httpWebRequest.Method = "GET"; + httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); + Stream responseStream = httpWebResponse.GetResponseStream(); + StreamReader streamReader = new StreamReader(responseStream, Encoding); + string html = streamReader.ReadToEnd(); + streamReader.Close(); + responseStream.Close(); + _CurrentTry--; + httpWebRequest.Abort(); + httpWebResponse.Close(); + return html; + } + catch (Exception) + { + if (_CurrentTry <= MaxTry) GetHtml(url, cookieContainer); + _CurrentTry--; + if (httpWebRequest != null) httpWebRequest.Abort(); + if (httpWebResponse != null) httpWebResponse.Close(); + return string.Empty; + } + } + #endregion + + #region 获取字符流 + /// + /// 获取字符流 + /// + //--------------------------------------------------------------------------------------------------------------- + // 示例: + // System.Net.CookieContainer cookie = new System.Net.CookieContainer(); + // Stream s = HttpHelper.GetStream("http://ptlogin2.qq.com/getimage?aid=15000102&0.43878429697395826", cookie); + // picVerify.Image = Image.FromStream(s); + //--------------------------------------------------------------------------------------------------------------- + /// 地址 + /// cookieContainer + public Stream GetStream(string url, CookieContainer cookieContainer) + { + _CurrentTry++; + + HttpWebRequest httpWebRequest = null; + HttpWebResponse httpWebResponse = null; + + try + { + httpWebRequest = (HttpWebRequest)WebRequest.Create(url); + httpWebRequest.CookieContainer = cookieContainer; + httpWebRequest.ContentType = _ContentType; + httpWebRequest.ServicePoint.ConnectionLimit = MaxTry; + httpWebRequest.Referer = url; + httpWebRequest.Accept = _Accept; + httpWebRequest.UserAgent = _UserAgent; + httpWebRequest.Method = "GET"; + + httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); + Stream responseStream = httpWebResponse.GetResponseStream(); + _CurrentTry--; + return responseStream; + } + catch (Exception) + { + if (_CurrentTry <= MaxTry) + { + GetHtml(url, cookieContainer); + } + + _CurrentTry--; + + if (httpWebRequest != null) + { + httpWebRequest.Abort(); + } if (httpWebResponse != null) + { + httpWebResponse.Close(); + } + return null; + } + } + #endregion + + #region 清除HTML标记 + /// + /// 清除HTML标记 + /// + /// + /// 已经去除后的文字 + public string NoHTML(string Htmlstring) + { + //删除脚本 + Htmlstring = Regex.Replace(Htmlstring, @"]*?>.*?", "", RegexOptions.IgnoreCase); + + //删除HTML + Regex regex = new Regex("<.+?>", RegexOptions.IgnoreCase); + Htmlstring = regex.Replace(Htmlstring, ""); + Htmlstring = Regex.Replace(Htmlstring, @"<(.[^>]*)>", "", RegexOptions.IgnoreCase); + Htmlstring = Regex.Replace(Htmlstring, @"([\r\n])[\s]+", "", RegexOptions.IgnoreCase); + Htmlstring = Regex.Replace(Htmlstring, @"-->", "", RegexOptions.IgnoreCase); + Htmlstring = Regex.Replace(Htmlstring, @" OutOfProcess false - 1.2.0 + 1.3.0 MIT xiaoxue xiaoxue @@ -43,8 +43,8 @@ - - + + diff --git a/Admin.Core/Aop/AopHelper.cs b/Admin.Core/Aop/AopHelper.cs index af691633a..ab016cc92 100644 --- a/Admin.Core/Aop/AopHelper.cs +++ b/Admin.Core/Aop/AopHelper.cs @@ -19,7 +19,7 @@ public static async Task ExecuteGenericMethod(Task returnValue, Action< catch (Exception ex) { exceptionAction?.Invoke(ex); - throw; + return default; } finally { diff --git a/Admin.Core/Aop/TransactionInterceptor.cs b/Admin.Core/Aop/TransactionInterceptor.cs index 2401169ba..a09e61664 100644 --- a/Admin.Core/Aop/TransactionInterceptor.cs +++ b/Admin.Core/Aop/TransactionInterceptor.cs @@ -1,4 +1,4 @@ -using System; +using System.Reflection; using System.Threading.Tasks; using Castle.DynamicProxy; using FreeSql; @@ -6,6 +6,7 @@ using Admin.Core.Common.Output; using Admin.Core.Common.Attributes; + namespace Admin.Core.Aop { public class TransactionInterceptor : IInterceptor @@ -18,97 +19,49 @@ public TransactionInterceptor(UnitOfWorkManager unitOfWorkManager) _unitOfWorkManager = unitOfWorkManager; } - public async void Intercept(IInvocation invocation) + public void Intercept(IInvocation invocation) { var method = invocation.MethodInvocationTarget ?? invocation.Method; - if (method.HasAttribute()) { - try - { - var transaction = method.GetAttribute(); - _unitOfWork = _unitOfWorkManager.Begin(transaction.Propagation, transaction.IsolationLevel); - invocation.Proceed(); + InterceptTransaction(invocation, method); + } + else + { + invocation.Proceed(); + } + } - if (method.IsAsync()) - { - if (invocation.Method.ReturnType == typeof(Task)) - { - try - { - await (Task)invocation.ReturnValue; - _unitOfWork.Commit(); - } - catch (Exception ex) - { - _unitOfWork.Rollback(); - throw ex; - } - finally - { - _unitOfWork.Dispose(); - } - } - else - { - AopHelper.CallGenericMethod( - invocation, - res => - { - if (res == null) - { - return; - } + private async void InterceptTransaction(IInvocation invocation, MethodInfo method) + { + try + { + var transaction = method.GetAttribute(); + _unitOfWork = _unitOfWorkManager.Begin(transaction.Propagation, transaction.IsolationLevel); + invocation.Proceed(); - var responseOutput = res as IResponseOutput; - if (responseOutput != null && !responseOutput.Success) - { - _unitOfWork.Rollback(); - } - else - { - _unitOfWork.Commit(); - } - }, - ex => - { - _unitOfWork.Rollback(); - }, - ()=> - { - _unitOfWork.Dispose(); - }); - } - } - else - { - if (invocation.Method.ReturnType != typeof(void)) - { - var responseOutput = invocation.ReturnValue as Task; - if (responseOutput != null && !responseOutput.Result.Success) - { - _unitOfWork.Rollback(); - } - else - { - _unitOfWork.Commit(); - } - } - else - { - _unitOfWork.Commit(); - } - } + dynamic returnValue = invocation.ReturnValue; + if (returnValue is Task) + { + returnValue = await returnValue; } - catch (Exception ex) + + if (returnValue is IResponseOutput res && !res.Success) { _unitOfWork.Rollback(); - throw ex; + } + else + { + _unitOfWork.Commit(); } } - else + catch { - invocation.Proceed(); + _unitOfWork.Rollback(); + } + finally + { + _unitOfWork.Dispose(); } } } diff --git a/Admin.Core/Attributes/VersionRouteAttribute.cs b/Admin.Core/Attributes/VersionRouteAttribute.cs index d0d077b6e..9686b6590 100644 --- a/Admin.Core/Attributes/VersionRouteAttribute.cs +++ b/Admin.Core/Attributes/VersionRouteAttribute.cs @@ -13,7 +13,8 @@ public class VersionRouteAttribute : RouteAttribute, IApiDescriptionGroupNamePro { public string GroupName { get; set; } - public VersionRouteAttribute(ApiVersion version, string actionName = "") : base($"/api/{version.ToString()}/[area]/[controller]/{actionName}") + public VersionRouteAttribute(ApiVersion version = ApiVersion.V2, string action = "[action]") + : base($"/api/{version}/[area]/[controller]/{action}") { GroupName = version.ToString(); } diff --git a/Admin.Core/Auth/PermissionHandler.cs b/Admin.Core/Auth/PermissionHandler.cs index b9f52fb3a..208318249 100644 --- a/Admin.Core/Auth/PermissionHandler.cs +++ b/Admin.Core/Auth/PermissionHandler.cs @@ -1,5 +1,6 @@ using System.Linq; using System.Threading.Tasks; +using Admin.Core.Common.Attributes; using Admin.Core.Service.Admin.User; namespace Admin.Core.Auth @@ -7,6 +8,7 @@ namespace Admin.Core.Auth /// /// 权限处理 /// + [SingleInstance] public class PermissionHandler : IPermissionHandler { private readonly IUserService _userService; diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index 26c8ee126..855ee4554 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -10,7 +10,6 @@ using Admin.Core.Common.Configs; using Admin.Core.Common.Helpers; using Admin.Core.Model.Admin; -using System.Reflection; namespace Admin.Core.Db { diff --git a/Admin.Core/Db/ServiceCollectionExtensions.cs b/Admin.Core/Db/ServiceCollectionExtensions.cs index affb2d70b..81ae072e9 100644 --- a/Admin.Core/Db/ServiceCollectionExtensions.cs +++ b/Admin.Core/Db/ServiceCollectionExtensions.cs @@ -87,11 +87,11 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen #region 审计数据 //计算服务器时间 //var serverTime = fsql.Select().Limit(1).First(a => DateTime.local); - //var timeOffset = DateTime.UtcNow.Subtract(serverTime); + //var timeOffset = DateTime.UtcNow.Subtract(serverTime); + var user = services.BuildServiceProvider().GetService(); fsql.Aop.AuditValue += (s, e) => { - var user = services.BuildServiceProvider().GetService(); - if(user == null || !(user.Id > 0)) + if (user == null || user.Id <= 0) { return; } diff --git a/Admin.Core/Filters/LogActionFilter.cs b/Admin.Core/Filters/LogActionFilter.cs index 404774571..63f40694d 100644 --- a/Admin.Core/Filters/LogActionFilter.cs +++ b/Admin.Core/Filters/LogActionFilter.cs @@ -10,9 +10,9 @@ public class LogActionFilter : IAsyncActionFilter { private readonly ILogHandler _logHandler; - public LogActionFilter(ILogHandler opratoinLogHandler) + public LogActionFilter(ILogHandler logHandler) { - _logHandler = opratoinLogHandler; + _logHandler = logHandler; } public Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) diff --git a/Admin.Core/Logs/LogHandler.cs b/Admin.Core/Logs/LogHandler.cs index 59cdbc4f4..4d34e131f 100644 --- a/Admin.Core/Logs/LogHandler.cs +++ b/Admin.Core/Logs/LogHandler.cs @@ -32,7 +32,6 @@ public async Task LogAsync(ActionExecutingContext context, ActionExecutionDelega sw.Start(); dynamic actionResult = (await next()).Result; - sw.Stop(); //操作参数 diff --git a/Admin.Core/Startup.cs b/Admin.Core/Startup.cs index d9331a7a1..4a9a13172 100644 --- a/Admin.Core/Startup.cs +++ b/Admin.Core/Startup.cs @@ -23,7 +23,6 @@ //using FluentValidation.AspNetCore; using Admin.Core.Common.Helpers; using Admin.Core.Common.Configs; -using Admin.Core.Common.Auth; using Admin.Core.Auth; using Admin.Core.Enums; using Admin.Core.Filters; @@ -31,26 +30,33 @@ using Admin.Core.Common.Cache; using Admin.Core.Aop; using Admin.Core.Logs; -using PermissionHandler = Admin.Core.Auth.PermissionHandler; using Admin.Core.Extensions; using Admin.Core.Common.Attributes; +using Admin.Core.Common.Auth; + namespace Admin.Core { public class Startup { - private readonly IHostEnvironment _env; private static string basePath => AppContext.BaseDirectory; + private readonly IHostEnvironment _env; + private readonly ConfigHelper _configHelper; private readonly AppConfig _appConfig; public Startup(IWebHostEnvironment env) { _env = env; - _appConfig = new ConfigHelper().Get("appconfig", env.EnvironmentName) ?? new AppConfig(); + _configHelper = new ConfigHelper(); + _appConfig = _configHelper.Get("appconfig", env.EnvironmentName) ?? new AppConfig(); } public void ConfigureServices(IServiceCollection services) { + //用户信息 + services.AddSingleton(); + services.TryAddSingleton(); + //数据库 services.AddDb(_env, _appConfig); @@ -58,7 +64,7 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(_appConfig); //上传配置 - var uploadConfig = new ConfigHelper().Load("uploadconfig", _env.EnvironmentName, true); + var uploadConfig = _configHelper.Load("uploadconfig", _env.EnvironmentName, true); services.Configure(uploadConfig); #region AutoMapper 自动映射 @@ -76,6 +82,18 @@ public void ConfigureServices(IServiceCollection services) .AllowAnyHeader() .AllowAnyMethod(); }); + + /* + //浏览器会发起2次请求,使用OPTIONS发起预检请求,第二次才是api异步请求 + c.AddPolicy("All", policy => + { + policy + .AllowAnyOrigin() + .SetPreflightMaxAge(new TimeSpan(0, 10, 0)) + .AllowAnyHeader() + .AllowAnyMethod(); + }); + */ }); #endregion @@ -139,13 +157,8 @@ public void ConfigureServices(IServiceCollection services) #endregion #region Jwt身份认证 - var jwtConfig = new ConfigHelper().Get("jwtconfig", _env.EnvironmentName); + var jwtConfig = _configHelper.Get("jwtconfig", _env.EnvironmentName); services.TryAddSingleton(jwtConfig); - services.AddSingleton(); - services.TryAddSingleton(); - services.TryAddSingleton(); - services.AddScoped(); - services.AddAuthentication(options => { options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; @@ -181,6 +194,8 @@ public void ConfigureServices(IServiceCollection services) { options.Filters.Add(); } + //禁止去除ActionAsync后缀 + options.SuppressAsyncSuffixInActionNames = false; }) //.AddFluentValidation(config => //{ @@ -199,7 +214,7 @@ public void ConfigureServices(IServiceCollection services) #endregion #region 缓存 - var cacheConfig = new ConfigHelper().Get("cacheconfig", _env.EnvironmentName); + var cacheConfig = _configHelper.Get("cacheconfig", _env.EnvironmentName); if (cacheConfig.Type == CacheType.Redis) { var csredis = new CSRedis.CSRedisClient(cacheConfig.Redis.ConnectionString); @@ -222,6 +237,20 @@ public void ConfigureContainer(ContainerBuilder builder) #region AutoFac IOC容器 try { + #region SingleInstance + //无接口注入单例 + var assemblyCore = Assembly.Load("Admin.Core"); + var assemblyCommon = Assembly.Load("Admin.Core.Common"); + builder.RegisterAssemblyTypes(assemblyCore, assemblyCommon) + .Where(t => t.GetCustomAttribute() != null) + .SingleInstance(); + //有接口注入单例 + builder.RegisterAssemblyTypes(assemblyCore, assemblyCommon) + .Where(t => t.GetCustomAttribute() != null) + .AsImplementedInterfaces() + .SingleInstance(); + #endregion + #region Aop var interceptorServiceTypes = new List(); if (_appConfig.Aop.Transaction) @@ -231,15 +260,6 @@ public void ConfigureContainer(ContainerBuilder builder) } #endregion - #region Service - var assemblyServices = Assembly.Load("Admin.Core.Service"); - builder.RegisterAssemblyTypes(assemblyServices) - .AsImplementedInterfaces() - .InstancePerDependency() - .EnableInterfaceInterceptors() - .InterceptedBy(interceptorServiceTypes.ToArray()); - #endregion - #region Repository var assemblyRepository = Assembly.Load("Admin.Core.Repository"); builder.RegisterAssemblyTypes(assemblyRepository) @@ -247,12 +267,13 @@ public void ConfigureContainer(ContainerBuilder builder) .InstancePerDependency(); #endregion - #region SingleInstance - var assemblyCore = Assembly.Load("Admin.Core"); - var assemblyCommon = Assembly.Load("Admin.Core.Common"); - builder.RegisterAssemblyTypes(assemblyCore, assemblyCommon) - .Where(t => t.GetCustomAttribute() != null) - .SingleInstance(); + #region Service + var assemblyServices = Assembly.Load("Admin.Core.Service"); + builder.RegisterAssemblyTypes(assemblyServices) + .AsImplementedInterfaces() + .InstancePerDependency() + .EnableInterfaceInterceptors() + .InterceptedBy(interceptorServiceTypes.ToArray()); #endregion } catch (Exception ex) diff --git a/Admin.Core/configs/dbconfig.json b/Admin.Core/configs/dbconfig.json index 91ff43364..d92d77760 100644 --- a/Admin.Core/configs/dbconfig.json +++ b/Admin.Core/configs/dbconfig.json @@ -18,11 +18,12 @@ //建库连接字符串 //MySql "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;" //SqlServer "Data Source=.;Integrated Security=True;Initial Catalog=master;Pooling=true;Min Pool Size=1" - //PostgreSQL "CREATE DATABASE \"admindb\" WITH ENCODING = 'UTF8'" + //PostgreSQL "Host=localhost;Port=5432;Username=postgres;Password=; Database=postgres;Pooling=true;Minimum Pool Size=1", "createDbConnectionString": "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;", //建库脚本 //MySql "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'" //SqlServer "CREATE DATABASE [admindb]" + //PostgreSQL "CREATE DATABASE \"admindb\" WITH ENCODING = 'UTF8'" "createDbSql": "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'", //数据库配置 https://github.com/dotnetcore/FreeSql/wiki/入门 @@ -31,7 +32,7 @@ //连接字符串 //MySql "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;" //SqlServer "Data Source=.;Integrated Security=True;Initial Catalog=admindb;Pooling=true;Min Pool Size=1" - //Sqlite "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" //PostgreSQL "Host=localhost;Port=5432;Username=postgres;Password=; Database=admindb;Pooling=true;Minimum Pool Size=1" + //Sqlite "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" "connectionString": "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1" } diff --git a/Admin.Core/configs/jwtconfig.json b/Admin.Core/configs/jwtconfig.json index dff6557b7..5f21512d3 100644 --- a/Admin.Core/configs/jwtconfig.json +++ b/Admin.Core/configs/jwtconfig.json @@ -1,8 +1,8 @@ { //发行者 - "issuer": "https://www.admin.zhontai.com", + "issuer": "http://127.0.0.1:8888", //订阅者 - "audience": "https://www.admin.zhontai.com", + "audience": "http://127.0.0.1:8888", //密钥 "securityKey": "ertJKl#521*a@790asD&1#", //有效期(分钟) From 315ea8d151b21c936d91379f281f17e2c2732802 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Thu, 28 May 2020 23:48:10 +0800 Subject: [PATCH 42/53] =?UTF-8?q?=E6=9B=B4=E6=96=B01.3.1=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20=E6=8E=A5=E5=8F=A3=E3=80=81=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=92=8C=E4=BB=93=E5=82=A8=E6=B5=8B=E8=AF=95=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20Ip=E9=99=90=E6=B5=81=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=86=85=E5=AD=98=E5=92=8CRedis=E7=BC=93=E5=AD=98=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20=E6=9D=83=E9=99=90=E7=AE=A1=E7=90=86=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=9D=83=E9=99=90=E7=BC=96=E7=A0=81=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=EF=BC=8C=E6=8E=A5=E5=8F=A3=E8=A1=A8=E5=8D=95=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=9D=83=E9=99=90=E7=BC=96=E7=A0=81=E4=BF=9D=E5=AD=98=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E6=9D=83=E9=99=90=E6=8C=87=E4=BB=A4v-perm?= =?UTF-8?q?ission=3D"'=E6=9D=83=E9=99=90=E7=BC=96=E7=A0=81'"=20=E6=88=96?= =?UTF-8?q?=20v-permission=3D"{=20permission:=20'=E6=9D=83=E9=99=90?= =?UTF-8?q?=E7=BC=96=E7=A0=81',=20disabled:true=20}"=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=20=E6=9D=83=E9=99=90=E6=A3=80=E6=9F=A5=E6=96=B9=E6=B3=95v-if?= =?UTF-8?q?=3D"checkPermission('=E6=9D=83=E9=99=90=E7=BC=96=E7=A0=81')"=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E9=AB=98=E7=BA=A7=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E7=82=B9=E5=87=BB=E5=85=B3=E9=97=AD=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E6=8C=89=E9=92=AE=EF=BC=8C=E6=97=A0=E6=B3=95=E5=86=8D?= =?UTF-8?q?=E6=89=93=E5=BC=80=E9=AB=98=E7=BA=A7=E6=9F=A5=E8=AF=A2=E7=AA=97?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 4 +- Admin.Core.Common/Configs/AppConfig.cs | 10 +++ Admin.Core.Common/Configs/CacheConfig.cs | 10 +++ Admin.Core.Common/Helpers/ConfigHelper.cs | 2 +- Admin.Core.Common/Helpers/HtmlHelper.cs | 8 +- Admin.Core.Model/Admin/PermissionEntity.cs | 6 ++ Admin.Core.Services/Admin/Auth/AuthService.cs | 52 +++++++---- .../Admin/Auth/Input/AuthLoginInput.cs | 2 +- .../Auth/Output/AuthGetVerifyCodeOutput.cs | 17 ++++ .../Admin/LoginLog/LoginLogService.cs | 18 ++-- .../Permission/Input/PermissionAddApiInput.cs | 5 ++ Admin.Core.Tests/Admin.Core.Tests.csproj | 5 +- Admin.Core.Tests/BaseTest.cs | 82 +++++++++++++++++ Admin.Core.Tests/Controller.Tests/ApiTest.cs | 32 ------- .../Controller/Admin/ApiControllerTest.cs | 27 ++++++ .../Controller/BaseControllerTest.cs | 88 +++++++++++++++++++ .../Repository/Admin/RepositoryBaseTest.cs | 24 +++++ .../Service/Admin/ApiServiceTest.cs | 22 +++++ Admin.Core/Admin.Core.Common.xml | 23 +++++ Admin.Core/Admin.Core.Model.xml | 5 ++ Admin.Core/Admin.Core.Service.xml | 15 ++++ Admin.Core/Admin.Core.csproj | 4 +- Admin.Core/Admin.Core.xml | 8 ++ Admin.Core/Db/Data/data.json | 2 +- Admin.Core/Db/DbHelper.cs | 1 + .../RateLimitServiceCollectionExtensions.cs | 43 +++++++++ Admin.Core/Program.cs | 16 +++- Admin.Core/Startup.cs | 19 +++- Admin.Core/configs/appconfig.json | 3 + Admin.Core/configs/cacheconfig.json | 7 +- .../configs/ratelimitconfig.Development.json | 3 + Admin.Core/configs/ratelimitconfig.json | 33 +++++++ 32 files changed, 520 insertions(+), 76 deletions(-) create mode 100644 Admin.Core.Services/Admin/Auth/Output/AuthGetVerifyCodeOutput.cs create mode 100644 Admin.Core.Tests/BaseTest.cs delete mode 100644 Admin.Core.Tests/Controller.Tests/ApiTest.cs create mode 100644 Admin.Core.Tests/Controller/Admin/ApiControllerTest.cs create mode 100644 Admin.Core.Tests/Controller/BaseControllerTest.cs create mode 100644 Admin.Core.Tests/Repository/Admin/RepositoryBaseTest.cs create mode 100644 Admin.Core.Tests/Service/Admin/ApiServiceTest.cs create mode 100644 Admin.Core/Extensions/RateLimitServiceCollectionExtensions.cs create mode 100644 Admin.Core/configs/ratelimitconfig.Development.json create mode 100644 Admin.Core/configs/ratelimitconfig.json diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 0ddc04dd8..e12f6cc27 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -33,9 +33,9 @@ - + - + diff --git a/Admin.Core.Common/Configs/AppConfig.cs b/Admin.Core.Common/Configs/AppConfig.cs index 49c351269..9e7758f5c 100644 --- a/Admin.Core.Common/Configs/AppConfig.cs +++ b/Admin.Core.Common/Configs/AppConfig.cs @@ -25,6 +25,11 @@ public class AppConfig /// public LogConfig Log { get; set; } = new LogConfig(); + /// + /// 限流 + /// + public bool RateLimit { get; set; } = true; + /// /// 验证码配置 /// @@ -58,6 +63,11 @@ public class LogConfig /// public class VarifyCodeConfig { + /// + /// 启用 + /// + public bool Enabled { get; set; } = true; + /// /// 操作日志 /// diff --git a/Admin.Core.Common/Configs/CacheConfig.cs b/Admin.Core.Common/Configs/CacheConfig.cs index cdea865f9..c41f6bacd 100644 --- a/Admin.Core.Common/Configs/CacheConfig.cs +++ b/Admin.Core.Common/Configs/CacheConfig.cs @@ -14,6 +14,11 @@ public class CacheConfig /// public CacheType Type { get; set; } = CacheType.Memory; + /// + /// 限流缓存类型 + /// + public CacheType TypeRateLimit { get; set; } = CacheType.Memory; + /// /// Redis配置 /// @@ -29,5 +34,10 @@ public class RedisConfig /// 连接字符串 /// public string ConnectionString { get; set; } = "127.0.0.1:6379,password=,defaultDatabase=2"; + + /// + /// 限流连接字符串 + /// + public string ConnectionStringRateLimit { get; set; } = "127.0.0.1:6379,password=,defaultDatabase=1"; } } diff --git a/Admin.Core.Common/Helpers/ConfigHelper.cs b/Admin.Core.Common/Helpers/ConfigHelper.cs index a02f1a5ad..c7850cc70 100644 --- a/Admin.Core.Common/Helpers/ConfigHelper.cs +++ b/Admin.Core.Common/Helpers/ConfigHelper.cs @@ -39,7 +39,7 @@ public IConfiguration Load(string fileName, string environmentName = "", bool re if (environmentName.NotNull()) { - builder.AddJsonFile(fileName.ToLower() + "." + environmentName + ".json", true, reloadOnChange); + builder.AddJsonFile(fileName.ToLower() + "." + environmentName + ".json", optional: true, reloadOnChange: reloadOnChange); } return builder.Build(); diff --git a/Admin.Core.Common/Helpers/HtmlHelper.cs b/Admin.Core.Common/Helpers/HtmlHelper.cs index a197e2db9..16d4407ab 100644 --- a/Admin.Core.Common/Helpers/HtmlHelper.cs +++ b/Admin.Core.Common/Helpers/HtmlHelper.cs @@ -15,7 +15,7 @@ namespace Admin.Core.Common.Helpers public class HtmlHelper { #region 私有字段 - private readonly string _ContentType = "application/x-www-form-urlencoded"; + private readonly string _ContentType = "application/json"; private readonly string _Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-silverlight-2-b1, */*"; private readonly string _UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)"; private int _Delay = 1000; @@ -144,15 +144,15 @@ public string GetHtml(string url, CookieContainer cookieContainer) #endregion #region 获取字符流 - /// - /// 获取字符流 - /// //--------------------------------------------------------------------------------------------------------------- // 示例: // System.Net.CookieContainer cookie = new System.Net.CookieContainer(); // Stream s = HttpHelper.GetStream("http://ptlogin2.qq.com/getimage?aid=15000102&0.43878429697395826", cookie); // picVerify.Image = Image.FromStream(s); //--------------------------------------------------------------------------------------------------------------- + /// + /// 获取字符流 + /// /// 地址 /// cookieContainer public Stream GetStream(string url, CookieContainer cookieContainer) diff --git a/Admin.Core.Model/Admin/PermissionEntity.cs b/Admin.Core.Model/Admin/PermissionEntity.cs index e02d395da..dfcafd591 100644 --- a/Admin.Core.Model/Admin/PermissionEntity.cs +++ b/Admin.Core.Model/Admin/PermissionEntity.cs @@ -21,6 +21,12 @@ public class PermissionEntity : EntityBase [Column(StringLength = 50)] public string Label { get; set; } + /// + /// 权限编码 + /// + [Column(StringLength = 550)] + public string Code { get; set; } + /// /// 权限类型 /// diff --git a/Admin.Core.Services/Admin/Auth/AuthService.cs b/Admin.Core.Services/Admin/Auth/AuthService.cs index 2e63c1c28..fded6b4e8 100644 --- a/Admin.Core.Services/Admin/Auth/AuthService.cs +++ b/Admin.Core.Services/Admin/Auth/AuthService.cs @@ -1,14 +1,15 @@ using System; using System.Linq; using System.Threading.Tasks; +using AutoMapper; using Admin.Core.Model.Admin; using Admin.Core.Common.Output; using Admin.Core.Repository.Admin; -using Admin.Core.Common.Helpers; using Admin.Core.Common.Auth; using Admin.Core.Common.Cache; +using Admin.Core.Common.Configs; +using Admin.Core.Common.Helpers; using Admin.Core.Service.Admin.Auth.Input; -using AutoMapper; using Admin.Core.Service.Admin.Auth.Output; namespace Admin.Core.Service.Admin.Auth @@ -18,6 +19,7 @@ public class AuthService : IAuthService private readonly IUser _user; private readonly ICache _cache; private readonly IMapper _mapper; + private readonly AppConfig _appConfig; private readonly VerifyCodeHelper _verifyCodeHelper; private readonly IUserRepository _userRepository; private readonly IPermissionRepository _permissionRepository; @@ -26,6 +28,7 @@ public AuthService( IUser user, ICache cache, IMapper mapper, + AppConfig appConfig, VerifyCodeHelper verifyCodeHelper, IUserRepository userRepository, IPermissionRepository permissionRepository @@ -34,6 +37,7 @@ IPermissionRepository permissionRepository _user = user; _cache = cache; _mapper = mapper; + _appConfig = appConfig; _verifyCodeHelper = verifyCodeHelper; _userRepository = userRepository; _permissionRepository = permissionRepository; @@ -42,24 +46,27 @@ IPermissionRepository permissionRepository public async Task LoginAsync(AuthLoginInput input) { #region 验证码校验 - var verifyCodeKey = string.Format(CacheKey.VerifyCodeKey, input.VerifyCodeKey); - var exists = await _cache.ExistsAsync(verifyCodeKey); - if (exists) + if (_appConfig.VarifyCode.Enabled) { - var verifyCode = await _cache.GetAsync(verifyCodeKey); - if (string.IsNullOrEmpty(verifyCode)) + var verifyCodeKey = string.Format(CacheKey.VerifyCodeKey, input.VerifyCodeKey); + var exists = await _cache.ExistsAsync(verifyCodeKey); + if (exists) { - return ResponseOutput.NotOk("验证码已过期!", 1); + var verifyCode = await _cache.GetAsync(verifyCodeKey); + if (string.IsNullOrEmpty(verifyCode)) + { + return ResponseOutput.NotOk("验证码已过期!", 1); + } + if (verifyCode.ToLower() != input.VerifyCode.ToLower()) + { + return ResponseOutput.NotOk("验证码输入有误!", 2); + } + await _cache.DelAsync(verifyCodeKey); } - if (verifyCode.ToLower() != input.VerifyCode.ToLower()) + else { - return ResponseOutput.NotOk("验证码输入有误!", 2); + return ResponseOutput.NotOk("验证码已过期!", 1); } - await _cache.DelAsync(verifyCodeKey); - } - else - { - return ResponseOutput.NotOk("验证码已过期!", 1); } #endregion @@ -143,7 +150,17 @@ public async Task GetUserInfoAsync() a.External }); - return ResponseOutput.Ok(new { user, menus }); + var permissions = await _permissionRepository.Select + .Where(a => a.Type == PermissionType.Api) + .Where(a => + _permissionRepository.Orm.Select() + .InnerJoin((b, c) => b.RoleId == c.RoleId && c.UserId == _user.Id) + .Where(b => b.PermissionId == a.Id) + .Any() + ) + .ToListAsync(a => a.Code); + + return ResponseOutput.Ok(new { user, menus, permissions }); } public async Task GetVerifyCodeAsync(string lastKey) @@ -161,8 +178,7 @@ public async Task GetVerifyCodeAsync(string lastKey) var key = string.Format(CacheKey.VerifyCodeKey, guid); await _cache.SetAsync(key, code, TimeSpan.FromMinutes(5)); - var data = new { key = guid, img }; - + var data = new AuthGetVerifyCodeOutput { Key = guid, Img = img }; return ResponseOutput.Ok(data); } diff --git a/Admin.Core.Services/Admin/Auth/Input/AuthLoginInput.cs b/Admin.Core.Services/Admin/Auth/Input/AuthLoginInput.cs index e189775e3..58efa164f 100644 --- a/Admin.Core.Services/Admin/Auth/Input/AuthLoginInput.cs +++ b/Admin.Core.Services/Admin/Auth/Input/AuthLoginInput.cs @@ -27,7 +27,7 @@ public class AuthLoginInput /// /// 验证码 /// - [Required(ErrorMessage = "验证码不能为空!")] + //[Required(ErrorMessage = "验证码不能为空!")] public string VerifyCode { get; set; } /// diff --git a/Admin.Core.Services/Admin/Auth/Output/AuthGetVerifyCodeOutput.cs b/Admin.Core.Services/Admin/Auth/Output/AuthGetVerifyCodeOutput.cs new file mode 100644 index 000000000..3e8a1a24d --- /dev/null +++ b/Admin.Core.Services/Admin/Auth/Output/AuthGetVerifyCodeOutput.cs @@ -0,0 +1,17 @@ +using System; + +namespace Admin.Core.Service.Admin.Auth.Output +{ + public class AuthGetVerifyCodeOutput + { + /// + /// 缓存键 + /// + public string Key { get; set; } + + /// + /// 图片 + /// + public string Img { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs b/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs index d62e5cfaf..0a2ea136e 100644 --- a/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs +++ b/Admin.Core.Services/Admin/LoginLog/LoginLogService.cs @@ -54,14 +54,16 @@ public async Task> AddAsync(LoginLogAddInput input) input.IP = IPHelper.GetIP(_context?.HttpContext?.Request); string ua = _context.HttpContext.Request.Headers["User-Agent"]; - var client = UAParser.Parser.GetDefault().Parse(ua); - var device = client.Device.Family; - device = device.ToLower() == "other" ? "" : device; - input.Browser = client.UA.Family; - input.Os = client.OS.Family; - input.Device = device; - input.BrowserInfo = ua; - + if (ua.NotNull()) + { + var client = UAParser.Parser.GetDefault().Parse(ua); + var device = client.Device.Family; + device = device.ToLower() == "other" ? "" : device; + input.Browser = client.UA.Family; + input.Os = client.OS.Family; + input.Device = device; + input.BrowserInfo = ua; + } var entity = _mapper.Map(input); var id = (await _loginLogRepository.InsertAsync(entity)).Id; diff --git a/Admin.Core.Services/Admin/Permission/Input/PermissionAddApiInput.cs b/Admin.Core.Services/Admin/Permission/Input/PermissionAddApiInput.cs index a8770a675..07cf5321e 100644 --- a/Admin.Core.Services/Admin/Permission/Input/PermissionAddApiInput.cs +++ b/Admin.Core.Services/Admin/Permission/Input/PermissionAddApiInput.cs @@ -24,6 +24,11 @@ public class PermissionAddApiInput /// public string Label { get; set; } + /// + /// Ȩޱ + /// + public string Code { get; set; } + /// /// ˵ /// diff --git a/Admin.Core.Tests/Admin.Core.Tests.csproj b/Admin.Core.Tests/Admin.Core.Tests.csproj index 3a80bfe2c..94a912928 100644 --- a/Admin.Core.Tests/Admin.Core.Tests.csproj +++ b/Admin.Core.Tests/Admin.Core.Tests.csproj @@ -7,7 +7,8 @@ - + + all @@ -16,8 +17,6 @@ - - diff --git a/Admin.Core.Tests/BaseTest.cs b/Admin.Core.Tests/BaseTest.cs new file mode 100644 index 000000000..d59567142 --- /dev/null +++ b/Admin.Core.Tests/BaseTest.cs @@ -0,0 +1,82 @@ +using System; +using System.IO; +using System.Net.Http; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.TestHost; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Autofac.Extensions.DependencyInjection; +using NLog.Web; +using Admin.Core.Common.Configs; +using Admin.Core.Common.Helpers; +using EnvironmentName = Microsoft.AspNetCore.Hosting.EnvironmentName; + +namespace Admin.Core.Tests +{ + public class BaseTest + { + protected AppConfig AppConfig { get; } + protected TestServer Server { get; } + protected HttpClient Client { get; } + protected IServiceProvider ServiceProvider { get; } + + protected BaseTest() + { + AppConfig = new ConfigHelper().Get("appconfig") ?? new AppConfig(); + + var builder = CreateHostBuilder(); + var host = builder.Build(); + host.Start(); + + Server = host.GetTestServer(); + Client = host.GetTestClient(); + + ServiceProvider = Server.Services; + } + + private IHostBuilder CreateHostBuilder() + { + var configsPath = Path.Combine(AppContext.BaseDirectory, "configs").ToPath(); + + + return Host.CreateDefaultBuilder() + .UseServiceProviderFactory(new AutofacServiceProviderFactory()) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder + .UseEnvironment(EnvironmentName.Development) + .UseStartup() + .ConfigureAppConfiguration((host, config) => + { + if (AppConfig.RateLimit) + { + config.AddJsonFile($"{configsPath}/ratelimitconfig.json", optional: true, reloadOnChange: true) +#if DEBUG + .AddJsonFile($"{configsPath}/ratelimitconfig.Development.json", false) +#endif + ; + } + }); + webBuilder.UseTestServer(); + }) + .ConfigureLogging(logging => + { + logging.ClearProviders(); + logging.SetMinimumLevel(LogLevel.Trace); + }) + .UseNLog(); + } + + public T GetService() + { + return ServiceProvider.GetService(); + } + + public T GetRequiredService() + { + return ServiceProvider.GetRequiredService(); + } + } +} diff --git a/Admin.Core.Tests/Controller.Tests/ApiTest.cs b/Admin.Core.Tests/Controller.Tests/ApiTest.cs deleted file mode 100644 index 28ce097f4..000000000 --- a/Admin.Core.Tests/Controller.Tests/ApiTest.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Xunit; -using Moq; -using Admin.Core.Model.Admin; -using Admin.Core.Service.Admin.Api; -using Admin.Core.Common.Input; -using Admin.Core.Controllers.Admin; - -namespace Admin.Core.Tests.Controller.Tests -{ - public class ApiTest - { - Mock mockIApiService = new Mock(); - - ApiController _apiController; - - public ApiTest() - { - _apiController = new ApiController(mockIApiService.Object); - } - - [Fact] - public async void GetList() - { - var p = new PageInput(); - var res = await _apiController.GetPage(p); - Assert.True(res.Success); - - //var data = res.; - //Assert.NotNull(data); - } - } -} diff --git a/Admin.Core.Tests/Controller/Admin/ApiControllerTest.cs b/Admin.Core.Tests/Controller/Admin/ApiControllerTest.cs new file mode 100644 index 000000000..6c33eacb3 --- /dev/null +++ b/Admin.Core.Tests/Controller/Admin/ApiControllerTest.cs @@ -0,0 +1,27 @@ +using Xunit; +using System.Net; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Admin.Core.Tests.Controller.Admin +{ + public class ApiControllerTest : BaseControllerTest + { + public ApiControllerTest() + { + } + + [Fact] + public async void GetList() + { + await Login(); + + var res = await Client.GetAsync("/api/admin/api/getlist"); + Assert.Equal(HttpStatusCode.OK, res.StatusCode); + + var content = await res.Content.ReadAsStringAsync(); + var jObject = JsonConvert.DeserializeObject(content); + Assert.Equal(1, jObject["code"]); + } + } +} diff --git a/Admin.Core.Tests/Controller/BaseControllerTest.cs b/Admin.Core.Tests/Controller/BaseControllerTest.cs new file mode 100644 index 000000000..10eb99419 --- /dev/null +++ b/Admin.Core.Tests/Controller/BaseControllerTest.cs @@ -0,0 +1,88 @@ + +using System.Net; +using System.Text; +using System.Linq; +using System.Net.Http; +using System.ComponentModel; +using System.Threading.Tasks; +using System.Net.Http.Headers; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Admin.Core.Service.Admin.Auth.Input; +using Admin.Core.Service.Admin.Auth; +using Admin.Core.Common.Cache; +using Admin.Core.Common.Output; +using Admin.Core.Service.Admin.Auth.Output; +using Admin.Core.Common.Configs; + +namespace Admin.Core.Tests.Controller +{ + public class BaseControllerTest : BaseTest + { + private readonly ICache _cache; + private readonly IAuthService _authService; + private readonly AppConfig _appConfig; + + protected BaseControllerTest() + { + _cache = GetService(); + _authService = GetService(); + _appConfig = GetService(); + } + + public ByteArrayContent GetHttpContent(object input) + { + var content = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(input)); + var httpContent = new ByteArrayContent(content); + httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json;charset=UTF-8"); + return httpContent; + } + + public async Task Login(AuthLoginInput input = null) + { + if(input == null && _appConfig.VarifyCode.Enabled) + { + var res = await _authService.GetVerifyCodeAsync("") as IResponseOutput; + var verifyCodeKey = string.Format(CacheKey.VerifyCodeKey, res.Data.Key); + var verifyCode = await _cache.GetAsync(verifyCodeKey); + input = new AuthLoginInput() + { + UserName = "xiaoxue", + Password = "111111", + VerifyCodeKey = res.Data.Key, + VerifyCode = verifyCode + }; + } + + //Client.DefaultRequestHeaders.Connection.Add("keep-alive"); + Client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"); + + var result = await Client.PostAsync($"/api/admin/auth/login", GetHttpContent(input)); + var content = await result.Content.ReadAsStringAsync(); + var jObject = JsonConvert.DeserializeObject(content); + + Client.DefaultRequestHeaders.Add("Authorization", $"Bearer {jObject["data"]["token"]}"); + } + + public string ToParams(object source) + { + var stringBuilder = new StringBuilder(string.Empty); + if (source == null) + { + return ""; + } + + var entries = from PropertyDescriptor property in TypeDescriptor.GetProperties(source) + let value = property.GetValue(source) + where value != null + select (property.Name, value); + + foreach (var (name, value) in entries) + { + stringBuilder.Append(WebUtility.UrlEncode(name) + "=" + WebUtility.UrlEncode(value + "") + "&"); + } + + return stringBuilder.ToString().Trim('&'); + } + } +} diff --git a/Admin.Core.Tests/Repository/Admin/RepositoryBaseTest.cs b/Admin.Core.Tests/Repository/Admin/RepositoryBaseTest.cs new file mode 100644 index 000000000..b9f738dd0 --- /dev/null +++ b/Admin.Core.Tests/Repository/Admin/RepositoryBaseTest.cs @@ -0,0 +1,24 @@ +using Xunit; +using Admin.Core.Repository; +using Admin.Core.Model.Admin; + +namespace Admin.Core.Tests.Service.Repository.Admin +{ + public class RepositoryBaseTest : BaseTest + { + private readonly IRepositoryBase _repositoryBase; + + public RepositoryBaseTest() + { + _repositoryBase = GetService>(); + } + + [Fact] + public async void GetAsyncByExpression() + { + var id = 1; + var user = await _repositoryBase.GetAsync(a => a.Id == id); + Assert.Equal(id, user?.Id); + } + } +} diff --git a/Admin.Core.Tests/Service/Admin/ApiServiceTest.cs b/Admin.Core.Tests/Service/Admin/ApiServiceTest.cs new file mode 100644 index 000000000..b914148b8 --- /dev/null +++ b/Admin.Core.Tests/Service/Admin/ApiServiceTest.cs @@ -0,0 +1,22 @@ +using Xunit; +using Admin.Core.Service.Admin.Api; + +namespace Admin.Core.Tests.Service.Admin +{ + public class ApiServiceTest : BaseTest + { + private readonly IApiService _apiService; + + public ApiServiceTest() + { + _apiService = GetService(); + } + + [Fact] + public async void GetAsync() + { + var res = await _apiService.GetAsync(1); + Assert.True(res.Success); + } + } +} diff --git a/Admin.Core/Admin.Core.Common.xml b/Admin.Core/Admin.Core.Common.xml index 8d45145ac..7421ccea8 100644 --- a/Admin.Core/Admin.Core.Common.xml +++ b/Admin.Core/Admin.Core.Common.xml @@ -375,6 +375,11 @@ 日志配置 + + + 限流 + + 验证码配置 @@ -405,6 +410,11 @@ 验证码配置 + + + 启用 + + 操作日志 @@ -420,6 +430,11 @@ 缓存类型 + + + 限流缓存类型 + + Redis配置 @@ -435,6 +450,11 @@ 连接字符串 + + + 限流连接字符串 + + 数据库配置 @@ -902,6 +922,9 @@ CookieContainer + + 获取字符流 + 地址 cookieContainer diff --git a/Admin.Core/Admin.Core.Model.xml b/Admin.Core/Admin.Core.Model.xml index 33732cb32..24b7e7cad 100644 --- a/Admin.Core/Admin.Core.Model.xml +++ b/Admin.Core/Admin.Core.Model.xml @@ -274,6 +274,11 @@ 权限名称 + + + 权限编码 + + 权限类型 diff --git a/Admin.Core/Admin.Core.Service.xml b/Admin.Core/Admin.Core.Service.xml index 627c9ef9f..a33ec93a9 100644 --- a/Admin.Core/Admin.Core.Service.xml +++ b/Admin.Core/Admin.Core.Service.xml @@ -232,6 +232,16 @@ 验证码键 + + + 缓存键 + + + + + 图片 + + 主键Id @@ -835,6 +845,11 @@ 权限名称 + + + 权限编码 + + 说明 diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index 99aef5994..7f4e194f0 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -40,8 +40,10 @@ + + @@ -49,7 +51,7 @@ - + diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index 3e9c80ca2..b778bedcb 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -746,6 +746,14 @@ 系统内部错误(非业务代码里显式抛出的异常,例如由于数据不正确导致空指针异常、数据库异常等等) + + + 添加Ip限流 + + + + + Admin异常错误过滤 diff --git a/Admin.Core/Db/Data/data.json b/Admin.Core/Db/Data/data.json index f613340ea..d62850db1 100644 --- a/Admin.Core/Db/Data/data.json +++ b/Admin.Core/Db/Data/data.json @@ -1 +1 @@ -{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""},{"id":90,"parentId":78,"label":"上传文档图片","path":"/api/admin/document/uploadimage","httpMethods":"post","description":""},{"id":91,"parentId":78,"label":"查询文档图片列表","path":"/api/admin/document/getimagelist","httpMethods":"get","description":""},{"id":92,"parentId":78,"label":"删除图片","path":"/api/admin/document/deleteimage","httpMethods":"delete","description":""},{"id":93,"parentId":7,"label":"上传头像","path":"/api/admin/user/avatarupload","httpMethods":"post","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","type":3,"apiId":89,"sort":11,"description":""},{"id":93,"parentId":75,"label":"上传文档图片","type":3,"apiId":90,"sort":0,"description":""},{"id":94,"parentId":75,"label":"查询文档图片列表","type":3,"apiId":91,"sort":0,"description":""},{"id":95,"parentId":75,"label":"删除图片","type":3,"apiId":92,"sort":0,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","nickName":"小雪转中雪","avatar":"2/14753102362214400.gif","remark":""},{"id":3,"userName":"jack","password":"96E79218965EB72C92A549DD5A33112","nickName":"杰克"}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""},{"id":3,"name":"文档管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":3,"userId":2,"roleId":2},{"id":6,"userId":3,"roleId":3}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":168,"roleId":1,"permissionId":94},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92},{"id":167,"roleId":2,"permissionId":93},{"id":169,"roleId":2,"permissionId":94},{"id":170,"roleId":2,"permissionId":95},{"id":173,"roleId":3,"permissionId":4},{"id":174,"roleId":3,"permissionId":47},{"id":189,"roleId":3,"permissionId":48},{"id":190,"roleId":3,"permissionId":49},{"id":191,"roleId":3,"permissionId":50},{"id":171,"roleId":3,"permissionId":66},{"id":172,"roleId":3,"permissionId":75},{"id":179,"roleId":3,"permissionId":76},{"id":182,"roleId":3,"permissionId":77},{"id":183,"roleId":3,"permissionId":78},{"id":184,"roleId":3,"permissionId":79},{"id":185,"roleId":3,"permissionId":80},{"id":186,"roleId":3,"permissionId":81},{"id":180,"roleId":3,"permissionId":82},{"id":181,"roleId":3,"permissionId":83},{"id":178,"roleId":3,"permissionId":90},{"id":187,"roleId":3,"permissionId":91},{"id":188,"roleId":3,"permissionId":92},{"id":176,"roleId":3,"permissionId":93},{"id":177,"roleId":3,"permissionId":94},{"id":175,"roleId":3,"permissionId":95}]} \ No newline at end of file +{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""},{"id":90,"parentId":78,"label":"上传文档图片","path":"/api/admin/document/uploadimage","httpMethods":"post","description":""},{"id":91,"parentId":78,"label":"查询文档图片列表","path":"/api/admin/document/getimagelist","httpMethods":"get","description":""},{"id":92,"parentId":78,"label":"删除图片","path":"/api/admin/document/deleteimage","httpMethods":"delete","description":""},{"id":93,"parentId":7,"label":"上传头像","path":"/api/admin/user/avatarupload","httpMethods":"post","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","code":"api:admin:role:getpage","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","code":"api:admin:role:add","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","code":"api:admin:role:update","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","code":"api:admin:role:softdelete","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","code":"api:admin:role:batchsoftdelete","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","code":"api:admin:role:get","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","code":"api:admin:user:getpage","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","code":"api:admin:user:add","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","code":"api:admin:user:update","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","code":"api:admin:user:softdelete","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","code":"api:admin:user:batchsoftdelete","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","code":"api:admin:user:get","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","code":"api:admin:api:getlist","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","code":"api:admin:api:add","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","code":"api:admin:api:update","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","code":"api:admin:api:softdelete","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","code":"api:admin:api:batchsoftdelete","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","code":"api:admin:api:sync","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","code":"api:admin:api:get","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","code":"api:admin:permission:getlist","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","code":"api:admin:permission:addgroup","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","code":"api:admin:permission:addmenu","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","code":"api:admin:permission:addapi","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","code":"api:admin:permission:updategroup","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","code":"api:admin:permission:updatemenu","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","code":"api:admin:permission:updateapi","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","code":"api:admin:permission:softdelete","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","code":"api:admin:permission:getgroup","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","code":"api:admin:permission:getmenu","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","code":"api:admin:permission:getapi","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","code":"api:admin:role:getpage","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","code":"api:admin:permission:getpermissionlist","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","code":"api:admin:permission:getrolepermissionlist","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","code":"api:admin:permission:assign","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","code":"api:admin:user:getbasic","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","code":"api:admin:user:updatebasic","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","code":"api:admin:user:changepassword","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","code":"api:admin:dictionary:getpage","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","code":"api:admin:dictionary:add","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","code":"api:admin:dictionary:update","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","code":"api:admin:dictionary:softdelete","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","code":"api:admin:dictionary:get","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","code":"api:admin:view:getlist","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","code":"api:admin:view:add","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","code":"api:admin:view:update","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","code":"api:admin:view:softdelete","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","code":"api:admin:view:batchsoftdelete","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","code":"api:admin:view:sync","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","code":"api:admin:view:get","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","code":"api:admin:cache:list","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","code":"api:admin:cache:clear","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","code":"api:admin:oprationlog:getpage","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","code":"api:admin:loginlog:getpage","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","code":"api:admin:document:getplainlist","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","code":"api:admin:document:addgroup","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","code":"api:admin:document:addmenu","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","code":"api:admin:document:updategroup","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","code":"api:admin:document:updatemenu","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","code":"api:admin:document:softdelete","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","code":"api:admin:document:getgroup","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","code":"api:admin:document:getmenu","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","code":"api:admin:document:getlist","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","code":"api:admin:document:getcontent","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","code":"api:admin:document:updatecontent","type":3,"apiId":89,"sort":11,"description":""},{"id":93,"parentId":75,"label":"上传文档图片","code":"api:admin:document:uploadimage","type":3,"apiId":90,"sort":0,"description":""},{"id":94,"parentId":75,"label":"查询文档图片列表","code":"api:admin:document:getimagelist","type":3,"apiId":91,"sort":0,"description":""},{"id":95,"parentId":75,"label":"删除图片","code":"api:admin:document:deleteimage","type":3,"apiId":92,"sort":0,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","nickName":"小雪转中雪","avatar":"2/14753102362214400.gif","remark":""},{"id":3,"userName":"jack","password":"96E79218965EB72C92A549DD5A33112","nickName":"杰克"}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""},{"id":3,"name":"文档管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":3,"userId":2,"roleId":2},{"id":6,"userId":3,"roleId":3}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":168,"roleId":1,"permissionId":94},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92},{"id":167,"roleId":2,"permissionId":93},{"id":169,"roleId":2,"permissionId":94},{"id":170,"roleId":2,"permissionId":95},{"id":173,"roleId":3,"permissionId":4},{"id":174,"roleId":3,"permissionId":47},{"id":189,"roleId":3,"permissionId":48},{"id":190,"roleId":3,"permissionId":49},{"id":191,"roleId":3,"permissionId":50},{"id":171,"roleId":3,"permissionId":66},{"id":172,"roleId":3,"permissionId":75},{"id":179,"roleId":3,"permissionId":76},{"id":182,"roleId":3,"permissionId":77},{"id":183,"roleId":3,"permissionId":78},{"id":184,"roleId":3,"permissionId":79},{"id":185,"roleId":3,"permissionId":80},{"id":186,"roleId":3,"permissionId":81},{"id":180,"roleId":3,"permissionId":82},{"id":181,"roleId":3,"permissionId":83},{"id":178,"roleId":3,"permissionId":90},{"id":187,"roleId":3,"permissionId":91},{"id":188,"roleId":3,"permissionId":92},{"id":176,"roleId":3,"permissionId":93},{"id":177,"roleId":3,"permissionId":94},{"id":175,"roleId":3,"permissionId":95}]} \ No newline at end of file diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index 855ee4554..0224786bc 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -284,6 +284,7 @@ public static async Task GenerateSimpleJsonData(IFreeSql db) a.Id, a.ParentId, a.Label, + a.Code, a.Type, a.ViewId, a.ApiId, diff --git a/Admin.Core/Extensions/RateLimitServiceCollectionExtensions.cs b/Admin.Core/Extensions/RateLimitServiceCollectionExtensions.cs new file mode 100644 index 000000000..e9ecaf9fa --- /dev/null +++ b/Admin.Core/Extensions/RateLimitServiceCollectionExtensions.cs @@ -0,0 +1,43 @@ +using AspNetCoreRateLimit; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.Caching.Redis; +using Admin.Core.Common.Configs; + +namespace Admin.Core.Extensions +{ + public static class RateLimitServiceCollectionExtensions + { + /// + /// 添加Ip限流 + /// + /// + /// + /// + public static void AddIpRateLimit(this IServiceCollection services, IConfiguration configuration, CacheConfig cacheConfig) + { + #region IP限流 + services.Configure(configuration.GetSection("IpRateLimiting")); + services.Configure(configuration.GetSection("IpRateLimitPolicies")); + + if (cacheConfig.TypeRateLimit == Common.Cache.CacheType.Redis) + { + //redis + var redisRateLimit = new CSRedis.CSRedisClient(cacheConfig.Redis.ConnectionStringRateLimit); + services.AddSingleton(new CSRedisCache(redisRateLimit)); + services.AddSingleton(); + services.AddSingleton(); + } + else + { + //内存 + services.AddMemoryCache(); + services.AddSingleton(); + services.AddSingleton(); + } + services.AddSingleton(); + #endregion + } + } +} diff --git a/Admin.Core/Program.cs b/Admin.Core/Program.cs index 494159b73..1fac5cee6 100644 --- a/Admin.Core/Program.cs +++ b/Admin.Core/Program.cs @@ -2,11 +2,12 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -using Autofac.Extensions.DependencyInjection; using NLog.Web; +using Autofac.Extensions.DependencyInjection; using Admin.Core.Common.Helpers; -using LogLevel = Microsoft.Extensions.Logging.LogLevel; using Admin.Core.Common.Configs; +using LogLevel = Microsoft.Extensions.Logging.LogLevel; +using Microsoft.Extensions.Configuration; //using NLog; //using NLog.Extensions.Logging; //using EnvironmentName = Microsoft.AspNetCore.Hosting.EnvironmentName; @@ -36,6 +37,17 @@ public static IHostBuilder CreateHostBuilder(string[] args) webBuilder //.UseEnvironment(EnvironmentName.Production) .UseStartup() + .ConfigureAppConfiguration((host, config) => + { + if (appConfig.RateLimit) + { + config.AddJsonFile("./configs/ratelimitconfig.json", optional: true, reloadOnChange: true) +#if DEBUG + .AddJsonFile("./configs/ratelimitconfig.Development.json", false) +#endif + ; + } + }) .UseUrls(appConfig.Urls); }) .ConfigureLogging(logging => diff --git a/Admin.Core/Startup.cs b/Admin.Core/Startup.cs index 4a9a13172..d3bf099ce 100644 --- a/Admin.Core/Startup.cs +++ b/Admin.Core/Startup.cs @@ -12,6 +12,7 @@ using Microsoft.OpenApi.Models; using Microsoft.IdentityModel.Tokens; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Newtonsoft.Json; @@ -33,19 +34,21 @@ using Admin.Core.Extensions; using Admin.Core.Common.Attributes; using Admin.Core.Common.Auth; - +using AspNetCoreRateLimit; namespace Admin.Core { public class Startup { private static string basePath => AppContext.BaseDirectory; + private readonly IConfiguration _configuration; private readonly IHostEnvironment _env; private readonly ConfigHelper _configHelper; private readonly AppConfig _appConfig; - public Startup(IWebHostEnvironment env) + public Startup(IConfiguration configuration, IWebHostEnvironment env) { + _configuration = configuration; _env = env; _configHelper = new ConfigHelper(); _appConfig = _configHelper.Get("appconfig", env.EnvironmentName) ?? new AppConfig(); @@ -228,6 +231,12 @@ public void ConfigureServices(IServiceCollection services) } #endregion + //IP限流 + if (_appConfig.RateLimit) + { + services.AddIpRateLimit(_configuration, cacheConfig); + } + //阻止NLog接收状态消息 services.Configure(opts => opts.SuppressStatusMessages = true); } @@ -292,6 +301,12 @@ public void Configure(IApplicationBuilder app) // Console.WriteLine($"{_appConfig.Urls}\r\n"); //}); + //IP限流 + if (_appConfig.RateLimit) + { + app.UseIpRateLimiting(); + } + #region app配置 //异常 app.UseExceptionHandler("/Error"); diff --git a/Admin.Core/configs/appconfig.json b/Admin.Core/configs/appconfig.json index 7fc4dddea..a5bbb077d 100644 --- a/Admin.Core/configs/appconfig.json +++ b/Admin.Core/configs/appconfig.json @@ -13,8 +13,11 @@ //操作日志 "operation": true }, + //限流 + "rateLimit": true, //验证码 "varifyCode": { + "enabled": true, // 字体 "font": [ "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" ] } diff --git a/Admin.Core/configs/cacheconfig.json b/Admin.Core/configs/cacheconfig.json index 744b3c1e1..ff9675a7b 100644 --- a/Admin.Core/configs/cacheconfig.json +++ b/Admin.Core/configs/cacheconfig.json @@ -1,8 +1,13 @@ { //缓存类型 Memory = 0,Redis = 1 "type": 0, + //限流缓存类型 Memory = 0,Redis = 1 + "typeRateLimit": 0, //Redis配置 "redis": { - "connectionString": "127.0.0.1:6379,password=,defaultDatabase=2" + //连接字符串 + "connectionString": "127.0.0.1:6379,password=,defaultDatabase=2", + //限流连接字符串 + "connectionStringRateLimit": "127.0.0.1:6379,password=,defaultDatabase=0" } } diff --git a/Admin.Core/configs/ratelimitconfig.Development.json b/Admin.Core/configs/ratelimitconfig.Development.json new file mode 100644 index 000000000..0db3279e4 --- /dev/null +++ b/Admin.Core/configs/ratelimitconfig.Development.json @@ -0,0 +1,3 @@ +{ + +} diff --git a/Admin.Core/configs/ratelimitconfig.json b/Admin.Core/configs/ratelimitconfig.json new file mode 100644 index 000000000..8b1b4dec6 --- /dev/null +++ b/Admin.Core/configs/ratelimitconfig.json @@ -0,0 +1,33 @@ +{ + /* + https://github.com/stefanprodan/AspNetCoreRateLimit/wiki/IpRateLimitMiddleware + https://github.com/stefanprodan/AspNetCoreRateLimit/wiki/Using-Redis-as-a-distributed-counter-store + */ + "IpRateLimiting": { + "EnableEndpointRateLimiting": true, + "StackBlockedRequests": false, + "RealIpHeader": "X-Real-IP", + "ClientIdHeader": "X-ClientId", + "IpWhitelist": [], // "127.0.0.1" + "EndpointWhitelist": [], // "get:/api/a", "*:/api/b" + "ClientWhitelist": [], + "HttpStatusCode": 429, + "QuotaExceededResponse": { + "Content": "{{\"code\":429,\"msg\":\"访问过于频繁!\"}}", + "ContentType": "application/json", + "StatusCode": 429 + }, + "GeneralRules": [ + { + "Endpoint": "*", + "Period": "1s", + "Limit": 2 + }, + { + "Endpoint": "*", + "Period": "10m", + "Limit": 100 + } + ] + } +} From a92ff994c63b432b6098abb0f40da88764c08e2e Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Thu, 28 May 2020 23:53:09 +0800 Subject: [PATCH 43/53] =?UTF-8?q?=E6=9B=B4=E6=96=B01.3.1=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20=E6=8E=A5=E5=8F=A3=E3=80=81=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=92=8C=E4=BB=93=E5=82=A8=E6=B5=8B=E8=AF=95=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20Ip=E9=99=90=E6=B5=81=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=86=85=E5=AD=98=E5=92=8CRedis=E7=BC=93=E5=AD=98=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20=E6=9D=83=E9=99=90=E7=AE=A1=E7=90=86=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=9D=83=E9=99=90=E7=BC=96=E7=A0=81=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=EF=BC=8C=E6=8E=A5=E5=8F=A3=E8=A1=A8=E5=8D=95=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=9D=83=E9=99=90=E7=BC=96=E7=A0=81=E4=BF=9D=E5=AD=98=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E6=9D=83=E9=99=90=E6=8C=87=E4=BB=A4v-perm?= =?UTF-8?q?ission=3D"'=E6=9D=83=E9=99=90=E7=BC=96=E7=A0=81'"=20=E6=88=96?= =?UTF-8?q?=20v-permission=3D"{=20permission:=20'=E6=9D=83=E9=99=90?= =?UTF-8?q?=E7=BC=96=E7=A0=81',=20disabled:true=20}"=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=20=E6=9D=83=E9=99=90=E6=A3=80=E6=9F=A5=E6=96=B9=E6=B3=95v-if?= =?UTF-8?q?=3D"checkPermission('=E6=9D=83=E9=99=90=E7=BC=96=E7=A0=81')"=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E9=AB=98=E7=BA=A7=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E7=82=B9=E5=87=BB=E5=85=B3=E9=97=AD=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E6=8C=89=E9=92=AE=EF=BC=8C=E6=97=A0=E6=B3=95=E5=86=8D?= =?UTF-8?q?=E6=89=93=E5=BC=80=E9=AB=98=E7=BA=A7=E6=9F=A5=E8=AF=A2=E7=AA=97?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 2 +- Admin.Core.Model/Admin.Core.Model.csproj | 2 +- Admin.Core.Repository/Admin.Core.Repository.csproj | 2 +- Admin.Core.Services/Admin.Core.Service.csproj | 2 +- Admin.Core/Admin.Core.csproj | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index e12f6cc27..8aa327d7a 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.0 + 1.3.1 xiaoxue xiaoxue 中台Admin后端通用库 diff --git a/Admin.Core.Model/Admin.Core.Model.csproj b/Admin.Core.Model/Admin.Core.Model.csproj index 66a6582ac..6c72c3aa8 100644 --- a/Admin.Core.Model/Admin.Core.Model.csproj +++ b/Admin.Core.Model/Admin.Core.Model.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.0 + 1.3.1 xiaoxue xiaoxue 中台Admin后端实体库 diff --git a/Admin.Core.Repository/Admin.Core.Repository.csproj b/Admin.Core.Repository/Admin.Core.Repository.csproj index 89fd939fb..6760a9c9f 100644 --- a/Admin.Core.Repository/Admin.Core.Repository.csproj +++ b/Admin.Core.Repository/Admin.Core.Repository.csproj @@ -2,7 +2,7 @@ netcoreapp3.1 - 1.3.0 + 1.3.1 xiaoxue xiaoxue 中台Admin后端仓储库 diff --git a/Admin.Core.Services/Admin.Core.Service.csproj b/Admin.Core.Services/Admin.Core.Service.csproj index 75a18fa22..0927bcfd9 100644 --- a/Admin.Core.Services/Admin.Core.Service.csproj +++ b/Admin.Core.Services/Admin.Core.Service.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.0 + 1.3.1 xiaoxue xiaoxue 中台Admin后端服务库 diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index 7f4e194f0..a61def6cc 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -5,7 +5,7 @@ OutOfProcess false - 1.3.0 + 1.3.1 MIT xiaoxue xiaoxue From 818731063b0d55daa4e5caeb8315bdc9cdc7a39d Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Sun, 31 May 2020 23:12:23 +0800 Subject: [PATCH 44/53] =?UTF-8?q?=E6=9B=B4=E6=96=B01.3.2=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20=E6=9F=A5=E8=AF=A2=E7=BB=84=E4=BB=B6my-search=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=9F=A5=E8=AF=A2=E7=BB=84=E4=BB=B6=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=20=E6=96=B0=E5=A2=9E=20=E9=AB=98=E7=BA=A7=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=97=A5=E6=9C=9F=E6=95=B0=E6=8D=AE=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=B6=E9=97=B4=E6=AE=B5=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20=E5=85=A8=E5=B1=80=E6=B7=B7=E5=85=A5mixin=EF=BC=8C?= =?UTF-8?q?=E6=B7=B7=E5=85=A5=E6=9D=83=E9=99=90=E6=A3=80=E6=9F=A5=E6=96=B9?= =?UTF-8?q?=E6=B3=95=20=E6=96=B0=E5=A2=9E=20=E7=95=8C=E9=9D=A2=E6=89=80?= =?UTF-8?q?=E6=9C=89=E6=93=8D=E4=BD=9C=E5=8F=97=E6=9D=83=E9=99=90=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=20=E6=96=B0=E5=A2=9E=20=E6=9D=83=E9=99=90=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=9D=83=E9=99=90=E7=82=B9=EF=BC=8C=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E7=B2=92=E5=BA=A6=E6=8E=A7=E5=88=B6=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20=E9=AB=98=E7=BA=A7=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=AD=97=E6=AE=B5=E5=92=8C=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E7=AC=A6=E9=BB=98=E8=AE=A4=E5=80=BC=EF=BC=8C=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=AE=B5=E6=9F=A5=E8=AF=A2=E5=A4=84=E7=90=86?= =?UTF-8?q?=20=E4=BF=AE=E5=A4=8D=20=E9=83=A8=E5=88=86=E7=8E=AF=E5=A2=83npm?= =?UTF-8?q?=20run=20serve=E6=8F=90=E7=A4=BA=E5=AE=89=E8=A3=85=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 2 +- Admin.Core.Model/Admin.Core.Model.csproj | 2 +- Admin.Core.Model/Admin/PermissionType.cs | 6 ++- .../Admin.Core.Repository.csproj | 2 +- Admin.Core.Services/Admin.Core.Service.csproj | 2 +- Admin.Core.Services/Admin/Auth/AuthService.cs | 6 ++- .../Admin/Permission/IPermissionService.cs | 6 +++ .../Permission/Input/PermissionAddDotInput.cs | 37 +++++++++++++++++ .../Input/PermissionUpdateDotInput.cs | 15 +++++++ .../Output/PermissionGetDotOutput.cs | 9 +++++ .../Admin/Permission/PermissionService.cs | 27 +++++++++++++ .../Admin/Permission/_MapConfig.cs | 2 + Admin.Core.Services/Admin/User/UserService.cs | 3 -- Admin.Core/Admin.Core.Model.xml | 5 +++ Admin.Core/Admin.Core.Service.xml | 40 +++++++++++++++++++ Admin.Core/Admin.Core.csproj | 2 +- Admin.Core/Admin.Core.xml | 21 ++++++++++ .../Controllers/Admin/PermissionController.cs | 33 +++++++++++++++ Admin.Core/Db/Data/data.json | 2 +- Admin.Core/configs/appconfig.json | 1 + 20 files changed, 211 insertions(+), 12 deletions(-) create mode 100644 Admin.Core.Services/Admin/Permission/Input/PermissionAddDotInput.cs create mode 100644 Admin.Core.Services/Admin/Permission/Input/PermissionUpdateDotInput.cs create mode 100644 Admin.Core.Services/Admin/Permission/Output/PermissionGetDotOutput.cs diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 8aa327d7a..1f92b83ae 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.1 + 1.3.2 xiaoxue xiaoxue 中台Admin后端通用库 diff --git a/Admin.Core.Model/Admin.Core.Model.csproj b/Admin.Core.Model/Admin.Core.Model.csproj index 6c72c3aa8..cfb03ff65 100644 --- a/Admin.Core.Model/Admin.Core.Model.csproj +++ b/Admin.Core.Model/Admin.Core.Model.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.1 + 1.3.2 xiaoxue xiaoxue 中台Admin后端实体库 diff --git a/Admin.Core.Model/Admin/PermissionType.cs b/Admin.Core.Model/Admin/PermissionType.cs index 29dc077e2..9eff5a429 100644 --- a/Admin.Core.Model/Admin/PermissionType.cs +++ b/Admin.Core.Model/Admin/PermissionType.cs @@ -17,6 +17,10 @@ public enum PermissionType /// /// 接口 /// - Api = 3 + Api = 3, + /// + /// 权限点 + /// + Dot = 4 } } diff --git a/Admin.Core.Repository/Admin.Core.Repository.csproj b/Admin.Core.Repository/Admin.Core.Repository.csproj index 6760a9c9f..4a2558f2e 100644 --- a/Admin.Core.Repository/Admin.Core.Repository.csproj +++ b/Admin.Core.Repository/Admin.Core.Repository.csproj @@ -2,7 +2,7 @@ netcoreapp3.1 - 1.3.1 + 1.3.2 xiaoxue xiaoxue 中台Admin后端仓储库 diff --git a/Admin.Core.Services/Admin.Core.Service.csproj b/Admin.Core.Services/Admin.Core.Service.csproj index 0927bcfd9..bced56faf 100644 --- a/Admin.Core.Services/Admin.Core.Service.csproj +++ b/Admin.Core.Services/Admin.Core.Service.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.1 + 1.3.2 xiaoxue xiaoxue 中台Admin后端服务库 diff --git a/Admin.Core.Services/Admin/Auth/AuthService.cs b/Admin.Core.Services/Admin/Auth/AuthService.cs index fded6b4e8..313888038 100644 --- a/Admin.Core.Services/Admin/Auth/AuthService.cs +++ b/Admin.Core.Services/Admin/Auth/AuthService.cs @@ -116,6 +116,7 @@ public async Task GetUserInfoAsync() return ResponseOutput.NotOk("未登录!"); } + //用户信息 var user = await _userRepository.Select.WhereDynamic(_user.Id) .ToOneAsync(m => new { m.NickName, @@ -123,7 +124,7 @@ public async Task GetUserInfoAsync() m.Avatar }); - //获取菜单 + //用户菜单 var menus = await _permissionRepository.Select .Where(a => new[] { PermissionType.Group, PermissionType.Menu }.Contains(a.Type)) .Where(a => @@ -150,8 +151,9 @@ public async Task GetUserInfoAsync() a.External }); + //用户权限点 var permissions = await _permissionRepository.Select - .Where(a => a.Type == PermissionType.Api) + .Where(a => new[] { PermissionType.Api, PermissionType.Dot }.Contains(a.Type)) .Where(a => _permissionRepository.Orm.Select() .InnerJoin((b, c) => b.RoleId == c.RoleId && c.UserId == _user.Id) diff --git a/Admin.Core.Services/Admin/Permission/IPermissionService.cs b/Admin.Core.Services/Admin/Permission/IPermissionService.cs index d6028a7ad..d23ce5226 100644 --- a/Admin.Core.Services/Admin/Permission/IPermissionService.cs +++ b/Admin.Core.Services/Admin/Permission/IPermissionService.cs @@ -16,6 +16,8 @@ public partial interface IPermissionService Task GetApiAsync(long id); + Task GetDotAsync(long id); + Task GetPermissionList(); Task GetRolePermissionList(long roleId = 0); @@ -28,12 +30,16 @@ public partial interface IPermissionService Task AddApiAsync(PermissionAddApiInput input); + Task AddDotAsync(PermissionAddDotInput input); + Task UpdateGroupAsync(PermissionUpdateGroupInput input); Task UpdateMenuAsync(PermissionUpdateMenuInput input); Task UpdateApiAsync(PermissionUpdateApiInput input); + Task UpdateDotAsync(PermissionUpdateDotInput input); + Task DeleteAsync(long id); Task SoftDeleteAsync(long id); diff --git a/Admin.Core.Services/Admin/Permission/Input/PermissionAddDotInput.cs b/Admin.Core.Services/Admin/Permission/Input/PermissionAddDotInput.cs new file mode 100644 index 000000000..360b2f46d --- /dev/null +++ b/Admin.Core.Services/Admin/Permission/Input/PermissionAddDotInput.cs @@ -0,0 +1,37 @@ +using Admin.Core.Model.Admin; + +namespace Admin.Core.Service.Admin.Permission.Input +{ + public class PermissionAddDotInput + { + /// + /// Ȩ + /// + public PermissionType Type { get; set; } = PermissionType.Dot; + + /// + /// ڵ + /// + public int ParentId { get; set; } + + /// + /// Ȩ + /// + public string Label { get; set; } + + /// + /// Ȩޱ + /// + public string Code { get; set; } + + /// + /// ˵ + /// + public string Description { get; set; } + + /// + /// ͼ + /// + public string Icon { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateDotInput.cs b/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateDotInput.cs new file mode 100644 index 000000000..d0fe87c1b --- /dev/null +++ b/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateDotInput.cs @@ -0,0 +1,15 @@ +namespace Admin.Core.Service.Admin.Permission.Input +{ + public class PermissionUpdateDotInput : PermissionAddDotInput + { + /// + /// ȨId + /// + public long Id { get; set; } + + /// + /// 汾 + /// + public long Version { get; set; } + } +} diff --git a/Admin.Core.Services/Admin/Permission/Output/PermissionGetDotOutput.cs b/Admin.Core.Services/Admin/Permission/Output/PermissionGetDotOutput.cs new file mode 100644 index 000000000..5b576a28e --- /dev/null +++ b/Admin.Core.Services/Admin/Permission/Output/PermissionGetDotOutput.cs @@ -0,0 +1,9 @@ +using Admin.Core.Service.Admin.Permission.Input; + +namespace Admin.Core.Service.Admin.Permission.Output +{ + public class PermissionGetDotOutput : PermissionUpdateDotInput + { + + } +} diff --git a/Admin.Core.Services/Admin/Permission/PermissionService.cs b/Admin.Core.Services/Admin/Permission/PermissionService.cs index e07754407..57122e44d 100644 --- a/Admin.Core.Services/Admin/Permission/PermissionService.cs +++ b/Admin.Core.Services/Admin/Permission/PermissionService.cs @@ -59,6 +59,12 @@ public async Task GetApiAsync(long id) return ResponseOutput.Ok(result); } + public async Task GetDotAsync(long id) + { + var result = await _permissionRepository.GetAsync(id); + return ResponseOutput.Ok(result); + } + public async Task ListAsync(string key, DateTime? start, DateTime? end) { if (end.HasValue) @@ -100,6 +106,14 @@ public async Task AddApiAsync(PermissionAddApiInput input) return ResponseOutput.Ok(id > 0); } + public async Task AddDotAsync(PermissionAddDotInput input) + { + var entity = _mapper.Map(input); + var id = (await _permissionRepository.InsertAsync(entity)).Id; + + return ResponseOutput.Ok(id > 0); + } + public async Task UpdateGroupAsync(PermissionUpdateGroupInput input) { var result = false; @@ -139,6 +153,19 @@ public async Task UpdateApiAsync(PermissionUpdateApiInput input return ResponseOutput.Result(result); } + public async Task UpdateDotAsync(PermissionUpdateDotInput input) + { + var result = false; + if (input != null && input.Id > 0) + { + var entity = await _permissionRepository.GetAsync(input.Id); + entity = _mapper.Map(input, entity); + result = (await _permissionRepository.UpdateAsync(entity)) > 0; + } + + return ResponseOutput.Result(result); + } + public async Task DeleteAsync(long id) { var result = false; diff --git a/Admin.Core.Services/Admin/Permission/_MapConfig.cs b/Admin.Core.Services/Admin/Permission/_MapConfig.cs index 39d090e19..fbc8a73b0 100644 --- a/Admin.Core.Services/Admin/Permission/_MapConfig.cs +++ b/Admin.Core.Services/Admin/Permission/_MapConfig.cs @@ -14,10 +14,12 @@ public MapConfig() CreateMap(); CreateMap(); CreateMap(); + CreateMap(); CreateMap(); CreateMap(); CreateMap(); + CreateMap(); } } } diff --git a/Admin.Core.Services/Admin/User/UserService.cs b/Admin.Core.Services/Admin/User/UserService.cs index f0480b9b4..e2a8c01db 100644 --- a/Admin.Core.Services/Admin/User/UserService.cs +++ b/Admin.Core.Services/Admin/User/UserService.cs @@ -92,10 +92,7 @@ public async Task> GetPermissionsAsync() public async Task PageAsync(PageInput input) { - var key = input.Filter?.UserName; - var list = await _userRepository.Select - .WhereIf(key.NotNull(), a => a.Status >= 0 && (a.UserName.Contains(key) || a.NickName.Contains(key))) .WhereDynamicFilter(input.DynamicFilter) .Count(out var total) .OrderByDescending(true, a => a.Id) diff --git a/Admin.Core/Admin.Core.Model.xml b/Admin.Core/Admin.Core.Model.xml index 24b7e7cad..70d2ca897 100644 --- a/Admin.Core/Admin.Core.Model.xml +++ b/Admin.Core/Admin.Core.Model.xml @@ -364,6 +364,11 @@ 接口 + + + 权限点 + + 角色 diff --git a/Admin.Core/Admin.Core.Service.xml b/Admin.Core/Admin.Core.Service.xml index a33ec93a9..cdf05d87b 100644 --- a/Admin.Core/Admin.Core.Service.xml +++ b/Admin.Core/Admin.Core.Service.xml @@ -865,6 +865,36 @@ 图标 + + + 权限类型 + + + + + 父级节点 + + + + + 权限名称 + + + + + 权限编码 + + + + + 说明 + + + + + 图标 + + 权限类型 @@ -960,6 +990,16 @@ 版本 + + + 权限Id + + + + + 版本 + + 权限Id diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index a61def6cc..b15cc654e 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -5,7 +5,7 @@ OutOfProcess false - 1.3.1 + 1.3.2 MIT xiaoxue xiaoxue diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index b778bedcb..8b5bf7cc0 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -382,6 +382,13 @@ + + + 查询单条权限点 + + + + 查询角色权限-权限列表 @@ -416,6 +423,13 @@ + + + 新增权限点 + + + + 修改分组 @@ -437,6 +451,13 @@ + + + 修改权限点 + + + + 删除权限 diff --git a/Admin.Core/Controllers/Admin/PermissionController.cs b/Admin.Core/Controllers/Admin/PermissionController.cs index 4227bb6e7..1ff354963 100644 --- a/Admin.Core/Controllers/Admin/PermissionController.cs +++ b/Admin.Core/Controllers/Admin/PermissionController.cs @@ -65,6 +65,17 @@ public async Task GetApi(long id) return await _permissionServices.GetApiAsync(id); } + /// + /// 查询单条权限点 + /// + /// + /// + [HttpGet] + public async Task GetDot(long id) + { + return await _permissionServices.GetDotAsync(id); + } + /// /// 查询角色权限-权限列表 /// @@ -119,6 +130,17 @@ public async Task AddApi(PermissionAddApiInput input) return await _permissionServices.AddApiAsync(input); } + /// + /// 新增权限点 + /// + /// + /// + [HttpPost] + public async Task AddDot(PermissionAddDotInput input) + { + return await _permissionServices.AddDotAsync(input); + } + /// /// 修改分组 /// @@ -152,6 +174,17 @@ public async Task UpdateApi(PermissionUpdateApiInput input) return await _permissionServices.UpdateApiAsync(input); } + /// + /// 修改权限点 + /// + /// + /// + [HttpPut] + public async Task UpdateDot(PermissionUpdateDotInput input) + { + return await _permissionServices.UpdateDotAsync(input); + } + /// /// 删除权限 /// diff --git a/Admin.Core/Db/Data/data.json b/Admin.Core/Db/Data/data.json index d62850db1..6825f3da9 100644 --- a/Admin.Core/Db/Data/data.json +++ b/Admin.Core/Db/Data/data.json @@ -1 +1 @@ -{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""},{"id":90,"parentId":78,"label":"上传文档图片","path":"/api/admin/document/uploadimage","httpMethods":"post","description":""},{"id":91,"parentId":78,"label":"查询文档图片列表","path":"/api/admin/document/getimagelist","httpMethods":"get","description":""},{"id":92,"parentId":78,"label":"删除图片","path":"/api/admin/document/deleteimage","httpMethods":"delete","description":""},{"id":93,"parentId":7,"label":"上传头像","path":"/api/admin/user/avatarupload","httpMethods":"post","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","code":"api:admin:role:getpage","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","code":"api:admin:role:add","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","code":"api:admin:role:update","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","code":"api:admin:role:softdelete","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","code":"api:admin:role:batchsoftdelete","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","code":"api:admin:role:get","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","code":"api:admin:user:getpage","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","code":"api:admin:user:add","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","code":"api:admin:user:update","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","code":"api:admin:user:softdelete","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","code":"api:admin:user:batchsoftdelete","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","code":"api:admin:user:get","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","code":"api:admin:api:getlist","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","code":"api:admin:api:add","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","code":"api:admin:api:update","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","code":"api:admin:api:softdelete","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","code":"api:admin:api:batchsoftdelete","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","code":"api:admin:api:sync","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","code":"api:admin:api:get","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","code":"api:admin:permission:getlist","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","code":"api:admin:permission:addgroup","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","code":"api:admin:permission:addmenu","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","code":"api:admin:permission:addapi","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","code":"api:admin:permission:updategroup","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","code":"api:admin:permission:updatemenu","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","code":"api:admin:permission:updateapi","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","code":"api:admin:permission:softdelete","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","code":"api:admin:permission:getgroup","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","code":"api:admin:permission:getmenu","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","code":"api:admin:permission:getapi","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","code":"api:admin:role:getpage","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","code":"api:admin:permission:getpermissionlist","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","code":"api:admin:permission:getrolepermissionlist","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","code":"api:admin:permission:assign","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","code":"api:admin:user:getbasic","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","code":"api:admin:user:updatebasic","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","code":"api:admin:user:changepassword","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","code":"api:admin:dictionary:getpage","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","code":"api:admin:dictionary:add","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","code":"api:admin:dictionary:update","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","code":"api:admin:dictionary:softdelete","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","code":"api:admin:dictionary:get","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","code":"api:admin:view:getlist","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","code":"api:admin:view:add","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","code":"api:admin:view:update","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","code":"api:admin:view:softdelete","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","code":"api:admin:view:batchsoftdelete","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","code":"api:admin:view:sync","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","code":"api:admin:view:get","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","code":"api:admin:cache:list","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","code":"api:admin:cache:clear","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","code":"api:admin:oprationlog:getpage","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","code":"api:admin:loginlog:getpage","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","code":"api:admin:document:getplainlist","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","code":"api:admin:document:addgroup","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","code":"api:admin:document:addmenu","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","code":"api:admin:document:updategroup","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","code":"api:admin:document:updatemenu","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","code":"api:admin:document:softdelete","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","code":"api:admin:document:getgroup","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","code":"api:admin:document:getmenu","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","code":"api:admin:document:getlist","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","code":"api:admin:document:getcontent","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","code":"api:admin:document:updatecontent","type":3,"apiId":89,"sort":11,"description":""},{"id":93,"parentId":75,"label":"上传文档图片","code":"api:admin:document:uploadimage","type":3,"apiId":90,"sort":0,"description":""},{"id":94,"parentId":75,"label":"查询文档图片列表","code":"api:admin:document:getimagelist","type":3,"apiId":91,"sort":0,"description":""},{"id":95,"parentId":75,"label":"删除图片","code":"api:admin:document:deleteimage","type":3,"apiId":92,"sort":0,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","nickName":"小雪转中雪","avatar":"2/14753102362214400.gif","remark":""},{"id":3,"userName":"jack","password":"96E79218965EB72C92A549DD5A33112","nickName":"杰克"}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""},{"id":3,"name":"文档管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":3,"userId":2,"roleId":2},{"id":6,"userId":3,"roleId":3}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":168,"roleId":1,"permissionId":94},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92},{"id":167,"roleId":2,"permissionId":93},{"id":169,"roleId":2,"permissionId":94},{"id":170,"roleId":2,"permissionId":95},{"id":173,"roleId":3,"permissionId":4},{"id":174,"roleId":3,"permissionId":47},{"id":189,"roleId":3,"permissionId":48},{"id":190,"roleId":3,"permissionId":49},{"id":191,"roleId":3,"permissionId":50},{"id":171,"roleId":3,"permissionId":66},{"id":172,"roleId":3,"permissionId":75},{"id":179,"roleId":3,"permissionId":76},{"id":182,"roleId":3,"permissionId":77},{"id":183,"roleId":3,"permissionId":78},{"id":184,"roleId":3,"permissionId":79},{"id":185,"roleId":3,"permissionId":80},{"id":186,"roleId":3,"permissionId":81},{"id":180,"roleId":3,"permissionId":82},{"id":181,"roleId":3,"permissionId":83},{"id":178,"roleId":3,"permissionId":90},{"id":187,"roleId":3,"permissionId":91},{"id":188,"roleId":3,"permissionId":92},{"id":176,"roleId":3,"permissionId":93},{"id":177,"roleId":3,"permissionId":94},{"id":175,"roleId":3,"permissionId":95}]} \ No newline at end of file +{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""},{"id":90,"parentId":78,"label":"上传文档图片","path":"/api/admin/document/uploadimage","httpMethods":"post","description":""},{"id":91,"parentId":78,"label":"查询文档图片列表","path":"/api/admin/document/getimagelist","httpMethods":"get","description":""},{"id":92,"parentId":78,"label":"删除图片","path":"/api/admin/document/deleteimage","httpMethods":"delete","description":""},{"id":93,"parentId":7,"label":"上传头像","path":"/api/admin/user/avatarupload","httpMethods":"post","description":""},{"id":94,"parentId":5,"label":"查询单条权限点","path":"/api/admin/permission/getdot","httpMethods":"get","description":""},{"id":95,"parentId":5,"label":"新增权限点","path":"/api/admin/permission/adddot","httpMethods":"post","description":""},{"id":96,"parentId":5,"label":"修改权限点","path":"/api/admin/permission/updatedot","httpMethods":"put","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","code":"api:admin:role:getpage","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","code":"api:admin:role:add","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","code":"api:admin:role:update","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","code":"api:admin:role:softdelete","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","code":"api:admin:role:batchsoftdelete","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","code":"api:admin:role:get","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","code":"api:admin:user:getpage","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","code":"api:admin:user:add","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","code":"api:admin:user:update","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","code":"api:admin:user:softdelete","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","code":"api:admin:user:batchsoftdelete","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","code":"api:admin:user:get","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","code":"api:admin:api:getlist","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","code":"api:admin:api:add","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","code":"api:admin:api:update","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","code":"api:admin:api:softdelete","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","code":"api:admin:api:batchsoftdelete","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","code":"api:admin:api:sync","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","code":"api:admin:api:get","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","code":"api:admin:permission:getlist","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","code":"api:admin:permission:addgroup","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","code":"api:admin:permission:addmenu","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","code":"api:admin:permission:addapi","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","code":"api:admin:permission:updategroup","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","code":"api:admin:permission:updatemenu","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","code":"api:admin:permission:updateapi","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","code":"api:admin:permission:softdelete","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","code":"api:admin:permission:getgroup","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","code":"api:admin:permission:getmenu","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","code":"api:admin:permission:getapi","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","code":"api:admin:role:getpage","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","code":"api:admin:permission:getpermissionlist","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","code":"api:admin:permission:getrolepermissionlist","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","code":"api:admin:permission:assign","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","code":"api:admin:user:getbasic","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","code":"api:admin:user:updatebasic","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","code":"api:admin:user:changepassword","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","code":"api:admin:dictionary:getpage","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","code":"api:admin:dictionary:add","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","code":"api:admin:dictionary:update","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","code":"api:admin:dictionary:softdelete","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","code":"api:admin:dictionary:get","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","code":"api:admin:view:getlist","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","code":"api:admin:view:add","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","code":"api:admin:view:update","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","code":"api:admin:view:softdelete","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","code":"api:admin:view:batchsoftdelete","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","code":"api:admin:view:sync","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","code":"api:admin:view:get","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","code":"api:admin:cache:list","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","code":"api:admin:cache:clear","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","code":"api:admin:oprationlog:getpage","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","code":"api:admin:loginlog:getpage","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","code":"api:admin:document:getplainlist","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","code":"api:admin:document:addgroup","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","code":"api:admin:document:addmenu","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","code":"api:admin:document:updategroup","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","code":"api:admin:document:updatemenu","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","code":"api:admin:document:softdelete","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","code":"api:admin:document:getgroup","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","code":"api:admin:document:getmenu","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","code":"api:admin:document:getlist","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","code":"api:admin:document:getcontent","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","code":"api:admin:document:updatecontent","type":3,"apiId":89,"sort":11,"description":""},{"id":93,"parentId":75,"label":"上传文档图片","code":"api:admin:document:uploadimage","type":3,"apiId":90,"sort":0,"description":""},{"id":94,"parentId":75,"label":"查询文档图片列表","code":"api:admin:document:getimagelist","type":3,"apiId":91,"sort":0,"description":""},{"id":95,"parentId":75,"label":"删除图片","code":"api:admin:document:deleteimage","type":3,"apiId":92,"sort":0,"description":""},{"id":96,"parentId":11,"label":"查询单条权限点","code":"api:admin:permission:getdot","type":3,"apiId":94,"sort":0,"description":""},{"id":97,"parentId":11,"label":"新增权限点","code":"api:admin:permission:adddot","type":3,"apiId":95,"sort":0,"description":""},{"id":98,"parentId":11,"label":"修改权限点","code":"api:admin:permission:updatedot","type":3,"apiId":96,"sort":0,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","nickName":"小雪转中雪","avatar":"2/14753102362214400.gif","remark":""},{"id":3,"userName":"jack","password":"96E79218965EB72C92A549DD5A33112","nickName":"杰克"}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""},{"id":3,"name":"文档管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":3,"userId":2,"roleId":2},{"id":6,"userId":3,"roleId":3}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":168,"roleId":1,"permissionId":94},{"id":192,"roleId":1,"permissionId":96},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92},{"id":167,"roleId":2,"permissionId":93},{"id":169,"roleId":2,"permissionId":94},{"id":170,"roleId":2,"permissionId":95},{"id":194,"roleId":2,"permissionId":96},{"id":193,"roleId":2,"permissionId":97},{"id":195,"roleId":2,"permissionId":98},{"id":173,"roleId":3,"permissionId":4},{"id":174,"roleId":3,"permissionId":47},{"id":189,"roleId":3,"permissionId":48},{"id":190,"roleId":3,"permissionId":49},{"id":191,"roleId":3,"permissionId":50},{"id":171,"roleId":3,"permissionId":66},{"id":172,"roleId":3,"permissionId":75},{"id":179,"roleId":3,"permissionId":76},{"id":182,"roleId":3,"permissionId":77},{"id":183,"roleId":3,"permissionId":78},{"id":184,"roleId":3,"permissionId":79},{"id":185,"roleId":3,"permissionId":80},{"id":186,"roleId":3,"permissionId":81},{"id":180,"roleId":3,"permissionId":82},{"id":181,"roleId":3,"permissionId":83},{"id":178,"roleId":3,"permissionId":90},{"id":187,"roleId":3,"permissionId":91},{"id":188,"roleId":3,"permissionId":92},{"id":176,"roleId":3,"permissionId":93},{"id":177,"roleId":3,"permissionId":94},{"id":175,"roleId":3,"permissionId":95}]} \ No newline at end of file diff --git a/Admin.Core/configs/appconfig.json b/Admin.Core/configs/appconfig.json index a5bbb077d..5eeeef4ce 100644 --- a/Admin.Core/configs/appconfig.json +++ b/Admin.Core/configs/appconfig.json @@ -17,6 +17,7 @@ "rateLimit": true, //验证码 "varifyCode": { + //启用 "enabled": true, // 字体 "font": [ "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" ] From 43fa1765f2cd9130f97e61e6ea08ea548f07ab19 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Fri, 5 Jun 2020 22:21:19 +0800 Subject: [PATCH 45/53] =?UTF-8?q?=E6=9B=B4=E6=96=B01.3.3=E7=89=88=E6=9C=AC?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9E=20token=E4=BB=A5=E6=97=A7=E6=8D=A2?= =?UTF-8?q?=E6=96=B0=20=E6=96=B0=E5=A2=9E=20=E9=AB=98=E7=BA=A7=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=97=B6=E9=97=B4=E6=AE=B5=E6=94=AF=E6=8C=81=E6=9C=88?= =?UTF-8?q?=E3=80=81=E6=97=A5=E3=80=81=E6=97=B6=E5=92=8C=E5=88=86=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E9=AB=98=E7=BA=A7=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=AE=B5=E5=92=8C=E9=9D=9E=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=AE=B5=E5=88=87=E6=8D=A2=20=E4=BC=98=E5=8C=96=20=E9=AB=98?= =?UTF-8?q?=E7=BA=A7=E6=9F=A5=E8=AF=A2=E5=AD=97=E6=AE=B5=E4=B8=BA=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E7=B1=BB=E5=9E=8B=E6=97=B6=E8=BE=93=E5=85=A5=E6=A1=86?= =?UTF-8?q?=E5=AE=BD=E5=BA=A6=E4=BC=98=E5=8C=96=20=E4=BC=98=E5=8C=96=20el?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E6=8E=A7=E4=BB=B6=E8=BF=87=E5=A4=A7=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E4=B8=BA=E6=AD=A3=E5=B8=B8=E6=AF=94=E4=BE=8B=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=20=E8=B0=83=E6=95=B4=20Ip=E9=99=90=E6=B5=81=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=85=B3=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 16 ++-- Admin.Core.Common/Auth/IUserToken.cs | 2 + Admin.Core.Common/Auth/User.cs | 5 ++ Admin.Core.Common/Auth/UserToken.cs | 11 +++ Admin.Core.Common/Configs/AppConfig.cs | 4 +- Admin.Core.Common/Configs/JwtConfig.cs | 5 ++ Admin.Core.Model/Admin.Core.Model.csproj | 2 +- .../Admin.Core.Repository.csproj | 2 +- Admin.Core.Services/Admin.Core.Service.csproj | 2 +- Admin.Core.Services/Admin/Auth/AuthService.cs | 2 +- .../Admin/User/IUserService.cs | 3 + Admin.Core.Services/Admin/User/UserService.cs | 8 ++ .../Controller/BaseControllerTest.cs | 2 +- Admin.Core/Admin.Core.Common.xml | 12 ++- Admin.Core/Admin.Core.csproj | 2 +- Admin.Core/Admin.Core.xml | 15 ++++ .../Controllers/Admin/AuthController.cs | 90 +++++++++++++++---- .../Controllers/Admin/UserController.cs | 1 - Admin.Core/Db/Data/data.json | 2 +- Admin.Core/configs/appconfig.json | 4 +- Admin.Core/configs/jwtconfig.json | 4 +- 21 files changed, 157 insertions(+), 37 deletions(-) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 1f92b83ae..8502364d2 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.2 + 1.3.3 xiaoxue xiaoxue 中台Admin后端通用库 @@ -22,13 +22,13 @@ - - - - - - - + + + + + + + diff --git a/Admin.Core.Common/Auth/IUserToken.cs b/Admin.Core.Common/Auth/IUserToken.cs index f62c326db..292b2ba49 100644 --- a/Admin.Core.Common/Auth/IUserToken.cs +++ b/Admin.Core.Common/Auth/IUserToken.cs @@ -5,5 +5,7 @@ namespace Admin.Core.Common.Auth public interface IUserToken { string Build(Claim[] claims); + + Claim[] Decode(string jwtToken); } } diff --git a/Admin.Core.Common/Auth/User.cs b/Admin.Core.Common/Auth/User.cs index fc8890360..4a023d261 100644 --- a/Admin.Core.Common/Auth/User.cs +++ b/Admin.Core.Common/Auth/User.cs @@ -87,5 +87,10 @@ public static class ClaimAttributes /// 姓名 /// public const string UserNickName = "nn"; + + /// + /// 刷新有效期 + /// + public const string RefreshExpires = "re"; } } diff --git a/Admin.Core.Common/Auth/UserToken.cs b/Admin.Core.Common/Auth/UserToken.cs index 35204142a..2fc18bb1b 100644 --- a/Admin.Core.Common/Auth/UserToken.cs +++ b/Admin.Core.Common/Auth/UserToken.cs @@ -6,6 +6,8 @@ using Microsoft.IdentityModel.Tokens; using Admin.Core.Common.Configs; using Admin.Core.Common.Attributes; +using System.Linq; +using Google.Protobuf.WellKnownTypes; namespace Admin.Core.Common.Auth { @@ -23,6 +25,8 @@ public string Build(Claim[] claims) { var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtConfig.SecurityKey)); var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); + var refreshExpires = DateTime.Now.AddMinutes(_jwtConfig.RefreshExpires).ToString(); + claims = claims.Append(new Claim(ClaimAttributes.RefreshExpires, refreshExpires)).ToArray(); var token = new JwtSecurityToken( issuer: _jwtConfig.Issuer, @@ -34,5 +38,12 @@ public string Build(Claim[] claims) ); return new JwtSecurityTokenHandler().WriteToken(token); } + + public Claim[] Decode(string jwtToken) + { + var jwtSecurityTokenHandler = new JwtSecurityTokenHandler(); + var jwtSecurityToken = jwtSecurityTokenHandler.ReadJwtToken(jwtToken); + return jwtSecurityToken?.Claims?.ToArray(); + } } } diff --git a/Admin.Core.Common/Configs/AppConfig.cs b/Admin.Core.Common/Configs/AppConfig.cs index 9e7758f5c..12a3e2f95 100644 --- a/Admin.Core.Common/Configs/AppConfig.cs +++ b/Admin.Core.Common/Configs/AppConfig.cs @@ -28,7 +28,7 @@ public class AppConfig /// /// 限流 /// - public bool RateLimit { get; set; } = true; + public bool RateLimit { get; set; } = false; /// /// 验证码配置 @@ -66,7 +66,7 @@ public class VarifyCodeConfig /// /// 启用 /// - public bool Enabled { get; set; } = true; + public bool Enable { get; set; } = true; /// /// 操作日志 diff --git a/Admin.Core.Common/Configs/JwtConfig.cs b/Admin.Core.Common/Configs/JwtConfig.cs index 54cbb54e7..aa1ccedc3 100644 --- a/Admin.Core.Common/Configs/JwtConfig.cs +++ b/Admin.Core.Common/Configs/JwtConfig.cs @@ -27,5 +27,10 @@ public class JwtConfig /// 有效期(分钟) /// public int Expires { get; set; } = 120; + + /// + /// 刷新有效期(分钟) + /// + public int RefreshExpires { get; set; } = 480; } } diff --git a/Admin.Core.Model/Admin.Core.Model.csproj b/Admin.Core.Model/Admin.Core.Model.csproj index cfb03ff65..7716ca3fa 100644 --- a/Admin.Core.Model/Admin.Core.Model.csproj +++ b/Admin.Core.Model/Admin.Core.Model.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.2 + 1.3.3 xiaoxue xiaoxue 中台Admin后端实体库 diff --git a/Admin.Core.Repository/Admin.Core.Repository.csproj b/Admin.Core.Repository/Admin.Core.Repository.csproj index 4a2558f2e..9f43c9038 100644 --- a/Admin.Core.Repository/Admin.Core.Repository.csproj +++ b/Admin.Core.Repository/Admin.Core.Repository.csproj @@ -2,7 +2,7 @@ netcoreapp3.1 - 1.3.2 + 1.3.3 xiaoxue xiaoxue 中台Admin后端仓储库 diff --git a/Admin.Core.Services/Admin.Core.Service.csproj b/Admin.Core.Services/Admin.Core.Service.csproj index bced56faf..739245315 100644 --- a/Admin.Core.Services/Admin.Core.Service.csproj +++ b/Admin.Core.Services/Admin.Core.Service.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.2 + 1.3.3 xiaoxue xiaoxue 中台Admin后端服务库 diff --git a/Admin.Core.Services/Admin/Auth/AuthService.cs b/Admin.Core.Services/Admin/Auth/AuthService.cs index 313888038..3c85d9c93 100644 --- a/Admin.Core.Services/Admin/Auth/AuthService.cs +++ b/Admin.Core.Services/Admin/Auth/AuthService.cs @@ -46,7 +46,7 @@ IPermissionRepository permissionRepository public async Task LoginAsync(AuthLoginInput input) { #region 验证码校验 - if (_appConfig.VarifyCode.Enabled) + if (_appConfig.VarifyCode.Enable) { var verifyCodeKey = string.Format(CacheKey.VerifyCodeKey, input.VerifyCodeKey); var exists = await _cache.ExistsAsync(verifyCodeKey); diff --git a/Admin.Core.Services/Admin/User/IUserService.cs b/Admin.Core.Services/Admin/User/IUserService.cs index b0a4fb141..5347c0932 100644 --- a/Admin.Core.Services/Admin/User/IUserService.cs +++ b/Admin.Core.Services/Admin/User/IUserService.cs @@ -4,6 +4,7 @@ using Admin.Core.Common.Input; using Admin.Core.Common.Output; using Admin.Core.Model.Admin; +using Admin.Core.Service.Admin.Auth.Output; using Admin.Core.Service.Admin.User.Input; using Admin.Core.Service.Admin.User.Output; @@ -14,6 +15,8 @@ namespace Admin.Core.Service.Admin.User /// public interface IUserService { + Task> GetLoginUserAsync(long id); + Task> GetAsync(long id); Task PageAsync(PageInput input); diff --git a/Admin.Core.Services/Admin/User/UserService.cs b/Admin.Core.Services/Admin/User/UserService.cs index e2a8c01db..5b1c5801a 100644 --- a/Admin.Core.Services/Admin/User/UserService.cs +++ b/Admin.Core.Services/Admin/User/UserService.cs @@ -13,6 +13,7 @@ using Admin.Core.Service.Admin.User.Input; using Admin.Core.Service.Admin.User.Output; using Admin.Core.Common.Attributes; +using Admin.Core.Service.Admin.Auth.Output; namespace Admin.Core.FrameWork.Service.User { @@ -45,6 +46,13 @@ IRolePermissionRepository rolePermissionRepository _rolePermissionRepository = rolePermissionRepository; } + public async Task> GetLoginUserAsync(long id) + { + var output = new ResponseOutput(); + var entityDto = await _userRepository.GetAsync(id); + return output.Ok(entityDto); + } + public async Task> GetAsync(long id) { var res = new ResponseOutput(); diff --git a/Admin.Core.Tests/Controller/BaseControllerTest.cs b/Admin.Core.Tests/Controller/BaseControllerTest.cs index 10eb99419..5099f501f 100644 --- a/Admin.Core.Tests/Controller/BaseControllerTest.cs +++ b/Admin.Core.Tests/Controller/BaseControllerTest.cs @@ -40,7 +40,7 @@ public ByteArrayContent GetHttpContent(object input) public async Task Login(AuthLoginInput input = null) { - if(input == null && _appConfig.VarifyCode.Enabled) + if(input == null && _appConfig.VarifyCode.Enable) { var res = await _authService.GetVerifyCodeAsync("") as IResponseOutput; var verifyCodeKey = string.Format(CacheKey.VerifyCodeKey, res.Data.Key); diff --git a/Admin.Core/Admin.Core.Common.xml b/Admin.Core/Admin.Core.Common.xml index 7421ccea8..0a1166302 100644 --- a/Admin.Core/Admin.Core.Common.xml +++ b/Admin.Core/Admin.Core.Common.xml @@ -84,6 +84,11 @@ 姓名 + + + 刷新有效期 + + 编号 @@ -410,7 +415,7 @@ 验证码配置 - + 启用 @@ -535,6 +540,11 @@ 有效期(分钟) + + + 刷新有效期(分钟) + + 上传配置 diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index b15cc654e..84a7f94ee 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -5,7 +5,7 @@ OutOfProcess false - 1.3.2 + 1.3.3 MIT xiaoxue xiaoxue diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index 8b5bf7cc0..1fb379420 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -133,6 +133,13 @@ 授权管理 + + + 获得token + + + + 获取验证码 @@ -160,6 +167,14 @@ 登录信息 + + + 刷新Token + 以旧换新 + + + + 缓存管理 diff --git a/Admin.Core/Controllers/Admin/AuthController.cs b/Admin.Core/Controllers/Admin/AuthController.cs index e42736a57..7c23b1b3e 100644 --- a/Admin.Core/Controllers/Admin/AuthController.cs +++ b/Admin.Core/Controllers/Admin/AuthController.cs @@ -1,16 +1,21 @@ -using System.Threading.Tasks; +using System; +using System.Linq; +using System.Diagnostics; +using System.Threading.Tasks; using System.Security.Claims; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc.ModelBinding; using Admin.Core.Attributes; +using Admin.Core.Common.Auth; using Admin.Core.Common.Output; using Admin.Core.Service.Admin.Auth; using Admin.Core.Service.Admin.Auth.Input; using Admin.Core.Service.Admin.Auth.Output; -using Admin.Core.Common.Auth; -using System.Diagnostics; -using Admin.Core.Service.Admin.LoginLog.Input; using Admin.Core.Service.Admin.LoginLog; +using Admin.Core.Service.Admin.LoginLog.Input; +using Admin.Core.Common.Helpers; +using Admin.Core.Service.Admin.User; namespace Admin.Core.Controllers.Admin { @@ -21,19 +26,45 @@ public class AuthController : AreaController { private readonly IUserToken _userToken; private readonly IAuthService _authService; + private readonly IUserService _userServices; private readonly ILoginLogService _loginLogService; public AuthController( IUserToken userToken, IAuthService authServices, + IUserService userServices, ILoginLogService loginLogService ) { _userToken = userToken; _authService = authServices; + _userServices = userServices; _loginLogService = loginLogService; } + /// + /// 获得token + /// + /// + /// + private IResponseOutput GetToken(ResponseOutput output) + { + if (!output.Success) + { + return ResponseOutput.NotOk(output.Msg); + } + + var user = output.Data; + var token = _userToken.Build(new[] + { + new Claim(ClaimAttributes.UserId, user.Id.ToString()), + new Claim(ClaimAttributes.UserName, user.UserName), + new Claim(ClaimAttributes.UserNickName, user.NickName) + }); + + return ResponseOutput.Ok(new { token }); + } + /// /// 获取验证码 /// @@ -83,7 +114,7 @@ public async Task Login(AuthLoginInput input) { var sw = new Stopwatch(); sw.Start(); - var res = (await _authService.LoginAsync(input)) as IResponseOutput; + var res = await _authService.LoginAsync(input); sw.Stop(); #region 添加登录日志 @@ -95,10 +126,11 @@ public async Task Login(AuthLoginInput input) Msg = res.Msg }; - AuthLoginOutput user = null; + ResponseOutput output = null; if (res.Success) { - user = (res as IResponseOutput).Data; + output = (res as ResponseOutput); + var user = output.Data; loginLogAddInput.CreatedUserId = user.Id; loginLogAddInput.NickName = user.NickName; } @@ -111,16 +143,44 @@ public async Task Login(AuthLoginInput input) return res; } - #region 生成token信息 - var token = _userToken.Build(new[] + return GetToken(output); + } + + + + /// + /// 刷新Token + /// 以旧换新 + /// + /// + /// + [HttpGet] + [AllowAnonymous] + [NoOprationLog] + public async Task Refresh([BindRequired] string token) + { + var userClaims = _userToken.Decode(token); + if(userClaims == null || userClaims.Length == 0) { - new Claim(ClaimAttributes.UserId, user.Id.ToString()), - new Claim(ClaimAttributes.UserName, user.UserName), - new Claim(ClaimAttributes.UserNickName, user.NickName) - }); - #endregion + return ResponseOutput.NotOk(); + } - return ResponseOutput.Ok(new { token }); + var refreshExpiresValue = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.RefreshExpires).Value; + if (refreshExpiresValue.IsNull()) + { + return ResponseOutput.NotOk(); + } + + var refreshExpires = refreshExpiresValue.ToDate(); + if(refreshExpires <= DateTime.Now) + { + return ResponseOutput.NotOk("登录信息已过期"); + } + + var userId = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.UserId).Value; + var output = await _userServices.GetLoginUserAsync(userId.ToLong()); + + return GetToken(output); } } } diff --git a/Admin.Core/Controllers/Admin/UserController.cs b/Admin.Core/Controllers/Admin/UserController.cs index f8f63d7a9..66fe3d548 100644 --- a/Admin.Core/Controllers/Admin/UserController.cs +++ b/Admin.Core/Controllers/Admin/UserController.cs @@ -22,7 +22,6 @@ public class UserController : AreaController private readonly IUser _user; private readonly UploadConfig _uploadConfig; private readonly UploadHelper _uploadHelper; - private readonly IUserService _userServices; public UserController( diff --git a/Admin.Core/Db/Data/data.json b/Admin.Core/Db/Data/data.json index 6825f3da9..8f176f62c 100644 --- a/Admin.Core/Db/Data/data.json +++ b/Admin.Core/Db/Data/data.json @@ -1 +1 @@ -{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""},{"id":90,"parentId":78,"label":"上传文档图片","path":"/api/admin/document/uploadimage","httpMethods":"post","description":""},{"id":91,"parentId":78,"label":"查询文档图片列表","path":"/api/admin/document/getimagelist","httpMethods":"get","description":""},{"id":92,"parentId":78,"label":"删除图片","path":"/api/admin/document/deleteimage","httpMethods":"delete","description":""},{"id":93,"parentId":7,"label":"上传头像","path":"/api/admin/user/avatarupload","httpMethods":"post","description":""},{"id":94,"parentId":5,"label":"查询单条权限点","path":"/api/admin/permission/getdot","httpMethods":"get","description":""},{"id":95,"parentId":5,"label":"新增权限点","path":"/api/admin/permission/adddot","httpMethods":"post","description":""},{"id":96,"parentId":5,"label":"修改权限点","path":"/api/admin/permission/updatedot","httpMethods":"put","description":""}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","code":"api:admin:role:getpage","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","code":"api:admin:role:add","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","code":"api:admin:role:update","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","code":"api:admin:role:softdelete","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","code":"api:admin:role:batchsoftdelete","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","code":"api:admin:role:get","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","code":"api:admin:user:getpage","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","code":"api:admin:user:add","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","code":"api:admin:user:update","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","code":"api:admin:user:softdelete","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","code":"api:admin:user:batchsoftdelete","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","code":"api:admin:user:get","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","code":"api:admin:api:getlist","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","code":"api:admin:api:add","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","code":"api:admin:api:update","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","code":"api:admin:api:softdelete","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","code":"api:admin:api:batchsoftdelete","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","code":"api:admin:api:sync","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","code":"api:admin:api:get","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","code":"api:admin:permission:getlist","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","code":"api:admin:permission:addgroup","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","code":"api:admin:permission:addmenu","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","code":"api:admin:permission:addapi","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","code":"api:admin:permission:updategroup","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","code":"api:admin:permission:updatemenu","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","code":"api:admin:permission:updateapi","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","code":"api:admin:permission:softdelete","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","code":"api:admin:permission:getgroup","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","code":"api:admin:permission:getmenu","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","code":"api:admin:permission:getapi","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","code":"api:admin:role:getpage","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","code":"api:admin:permission:getpermissionlist","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","code":"api:admin:permission:getrolepermissionlist","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","code":"api:admin:permission:assign","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","code":"api:admin:user:getbasic","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","code":"api:admin:user:updatebasic","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","code":"api:admin:user:changepassword","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","code":"api:admin:dictionary:getpage","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","code":"api:admin:dictionary:add","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","code":"api:admin:dictionary:update","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","code":"api:admin:dictionary:softdelete","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","code":"api:admin:dictionary:get","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","code":"api:admin:view:getlist","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","code":"api:admin:view:add","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","code":"api:admin:view:update","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","code":"api:admin:view:softdelete","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","code":"api:admin:view:batchsoftdelete","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","code":"api:admin:view:sync","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","code":"api:admin:view:get","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","code":"api:admin:cache:list","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","code":"api:admin:cache:clear","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","code":"api:admin:oprationlog:getpage","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","code":"api:admin:loginlog:getpage","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","code":"api:admin:document:getplainlist","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","code":"api:admin:document:addgroup","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","code":"api:admin:document:addmenu","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","code":"api:admin:document:updategroup","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","code":"api:admin:document:updatemenu","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","code":"api:admin:document:softdelete","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","code":"api:admin:document:getgroup","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","code":"api:admin:document:getmenu","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","code":"api:admin:document:getlist","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","code":"api:admin:document:getcontent","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","code":"api:admin:document:updatecontent","type":3,"apiId":89,"sort":11,"description":""},{"id":93,"parentId":75,"label":"上传文档图片","code":"api:admin:document:uploadimage","type":3,"apiId":90,"sort":0,"description":""},{"id":94,"parentId":75,"label":"查询文档图片列表","code":"api:admin:document:getimagelist","type":3,"apiId":91,"sort":0,"description":""},{"id":95,"parentId":75,"label":"删除图片","code":"api:admin:document:deleteimage","type":3,"apiId":92,"sort":0,"description":""},{"id":96,"parentId":11,"label":"查询单条权限点","code":"api:admin:permission:getdot","type":3,"apiId":94,"sort":0,"description":""},{"id":97,"parentId":11,"label":"新增权限点","code":"api:admin:permission:adddot","type":3,"apiId":95,"sort":0,"description":""},{"id":98,"parentId":11,"label":"修改权限点","code":"api:admin:permission:updatedot","type":3,"apiId":96,"sort":0,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","nickName":"小雪转中雪","avatar":"2/14753102362214400.gif","remark":""},{"id":3,"userName":"jack","password":"96E79218965EB72C92A549DD5A33112","nickName":"杰克"}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""},{"id":3,"name":"文档管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":3,"userId":2,"roleId":2},{"id":6,"userId":3,"roleId":3}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":168,"roleId":1,"permissionId":94},{"id":192,"roleId":1,"permissionId":96},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92},{"id":167,"roleId":2,"permissionId":93},{"id":169,"roleId":2,"permissionId":94},{"id":170,"roleId":2,"permissionId":95},{"id":194,"roleId":2,"permissionId":96},{"id":193,"roleId":2,"permissionId":97},{"id":195,"roleId":2,"permissionId":98},{"id":173,"roleId":3,"permissionId":4},{"id":174,"roleId":3,"permissionId":47},{"id":189,"roleId":3,"permissionId":48},{"id":190,"roleId":3,"permissionId":49},{"id":191,"roleId":3,"permissionId":50},{"id":171,"roleId":3,"permissionId":66},{"id":172,"roleId":3,"permissionId":75},{"id":179,"roleId":3,"permissionId":76},{"id":182,"roleId":3,"permissionId":77},{"id":183,"roleId":3,"permissionId":78},{"id":184,"roleId":3,"permissionId":79},{"id":185,"roleId":3,"permissionId":80},{"id":186,"roleId":3,"permissionId":81},{"id":180,"roleId":3,"permissionId":82},{"id":181,"roleId":3,"permissionId":83},{"id":178,"roleId":3,"permissionId":90},{"id":187,"roleId":3,"permissionId":91},{"id":188,"roleId":3,"permissionId":92},{"id":176,"roleId":3,"permissionId":93},{"id":177,"roleId":3,"permissionId":94},{"id":175,"roleId":3,"permissionId":95}]} \ No newline at end of file +{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""},{"id":90,"parentId":78,"label":"上传文档图片","path":"/api/admin/document/uploadimage","httpMethods":"post","description":""},{"id":91,"parentId":78,"label":"查询文档图片列表","path":"/api/admin/document/getimagelist","httpMethods":"get","description":""},{"id":92,"parentId":78,"label":"删除图片","path":"/api/admin/document/deleteimage","httpMethods":"delete","description":""},{"id":93,"parentId":7,"label":"上传头像","path":"/api/admin/user/avatarupload","httpMethods":"post","description":""},{"id":94,"parentId":5,"label":"查询单条权限点","path":"/api/admin/permission/getdot","httpMethods":"get","description":""},{"id":95,"parentId":5,"label":"新增权限点","path":"/api/admin/permission/adddot","httpMethods":"post","description":""},{"id":96,"parentId":5,"label":"修改权限点","path":"/api/admin/permission/updatedot","httpMethods":"put","description":""},{"id":97,"parentId":2,"label":"刷新Token","path":"/api/admin/auth/refresh","httpMethods":"get","description":"以旧换新"}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","code":"api:admin:role:getpage","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","code":"api:admin:role:add","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","code":"api:admin:role:update","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","code":"api:admin:role:softdelete","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","code":"api:admin:role:batchsoftdelete","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","code":"api:admin:role:get","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","code":"api:admin:user:getpage","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","code":"api:admin:user:add","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","code":"api:admin:user:update","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","code":"api:admin:user:softdelete","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","code":"api:admin:user:batchsoftdelete","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","code":"api:admin:user:get","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","code":"api:admin:api:getlist","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","code":"api:admin:api:add","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","code":"api:admin:api:update","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","code":"api:admin:api:softdelete","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","code":"api:admin:api:batchsoftdelete","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","code":"api:admin:api:sync","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","code":"api:admin:api:get","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","code":"api:admin:permission:getlist","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","code":"api:admin:permission:addgroup","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","code":"api:admin:permission:addmenu","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","code":"api:admin:permission:addapi","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","code":"api:admin:permission:updategroup","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","code":"api:admin:permission:updatemenu","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","code":"api:admin:permission:updateapi","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","code":"api:admin:permission:softdelete","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","code":"api:admin:permission:getgroup","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","code":"api:admin:permission:getmenu","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","code":"api:admin:permission:getapi","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","code":"api:admin:role:getpage","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","code":"api:admin:permission:getpermissionlist","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","code":"api:admin:permission:getrolepermissionlist","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","code":"api:admin:permission:assign","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","code":"api:admin:user:getbasic","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","code":"api:admin:user:updatebasic","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","code":"api:admin:user:changepassword","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","code":"api:admin:dictionary:getpage","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","code":"api:admin:dictionary:add","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","code":"api:admin:dictionary:update","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","code":"api:admin:dictionary:softdelete","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","code":"api:admin:dictionary:get","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","code":"api:admin:view:getlist","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","code":"api:admin:view:add","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","code":"api:admin:view:update","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","code":"api:admin:view:softdelete","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","code":"api:admin:view:batchsoftdelete","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","code":"api:admin:view:sync","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","code":"api:admin:view:get","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","code":"api:admin:cache:list","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","code":"api:admin:cache:clear","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","code":"api:admin:oprationlog:getpage","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","code":"api:admin:loginlog:getpage","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","code":"api:admin:document:getplainlist","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","code":"api:admin:document:addgroup","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","code":"api:admin:document:addmenu","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","code":"api:admin:document:updategroup","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","code":"api:admin:document:updatemenu","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","code":"api:admin:document:softdelete","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","code":"api:admin:document:getgroup","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","code":"api:admin:document:getmenu","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","code":"api:admin:document:getlist","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","code":"api:admin:document:getcontent","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","code":"api:admin:document:updatecontent","type":3,"apiId":89,"sort":11,"description":""},{"id":93,"parentId":75,"label":"上传文档图片","code":"api:admin:document:uploadimage","type":3,"apiId":90,"sort":0,"description":""},{"id":94,"parentId":75,"label":"查询文档图片列表","code":"api:admin:document:getimagelist","type":3,"apiId":91,"sort":0,"description":""},{"id":95,"parentId":75,"label":"删除图片","code":"api:admin:document:deleteimage","type":3,"apiId":92,"sort":0,"description":""},{"id":96,"parentId":11,"label":"查询单条权限点","code":"api:admin:permission:getdot","type":3,"apiId":94,"sort":0,"description":""},{"id":97,"parentId":11,"label":"新增权限点","code":"api:admin:permission:adddot","type":3,"apiId":95,"sort":0,"description":""},{"id":98,"parentId":11,"label":"修改权限点","code":"api:admin:permission:updatedot","type":3,"apiId":96,"sort":0,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","nickName":"小雪转中雪","avatar":"2/14753102362214400.gif","remark":""},{"id":3,"userName":"jack","password":"96E79218965EB72C92A549DD5A33112","nickName":"杰克"}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""},{"id":3,"name":"文档管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":3,"userId":2,"roleId":2},{"id":9,"userId":3,"roleId":3}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":168,"roleId":1,"permissionId":94},{"id":192,"roleId":1,"permissionId":96},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92},{"id":167,"roleId":2,"permissionId":93},{"id":169,"roleId":2,"permissionId":94},{"id":170,"roleId":2,"permissionId":95},{"id":194,"roleId":2,"permissionId":96},{"id":193,"roleId":2,"permissionId":97},{"id":195,"roleId":2,"permissionId":98},{"id":173,"roleId":3,"permissionId":4},{"id":174,"roleId":3,"permissionId":47},{"id":189,"roleId":3,"permissionId":48},{"id":190,"roleId":3,"permissionId":49},{"id":191,"roleId":3,"permissionId":50},{"id":171,"roleId":3,"permissionId":66},{"id":172,"roleId":3,"permissionId":75},{"id":179,"roleId":3,"permissionId":76},{"id":182,"roleId":3,"permissionId":77},{"id":183,"roleId":3,"permissionId":78},{"id":184,"roleId":3,"permissionId":79},{"id":185,"roleId":3,"permissionId":80},{"id":186,"roleId":3,"permissionId":81},{"id":180,"roleId":3,"permissionId":82},{"id":181,"roleId":3,"permissionId":83},{"id":178,"roleId":3,"permissionId":90},{"id":187,"roleId":3,"permissionId":91},{"id":188,"roleId":3,"permissionId":92},{"id":176,"roleId":3,"permissionId":93},{"id":177,"roleId":3,"permissionId":94},{"id":175,"roleId":3,"permissionId":95}]} \ No newline at end of file diff --git a/Admin.Core/configs/appconfig.json b/Admin.Core/configs/appconfig.json index 5eeeef4ce..9add20b9b 100644 --- a/Admin.Core/configs/appconfig.json +++ b/Admin.Core/configs/appconfig.json @@ -14,11 +14,11 @@ "operation": true }, //限流 - "rateLimit": true, + "rateLimit": false, //验证码 "varifyCode": { //启用 - "enabled": true, + "enable": true, // 字体 "font": [ "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" ] } diff --git a/Admin.Core/configs/jwtconfig.json b/Admin.Core/configs/jwtconfig.json index 5f21512d3..9f7e95f18 100644 --- a/Admin.Core/configs/jwtconfig.json +++ b/Admin.Core/configs/jwtconfig.json @@ -6,5 +6,7 @@ //密钥 "securityKey": "ertJKl#521*a@790asD&1#", //有效期(分钟) - "expires": 120 + "expires": 120, + //刷新有效期(分钟) 10080 = 7天 + "refreshExpires": 10080 } From 15436535290fbac9699ae267ecc6303ae4e461fe Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Thu, 18 Jun 2020 17:52:13 +0800 Subject: [PATCH 46/53] =?UTF-8?q?=E6=9B=B4=E6=96=B01.3.4=20=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=20vue=20cli=E5=88=B04.4.4=E7=89=88=E6=9C=AC=EF=BC=8C?= =?UTF-8?q?=E5=8D=87=E7=BA=A7eslint=E7=9B=B8=E5=85=B3=E6=8F=92=E4=BB=B6=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E6=94=AF=E6=8C=81api=E5=92=8C=E8=B7=A8?= =?UTF-8?q?=E5=9F=9F=E5=9C=B0=E5=9D=80=E5=A4=9A=E5=9C=B0=E5=9D=80=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=20=E6=96=B0=E5=A2=9E=20ip=E5=B8=AE=E5=8A=A9=E7=B1=BB?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=BE=97mac=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E6=96=B9=E6=B3=95=20=E5=A2=9E=E5=8A=A0=E5=89=8D=E5=90=8E?= =?UTF-8?q?=E7=AB=AFiis=E5=8F=91=E5=B8=83=E9=83=A8=E5=88=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=B3=A8=E9=87=8A=E8=AF=B4=E6=98=8E=20=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=AE=A1=E7=90=86=E8=BE=93=E5=85=A5=E6=9B=B4=E6=94=B9?= =?UTF-8?q?Dto=E7=BC=96=E7=A0=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 8 +-- Admin.Core.Common/Auth/IUserToken.cs | 2 +- Admin.Core.Common/Auth/UserToken.cs | 3 +- Admin.Core.Common/Configs/AppConfig.cs | 11 +++- Admin.Core.Common/Helpers/ConfigHelper.cs | 2 +- Admin.Core.Common/Helpers/IPHelper.cs | 56 ++++++++++++++++++- Admin.Core.Common/Helpers/VerifyCodeHelper.cs | 4 +- .../Input/PermissionUpdateApiInput.cs | 6 +- .../Input/PermissionUpdateDotInput.cs | 6 +- .../Input/PermissionUpdateGroupInput.cs | 6 +- .../Input/PermissionUpdateMenuInput.cs | 6 +- Admin.Core.Tests/Admin.Core.Tests.csproj | 4 +- .../Repository/Admin/RepositoryBaseTest.cs | 6 +- Admin.Core/Admin.Core.Common.xml | 20 ++++++- Admin.Core/Admin.Core.csproj | 6 +- .../Controllers/Admin/AuthController.cs | 11 ++-- Admin.Core/Db/ServiceCollectionExtensions.cs | 2 +- ...ploadConfigApplicationBuilderExtensions.cs | 4 +- Admin.Core/Logs/LogHandler.cs | 1 - Admin.Core/Startup.cs | 22 +++++--- Admin.Core/configs/appconfig.json | 8 ++- Admin.Core/configs/ratelimitconfig.json | 6 +- 22 files changed, 144 insertions(+), 56 deletions(-) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 8502364d2..2314177f4 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -21,7 +21,7 @@ - + @@ -30,9 +30,9 @@ - - - + + + diff --git a/Admin.Core.Common/Auth/IUserToken.cs b/Admin.Core.Common/Auth/IUserToken.cs index 292b2ba49..6af13ec4b 100644 --- a/Admin.Core.Common/Auth/IUserToken.cs +++ b/Admin.Core.Common/Auth/IUserToken.cs @@ -4,7 +4,7 @@ namespace Admin.Core.Common.Auth { public interface IUserToken { - string Build(Claim[] claims); + string Create(Claim[] claims); Claim[] Decode(string jwtToken); } diff --git a/Admin.Core.Common/Auth/UserToken.cs b/Admin.Core.Common/Auth/UserToken.cs index 2fc18bb1b..4f5d4d360 100644 --- a/Admin.Core.Common/Auth/UserToken.cs +++ b/Admin.Core.Common/Auth/UserToken.cs @@ -7,7 +7,6 @@ using Admin.Core.Common.Configs; using Admin.Core.Common.Attributes; using System.Linq; -using Google.Protobuf.WellKnownTypes; namespace Admin.Core.Common.Auth { @@ -21,7 +20,7 @@ public UserToken(JwtConfig jwtConfig) _jwtConfig = jwtConfig; } - public string Build(Claim[] claims) + public string Create(Claim[] claims) { var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtConfig.SecurityKey)); var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); diff --git a/Admin.Core.Common/Configs/AppConfig.cs b/Admin.Core.Common/Configs/AppConfig.cs index 12a3e2f95..92ef16c24 100644 --- a/Admin.Core.Common/Configs/AppConfig.cs +++ b/Admin.Core.Common/Configs/AppConfig.cs @@ -8,7 +8,12 @@ public class AppConfig /// /// Api地址,默认 http://*:8888 /// - public string Urls { get; set; } = "http://*:8888"; + public string[] Urls { get; set; }// = new[]{ "http://*:8888" }; + + /// + /// 跨域地址,默认 http://*:9999 + /// + public string[] CorUrls { get; set; }// = new[]{ "http://*:9999" }; /// /// Swagger文档 @@ -67,10 +72,10 @@ public class VarifyCodeConfig /// 启用 /// public bool Enable { get; set; } = true; - + /// /// 操作日志 /// - public string[] Font { get; set; } = { "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" }; + public string[] Fonts { get; set; }// = new[] { "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" }; } } diff --git a/Admin.Core.Common/Helpers/ConfigHelper.cs b/Admin.Core.Common/Helpers/ConfigHelper.cs index c7850cc70..79ae94cef 100644 --- a/Admin.Core.Common/Helpers/ConfigHelper.cs +++ b/Admin.Core.Common/Helpers/ConfigHelper.cs @@ -72,7 +72,7 @@ public T Get(string fileName, string environmentName = "", bool reloadOnChang public void Bind(string fileName, object instance, string environmentName = "", bool reloadOnChange = false) { var configuration = Load(fileName, environmentName, reloadOnChange); - if (configuration == null) + if (configuration == null || instance == null) return; configuration.Bind(instance); diff --git a/Admin.Core.Common/Helpers/IPHelper.cs b/Admin.Core.Common/Helpers/IPHelper.cs index f5598dd35..8b811bd79 100644 --- a/Admin.Core.Common/Helpers/IPHelper.cs +++ b/Admin.Core.Common/Helpers/IPHelper.cs @@ -1,4 +1,5 @@ using System.Linq; +using System.Net.NetworkInformation; using System.Text.RegularExpressions; using Microsoft.AspNetCore.Http; @@ -16,13 +17,18 @@ public static bool IsIP(string ip) return Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$"); } + /// + /// 获得IP地址 + /// + /// + /// public static string GetIP(HttpRequest request) { if (request == null) { return ""; } - + string ip = request.Headers["X-Real-IP"].FirstOrDefault(); if (ip.IsNull()) { @@ -39,5 +45,53 @@ public static string GetIP(HttpRequest request) return ip; } + + /// + /// 获得MAC地址 + /// + /// + public static string GetMACIp() + { + //本地计算机网络连接信息 + //IPGlobalProperties computerProperties = IPGlobalProperties.GetIPGlobalProperties(); + //获取本机电脑名 + //var HostName = computerProperties.HostName; + //获取域名 + //var DomainName = computerProperties.DomainName; + + //获取本机所有网络连接 + NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); + + if (nics == null || nics.Length < 1) + { + return ""; + } + + var MACIp = ""; + foreach (NetworkInterface adapter in nics) + { + var adapterName = adapter.Name; + + var adapterDescription = adapter.Description; + var NetworkInterfaceType = adapter.NetworkInterfaceType; + if (adapterName == "本地连接" || adapterName == "WLAN") + { + PhysicalAddress address = adapter.GetPhysicalAddress(); + byte[] bytes = address.GetAddressBytes(); + + for (int i = 0; i < bytes.Length; i++) + { + MACIp += bytes[i].ToString("X2"); + + if (i != bytes.Length - 1) + { + MACIp += "-"; + } + } + } + } + + return MACIp; + } } } diff --git a/Admin.Core.Common/Helpers/VerifyCodeHelper.cs b/Admin.Core.Common/Helpers/VerifyCodeHelper.cs index a28086284..e41b28028 100644 --- a/Admin.Core.Common/Helpers/VerifyCodeHelper.cs +++ b/Admin.Core.Common/Helpers/VerifyCodeHelper.cs @@ -40,7 +40,7 @@ public byte[] Draw(out string code, int length = 4) //颜色列表,用于验证码、噪线、噪点 Color[] color = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue }; //字体列表,用于验证码 - string[] font = _appConfig.VarifyCode.Font; + string[] fonts = _appConfig.VarifyCode.Fonts; code = GenerateRandom(length); @@ -69,7 +69,7 @@ public byte[] Draw(out string code, int length = 4) Color clr; for (int i = 0; i < code.Length; i++) { - fnt = font[rnd.Next(font.Length)]; + fnt = fonts[rnd.Next(fonts.Length)]; ft = new Font(fnt, fontSize); clr = color[rnd.Next(color.Length)]; g.DrawString(code[i].ToString(), ft, new SolidBrush(clr), (float)i * 24 + 2, (float)0); diff --git a/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateApiInput.cs b/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateApiInput.cs index 79be12c35..8fef45f1d 100644 --- a/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateApiInput.cs +++ b/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateApiInput.cs @@ -1,14 +1,14 @@ -namespace Admin.Core.Service.Admin.Permission.Input +namespace Admin.Core.Service.Admin.Permission.Input { public class PermissionUpdateApiInput : PermissionAddApiInput { /// - /// ȨId + /// 权限Id /// public long Id { get; set; } /// - /// 汾 + /// 版本 /// public long Version { get; set; } } diff --git a/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateDotInput.cs b/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateDotInput.cs index d0fe87c1b..64776db02 100644 --- a/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateDotInput.cs +++ b/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateDotInput.cs @@ -1,14 +1,14 @@ -namespace Admin.Core.Service.Admin.Permission.Input +namespace Admin.Core.Service.Admin.Permission.Input { public class PermissionUpdateDotInput : PermissionAddDotInput { /// - /// ȨId + /// 权限Id /// public long Id { get; set; } /// - /// 汾 + /// 版本 /// public long Version { get; set; } } diff --git a/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateGroupInput.cs b/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateGroupInput.cs index c0d18bd60..1f6cd7b2a 100644 --- a/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateGroupInput.cs +++ b/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateGroupInput.cs @@ -1,15 +1,15 @@ - + namespace Admin.Core.Service.Admin.Permission.Input { public class PermissionUpdateGroupInput : PermissionAddGroupInput { /// - /// ȨId + /// 权限Id /// public long Id { get; set; } /// - /// 汾 + /// 版本 /// public long Version { get; set; } } diff --git a/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateMenuInput.cs b/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateMenuInput.cs index 1b27590da..42983aefa 100644 --- a/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateMenuInput.cs +++ b/Admin.Core.Services/Admin/Permission/Input/PermissionUpdateMenuInput.cs @@ -1,15 +1,15 @@ - + namespace Admin.Core.Service.Admin.Permission.Input { public class PermissionUpdateMenuInput : PermissionAddMenuInput { /// - /// ȨId + /// 权限Id /// public long Id { get; set; } /// - /// 汾 + /// 版本 /// public long Version { get; set; } } diff --git a/Admin.Core.Tests/Admin.Core.Tests.csproj b/Admin.Core.Tests/Admin.Core.Tests.csproj index 94a912928..7dd4a472a 100644 --- a/Admin.Core.Tests/Admin.Core.Tests.csproj +++ b/Admin.Core.Tests/Admin.Core.Tests.csproj @@ -7,10 +7,10 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Admin.Core.Tests/Repository/Admin/RepositoryBaseTest.cs b/Admin.Core.Tests/Repository/Admin/RepositoryBaseTest.cs index b9f738dd0..56e99eb9e 100644 --- a/Admin.Core.Tests/Repository/Admin/RepositoryBaseTest.cs +++ b/Admin.Core.Tests/Repository/Admin/RepositoryBaseTest.cs @@ -16,9 +16,9 @@ public RepositoryBaseTest() [Fact] public async void GetAsyncByExpression() { - var id = 1; - var user = await _repositoryBase.GetAsync(a => a.Id == id); - Assert.Equal(id, user?.Id); + var userName = "admin"; + var user = await _repositoryBase.GetAsync(a => a.UserName == userName); + Assert.Equal(userName, user?.UserName); } } } diff --git a/Admin.Core/Admin.Core.Common.xml b/Admin.Core/Admin.Core.Common.xml index 0a1166302..d9bd97602 100644 --- a/Admin.Core/Admin.Core.Common.xml +++ b/Admin.Core/Admin.Core.Common.xml @@ -365,6 +365,11 @@ Api地址,默认 http://*:8888 + + + 跨域地址,默认 http://*:9999 + + Swagger文档 @@ -420,7 +425,7 @@ 启用 - + 操作日志 @@ -1006,6 +1011,19 @@ + + + 获得IP地址 + + + + + + + 获得MAC地址 + + + MD5加密 diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index 84a7f94ee..33b702b37 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -43,10 +43,10 @@ - + - - + + diff --git a/Admin.Core/Controllers/Admin/AuthController.cs b/Admin.Core/Controllers/Admin/AuthController.cs index 7c23b1b3e..5c3c3bf0e 100644 --- a/Admin.Core/Controllers/Admin/AuthController.cs +++ b/Admin.Core/Controllers/Admin/AuthController.cs @@ -55,7 +55,7 @@ private IResponseOutput GetToken(ResponseOutput output) } var user = output.Data; - var token = _userToken.Build(new[] + var token = _userToken.Create(new[] { new Claim(ClaimAttributes.UserId, user.Id.ToString()), new Claim(ClaimAttributes.UserName, user.UserName), @@ -156,7 +156,6 @@ public async Task Login(AuthLoginInput input) /// [HttpGet] [AllowAnonymous] - [NoOprationLog] public async Task Refresh([BindRequired] string token) { var userClaims = _userToken.Decode(token); @@ -165,7 +164,7 @@ public async Task Refresh([BindRequired] string token) return ResponseOutput.NotOk(); } - var refreshExpiresValue = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.RefreshExpires).Value; + var refreshExpiresValue = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.RefreshExpires)?.Value; if (refreshExpiresValue.IsNull()) { return ResponseOutput.NotOk(); @@ -177,7 +176,11 @@ public async Task Refresh([BindRequired] string token) return ResponseOutput.NotOk("登录信息已过期"); } - var userId = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.UserId).Value; + var userId = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.UserId)?.Value; + if (userId.IsNull()) + { + return ResponseOutput.NotOk(); + } var output = await _userServices.GetLoginUserAsync(userId.ToLong()); return GetToken(output); diff --git a/Admin.Core/Db/ServiceCollectionExtensions.cs b/Admin.Core/Db/ServiceCollectionExtensions.cs index 81ae072e9..5790ee121 100644 --- a/Admin.Core/Db/ServiceCollectionExtensions.cs +++ b/Admin.Core/Db/ServiceCollectionExtensions.cs @@ -130,7 +130,7 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen #endregion #endregion - Console.WriteLine($"{appConfig.Urls}\r\n"); + Console.WriteLine($"{string.Join("\r\n", appConfig.Urls)}\r\n"); } } } diff --git a/Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs b/Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs index 876d2da02..64513517a 100644 --- a/Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs +++ b/Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs @@ -23,11 +23,13 @@ private static void UseFileUploadConfig(IApplicationBuilder app, FileUploadConfi }); } - public static void UseUploadConfig(this IApplicationBuilder app) + public static IApplicationBuilder UseUploadConfig(this IApplicationBuilder app) { var uploadConfig = app.ApplicationServices.GetRequiredService>(); UseFileUploadConfig(app, uploadConfig.Value.Avatar); UseFileUploadConfig(app, uploadConfig.Value.Document); + + return app; } } diff --git a/Admin.Core/Logs/LogHandler.cs b/Admin.Core/Logs/LogHandler.cs index 4d34e131f..57a2eb8e0 100644 --- a/Admin.Core/Logs/LogHandler.cs +++ b/Admin.Core/Logs/LogHandler.cs @@ -30,7 +30,6 @@ public async Task LogAsync(ActionExecutingContext context, ActionExecutionDelega { var sw = new Stopwatch(); sw.Start(); - dynamic actionResult = (await next()).Result; sw.Stop(); diff --git a/Admin.Core/Startup.cs b/Admin.Core/Startup.cs index d3bf099ce..8ddc0aeec 100644 --- a/Admin.Core/Startup.cs +++ b/Admin.Core/Startup.cs @@ -81,9 +81,10 @@ public void ConfigureServices(IServiceCollection services) c.AddPolicy("Limit", policy => { policy - .WithOrigins(_appConfig.Urls) + .WithOrigins(_appConfig.CorUrls) .AllowAnyHeader() - .AllowAnyMethod(); + .AllowAnyMethod() + .AllowCredentials(); }); /* @@ -94,7 +95,8 @@ public void ConfigureServices(IServiceCollection services) .AllowAnyOrigin() .SetPreflightMaxAge(new TimeSpan(0, 10, 0)) .AllowAnyHeader() - .AllowAnyMethod(); + .AllowAnyMethod() + .AllowCredentials(); }); */ }); @@ -185,11 +187,14 @@ public void ConfigureServices(IServiceCollection services) .AddScheme(nameof(ResponseAuthenticationHandler), o => { }); ; #endregion - #region 控制器 + #region 操作日志 if (_appConfig.Log.Operation) { services.AddSingleton(); } + #endregion + + #region 控制器 services.AddControllers(options => { options.Filters.Add(); @@ -231,11 +236,12 @@ public void ConfigureServices(IServiceCollection services) } #endregion - //IP限流 + #region IP限流 if (_appConfig.RateLimit) { services.AddIpRateLimit(_configuration, cacheConfig); - } + } + #endregion //阻止NLog接收状态消息 services.Configure(opts => opts.SuppressStatusMessages = true); @@ -301,13 +307,13 @@ public void Configure(IApplicationBuilder app) // Console.WriteLine($"{_appConfig.Urls}\r\n"); //}); + #region app配置 //IP限流 if (_appConfig.RateLimit) { app.UseIpRateLimiting(); } - #region app配置 //异常 app.UseExceptionHandler("/Error"); @@ -343,7 +349,7 @@ public void Configure(IApplicationBuilder app) { c.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"Admin.Core {version}"); }); - c.RoutePrefix = "";//直接根目录访问 + c.RoutePrefix = "";//直接根目录访问,如果是IIS发布可以注释该语句,并打开launchSettings.launchUrl c.DocExpansion(Swashbuckle.AspNetCore.SwaggerUI.DocExpansion.None);//折叠Api //c.DefaultModelsExpandDepth(-1);//不显示Models }); diff --git a/Admin.Core/configs/appconfig.json b/Admin.Core/configs/appconfig.json index 9add20b9b..e8ed10fa5 100644 --- a/Admin.Core/configs/appconfig.json +++ b/Admin.Core/configs/appconfig.json @@ -1,6 +1,8 @@ { //Api地址 - "urls": "http://*:8888", + "urls": [ "http://*:8888" ], + //跨域地址 + "corUrls": [ "http://*:9999" ], //Swagger文档 "swagger": false, //面向切面编程 @@ -19,7 +21,7 @@ "varifyCode": { //启用 "enable": true, - // 字体 - "font": [ "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" ] + //字体列表 + "fonts": [ "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" ] } } diff --git a/Admin.Core/configs/ratelimitconfig.json b/Admin.Core/configs/ratelimitconfig.json index 8b1b4dec6..3337df810 100644 --- a/Admin.Core/configs/ratelimitconfig.json +++ b/Admin.Core/configs/ratelimitconfig.json @@ -9,7 +9,7 @@ "RealIpHeader": "X-Real-IP", "ClientIdHeader": "X-ClientId", "IpWhitelist": [], // "127.0.0.1" - "EndpointWhitelist": [], // "get:/api/a", "*:/api/b" + "EndpointWhitelist": ["get:/api/admin/auth/refresh"], // "get:/api/a", "*:/api/b" "ClientWhitelist": [], "HttpStatusCode": 429, "QuotaExceededResponse": { @@ -21,12 +21,12 @@ { "Endpoint": "*", "Period": "1s", - "Limit": 2 + "Limit": 3 }, { "Endpoint": "*", "Period": "10m", - "Limit": 100 + "Limit": 200 } ] } From e15569731bb23d9a6f9e42ba32107f698a91f39b Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Thu, 18 Jun 2020 17:54:00 +0800 Subject: [PATCH 47/53] =?UTF-8?q?=E6=9B=B4=E6=96=B01.3.4=20=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=20vue=20cli=E5=88=B04.4.4=E7=89=88=E6=9C=AC=EF=BC=8C?= =?UTF-8?q?=E5=8D=87=E7=BA=A7eslint=E7=9B=B8=E5=85=B3=E6=8F=92=E4=BB=B6=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E6=94=AF=E6=8C=81api=E5=92=8C=E8=B7=A8?= =?UTF-8?q?=E5=9F=9F=E5=9C=B0=E5=9D=80=E5=A4=9A=E5=9C=B0=E5=9D=80=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=20=E6=96=B0=E5=A2=9E=20ip=E5=B8=AE=E5=8A=A9=E7=B1=BB?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=BE=97mac=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E6=96=B9=E6=B3=95=20=E5=A2=9E=E5=8A=A0=E5=89=8D=E5=90=8E?= =?UTF-8?q?=E7=AB=AFiis=E5=8F=91=E5=B8=83=E9=83=A8=E5=88=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=B3=A8=E9=87=8A=E8=AF=B4=E6=98=8E=20=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=AE=A1=E7=90=86=E8=BE=93=E5=85=A5=E6=9B=B4=E6=94=B9?= =?UTF-8?q?Dto=E7=BC=96=E7=A0=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 2 +- Admin.Core.Model/Admin.Core.Model.csproj | 2 +- Admin.Core.Repository/Admin.Core.Repository.csproj | 2 +- Admin.Core.Services/Admin.Core.Service.csproj | 2 +- Admin.Core/Admin.Core.csproj | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 2314177f4..4ef64d126 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.3 + 1.3.4 xiaoxue xiaoxue 中台Admin后端通用库 diff --git a/Admin.Core.Model/Admin.Core.Model.csproj b/Admin.Core.Model/Admin.Core.Model.csproj index 7716ca3fa..a814dd2a5 100644 --- a/Admin.Core.Model/Admin.Core.Model.csproj +++ b/Admin.Core.Model/Admin.Core.Model.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.3 + 1.3.4 xiaoxue xiaoxue 中台Admin后端实体库 diff --git a/Admin.Core.Repository/Admin.Core.Repository.csproj b/Admin.Core.Repository/Admin.Core.Repository.csproj index 9f43c9038..1a1fef0f5 100644 --- a/Admin.Core.Repository/Admin.Core.Repository.csproj +++ b/Admin.Core.Repository/Admin.Core.Repository.csproj @@ -2,7 +2,7 @@ netcoreapp3.1 - 1.3.3 + 1.3.4 xiaoxue xiaoxue 中台Admin后端仓储库 diff --git a/Admin.Core.Services/Admin.Core.Service.csproj b/Admin.Core.Services/Admin.Core.Service.csproj index 739245315..4964e5a90 100644 --- a/Admin.Core.Services/Admin.Core.Service.csproj +++ b/Admin.Core.Services/Admin.Core.Service.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.3 + 1.3.4 xiaoxue xiaoxue 中台Admin后端服务库 diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index 33b702b37..5a3ae5167 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -5,7 +5,7 @@ OutOfProcess false - 1.3.3 + 1.3.4 MIT xiaoxue xiaoxue From e44a882f1d329779f6024114df7d06183bf038b8 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Sat, 18 Jul 2020 15:21:39 +0800 Subject: [PATCH 48/53] =?UTF-8?q?=E6=9B=B4=E6=96=B01.4.0=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20=E6=94=AF=E6=8C=81JWT=E5=92=8CIS4=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E5=88=87=E6=8D=A2=20=E6=96=B0=E5=A2=9E=20=E9=9B=86=E6=88=90?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=AE=A4=E8=AF=81=E6=8E=88=E6=9D=83=E9=A1=B9?= =?UTF-8?q?=E7=9B=AEAdmin.IdentityServer=20=E6=9B=B4=E6=96=B0=20=E5=90=8E?= =?UTF-8?q?=E7=AB=AFnuget=E5=8C=85=20=E8=B0=83=E6=95=B4=20data.json?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=95=B0=E6=8D=AE=20=E4=BF=AE=E5=A4=8D=20?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E6=A0=B9=E6=8D=AE=E6=9D=A1=E4=BB=B6=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=90=8E=E6=B2=A1=E6=9C=89=E4=BB=8E=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E9=A1=B5=E5=BC=80=E5=A7=8B=E7=9A=84=E9=97=AE=E9=A2=98=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E6=89=A7=E8=A1=8Cdb=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=90=AF=E5=8A=A8=E7=AB=AF=E5=8F=A3=E4=B8=8D?= =?UTF-8?q?=E6=8C=89=E9=A1=BA=E5=BA=8F=E6=89=A7=E8=A1=8C=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20=E4=BF=AE=E5=A4=8D=20swagger=20api=E5=8A=A0?= =?UTF-8?q?=E6=9D=83=E5=B0=8F=E9=94=81=E5=BC=B9=E5=87=BA=E6=97=A0=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E6=A1=86=E7=9A=84=E9=97=AE=E9=A2=98=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20=E5=88=B7=E6=96=B0token=E6=89=A7=E8=A1=8C=E6=88=90?= =?UTF-8?q?=E5=8A=9F=EF=BC=8C=E8=AF=B7=E6=B1=82=E9=87=8D=E8=AF=95=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=A4=B1=E8=B4=A5=E4=BC=9A=E5=BE=AA=E7=8E=AF=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E7=9A=84=E9=97=AE=E9=A2=98=20=E4=BF=AE=E5=A4=8D=20tok?= =?UTF-8?q?en=E4=BB=A5=E6=97=A7=E6=8D=A2=E6=96=B0=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E4=B8=8D=E7=B2=BE=E7=A1=AE=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20=E4=BF=AE=E5=A4=8D=20ip=E5=B8=A6=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E9=AA=8C=E8=AF=81ip=E4=B8=8D=E9=80=9A=E8=BF=87=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=9C=AC=E5=9C=B0ip=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 20 +- Admin.Core.Common/Auth/ClaimAttributes.cs | 33 +++ Admin.Core.Common/Auth/User.cs | 28 +-- Admin.Core.Common/Auth/UserIdentiyServer.cs | 34 ++++ Admin.Core.Common/Auth/UserToken.cs | 5 +- Admin.Core.Common/Configs/AppConfig.cs | 28 ++- .../Extensions/DateTimeExtensions.cs | 36 ++++ Admin.Core.Common/Helpers/IPHelper.cs | 2 +- Admin.Core.Common/Helpers/UtilConvert.cs | 11 +- Admin.Core.Model/Admin.Core.Model.csproj | 2 +- .../Admin.Core.Repository.csproj | 2 +- Admin.Core.Services/Admin.Core.Service.csproj | 6 +- Admin.Core/Admin.Core.Common.xml | 95 +++++++-- Admin.Core/Admin.Core.csproj | 10 +- Admin.Core/Admin.Core.xml | 3 +- .../Controllers/Admin/AuthController.cs | 10 +- Admin.Core/Db/Data/data.json | 2 +- Admin.Core/Db/DbHelper.cs | 4 +- Admin.Core/Db/ServiceCollectionExtensions.cs | 11 +- Admin.Core/Program.cs | 37 +++- Admin.Core/Properties/launchSettings.json | 2 +- Admin.Core/Startup.cs | 189 ++++++++++++------ Admin.Core/configs/appconfig.Development.json | 5 +- Admin.Core/configs/appconfig.json | 11 +- Admin.Core/configs/dbconfig.json | 18 +- Admin.Core/configs/jwtconfig.json | 10 +- Admin.Core/configs/logconfig.json | 6 +- Admin.Core/configs/uploadconfig.json | 8 +- Admin.Core/nlog.config | 9 +- 29 files changed, 438 insertions(+), 199 deletions(-) create mode 100644 Admin.Core.Common/Auth/ClaimAttributes.cs create mode 100644 Admin.Core.Common/Auth/UserIdentiyServer.cs create mode 100644 Admin.Core.Common/Extensions/DateTimeExtensions.cs diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 4ef64d126..cb8ad3955 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.4 + 1.4.0 xiaoxue xiaoxue 中台Admin后端通用库 @@ -22,20 +22,20 @@ - - - - - - - + + + + + + + - + - + diff --git a/Admin.Core.Common/Auth/ClaimAttributes.cs b/Admin.Core.Common/Auth/ClaimAttributes.cs new file mode 100644 index 000000000..38f494842 --- /dev/null +++ b/Admin.Core.Common/Auth/ClaimAttributes.cs @@ -0,0 +1,33 @@ +namespace Admin.Core.Common.Auth +{ + /// + /// Claim属性 + /// + public static class ClaimAttributes + { + /// + /// 用户Id + /// + public const string UserId = "id"; + + /// + /// 认证授权用户Id + /// + public const string IdentityServerUserId = "sub"; + + /// + /// 用户名 + /// + public const string UserName = "na"; + + /// + /// 姓名 + /// + public const string UserNickName = "nn"; + + /// + /// 刷新有效期 + /// + public const string RefreshExpires = "re"; + } +} diff --git a/Admin.Core.Common/Auth/User.cs b/Admin.Core.Common/Auth/User.cs index 4a023d261..989db75b3 100644 --- a/Admin.Core.Common/Auth/User.cs +++ b/Admin.Core.Common/Auth/User.cs @@ -18,7 +18,7 @@ public User(IHttpContextAccessor accessor) /// /// 用户Id /// - public long Id + public virtual long Id { get { @@ -67,30 +67,4 @@ public string NickName } } } - - /// - /// Claim属性 - /// - public static class ClaimAttributes - { - /// - /// 用户Id - /// - public const string UserId = "id"; - - /// - /// 用户名 - /// - public const string UserName = "na"; - - /// - /// 姓名 - /// - public const string UserNickName = "nn"; - - /// - /// 刷新有效期 - /// - public const string RefreshExpires = "re"; - } } diff --git a/Admin.Core.Common/Auth/UserIdentiyServer.cs b/Admin.Core.Common/Auth/UserIdentiyServer.cs new file mode 100644 index 000000000..400cd0e9f --- /dev/null +++ b/Admin.Core.Common/Auth/UserIdentiyServer.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Http; +using Admin.Core.Common.Helpers; + +namespace Admin.Core.Common.Auth +{ + /// + /// 用户信息 + /// + public class UserIdentiyServer : User + { + private readonly IHttpContextAccessor _accessor; + + public UserIdentiyServer(IHttpContextAccessor accessor) : base(accessor) + { + _accessor = accessor; + } + + /// + /// 用户Id + /// + public override long Id + { + get + { + var id = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.IdentityServerUserId); + if (id != null && id.Value.NotNull()) + { + return id.Value.ToLong(); + } + return 0; + } + } + } +} diff --git a/Admin.Core.Common/Auth/UserToken.cs b/Admin.Core.Common/Auth/UserToken.cs index 4f5d4d360..24d0dfcdc 100644 --- a/Admin.Core.Common/Auth/UserToken.cs +++ b/Admin.Core.Common/Auth/UserToken.cs @@ -7,6 +7,7 @@ using Admin.Core.Common.Configs; using Admin.Core.Common.Attributes; using System.Linq; +using Admin.Core.Common.Extensions; namespace Admin.Core.Common.Auth { @@ -24,8 +25,8 @@ public string Create(Claim[] claims) { var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtConfig.SecurityKey)); var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); - var refreshExpires = DateTime.Now.AddMinutes(_jwtConfig.RefreshExpires).ToString(); - claims = claims.Append(new Claim(ClaimAttributes.RefreshExpires, refreshExpires)).ToArray(); + var timestamp = DateTime.Now.AddMinutes(_jwtConfig.Expires + _jwtConfig.RefreshExpires).ToTimestamp().ToString(); + claims = claims.Append(new Claim(ClaimAttributes.RefreshExpires, timestamp)).ToArray(); var token = new JwtSecurityToken( issuer: _jwtConfig.Issuer, diff --git a/Admin.Core.Common/Configs/AppConfig.cs b/Admin.Core.Common/Configs/AppConfig.cs index 92ef16c24..b923060c4 100644 --- a/Admin.Core.Common/Configs/AppConfig.cs +++ b/Admin.Core.Common/Configs/AppConfig.cs @@ -6,20 +6,25 @@ public class AppConfig { /// - /// Api地址,默认 http://*:8888 + /// Api地址,默认 http://*:8000 /// - public string[] Urls { get; set; }// = new[]{ "http://*:8888" }; + public string[] Urls { get; set; }// = new[]{ "http://*:8000" }; /// - /// 跨域地址,默认 http://*:9999 + /// 跨域地址,默认 http://*:9000 /// - public string[] CorUrls { get; set; }// = new[]{ "http://*:9999" }; + public string[] CorUrls { get; set; }// = new[]{ "http://*:9000" }; /// /// Swagger文档 /// public bool Swagger { get; set; } = false; + /// + /// 统一认证授权服务器 + /// + public IdentityServer IdentityServer { get; set; } = new IdentityServer(); + /// /// Aop配置 /// @@ -41,6 +46,21 @@ public class AppConfig public VarifyCodeConfig VarifyCode { get; set; } = new VarifyCodeConfig(); } + /// + /// 统一认证授权服务器配置 + /// + public class IdentityServer + { + /// + /// 启用 + /// + public bool Enable { get; set; } = false; + /// + /// 地址 + /// + public string Url { get; set; } = "https://localhost:5000"; + } + /// /// Aop配置 /// diff --git a/Admin.Core.Common/Extensions/DateTimeExtensions.cs b/Admin.Core.Common/Extensions/DateTimeExtensions.cs new file mode 100644 index 000000000..e677d2292 --- /dev/null +++ b/Admin.Core.Common/Extensions/DateTimeExtensions.cs @@ -0,0 +1,36 @@ +using System; + +namespace Admin.Core.Common.Extensions +{ + public static class DateTimeExtensions + { + /// + /// 时间戳起始日期 + /// + public static DateTime TimestampStart = new DateTime(1970, 1, 1, 0, 0, 0, 0); + + /// + /// 转换为时间戳 + /// + /// + /// 是否使用毫秒 + /// + public static long ToTimestamp(this DateTime dateTime, bool milliseconds = false) + { + var timestamp = dateTime.ToUniversalTime() - TimestampStart; + return (long)(milliseconds ? timestamp.TotalMilliseconds : timestamp.TotalSeconds); + } + + /// + /// 获取周几 + /// + /// + /// + public static string GetWeekName(this DateTime datetime) + { + var day = (int)datetime.DayOfWeek; + var week = new string[] { "周日", "周一", "周二", "周三", "周四", "周五", "周六" }; + return week[day]; + } + } +} diff --git a/Admin.Core.Common/Helpers/IPHelper.cs b/Admin.Core.Common/Helpers/IPHelper.cs index 8b811bd79..188a0fe3d 100644 --- a/Admin.Core.Common/Helpers/IPHelper.cs +++ b/Admin.Core.Common/Helpers/IPHelper.cs @@ -38,7 +38,7 @@ public static string GetIP(HttpRequest request) { ip = request.HttpContext?.Connection?.RemoteIpAddress?.ToString(); } - if (ip.IsNull() || !IsIP(ip)) + if (ip.IsNull() || !IsIP(ip.Split(":")[0])) { ip = "127.0.0.1"; } diff --git a/Admin.Core.Common/Helpers/UtilConvert.cs b/Admin.Core.Common/Helpers/UtilConvert.cs index 3de304e7f..e703b53da 100644 --- a/Admin.Core.Common/Helpers/UtilConvert.cs +++ b/Admin.Core.Common/Helpers/UtilConvert.cs @@ -109,7 +109,7 @@ public static decimal ToDecimal(this object thisValue, decimal errorValue) return errorValue; } - public static DateTime ToDate(this object thisValue) + public static DateTime ToDateTime(this object thisValue) { DateTime reval = DateTime.MinValue; if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) @@ -119,7 +119,7 @@ public static DateTime ToDate(this object thisValue) return reval; } - public static DateTime ToDate(this object thisValue, DateTime errorValue) + public static DateTime ToDateTime(this object thisValue, DateTime errorValue) { DateTime reval; if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) @@ -128,7 +128,12 @@ public static DateTime ToDate(this object thisValue, DateTime errorValue) } return errorValue; } - + + public static DateTime ToDateTime(this long milliseconds) + { + return Extensions.DateTimeExtensions.TimestampStart.AddMilliseconds(milliseconds); + } + public static bool ToBool(this object thisValue) { bool reval = false; diff --git a/Admin.Core.Model/Admin.Core.Model.csproj b/Admin.Core.Model/Admin.Core.Model.csproj index a814dd2a5..a315c799a 100644 --- a/Admin.Core.Model/Admin.Core.Model.csproj +++ b/Admin.Core.Model/Admin.Core.Model.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.4 + 1.4.0 xiaoxue xiaoxue 中台Admin后端实体库 diff --git a/Admin.Core.Repository/Admin.Core.Repository.csproj b/Admin.Core.Repository/Admin.Core.Repository.csproj index 1a1fef0f5..2f6040f6d 100644 --- a/Admin.Core.Repository/Admin.Core.Repository.csproj +++ b/Admin.Core.Repository/Admin.Core.Repository.csproj @@ -2,7 +2,7 @@ netcoreapp3.1 - 1.3.4 + 1.4.0 xiaoxue xiaoxue 中台Admin后端仓储库 diff --git a/Admin.Core.Services/Admin.Core.Service.csproj b/Admin.Core.Services/Admin.Core.Service.csproj index 4964e5a90..f8cdf32d2 100644 --- a/Admin.Core.Services/Admin.Core.Service.csproj +++ b/Admin.Core.Services/Admin.Core.Service.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.3.4 + 1.4.0 xiaoxue xiaoxue 中台Admin后端服务库 @@ -30,8 +30,8 @@ - - + + diff --git a/Admin.Core/Admin.Core.Common.xml b/Admin.Core/Admin.Core.Common.xml index d9bd97602..851d2a497 100644 --- a/Admin.Core/Admin.Core.Common.xml +++ b/Admin.Core/Admin.Core.Common.xml @@ -24,6 +24,36 @@ 事务隔离级别 + + + Claim属性 + + + + + 用户Id + + + + + 认证授权用户Id + + + + + 用户名 + + + + + 姓名 + + + + + 刷新有效期 + + 用户信息接口 @@ -64,31 +94,16 @@ 昵称 - + - Claim属性 + 用户信息 - + 用户Id - - - 用户名 - - - - - 姓名 - - - - - 刷新有效期 - - 编号 @@ -362,12 +377,12 @@ - Api地址,默认 http://*:8888 + Api地址,默认 http://*:8000 - 跨域地址,默认 http://*:9999 + 跨域地址,默认 http://*:9000 @@ -375,6 +390,11 @@ Swagger文档 + + + 统一认证授权服务器 + + Aop配置 @@ -395,6 +415,21 @@ 验证码配置 + + + 统一认证授权服务器配置 + + + + + 启用 + + + + + 地址 + + Aop配置 @@ -605,6 +640,26 @@ 文件格式 + + + 时间戳起始日期 + + + + + 转换为时间戳 + + + 是否使用毫秒 + + + + + 获取周几 + + + + 判断Guid是否为空 diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index 5a3ae5167..422580765 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -5,7 +5,7 @@ OutOfProcess false - 1.3.4 + 1.4.0 MIT xiaoxue xiaoxue @@ -44,14 +44,14 @@ - + + - - - + + diff --git a/Admin.Core/Admin.Core.xml b/Admin.Core/Admin.Core.xml index 1fb379420..5119ad4fa 100644 --- a/Admin.Core/Admin.Core.xml +++ b/Admin.Core/Admin.Core.xml @@ -724,13 +724,12 @@ - + 添加数据库 - diff --git a/Admin.Core/Controllers/Admin/AuthController.cs b/Admin.Core/Controllers/Admin/AuthController.cs index 5c3c3bf0e..17bb5a3fc 100644 --- a/Admin.Core/Controllers/Admin/AuthController.cs +++ b/Admin.Core/Controllers/Admin/AuthController.cs @@ -16,6 +16,7 @@ using Admin.Core.Service.Admin.LoginLog.Input; using Admin.Core.Common.Helpers; using Admin.Core.Service.Admin.User; +using Admin.Core.Common.Extensions; namespace Admin.Core.Controllers.Admin { @@ -146,8 +147,6 @@ public async Task Login(AuthLoginInput input) return GetToken(output); } - - /// /// 刷新Token /// 以旧换新 @@ -164,14 +163,13 @@ public async Task Refresh([BindRequired] string token) return ResponseOutput.NotOk(); } - var refreshExpiresValue = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.RefreshExpires)?.Value; - if (refreshExpiresValue.IsNull()) + var refreshExpires = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.RefreshExpires)?.Value; + if (refreshExpires.IsNull()) { return ResponseOutput.NotOk(); } - var refreshExpires = refreshExpiresValue.ToDate(); - if(refreshExpires <= DateTime.Now) + if(refreshExpires.ToLong() <= DateTime.Now.ToTimestamp()) { return ResponseOutput.NotOk("登录信息已过期"); } diff --git a/Admin.Core/Db/Data/data.json b/Admin.Core/Db/Data/data.json index 8f176f62c..ebe10a225 100644 --- a/Admin.Core/Db/Data/data.json +++ b/Admin.Core/Db/Data/data.json @@ -1 +1 @@ -{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""},{"id":90,"parentId":78,"label":"上传文档图片","path":"/api/admin/document/uploadimage","httpMethods":"post","description":""},{"id":91,"parentId":78,"label":"查询文档图片列表","path":"/api/admin/document/getimagelist","httpMethods":"get","description":""},{"id":92,"parentId":78,"label":"删除图片","path":"/api/admin/document/deleteimage","httpMethods":"delete","description":""},{"id":93,"parentId":7,"label":"上传头像","path":"/api/admin/user/avatarupload","httpMethods":"post","description":""},{"id":94,"parentId":5,"label":"查询单条权限点","path":"/api/admin/permission/getdot","httpMethods":"get","description":""},{"id":95,"parentId":5,"label":"新增权限点","path":"/api/admin/permission/adddot","httpMethods":"post","description":""},{"id":96,"parentId":5,"label":"修改权限点","path":"/api/admin/permission/updatedot","httpMethods":"put","description":""},{"id":97,"parentId":2,"label":"刷新Token","path":"/api/admin/auth/refresh","httpMethods":"get","description":"以旧换新"}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","code":"api:admin:role:getpage","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","code":"api:admin:role:add","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","code":"api:admin:role:update","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","code":"api:admin:role:softdelete","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","code":"api:admin:role:batchsoftdelete","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","code":"api:admin:role:get","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","code":"api:admin:user:getpage","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","code":"api:admin:user:add","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","code":"api:admin:user:update","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","code":"api:admin:user:softdelete","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","code":"api:admin:user:batchsoftdelete","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","code":"api:admin:user:get","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","code":"api:admin:api:getlist","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","code":"api:admin:api:add","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","code":"api:admin:api:update","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","code":"api:admin:api:softdelete","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","code":"api:admin:api:batchsoftdelete","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","code":"api:admin:api:sync","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","code":"api:admin:api:get","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","code":"api:admin:permission:getlist","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","code":"api:admin:permission:addgroup","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","code":"api:admin:permission:addmenu","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","code":"api:admin:permission:addapi","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","code":"api:admin:permission:updategroup","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","code":"api:admin:permission:updatemenu","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","code":"api:admin:permission:updateapi","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","code":"api:admin:permission:softdelete","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","code":"api:admin:permission:getgroup","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","code":"api:admin:permission:getmenu","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","code":"api:admin:permission:getapi","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","code":"api:admin:role:getpage","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","code":"api:admin:permission:getpermissionlist","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","code":"api:admin:permission:getrolepermissionlist","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","code":"api:admin:permission:assign","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","code":"api:admin:user:getbasic","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","code":"api:admin:user:updatebasic","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","code":"api:admin:user:changepassword","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","code":"api:admin:dictionary:getpage","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","code":"api:admin:dictionary:add","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","code":"api:admin:dictionary:update","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","code":"api:admin:dictionary:softdelete","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","code":"api:admin:dictionary:get","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","code":"api:admin:view:getlist","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","code":"api:admin:view:add","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","code":"api:admin:view:update","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","code":"api:admin:view:softdelete","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","code":"api:admin:view:batchsoftdelete","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","code":"api:admin:view:sync","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","code":"api:admin:view:get","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","code":"api:admin:cache:list","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","code":"api:admin:cache:clear","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","code":"api:admin:oprationlog:getpage","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","code":"api:admin:loginlog:getpage","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","code":"api:admin:document:getplainlist","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","code":"api:admin:document:addgroup","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","code":"api:admin:document:addmenu","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","code":"api:admin:document:updategroup","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","code":"api:admin:document:updatemenu","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","code":"api:admin:document:softdelete","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","code":"api:admin:document:getgroup","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","code":"api:admin:document:getmenu","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","code":"api:admin:document:getlist","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","code":"api:admin:document:getcontent","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","code":"api:admin:document:updatecontent","type":3,"apiId":89,"sort":11,"description":""},{"id":93,"parentId":75,"label":"上传文档图片","code":"api:admin:document:uploadimage","type":3,"apiId":90,"sort":0,"description":""},{"id":94,"parentId":75,"label":"查询文档图片列表","code":"api:admin:document:getimagelist","type":3,"apiId":91,"sort":0,"description":""},{"id":95,"parentId":75,"label":"删除图片","code":"api:admin:document:deleteimage","type":3,"apiId":92,"sort":0,"description":""},{"id":96,"parentId":11,"label":"查询单条权限点","code":"api:admin:permission:getdot","type":3,"apiId":94,"sort":0,"description":""},{"id":97,"parentId":11,"label":"新增权限点","code":"api:admin:permission:adddot","type":3,"apiId":95,"sort":0,"description":""},{"id":98,"parentId":11,"label":"修改权限点","code":"api:admin:permission:updatedot","type":3,"apiId":96,"sort":0,"description":""}],"users":[{"id":1,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":2,"userName":"xiaoxue","password":"96E79218965EB72C92A549DD5A33112","nickName":"小雪转中雪","avatar":"2/14753102362214400.gif","remark":""},{"id":3,"userName":"jack","password":"96E79218965EB72C92A549DD5A33112","nickName":"杰克"}],"roles":[{"id":1,"name":"管理员","description":"演示"},{"id":2,"name":"系统管理员","description":""},{"id":3,"name":"文档管理员","description":""}],"userRoles":[{"id":1,"userId":1,"roleId":1},{"id":3,"userId":2,"roleId":2},{"id":9,"userId":3,"roleId":3}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":168,"roleId":1,"permissionId":94},{"id":192,"roleId":1,"permissionId":96},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92},{"id":167,"roleId":2,"permissionId":93},{"id":169,"roleId":2,"permissionId":94},{"id":170,"roleId":2,"permissionId":95},{"id":194,"roleId":2,"permissionId":96},{"id":193,"roleId":2,"permissionId":97},{"id":195,"roleId":2,"permissionId":98},{"id":173,"roleId":3,"permissionId":4},{"id":174,"roleId":3,"permissionId":47},{"id":189,"roleId":3,"permissionId":48},{"id":190,"roleId":3,"permissionId":49},{"id":191,"roleId":3,"permissionId":50},{"id":171,"roleId":3,"permissionId":66},{"id":172,"roleId":3,"permissionId":75},{"id":179,"roleId":3,"permissionId":76},{"id":182,"roleId":3,"permissionId":77},{"id":183,"roleId":3,"permissionId":78},{"id":184,"roleId":3,"permissionId":79},{"id":185,"roleId":3,"permissionId":80},{"id":186,"roleId":3,"permissionId":81},{"id":180,"roleId":3,"permissionId":82},{"id":181,"roleId":3,"permissionId":83},{"id":178,"roleId":3,"permissionId":90},{"id":187,"roleId":3,"permissionId":91},{"id":188,"roleId":3,"permissionId":92},{"id":176,"roleId":3,"permissionId":93},{"id":177,"roleId":3,"permissionId":94},{"id":175,"roleId":3,"permissionId":95}]} \ No newline at end of file +{"dictionaries":[],"apis":[{"id":1,"label":"接口管理","path":"api","description":""},{"id":2,"label":"授权管理","path":"auth","description":""},{"id":3,"label":"数据字典","path":"dictionary","description":""},{"id":5,"label":"权限管理","path":"permission","description":""},{"id":6,"label":"角色管理","path":"role","description":""},{"id":7,"label":"用户管理","path":"user","description":""},{"id":8,"label":"视图管理","path":"view","description":""},{"id":10,"parentId":1,"label":"查询单条接口","path":"/api/admin/api/get","httpMethods":"get","description":""},{"id":11,"parentId":1,"label":"查询全部接口","path":"/api/admin/api/getlist","httpMethods":"get","description":""},{"id":12,"parentId":1,"label":"查询分页接口","path":"/api/admin/api/getpage","httpMethods":"post","description":""},{"id":13,"parentId":1,"label":"新增接口","path":"/api/admin/api/add","httpMethods":"post","description":""},{"id":14,"parentId":1,"label":"修改接口","path":"/api/admin/api/update","httpMethods":"put","description":""},{"id":15,"parentId":1,"label":"删除接口","path":"/api/admin/api/softdelete","httpMethods":"delete","description":""},{"id":16,"parentId":1,"label":"批量删除接口","path":"/api/admin/api/batchsoftdelete","httpMethods":"put","description":""},{"id":17,"parentId":1,"label":"同步接口","path":"/api/admin/api/sync","httpMethods":"post","description":"支持新增和修改接口\r\n根据接口是否存在自动禁用和启用api"},{"id":18,"parentId":2,"label":"获取验证码","path":"/api/admin/auth/getverifycode","httpMethods":"get","description":""},{"id":19,"parentId":2,"label":"获取密钥","path":"/api/admin/auth/getpasswordencryptkey","httpMethods":"get","description":""},{"id":20,"parentId":2,"label":"查询用户信息","path":"/api/admin/auth/getuserinfo","httpMethods":"get","description":""},{"id":21,"parentId":2,"label":"用户登录","path":"/api/admin/auth/login","httpMethods":"post","description":"根据登录信息生成Token"},{"id":22,"parentId":3,"label":"查询单条数据字典","path":"/api/admin/dictionary/get","httpMethods":"get","description":""},{"id":23,"parentId":3,"label":"查询分页数据字典","path":"/api/admin/dictionary/getpage","httpMethods":"post","description":""},{"id":24,"parentId":3,"label":"新增数据字典","path":"/api/admin/dictionary/add","httpMethods":"post","description":""},{"id":25,"parentId":3,"label":"修改数据字典","path":"/api/admin/dictionary/update","httpMethods":"put","description":""},{"id":26,"parentId":3,"label":"删除数据字典","path":"/api/admin/dictionary/softdelete","httpMethods":"delete","description":""},{"id":31,"parentId":5,"label":"查询权限列表","path":"/api/admin/permission/getlist","httpMethods":"get","description":""},{"id":32,"parentId":5,"label":"查询单条分组","path":"/api/admin/permission/getgroup","httpMethods":"get","description":""},{"id":33,"parentId":5,"label":"查询单条菜单","path":"/api/admin/permission/getmenu","httpMethods":"get","description":""},{"id":34,"parentId":5,"label":"查询单条接口","path":"/api/admin/permission/getapi","httpMethods":"get","description":""},{"id":35,"parentId":5,"label":"查询角色权限-权限列表","path":"/api/admin/permission/getpermissionlist","httpMethods":"get","description":""},{"id":36,"parentId":5,"label":"查询角色权限","path":"/api/admin/permission/getrolepermissionlist","httpMethods":"get","description":""},{"id":37,"parentId":5,"label":"新增分组","path":"/api/admin/permission/addgroup","httpMethods":"post","description":""},{"id":38,"parentId":5,"label":"新增菜单","path":"/api/admin/permission/addmenu","httpMethods":"post","description":""},{"id":39,"parentId":5,"label":"新增接口","path":"/api/admin/permission/addapi","httpMethods":"post","description":""},{"id":40,"parentId":5,"label":"修改分组","path":"/api/admin/permission/updategroup","httpMethods":"put","description":""},{"id":41,"parentId":5,"label":"修改菜单","path":"/api/admin/permission/updatemenu","httpMethods":"put","description":""},{"id":42,"parentId":5,"label":"修改接口","path":"/api/admin/permission/updateapi","httpMethods":"put","description":""},{"id":43,"parentId":5,"label":"删除权限","path":"/api/admin/permission/softdelete","httpMethods":"delete","description":""},{"id":44,"parentId":5,"label":"保存角色权限","path":"/api/admin/permission/assign","httpMethods":"post","description":""},{"id":45,"parentId":6,"label":"查询单条角色","path":"/api/admin/role/get","httpMethods":"get","description":""},{"id":46,"parentId":6,"label":"查询分页角色","path":"/api/admin/role/getpage","httpMethods":"post","description":""},{"id":47,"parentId":6,"label":"新增角色","path":"/api/admin/role/add","httpMethods":"post","description":""},{"id":48,"parentId":6,"label":"修改角色","path":"/api/admin/role/update","httpMethods":"put","description":""},{"id":49,"parentId":6,"label":"删除角色","path":"/api/admin/role/softdelete","httpMethods":"delete","description":""},{"id":50,"parentId":6,"label":"批量删除角色","path":"/api/admin/role/batchsoftdelete","httpMethods":"put","description":""},{"id":51,"parentId":7,"label":"查询用户基本信息","path":"/api/admin/user/getbasic","httpMethods":"get","description":""},{"id":52,"parentId":7,"label":"查询单条用户","path":"/api/admin/user/get","httpMethods":"get","description":""},{"id":53,"parentId":7,"label":"查询分页用户","path":"/api/admin/user/getpage","httpMethods":"post","description":""},{"id":54,"parentId":7,"label":"新增用户","path":"/api/admin/user/add","httpMethods":"post","description":""},{"id":55,"parentId":7,"label":"修改用户","path":"/api/admin/user/update","httpMethods":"put","description":""},{"id":56,"parentId":7,"label":"删除用户","path":"/api/admin/user/softdelete","httpMethods":"delete","description":""},{"id":57,"parentId":7,"label":"批量删除用户","path":"/api/admin/user/batchsoftdelete","httpMethods":"put","description":""},{"id":58,"parentId":7,"label":"更新用户密码","path":"/api/admin/user/changepassword","httpMethods":"put","description":""},{"id":59,"parentId":7,"label":"更新用户基本信息","path":"/api/admin/user/updatebasic","httpMethods":"put","description":""},{"id":60,"parentId":8,"label":"查询单条视图","path":"/api/admin/view/get","httpMethods":"get","description":""},{"id":61,"parentId":8,"label":"查询全部视图","path":"/api/admin/view/getlist","httpMethods":"get","description":""},{"id":62,"parentId":8,"label":"查询分页视图","path":"/api/admin/view/getpage","httpMethods":"post","description":""},{"id":63,"parentId":8,"label":"新增视图","path":"/api/admin/view/add","httpMethods":"post","description":""},{"id":64,"parentId":8,"label":"修改视图","path":"/api/admin/view/update","httpMethods":"put","description":""},{"id":65,"parentId":8,"label":"删除视图","path":"/api/admin/view/softdelete","httpMethods":"delete","description":""},{"id":66,"parentId":8,"label":"批量删除视图","path":"/api/admin/view/batchsoftdelete","httpMethods":"put","description":""},{"id":67,"parentId":8,"label":"同步视图","path":"/api/admin/view/sync","httpMethods":"post","description":"支持新增和修改视图\r\n根据视图是否存在自动禁用和启用视图"},{"id":70,"label":"缓存管理","path":"cache","description":""},{"id":71,"parentId":70,"label":"获取缓存列表","path":"/api/admin/cache/list","httpMethods":"get","description":""},{"id":72,"parentId":70,"label":"清除缓存","path":"/api/admin/cache/clear","httpMethods":"delete","description":""},{"id":73,"label":"登录日志管理","path":"loginlog","description":""},{"id":74,"label":"操作日志管理","path":"oprationlog","description":""},{"id":75,"parentId":73,"label":"查询分页登录日志","path":"/api/admin/loginlog/getpage","httpMethods":"post","description":""},{"id":76,"parentId":74,"label":"查询分页操作日志","path":"/api/admin/oprationlog/getpage","httpMethods":"post","description":""},{"id":78,"label":"文档管理","path":"document","description":""},{"id":79,"parentId":78,"label":"查询文档列表","path":"/api/admin/document/getlist","httpMethods":"get","description":""},{"id":80,"parentId":78,"label":"查询单条分组","path":"/api/admin/document/getgroup","httpMethods":"get","description":""},{"id":81,"parentId":78,"label":"查询单条菜单","path":"/api/admin/document/getmenu","httpMethods":"get","description":""},{"id":82,"parentId":78,"label":"查询精简文档列表","path":"/api/admin/document/getplainlist","httpMethods":"get","description":""},{"id":83,"parentId":78,"label":"新增分组","path":"/api/admin/document/addgroup","httpMethods":"post","description":""},{"id":84,"parentId":78,"label":"新增菜单","path":"/api/admin/document/addmenu","httpMethods":"post","description":""},{"id":85,"parentId":78,"label":"修改分组","path":"/api/admin/document/updategroup","httpMethods":"put","description":""},{"id":86,"parentId":78,"label":"修改菜单","path":"/api/admin/document/updatemenu","httpMethods":"put","description":""},{"id":87,"parentId":78,"label":"删除文档","path":"/api/admin/document/softdelete","httpMethods":"delete","description":""},{"id":88,"parentId":78,"label":"查询单条文档内容","path":"/api/admin/document/getcontent","httpMethods":"get","description":""},{"id":89,"parentId":78,"label":"修改文档内容","path":"/api/admin/document/updatecontent","httpMethods":"put","description":""},{"id":90,"parentId":78,"label":"上传文档图片","path":"/api/admin/document/uploadimage","httpMethods":"post","description":""},{"id":91,"parentId":78,"label":"查询文档图片列表","path":"/api/admin/document/getimagelist","httpMethods":"get","description":""},{"id":92,"parentId":78,"label":"删除图片","path":"/api/admin/document/deleteimage","httpMethods":"delete","description":""},{"id":93,"parentId":7,"label":"上传头像","path":"/api/admin/user/avatarupload","httpMethods":"post","description":""},{"id":94,"parentId":5,"label":"查询单条权限点","path":"/api/admin/permission/getdot","httpMethods":"get","description":""},{"id":95,"parentId":5,"label":"新增权限点","path":"/api/admin/permission/adddot","httpMethods":"post","description":""},{"id":96,"parentId":5,"label":"修改权限点","path":"/api/admin/permission/updatedot","httpMethods":"put","description":""},{"id":97,"parentId":2,"label":"刷新Token","path":"/api/admin/auth/refresh","httpMethods":"get","description":"以旧换新"}],"views":[{"id":1,"parentId":2,"label":"首页","path":"/admin/home","sort":1},{"id":2,"label":"平台管理","path":"admin","sort":1},{"id":3,"parentId":14,"name":"user","label":"用户管理","path":"/admin/user","sort":1},{"id":4,"parentId":14,"name":"role","label":"角色管理","path":"/admin/role","sort":2},{"id":5,"parentId":14,"name":"api","label":"接口管理","path":"/admin/api","sort":3},{"id":6,"parentId":14,"name":"v","label":"视图管理","path":"/admin/view","sort":4},{"id":7,"parentId":14,"name":"permission","label":"权限管理","path":"/admin/permission","sort":5},{"id":8,"parentId":14,"name":"assign","label":"角色权限","path":"/admin/role-permission","sort":6},{"id":9,"parentId":2,"label":"系统配置","path":"config","sort":3},{"id":10,"parentId":9,"name":"dictonary","label":"数据字典","path":"/admin/dictionary","sort":1},{"id":11,"parentId":15,"name":"log","label":"操作日志","path":"/admin/opration-log","description":"","sort":2},{"id":12,"parentId":2,"label":"个人管理","path":"account","sort":5},{"id":13,"parentId":12,"name":"settings","label":"个人设置","path":"/account/settings","sort":1},{"id":14,"parentId":2,"label":"权限管理","path":"auth","description":"","sort":2},{"id":15,"parentId":2,"label":"日志管理","path":"logs","description":"","sort":4},{"id":16,"parentId":14,"label":"缓存管理","path":"/admin/cache","description":"","sort":7},{"id":17,"parentId":15,"label":"登录日志","path":"/admin/login-log","description":"","sort":1},{"id":18,"parentId":2,"label":"文档管理","path":"/admin/document","description":""}],"permissions":[{"id":1,"parentId":65,"label":"更新日志","type":2,"viewId":1,"path":"/","icon":"el-icon-notebook-2","closable":false,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":2,"parentId":65,"label":"权限管理","type":1,"path":"","icon":"fa fa-sitemap","closable":false,"opened":false,"sort":2,"description":""},{"id":3,"parentId":65,"label":"系统配置","type":1,"path":"","icon":"el-icon-s-platform","closable":false,"opened":false,"sort":3,"description":""},{"id":4,"label":"个人管理","type":1,"path":"","icon":"el-icon-s-custom","closable":false,"opened":false,"sort":2,"description":""},{"id":5,"parentId":66,"label":"Admin","type":2,"path":"https://zhontai.net","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":5,"description":""},{"id":6,"parentId":66,"label":"FreeSql","type":2,"path":"https://github.com/dotnetcore/FreeSql/wiki","icon":"el-icon-s-promotion","closable":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":7,"parentId":2,"label":"用户管理","type":2,"viewId":3,"path":"/admin/user","closable":true,"opened":false,"newWindow":false,"external":true,"sort":1,"description":""},{"id":8,"parentId":2,"label":"角色管理","type":2,"viewId":4,"path":"/admin/role","icon":"","closable":true,"opened":false,"sort":2,"description":""},{"id":9,"parentId":2,"label":"接口管理","type":2,"viewId":5,"path":"/admin/api","closable":true,"opened":false,"sort":3,"description":""},{"id":10,"parentId":2,"label":"视图管理","type":2,"viewId":6,"path":"/admin/view","icon":"","closable":true,"sort":4,"description":""},{"id":11,"parentId":2,"label":"权限管理","type":2,"viewId":7,"path":"/admin/permission","closable":true,"opened":false,"sort":5,"description":""},{"id":12,"parentId":2,"label":"角色权限","type":2,"viewId":8,"path":"/admin/role-permisson","closable":true,"opened":false,"newWindow":false,"external":false,"sort":6,"description":""},{"id":13,"parentId":8,"label":"查询","code":"api:admin:role:getpage","type":3,"apiId":46,"path":" ","closable":false,"opened":false,"sort":1,"description":""},{"id":14,"parentId":8,"label":"新增","code":"api:admin:role:add","type":3,"apiId":47,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":15,"parentId":8,"label":"修改","code":"api:admin:role:update","type":3,"apiId":48,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":16,"parentId":8,"label":"删除","code":"api:admin:role:softdelete","type":3,"apiId":49,"path":" ","closable":true,"opened":false,"sort":4,"description":""},{"id":17,"parentId":8,"label":"批量删除","code":"api:admin:role:batchsoftdelete","type":3,"apiId":50,"path":" ","icon":"","closable":false,"opened":false,"sort":5,"description":""},{"id":18,"parentId":8,"label":"查询单条角色","code":"api:admin:role:get","type":3,"apiId":45,"sort":6,"description":""},{"id":19,"parentId":7,"label":"查询","code":"api:admin:user:getpage","type":3,"apiId":53,"path":"","closable":true,"opened":false,"sort":1,"description":""},{"id":20,"parentId":7,"label":"新增","code":"api:admin:user:add","type":3,"apiId":54,"path":"","closable":false,"opened":false,"sort":2,"description":""},{"id":21,"parentId":7,"label":"修改","code":"api:admin:user:update","type":3,"apiId":55,"path":"","closable":true,"opened":false,"sort":3,"description":""},{"id":22,"parentId":7,"label":"删除","code":"api:admin:user:softdelete","type":3,"apiId":56,"path":"","closable":true,"opened":false,"sort":4,"description":""},{"id":23,"parentId":7,"label":"批量删除","code":"api:admin:user:batchsoftdelete","type":3,"apiId":57,"path":"","icon":"","sort":5,"description":""},{"id":24,"parentId":7,"label":"查询单条用户","code":"api:admin:user:get","type":3,"apiId":52,"sort":6,"description":""},{"id":25,"parentId":9,"label":"查询","code":"api:admin:api:getlist","type":3,"apiId":11,"path":"","icon":"","sort":1,"description":""},{"id":26,"parentId":9,"label":"新增","code":"api:admin:api:add","type":3,"apiId":13,"path":" ","closable":false,"opened":false,"sort":2,"description":""},{"id":27,"parentId":9,"label":"修改","code":"api:admin:api:update","type":3,"apiId":14,"path":" ","closable":false,"opened":false,"sort":3,"description":""},{"id":28,"parentId":9,"label":"删除","code":"api:admin:api:softdelete","type":3,"apiId":15,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":29,"parentId":9,"label":"批量删除","code":"api:admin:api:batchsoftdelete","type":3,"apiId":16,"path":"","icon":"","sort":5,"description":""},{"id":30,"parentId":9,"label":"同步","code":"api:admin:api:sync","type":3,"apiId":17,"path":"","icon":"","sort":6,"description":""},{"id":31,"parentId":9,"label":"查询单条接口","code":"api:admin:api:get","type":3,"apiId":10,"sort":7,"description":""},{"id":32,"parentId":11,"label":"查询","code":"api:admin:permission:getlist","type":3,"apiId":31,"path":"","icon":"","sort":1,"description":""},{"id":33,"parentId":11,"label":"新增分组","code":"api:admin:permission:addgroup","type":3,"apiId":37,"sort":2,"description":""},{"id":34,"parentId":11,"label":"新增菜单","code":"api:admin:permission:addmenu","type":3,"apiId":38,"sort":3,"description":""},{"id":35,"parentId":11,"label":"新增接口","code":"api:admin:permission:addapi","type":3,"apiId":39,"sort":4,"description":""},{"id":36,"parentId":11,"label":"修改分组","code":"api:admin:permission:updategroup","type":3,"apiId":40,"sort":5,"description":""},{"id":37,"parentId":11,"label":"修改菜单","code":"api:admin:permission:updatemenu","type":3,"apiId":41,"sort":6,"description":""},{"id":38,"parentId":11,"label":"修改接口","code":"api:admin:permission:updateapi","type":3,"apiId":42,"sort":7,"description":""},{"id":39,"parentId":11,"label":"删除","code":"api:admin:permission:softdelete","type":3,"apiId":43,"path":" ","closable":false,"opened":false,"sort":8,"description":""},{"id":40,"parentId":11,"label":"查询单条分组","code":"api:admin:permission:getgroup","type":3,"apiId":32,"sort":9,"description":""},{"id":41,"parentId":11,"label":"查询单条菜单","code":"api:admin:permission:getmenu","type":3,"apiId":33,"sort":10,"description":""},{"id":42,"parentId":11,"label":"查询单条接口","code":"api:admin:permission:getapi","type":3,"apiId":34,"sort":11,"description":""},{"id":43,"parentId":12,"label":"查询角色","code":"api:admin:role:getpage","type":3,"apiId":46,"path":"","icon":"","sort":1,"description":""},{"id":44,"parentId":12,"label":"查询权限","code":"api:admin:permission:getpermissionlist","type":3,"apiId":35,"path":"","icon":"","sort":2,"description":""},{"id":45,"parentId":12,"label":"查询角色权限","code":"api:admin:permission:getrolepermissionlist","type":3,"apiId":36,"path":"","icon":"","sort":3,"description":""},{"id":46,"parentId":12,"label":"保存角色权限","code":"api:admin:permission:assign","type":3,"apiId":44,"path":" ","closable":false,"opened":false,"sort":4,"description":""},{"id":47,"parentId":4,"label":"个人设置","type":2,"viewId":13,"path":"/account/settings","icon":"el-icon-setting","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":48,"parentId":47,"label":"查询基本信息","code":"api:admin:user:getbasic","type":3,"apiId":51,"path":"","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":49,"parentId":47,"label":"更新基本信息","code":"api:admin:user:updatebasic","type":3,"apiId":59,"sort":2,"description":""},{"id":50,"parentId":47,"label":"更新密码","code":"api:admin:user:changepassword","type":3,"apiId":58,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":51,"parentId":3,"label":"基础数据","type":1,"icon":"fa fa-database","opened":false,"sort":1},{"id":52,"parentId":64,"label":"查询","code":"api:admin:dictionary:getpage","type":3,"apiId":23,"path":" ","icon":"","closable":false,"opened":false,"sort":1,"description":""},{"id":53,"parentId":64,"label":"新增","code":"api:admin:dictionary:add","type":3,"apiId":24,"path":" ","icon":"","closable":false,"opened":false,"sort":2,"description":""},{"id":54,"parentId":64,"label":"修改","code":"api:admin:dictionary:update","type":3,"apiId":25,"path":" ","icon":"","closable":false,"opened":false,"sort":3,"description":""},{"id":55,"parentId":64,"label":"删除","code":"api:admin:dictionary:softdelete","type":3,"apiId":26,"path":" ","icon":"","closable":false,"opened":false,"sort":4,"description":""},{"id":56,"parentId":64,"label":"查询单条数据字典","code":"api:admin:dictionary:get","type":3,"apiId":22,"sort":5,"description":""},{"id":57,"parentId":10,"label":"查询","code":"api:admin:view:getlist","type":3,"apiId":61,"sort":1,"description":""},{"id":58,"parentId":10,"label":"新增","code":"api:admin:view:add","type":3,"apiId":63,"sort":2,"description":""},{"id":59,"parentId":10,"label":"修改","code":"api:admin:view:update","type":3,"apiId":64,"sort":3,"description":""},{"id":60,"parentId":10,"label":"删除","code":"api:admin:view:softdelete","type":3,"apiId":65,"sort":4,"description":""},{"id":61,"parentId":10,"label":"批量删除","code":"api:admin:view:batchsoftdelete","type":3,"apiId":66,"sort":5,"description":""},{"id":62,"parentId":10,"label":"同步","code":"api:admin:view:sync","type":3,"apiId":67,"sort":6,"description":""},{"id":63,"parentId":10,"label":"查询单条视图","code":"api:admin:view:get","type":3,"apiId":60,"sort":7,"description":""},{"id":64,"parentId":3,"label":"树形字典","type":2,"viewId":10,"path":"/admin/dictionary","icon":"fa fa-database","closable":true,"opened":false,"newWindow":false,"external":false,"sort":1,"description":""},{"id":65,"label":"平台管理","type":1,"icon":"el-icon-s-platform","opened":true,"sort":1},{"id":66,"label":"帮助文档","type":1,"icon":"el-icon-question","opened":true,"sort":3},{"id":67,"parentId":2,"label":"缓存管理","type":2,"viewId":16,"path":"/admin/cache","icon":"","closable":true,"newWindow":false,"external":false,"sort":7,"description":""},{"id":68,"parentId":67,"label":"获取缓存列表","code":"api:admin:cache:list","type":3,"apiId":71,"sort":1,"description":""},{"id":69,"parentId":67,"label":"清除缓存","code":"api:admin:cache:clear","type":3,"apiId":72,"sort":2,"description":""},{"id":70,"parentId":65,"label":"日志管理","type":1,"icon":"el-icon-notebook-2","opened":true,"sort":4},{"id":71,"parentId":70,"label":"登录日志","type":2,"viewId":17,"path":"/admin/login-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":1,"description":""},{"id":72,"parentId":70,"label":"操作日志","type":2,"viewId":11,"path":"/admin/opration-log","icon":"","closable":true,"newWindow":false,"external":false,"sort":2,"description":""},{"id":73,"parentId":72,"label":"查询分页操作日志","code":"api:admin:oprationlog:getpage","type":3,"apiId":76,"sort":1,"description":""},{"id":74,"parentId":71,"label":"查询分页登录日志","code":"api:admin:loginlog:getpage","type":3,"apiId":75,"sort":1,"description":""},{"id":75,"parentId":66,"label":"文档管理","type":2,"viewId":18,"path":"/admin/document","icon":"el-icon-notebook-2","closable":true,"newWindow":false,"external":true,"sort":0,"description":""},{"id":76,"parentId":75,"label":"查询精简文档列表","code":"api:admin:document:getplainlist","type":3,"apiId":82,"sort":2,"description":""},{"id":77,"parentId":75,"label":"新增分组","code":"api:admin:document:addgroup","type":3,"apiId":83,"sort":5,"description":""},{"id":78,"parentId":75,"label":"新增菜单","code":"api:admin:document:addmenu","type":3,"apiId":84,"sort":6,"description":""},{"id":79,"parentId":75,"label":"修改分组","code":"api:admin:document:updategroup","type":3,"apiId":85,"sort":7,"description":""},{"id":80,"parentId":75,"label":"修改菜单","code":"api:admin:document:updatemenu","type":3,"apiId":86,"sort":8,"description":""},{"id":81,"parentId":75,"label":"删除文档","code":"api:admin:document:softdelete","type":3,"apiId":87,"sort":9,"description":""},{"id":82,"parentId":75,"label":"查询单条分组","code":"api:admin:document:getgroup","type":3,"apiId":80,"sort":3,"description":""},{"id":83,"parentId":75,"label":"查询单条菜单","code":"api:admin:document:getmenu","type":3,"apiId":81,"sort":4,"description":""},{"id":90,"parentId":75,"label":"查询文档列表","code":"api:admin:document:getlist","type":3,"apiId":79,"sort":1,"description":""},{"id":91,"parentId":75,"label":"查询单条文档内容","code":"api:admin:document:getcontent","type":3,"apiId":88,"sort":10,"description":""},{"id":92,"parentId":75,"label":"修改文档内容","code":"api:admin:document:updatecontent","type":3,"apiId":89,"sort":11,"description":""},{"id":93,"parentId":75,"label":"上传文档图片","code":"api:admin:document:uploadimage","type":3,"apiId":90,"sort":0,"description":""},{"id":94,"parentId":75,"label":"查询文档图片列表","code":"api:admin:document:getimagelist","type":3,"apiId":91,"sort":0,"description":""},{"id":95,"parentId":75,"label":"删除图片","code":"api:admin:document:deleteimage","type":3,"apiId":92,"sort":0,"description":""},{"id":96,"parentId":11,"label":"查询单条权限点","code":"api:admin:permission:getdot","type":3,"apiId":94,"sort":0,"description":""},{"id":97,"parentId":11,"label":"新增权限点","code":"api:admin:permission:adddot","type":3,"apiId":95,"sort":0,"description":""},{"id":98,"parentId":11,"label":"修改权限点","code":"api:admin:permission:updatedot","type":3,"apiId":96,"sort":0,"description":""}],"users":[{"id":1,"userName":"user","password":"96E79218965EB72C92A549DD5A33112","nickName":"平台用户","avatar":"","remark":""},{"id":2,"userName":"admin","password":"96E79218965EB72C92A549DD5A33112","nickName":"管理员","avatar":"","remark":""},{"id":3,"userName":"jack","password":"96E79218965EB72C92A549DD5A33112","nickName":"杰克"}],"roles":[{"id":1,"name":"平台用户","description":"演示"},{"id":2,"name":"系统管理员","description":""},{"id":3,"name":"文档管理员","description":""}],"userRoles":[{"id":10,"userId":1,"roleId":1},{"id":3,"userId":2,"roleId":2},{"id":9,"userId":3,"roleId":3}],"rolePermissions":[{"id":104,"roleId":1,"permissionId":1},{"id":66,"roleId":1,"permissionId":2},{"id":67,"roleId":1,"permissionId":3},{"id":68,"roleId":1,"permissionId":4},{"id":69,"roleId":1,"permissionId":5},{"id":70,"roleId":1,"permissionId":6},{"id":71,"roleId":1,"permissionId":7},{"id":72,"roleId":1,"permissionId":8},{"id":73,"roleId":1,"permissionId":9},{"id":74,"roleId":1,"permissionId":10},{"id":75,"roleId":1,"permissionId":11},{"id":76,"roleId":1,"permissionId":12},{"id":77,"roleId":1,"permissionId":13},{"id":78,"roleId":1,"permissionId":18},{"id":79,"roleId":1,"permissionId":19},{"id":80,"roleId":1,"permissionId":24},{"id":81,"roleId":1,"permissionId":25},{"id":82,"roleId":1,"permissionId":31},{"id":83,"roleId":1,"permissionId":32},{"id":84,"roleId":1,"permissionId":40},{"id":85,"roleId":1,"permissionId":41},{"id":86,"roleId":1,"permissionId":42},{"id":87,"roleId":1,"permissionId":43},{"id":88,"roleId":1,"permissionId":44},{"id":89,"roleId":1,"permissionId":45},{"id":90,"roleId":1,"permissionId":47},{"id":91,"roleId":1,"permissionId":48},{"id":92,"roleId":1,"permissionId":51},{"id":93,"roleId":1,"permissionId":52},{"id":98,"roleId":1,"permissionId":53},{"id":99,"roleId":1,"permissionId":54},{"id":100,"roleId":1,"permissionId":55},{"id":94,"roleId":1,"permissionId":56},{"id":95,"roleId":1,"permissionId":57},{"id":96,"roleId":1,"permissionId":63},{"id":97,"roleId":1,"permissionId":64},{"id":103,"roleId":1,"permissionId":65},{"id":131,"roleId":1,"permissionId":66},{"id":136,"roleId":1,"permissionId":67},{"id":137,"roleId":1,"permissionId":68},{"id":143,"roleId":1,"permissionId":70},{"id":144,"roleId":1,"permissionId":71},{"id":145,"roleId":1,"permissionId":72},{"id":147,"roleId":1,"permissionId":73},{"id":146,"roleId":1,"permissionId":74},{"id":156,"roleId":1,"permissionId":75},{"id":157,"roleId":1,"permissionId":76},{"id":160,"roleId":1,"permissionId":82},{"id":161,"roleId":1,"permissionId":83},{"id":163,"roleId":1,"permissionId":90},{"id":166,"roleId":1,"permissionId":91},{"id":168,"roleId":1,"permissionId":94},{"id":192,"roleId":1,"permissionId":96},{"id":102,"roleId":2,"permissionId":1},{"id":2,"roleId":2,"permissionId":2},{"id":3,"roleId":2,"permissionId":3},{"id":4,"roleId":2,"permissionId":4},{"id":5,"roleId":2,"permissionId":5},{"id":6,"roleId":2,"permissionId":6},{"id":7,"roleId":2,"permissionId":7},{"id":8,"roleId":2,"permissionId":8},{"id":9,"roleId":2,"permissionId":9},{"id":10,"roleId":2,"permissionId":10},{"id":11,"roleId":2,"permissionId":11},{"id":12,"roleId":2,"permissionId":12},{"id":13,"roleId":2,"permissionId":13},{"id":14,"roleId":2,"permissionId":14},{"id":15,"roleId":2,"permissionId":15},{"id":16,"roleId":2,"permissionId":16},{"id":17,"roleId":2,"permissionId":17},{"id":18,"roleId":2,"permissionId":18},{"id":19,"roleId":2,"permissionId":19},{"id":20,"roleId":2,"permissionId":20},{"id":21,"roleId":2,"permissionId":21},{"id":22,"roleId":2,"permissionId":22},{"id":23,"roleId":2,"permissionId":23},{"id":24,"roleId":2,"permissionId":24},{"id":25,"roleId":2,"permissionId":25},{"id":26,"roleId":2,"permissionId":26},{"id":27,"roleId":2,"permissionId":27},{"id":28,"roleId":2,"permissionId":28},{"id":29,"roleId":2,"permissionId":29},{"id":30,"roleId":2,"permissionId":30},{"id":31,"roleId":2,"permissionId":31},{"id":32,"roleId":2,"permissionId":32},{"id":33,"roleId":2,"permissionId":33},{"id":34,"roleId":2,"permissionId":34},{"id":35,"roleId":2,"permissionId":35},{"id":36,"roleId":2,"permissionId":36},{"id":37,"roleId":2,"permissionId":37},{"id":38,"roleId":2,"permissionId":38},{"id":39,"roleId":2,"permissionId":39},{"id":40,"roleId":2,"permissionId":40},{"id":41,"roleId":2,"permissionId":41},{"id":42,"roleId":2,"permissionId":42},{"id":43,"roleId":2,"permissionId":43},{"id":44,"roleId":2,"permissionId":44},{"id":45,"roleId":2,"permissionId":45},{"id":46,"roleId":2,"permissionId":46},{"id":47,"roleId":2,"permissionId":47},{"id":48,"roleId":2,"permissionId":48},{"id":49,"roleId":2,"permissionId":49},{"id":50,"roleId":2,"permissionId":50},{"id":51,"roleId":2,"permissionId":51},{"id":52,"roleId":2,"permissionId":52},{"id":53,"roleId":2,"permissionId":53},{"id":54,"roleId":2,"permissionId":54},{"id":55,"roleId":2,"permissionId":55},{"id":56,"roleId":2,"permissionId":56},{"id":57,"roleId":2,"permissionId":57},{"id":58,"roleId":2,"permissionId":58},{"id":59,"roleId":2,"permissionId":59},{"id":60,"roleId":2,"permissionId":60},{"id":61,"roleId":2,"permissionId":61},{"id":62,"roleId":2,"permissionId":62},{"id":63,"roleId":2,"permissionId":63},{"id":64,"roleId":2,"permissionId":64},{"id":101,"roleId":2,"permissionId":65},{"id":132,"roleId":2,"permissionId":66},{"id":133,"roleId":2,"permissionId":67},{"id":134,"roleId":2,"permissionId":68},{"id":135,"roleId":2,"permissionId":69},{"id":138,"roleId":2,"permissionId":70},{"id":139,"roleId":2,"permissionId":71},{"id":140,"roleId":2,"permissionId":72},{"id":142,"roleId":2,"permissionId":73},{"id":141,"roleId":2,"permissionId":74},{"id":148,"roleId":2,"permissionId":75},{"id":150,"roleId":2,"permissionId":76},{"id":151,"roleId":2,"permissionId":77},{"id":152,"roleId":2,"permissionId":78},{"id":153,"roleId":2,"permissionId":79},{"id":154,"roleId":2,"permissionId":80},{"id":155,"roleId":2,"permissionId":81},{"id":158,"roleId":2,"permissionId":82},{"id":159,"roleId":2,"permissionId":83},{"id":162,"roleId":2,"permissionId":90},{"id":165,"roleId":2,"permissionId":91},{"id":164,"roleId":2,"permissionId":92},{"id":167,"roleId":2,"permissionId":93},{"id":169,"roleId":2,"permissionId":94},{"id":170,"roleId":2,"permissionId":95},{"id":194,"roleId":2,"permissionId":96},{"id":193,"roleId":2,"permissionId":97},{"id":195,"roleId":2,"permissionId":98},{"id":173,"roleId":3,"permissionId":4},{"id":174,"roleId":3,"permissionId":47},{"id":189,"roleId":3,"permissionId":48},{"id":190,"roleId":3,"permissionId":49},{"id":191,"roleId":3,"permissionId":50},{"id":171,"roleId":3,"permissionId":66},{"id":172,"roleId":3,"permissionId":75},{"id":179,"roleId":3,"permissionId":76},{"id":182,"roleId":3,"permissionId":77},{"id":183,"roleId":3,"permissionId":78},{"id":184,"roleId":3,"permissionId":79},{"id":185,"roleId":3,"permissionId":80},{"id":186,"roleId":3,"permissionId":81},{"id":180,"roleId":3,"permissionId":82},{"id":181,"roleId":3,"permissionId":83},{"id":178,"roleId":3,"permissionId":90},{"id":187,"roleId":3,"permissionId":91},{"id":188,"roleId":3,"permissionId":92},{"id":176,"roleId":3,"permissionId":93},{"id":177,"roleId":3,"permissionId":94},{"id":175,"roleId":3,"permissionId":95}]} \ No newline at end of file diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index 0224786bc..c43c93abe 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -63,7 +63,7 @@ public static void SyncStructure(IFreeSql db, string msg = null, DbConfig dbConf // 同步结构 var dbType = dbConfig.Type.ToString(); - Console.WriteLine($"\r\n{(msg.NotNull() ? msg : $"sync {dbType} structure")} started"); + Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} started"); if(dbConfig.Type == DataType.Oracle) { db.CodeFirst.IsSyncStructureToUpper = true; @@ -192,7 +192,7 @@ public static async Task SyncData(IFreeSql db, DbConfig dbConfig = null) // Console.WriteLine($"{e.Sql}\r\n"); //}; - Console.WriteLine("\r\nsync data started"); + Console.WriteLine("sync data started"); db.Aop.AuditValue += SyncDataAuditValue; diff --git a/Admin.Core/Db/ServiceCollectionExtensions.cs b/Admin.Core/Db/ServiceCollectionExtensions.cs index 5790ee121..a857ee52f 100644 --- a/Admin.Core/Db/ServiceCollectionExtensions.cs +++ b/Admin.Core/Db/ServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using FreeSql; @@ -16,8 +17,7 @@ public static class ServiceCollectionExtensions /// /// /// - /// - public async static void AddDb(this IServiceCollection services, IHostEnvironment env, AppConfig appConfig) + public async static Task AddDb(this IServiceCollection services, IHostEnvironment env) { var dbConfig = new ConfigHelper().Get("dbconfig", env.EnvironmentName); @@ -76,10 +76,7 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen { fsql.Aop.CurdBefore += (s, e) => { - System.Threading.Tasks.Parallel.For(0, 1, body => - { - Console.WriteLine($"{e.Sql}\r\n"); - }); + Console.WriteLine($"{e.Sql}\r\n"); }; } #endregion @@ -129,8 +126,6 @@ public async static void AddDb(this IServiceCollection services, IHostEnvironmen }; #endregion #endregion - - Console.WriteLine($"{string.Join("\r\n", appConfig.Urls)}\r\n"); } } } diff --git a/Admin.Core/Program.cs b/Admin.Core/Program.cs index 1fac5cee6..e5665ca99 100644 --- a/Admin.Core/Program.cs +++ b/Admin.Core/Program.cs @@ -2,24 +2,41 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Configuration; +using NLog; using NLog.Web; using Autofac.Extensions.DependencyInjection; using Admin.Core.Common.Helpers; using Admin.Core.Common.Configs; using LogLevel = Microsoft.Extensions.Logging.LogLevel; -using Microsoft.Extensions.Configuration; -//using NLog; +using System.Threading.Tasks; //using NLog.Extensions.Logging; -//using EnvironmentName = Microsoft.AspNetCore.Hosting.EnvironmentName; namespace Admin.Core { public class Program { - public static void Main(string[] args) + private static AppConfig appConfig = new ConfigHelper().Get("appconfig") ?? new AppConfig(); + public static async Task Main(string[] args) { - Console.WriteLine("launching..."); - CreateHostBuilder(args).Build().Run(); + var logger = LogManager.GetCurrentClassLogger(); + try + { + Console.WriteLine("launching..."); + var host = CreateHostBuilder(args).Build(); + Console.WriteLine($"{string.Join("\r\n", appConfig.Urls)}\r\n"); + await host.RunAsync(); + return 0; + } + catch (Exception ex) + { + logger.Error(ex, "Stopped program because of exception"); + return 1; + } + finally + { + LogManager.Shutdown(); + } } public static IHostBuilder CreateHostBuilder(string[] args) @@ -28,22 +45,20 @@ public static IHostBuilder CreateHostBuilder(string[] args) //var logConfig = new ConfigHelper().Load("logconfig", reloadOnChange: true).GetSection("nLog"); //LogManager.Configuration = new NLogLoggingConfiguration(logConfig); - var appConfig = new ConfigHelper().Get("appconfig") ?? new AppConfig(); - return Host.CreateDefaultBuilder(args) .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => { webBuilder - //.UseEnvironment(EnvironmentName.Production) + //.UseEnvironment(Environments.Production) .UseStartup() .ConfigureAppConfiguration((host, config) => { if (appConfig.RateLimit) { - config.AddJsonFile("./configs/ratelimitconfig.json", optional: true, reloadOnChange: true) + config.AddJsonFile("./configs/ratelimitconfig.json", optional: false, reloadOnChange: true) #if DEBUG - .AddJsonFile("./configs/ratelimitconfig.Development.json", false) + .AddJsonFile("./configs/ratelimitconfig.Development.json", true) #endif ; } diff --git a/Admin.Core/Properties/launchSettings.json b/Admin.Core/Properties/launchSettings.json index 415b3367d..606c18ab9 100644 --- a/Admin.Core/Properties/launchSettings.json +++ b/Admin.Core/Properties/launchSettings.json @@ -7,7 +7,7 @@ "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, - "applicationUrl": "http://localhost:8888" + "applicationUrl": "http://localhost:8000" } } } \ No newline at end of file diff --git a/Admin.Core/Startup.cs b/Admin.Core/Startup.cs index 8ddc0aeec..aec74c40c 100644 --- a/Admin.Core/Startup.cs +++ b/Admin.Core/Startup.cs @@ -35,6 +35,7 @@ using Admin.Core.Common.Attributes; using Admin.Core.Common.Auth; using AspNetCoreRateLimit; +using IdentityServer4.AccessTokenValidation; namespace Admin.Core { @@ -58,10 +59,17 @@ public void ConfigureServices(IServiceCollection services) { //用户信息 services.AddSingleton(); - services.TryAddSingleton(); + if (_appConfig.IdentityServer.Enable) + { + services.TryAddSingleton(); + } + else + { + services.TryAddSingleton(); + } //数据库 - services.AddDb(_env, _appConfig); + services.AddDb(_env).Wait(); //应用配置 services.AddSingleton(_appConfig); @@ -76,9 +84,9 @@ public void ConfigureServices(IServiceCollection services) #endregion #region Cors 跨域 - services.AddCors(c => + services.AddCors(options => { - c.AddPolicy("Limit", policy => + options.AddPolicy("Limit", policy => { policy .WithOrigins(_appConfig.CorUrls) @@ -89,7 +97,7 @@ public void ConfigureServices(IServiceCollection services) /* //浏览器会发起2次请求,使用OPTIONS发起预检请求,第二次才是api异步请求 - c.AddPolicy("All", policy => + options.AddPolicy("All", policy => { policy .AllowAnyOrigin() @@ -102,14 +110,62 @@ public void ConfigureServices(IServiceCollection services) }); #endregion + #region Jwt身份认证授权 + var jwtConfig = _configHelper.Get("jwtconfig", _env.EnvironmentName); + services.TryAddSingleton(jwtConfig); + + if (_appConfig.IdentityServer.Enable) + { + services.AddAuthentication(options => + { + options.DefaultScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = nameof(ResponseAuthenticationHandler); //401 + options.DefaultForbidScheme = nameof(ResponseAuthenticationHandler); //403 + }) + .AddIdentityServerAuthentication(options => + { + options.Authority = _appConfig.IdentityServer.Url; + options.RequireHttpsMetadata = false; + options.SupportedTokens = SupportedTokens.Jwt; + options.ApiName = "admin.server.api"; + options.ApiSecret = "secret"; + }) + .AddScheme(nameof(ResponseAuthenticationHandler), o => { }); + } + else + { + services.AddAuthentication(options => + { + options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = nameof(ResponseAuthenticationHandler); //401 + options.DefaultForbidScheme = nameof(ResponseAuthenticationHandler); //403 + }) + .AddJwtBearer(options => + { + options.TokenValidationParameters = new TokenValidationParameters + { + ValidateIssuer = true, + ValidateAudience = true, + ValidateLifetime = true, + ValidateIssuerSigningKey = true, + ValidIssuer = jwtConfig.Issuer, + ValidAudience = jwtConfig.Audience, + IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.SecurityKey)), + ClockSkew = TimeSpan.Zero + }; + }) + .AddScheme(nameof(ResponseAuthenticationHandler), o => { }); + } + #endregion + #region Swagger Api文档 if (_env.IsDevelopment() || _appConfig.Swagger) { - services.AddSwaggerGen(c => + services.AddSwaggerGen(options => { typeof(ApiVersion).GetEnumNames().ToList().ForEach(version => { - c.SwaggerDoc(version, new OpenApiInfo + options.SwaggerDoc(version, new OpenApiInfo { Version = version, Title = "Admin.Core" @@ -118,75 +174,85 @@ public void ConfigureServices(IServiceCollection services) }); var xmlPath = Path.Combine(basePath, "Admin.Core.xml"); - c.IncludeXmlComments(xmlPath, true); + options.IncludeXmlComments(xmlPath, true); var xmlCommonPath = Path.Combine(basePath, "Admin.Core.Common.xml"); - c.IncludeXmlComments(xmlCommonPath, true); + options.IncludeXmlComments(xmlCommonPath, true); var xmlModelPath = Path.Combine(basePath, "Admin.Core.Model.xml"); - c.IncludeXmlComments(xmlModelPath); + options.IncludeXmlComments(xmlModelPath); var xmlServicesPath = Path.Combine(basePath, "Admin.Core.Service.xml"); - c.IncludeXmlComments(xmlServicesPath); + options.IncludeXmlComments(xmlServicesPath); - //添加设置Token的按钮 - c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme + #region 添加设置Token的按钮 + if (_appConfig.IdentityServer.Enable) { - Description = "Value: Bearer {token}", - Name = "Authorization", - In = ParameterLocation.Header, - Type = SecuritySchemeType.ApiKey, - Scheme = "Bearer" - }); + //添加Jwt验证设置 + options.AddSecurityRequirement(new OpenApiSecurityRequirement() + { + { + new OpenApiSecurityScheme + { + Reference = new OpenApiReference + { + Id = "oauth2", + Type = ReferenceType.SecurityScheme + } + }, + new List() + } + }); - //添加Jwt验证设置 - c.AddSecurityRequirement(new OpenApiSecurityRequirement() + //统一认证 + options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme + { + Type = SecuritySchemeType.OAuth2, + Description = "oauth2登录授权", + Flows = new OpenApiOAuthFlows + { + Implicit = new OpenApiOAuthFlow + { + AuthorizationUrl = new Uri($"{_appConfig.IdentityServer.Url}/connect/authorize"), + Scopes = new Dictionary + { + { "admin.server.api", "admin后端api" } + } + } + } + }); + } + else { + //添加Jwt验证设置 + options.AddSecurityRequirement(new OpenApiSecurityRequirement() { - new OpenApiSecurityScheme { - Reference = new OpenApiReference + new OpenApiSecurityScheme { - Type = ReferenceType.SecurityScheme, - Id = "Bearer" + Reference = new OpenApiReference + { + Id = "Bearer", + Type = ReferenceType.SecurityScheme + } }, - Scheme = "oauth2", - Name = "Bearer", - In = ParameterLocation.Header, - }, - new List() - } - }); + new List() + } + }); + + options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme + { + Description = "Value: Bearer {token}", + Name = "Authorization", + In = ParameterLocation.Header, + Type = SecuritySchemeType.ApiKey + }); + } + #endregion }); } #endregion - #region Jwt身份认证 - var jwtConfig = _configHelper.Get("jwtconfig", _env.EnvironmentName); - services.TryAddSingleton(jwtConfig); - services.AddAuthentication(options => - { - options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; - options.DefaultChallengeScheme = nameof(ResponseAuthenticationHandler); //401 - options.DefaultForbidScheme = nameof(ResponseAuthenticationHandler); //403 - }) - .AddJwtBearer(options => - { - options.TokenValidationParameters = new TokenValidationParameters - { - ValidateIssuer = true, - ValidateAudience = true, - ValidateLifetime = true, - ValidateIssuerSigningKey = true, - ValidIssuer = jwtConfig.Issuer, - ValidAudience = jwtConfig.Audience, - IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.SecurityKey)), - ClockSkew = TimeSpan.Zero - }; - }) - .AddScheme(nameof(ResponseAuthenticationHandler), o => { }); ; - #endregion - #region 操作日志 if (_appConfig.Log.Operation) { @@ -300,13 +366,6 @@ public void ConfigureContainer(ContainerBuilder builder) public void Configure(IApplicationBuilder app) { - //启动事件 - //, IHostApplicationLifetime lifetime - //lifetime.ApplicationStarted.Register(() => - //{ - // Console.WriteLine($"{_appConfig.Urls}\r\n"); - //}); - #region app配置 //IP限流 if (_appConfig.RateLimit) diff --git a/Admin.Core/configs/appconfig.Development.json b/Admin.Core/configs/appconfig.Development.json index 0db3279e4..dca394619 100644 --- a/Admin.Core/configs/appconfig.Development.json +++ b/Admin.Core/configs/appconfig.Development.json @@ -1,3 +1,6 @@ { - + "IdentityServer": { + //ַ + "url": "https://localhost:5000" + } } diff --git a/Admin.Core/configs/appconfig.json b/Admin.Core/configs/appconfig.json index e8ed10fa5..dc8b7e30b 100644 --- a/Admin.Core/configs/appconfig.json +++ b/Admin.Core/configs/appconfig.json @@ -1,10 +1,17 @@ { //Api地址 - "urls": [ "http://*:8888" ], + "urls": [ "http://*:8000" ], //跨域地址 - "corUrls": [ "http://*:9999" ], + "corUrls": [ "http://*:9000" ], //Swagger文档 "swagger": false, + //统一认证授权服务器 + "IdentityServer": { + //启用 + "enable": false, + //地址,开发认证地址前往appconfig.Development.json修改 + "url": "https://login.zhontai.net" + }, //面向切面编程 "aop": { //事物 diff --git a/Admin.Core/configs/dbconfig.json b/Admin.Core/configs/dbconfig.json index d92d77760..19ae37faa 100644 --- a/Admin.Core/configs/dbconfig.json +++ b/Admin.Core/configs/dbconfig.json @@ -4,14 +4,6 @@ //监听Curd操作 "curd": false, - //生成数据 - "generateData": false, - - //同步结构 - "syncStructure": true, - //同步数据 - "syncData": true, - //建库 "createDb": true, //SqlServer,PostgreSQL,Oracle,OdbcOracle,OdbcSqlServer,OdbcMySql,OdbcPostgreSQL,Odbc,OdbcDameng,MsAccess @@ -26,6 +18,16 @@ //PostgreSQL "CREATE DATABASE \"admindb\" WITH ENCODING = 'UTF8'" "createDbSql": "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'", + //同步结构 + "syncStructure": true, + //同步数据 + "syncData": true, + + //项目初始化不开启生成数据,发布生产环境前,如果开发环境有配置数据需要更新数据包,可以开启生成数据包,使用完记得关闭 + //开启生成数据前先关闭syncStructure syncData createDb + //生成数据 + "generateData": false, + //数据库配置 https://github.com/dotnetcore/FreeSql/wiki/入门 //数据库类型 MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4, OdbcOracle = 5, OdbcSqlServer = 6, OdbcMySql = 7, OdbcPostgreSQL = 8, Odbc = 9, OdbcDameng = 10, MsAccess = 11 "type": 4, diff --git a/Admin.Core/configs/jwtconfig.json b/Admin.Core/configs/jwtconfig.json index 9f7e95f18..dcc06c772 100644 --- a/Admin.Core/configs/jwtconfig.json +++ b/Admin.Core/configs/jwtconfig.json @@ -1,12 +1,12 @@ { //发行者 - "issuer": "http://127.0.0.1:8888", + "issuer": "http://127.0.0.1:8000", //订阅者 - "audience": "http://127.0.0.1:8888", + "audience": "http://127.0.0.1:8000", //密钥 "securityKey": "ertJKl#521*a@790asD&1#", - //有效期(分钟) + //有效期(分钟) 120 = 2小时 "expires": 120, - //刷新有效期(分钟) 10080 = 7天 - "refreshExpires": 10080 + //刷新有效期(分钟) 1440 = 1天 + "refreshExpires": 1440 } diff --git a/Admin.Core/configs/logconfig.json b/Admin.Core/configs/logconfig.json index f0ddd5ecf..1ef978bc5 100644 --- a/Admin.Core/configs/logconfig.json +++ b/Admin.Core/configs/logconfig.json @@ -30,19 +30,19 @@ //调试 "debug": { "type": "File", - "fileName": "logs/debug-${shortdate}.log", + "fileName": "../logs/debug-${shortdate}.log", "layout": "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" }, //警告 "warn": { "type": "File", - "fileName": "logs/warn-${shortdate}.log", + "fileName": "../logs/warn-${shortdate}.log", "layout": "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" }, //错误 "error": { "type": "File", - "fileName": "logs/error-${shortdate}.log", + "fileName": "../logs/error-${shortdate}.log", "layout": "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" } }, diff --git a/Admin.Core/configs/uploadconfig.json b/Admin.Core/configs/uploadconfig.json index dd3a59037..74d17817b 100644 --- a/Admin.Core/configs/uploadconfig.json +++ b/Admin.Core/configs/uploadconfig.json @@ -2,7 +2,7 @@ //头像 "avatar": { //上传路径 D:/upload/admin/avatar - "uploadPath": "D:/upload/admin/avatar", + "uploadPath": "../upload/admin/avatar", //请求路径 "requestPath": "/upload/admin/avatar", @@ -10,7 +10,7 @@ "dateTimeFormat": "", //{用户编号} "format": "{Id}", - //图片大小不超过 1M = 1024 * 1024 + //图片大小不超过 1M = 1 * 1024 * 1024 "maxSize": 1048576, //最大允许上传张数,-1不限制 "limit": 1, @@ -20,7 +20,7 @@ //文档图片 "document": { //上传路径 D:/upload/admin/document - "uploadPath": "D:/upload/admin/document", + "uploadPath": "../upload/admin/document", //请求路径 "requestPath": "/images", @@ -28,7 +28,7 @@ "dateTimeFormat": "", //{文档编号} "format": "{Id}", - //图片大小不超过 10M = 1 * 1024 * 1024 + //图片大小不超过 1M = 1 * 1024 * 1024 "maxSize": 1048576, //最大允许上传张数,-1不限制 "limit": -1, diff --git a/Admin.Core/nlog.config b/Admin.Core/nlog.config index 01de97018..0106de227 100644 --- a/Admin.Core/nlog.config +++ b/Admin.Core/nlog.config @@ -7,16 +7,19 @@ - + - + - + + + + From b30e7d5dd2fe920d708803130ff54883501f59ed Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Sat, 18 Jul 2020 16:24:41 +0800 Subject: [PATCH 49/53] =?UTF-8?q?=E6=9B=B4=E6=96=B01.4.0=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20=E6=94=AF=E6=8C=81JWT=E5=92=8CIS4=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E5=88=87=E6=8D=A2=20=E6=96=B0=E5=A2=9E=20=E9=9B=86=E6=88=90?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=AE=A4=E8=AF=81=E6=8E=88=E6=9D=83=E9=A1=B9?= =?UTF-8?q?=E7=9B=AEAdmin.IdentityServer=20=E6=9B=B4=E6=96=B0=20=E5=90=8E?= =?UTF-8?q?=E7=AB=AFnuget=E5=8C=85=20=E8=B0=83=E6=95=B4=20data.json?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=95=B0=E6=8D=AE=20=E4=BF=AE=E5=A4=8D=20?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E6=A0=B9=E6=8D=AE=E6=9D=A1=E4=BB=B6=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=90=8E=E6=B2=A1=E6=9C=89=E4=BB=8E=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E9=A1=B5=E5=BC=80=E5=A7=8B=E7=9A=84=E9=97=AE=E9=A2=98=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E6=89=A7=E8=A1=8Cdb=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=90=AF=E5=8A=A8=E7=AB=AF=E5=8F=A3=E4=B8=8D?= =?UTF-8?q?=E6=8C=89=E9=A1=BA=E5=BA=8F=E6=89=A7=E8=A1=8C=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20=E4=BF=AE=E5=A4=8D=20swagger=20api=E5=8A=A0?= =?UTF-8?q?=E6=9D=83=E5=B0=8F=E9=94=81=E5=BC=B9=E5=87=BA=E6=97=A0=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E6=A1=86=E7=9A=84=E9=97=AE=E9=A2=98=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20=E5=88=B7=E6=96=B0token=E6=89=A7=E8=A1=8C=E6=88=90?= =?UTF-8?q?=E5=8A=9F=EF=BC=8C=E8=AF=B7=E6=B1=82=E9=87=8D=E8=AF=95=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=A4=B1=E8=B4=A5=E4=BC=9A=E5=BE=AA=E7=8E=AF=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E7=9A=84=E9=97=AE=E9=A2=98=20=E4=BF=AE=E5=A4=8D=20tok?= =?UTF-8?q?en=E4=BB=A5=E6=97=A7=E6=8D=A2=E6=96=B0=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E4=B8=8D=E7=B2=BE=E7=A1=AE=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20=E4=BF=AE=E5=A4=8D=20ip=E5=B8=A6=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E9=AA=8C=E8=AF=81ip=E4=B8=8D=E9=80=9A=E8=BF=87=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=9C=AC=E5=9C=B0ip=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 6 +++--- Admin.Core.Services/Admin.Core.Service.csproj | 2 +- Admin.Core.Tests/Admin.Core.Tests.csproj | 2 +- Admin.Core/Admin.Core.csproj | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index cb8ad3955..897a53f04 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -30,9 +30,9 @@ - - - + + + diff --git a/Admin.Core.Services/Admin.Core.Service.csproj b/Admin.Core.Services/Admin.Core.Service.csproj index f8cdf32d2..29d80468b 100644 --- a/Admin.Core.Services/Admin.Core.Service.csproj +++ b/Admin.Core.Services/Admin.Core.Service.csproj @@ -31,7 +31,7 @@ - + diff --git a/Admin.Core.Tests/Admin.Core.Tests.csproj b/Admin.Core.Tests/Admin.Core.Tests.csproj index 7dd4a472a..2428a6acd 100644 --- a/Admin.Core.Tests/Admin.Core.Tests.csproj +++ b/Admin.Core.Tests/Admin.Core.Tests.csproj @@ -7,7 +7,7 @@ - + diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index 422580765..d0ac96ace 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -44,10 +44,10 @@ - + - - + + From 3a31e786abe71fc617940d1240bbc5abdd5cf48a Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Wed, 22 Jul 2020 09:44:13 +0800 Subject: [PATCH 50/53] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AE=A1=E8=AE=A1=E5=80=BC=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core/Db/DbHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Admin.Core/Db/DbHelper.cs b/Admin.Core/Db/DbHelper.cs index c43c93abe..b7caddb32 100644 --- a/Admin.Core/Db/DbHelper.cs +++ b/Admin.Core/Db/DbHelper.cs @@ -161,7 +161,7 @@ private static void SyncDataAuditValue(object s, AuditValueEventArgs e) e.Value = 2; break; case "CreatedUserName": - e.Value = "xiaoxue"; + e.Value = "admin"; break; } } @@ -173,7 +173,7 @@ private static void SyncDataAuditValue(object s, AuditValueEventArgs e) e.Value = 2; break; case "ModifiedUserName": - e.Value = "xiaoxue"; + e.Value = "admin"; break; } } From 35bc8e6e246c89f1721f5dfb8334c3012c3972d1 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Fri, 14 Aug 2020 21:35:00 +0800 Subject: [PATCH 51/53] =?UTF-8?q?=E6=9B=B4=E6=96=B01.4.1=20=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=20Nuget=E5=8C=85=E5=88=B0=E6=9C=80=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=20=E5=8D=87=E7=BA=A7=20vue=20cli=E5=88=B04.5.3?= =?UTF-8?q?=E7=89=88=E6=9C=AC=20=E4=BF=AE=E5=A4=8D=20=E5=9C=A8ie11?= =?UTF-8?q?=E4=B8=8B=E6=97=A0=E6=B3=95=E8=AE=BF=E9=97=AE=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=EF=BC=8Cget=E8=AF=B7=E6=B1=82=E4=BD=BF=E7=94=A8=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E5=AF=BC=E8=87=B4=E6=97=A0=E6=B3=95=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=20=E4=BF=AE=E5=A4=8D=20=E5=9C=A8ie1?= =?UTF-8?q?1=E4=B8=8B=E6=96=87=E6=A1=A3=E7=AE=A1=E7=90=86=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E6=97=A0=E6=B3=95=E5=8A=A0=E8=BD=BD=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20=E5=9C=A8ie11=E4=B8=8Btabs=E5=8F=B3=E9=94=AE?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E6=97=A0=E6=B3=95=E6=89=93=E5=BC=80=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20=E4=BF=AE=E5=A4=8D=20=E5=9C=A8ie11?= =?UTF-8?q?=E4=B8=8B=E5=89=8D=E7=AB=AF=E6=97=B6=E9=97=B4=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20=E5=B0=86=E5=88=86=E9=A1=B5=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=88=B0=E5=85=A8=E5=B1=80=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E4=B8=AD=EF=BC=8C=E7=95=8C=E9=9D=A2=E6=97=A0=E9=9C=80=E5=86=8D?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=88=86=E9=A1=B5=E7=BB=84=E4=BB=B6=20?= =?UTF-8?q?=E8=B0=83=E6=95=B4=20=E5=B0=86node-sass=E6=9B=B4=E6=94=B9?= =?UTF-8?q?=E4=B8=BAsass=EF=BC=8C=E7=A9=BF=E9=80=8F=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E7=BB=9F=E4=B8=80=E4=BD=BF=E7=94=A8::v-deep?= =?UTF-8?q?=20=E8=B0=83=E6=95=B4=20=E6=B5=8B=E8=AF=95=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=95=B0=E6=8D=AE=EF=BC=8C=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=97=B6=E7=94=A8=E6=88=B7=E8=83=BD=E5=A4=9F=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 22 +++++++++---------- Admin.Core.Model/Admin.Core.Model.csproj | 2 +- .../Admin.Core.Repository.csproj | 2 +- Admin.Core.Services/Admin.Core.Service.csproj | 2 +- Admin.Core.Services/Admin/User/UserService.cs | 3 +-- Admin.Core.Tests/Admin.Core.Tests.csproj | 6 ++--- .../Controller/BaseControllerTest.cs | 2 +- Admin.Core/Admin.Core.Service.xml | 10 ++++----- Admin.Core/Admin.Core.csproj | 12 +++++----- Admin.Core/Startup.cs | 7 +++++- 10 files changed, 36 insertions(+), 32 deletions(-) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 897a53f04..71a31d205 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.4.0 + 1.4.1 xiaoxue xiaoxue 中台Admin后端通用库 @@ -22,17 +22,17 @@ - - - - - - - + + + + + + + - - - + + + diff --git a/Admin.Core.Model/Admin.Core.Model.csproj b/Admin.Core.Model/Admin.Core.Model.csproj index a315c799a..9487ea235 100644 --- a/Admin.Core.Model/Admin.Core.Model.csproj +++ b/Admin.Core.Model/Admin.Core.Model.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.4.0 + 1.4.1 xiaoxue xiaoxue 中台Admin后端实体库 diff --git a/Admin.Core.Repository/Admin.Core.Repository.csproj b/Admin.Core.Repository/Admin.Core.Repository.csproj index 2f6040f6d..2de95791b 100644 --- a/Admin.Core.Repository/Admin.Core.Repository.csproj +++ b/Admin.Core.Repository/Admin.Core.Repository.csproj @@ -2,7 +2,7 @@ netcoreapp3.1 - 1.4.0 + 1.4.1 xiaoxue xiaoxue 中台Admin后端仓储库 diff --git a/Admin.Core.Services/Admin.Core.Service.csproj b/Admin.Core.Services/Admin.Core.Service.csproj index 29d80468b..c06b7e804 100644 --- a/Admin.Core.Services/Admin.Core.Service.csproj +++ b/Admin.Core.Services/Admin.Core.Service.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 true - 1.4.0 + 1.4.1 xiaoxue xiaoxue 中台Admin后端服务库 diff --git a/Admin.Core.Services/Admin/User/UserService.cs b/Admin.Core.Services/Admin/User/UserService.cs index 5b1c5801a..d39fdfd51 100644 --- a/Admin.Core.Services/Admin/User/UserService.cs +++ b/Admin.Core.Services/Admin/User/UserService.cs @@ -9,13 +9,12 @@ using Admin.Core.Common.Output; using Admin.Core.Model.Admin; using Admin.Core.Repository.Admin; -using Admin.Core.Service.Admin.User; using Admin.Core.Service.Admin.User.Input; using Admin.Core.Service.Admin.User.Output; using Admin.Core.Common.Attributes; using Admin.Core.Service.Admin.Auth.Output; -namespace Admin.Core.FrameWork.Service.User +namespace Admin.Core.Service.Admin.User { /// /// 用户服务 diff --git a/Admin.Core.Tests/Admin.Core.Tests.csproj b/Admin.Core.Tests/Admin.Core.Tests.csproj index 2428a6acd..115398ea3 100644 --- a/Admin.Core.Tests/Admin.Core.Tests.csproj +++ b/Admin.Core.Tests/Admin.Core.Tests.csproj @@ -7,10 +7,10 @@ - - + + - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Admin.Core.Tests/Controller/BaseControllerTest.cs b/Admin.Core.Tests/Controller/BaseControllerTest.cs index 5099f501f..dda6207d7 100644 --- a/Admin.Core.Tests/Controller/BaseControllerTest.cs +++ b/Admin.Core.Tests/Controller/BaseControllerTest.cs @@ -47,7 +47,7 @@ public async Task Login(AuthLoginInput input = null) var verifyCode = await _cache.GetAsync(verifyCodeKey); input = new AuthLoginInput() { - UserName = "xiaoxue", + UserName = "admin", Password = "111111", VerifyCodeKey = res.Data.Key, VerifyCode = verifyCode diff --git a/Admin.Core/Admin.Core.Service.xml b/Admin.Core/Admin.Core.Service.xml index cdf05d87b..c79ae6a2d 100644 --- a/Admin.Core/Admin.Core.Service.xml +++ b/Admin.Core/Admin.Core.Service.xml @@ -1325,6 +1325,11 @@ 创建时间 + + + 用户服务 + + 映射配置 @@ -1453,10 +1458,5 @@ 说明 - - - 用户服务 - - diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index d0ac96ace..f35a3cf1a 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -5,7 +5,7 @@ OutOfProcess false - 1.4.0 + 1.4.1 MIT xiaoxue xiaoxue @@ -44,13 +44,13 @@ - + - - + + - - + + diff --git a/Admin.Core/Startup.cs b/Admin.Core/Startup.cs index aec74c40c..23960afa3 100644 --- a/Admin.Core/Startup.cs +++ b/Admin.Core/Startup.cs @@ -61,10 +61,12 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(); if (_appConfig.IdentityServer.Enable) { + //is4 services.TryAddSingleton(); } else { + //jwt services.TryAddSingleton(); } @@ -110,12 +112,13 @@ public void ConfigureServices(IServiceCollection services) }); #endregion - #region Jwt身份认证授权 + #region 身份认证授权 var jwtConfig = _configHelper.Get("jwtconfig", _env.EnvironmentName); services.TryAddSingleton(jwtConfig); if (_appConfig.IdentityServer.Enable) { + //is4 services.AddAuthentication(options => { options.DefaultScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme; @@ -134,6 +137,7 @@ public void ConfigureServices(IServiceCollection services) } else { + //jwt services.AddAuthentication(options => { options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; @@ -325,6 +329,7 @@ public void ConfigureContainer(ContainerBuilder builder) builder.RegisterAssemblyTypes(assemblyCore, assemblyCommon) .Where(t => t.GetCustomAttribute() != null) .SingleInstance(); + //有接口注入单例 builder.RegisterAssemblyTypes(assemblyCore, assemblyCommon) .Where(t => t.GetCustomAttribute() != null) From 65439fc46897104cf56b19cb126714ad5ef38613 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Wed, 26 Aug 2020 14:36:51 +0800 Subject: [PATCH 52/53] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=92=A4=E9=94=80=E6=9D=83=E9=99=90=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E7=94=A8=E6=88=B7=E5=8F=AF=E5=86=8D=E6=93=8D=E4=BD=9C?= =?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 --- Admin.Core/Attributes/PermissionAttribute.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Admin.Core/Attributes/PermissionAttribute.cs b/Admin.Core/Attributes/PermissionAttribute.cs index 53cce6899..ed26662b1 100644 --- a/Admin.Core/Attributes/PermissionAttribute.cs +++ b/Admin.Core/Attributes/PermissionAttribute.cs @@ -16,7 +16,7 @@ namespace Admin.Core.Attributes [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] public class PermissionAttribute : AuthorizeAttribute, IAuthorizationFilter, IAsyncAuthorizationFilter { - public async void OnAuthorization(AuthorizationFilterContext context) + private async Task PermissionAuthorization(AuthorizationFilterContext context) { //排除匿名访问 if (context.ActionDescriptor.EndpointMetadata.Any(m => m.GetType() == typeof(AllowAnonymousAttribute))) @@ -45,10 +45,14 @@ public async void OnAuthorization(AuthorizationFilterContext context) } } - public Task OnAuthorizationAsync(AuthorizationFilterContext context) + public async void OnAuthorization(AuthorizationFilterContext context) + { + await PermissionAuthorization(context); + } + + public async Task OnAuthorizationAsync(AuthorizationFilterContext context) { - OnAuthorization(context); - return Task.CompletedTask; + await PermissionAuthorization(context); } } } From abea9b2b7d8f9f5786161255a4781587a8884b69 Mon Sep 17 00:00:00 2001 From: xiaoxue <361243234@qq.com> Date: Thu, 10 Sep 2020 10:43:42 +0800 Subject: [PATCH 53/53] =?UTF-8?q?=E6=9B=B4=E6=96=B0nuget=E5=8C=85=EF=BC=8C?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97=E5=A2=9E=E5=8A=A0=E5=B1=80?= =?UTF-8?q?=E9=83=A8=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Admin.Core.Common/Admin.Core.Common.csproj | 20 +++++----- Admin.Core.Tests/Admin.Core.Tests.csproj | 4 +- Admin.Core/Admin.Core.csproj | 8 ++-- Admin.Core/Logs/LogHandler.cs | 44 +++++++++++++++------- 4 files changed, 46 insertions(+), 30 deletions(-) diff --git a/Admin.Core.Common/Admin.Core.Common.csproj b/Admin.Core.Common/Admin.Core.Common.csproj index 71a31d205..c79eacd9d 100644 --- a/Admin.Core.Common/Admin.Core.Common.csproj +++ b/Admin.Core.Common/Admin.Core.Common.csproj @@ -22,17 +22,17 @@ - - - - - - - + + + + + + + - - - + + + diff --git a/Admin.Core.Tests/Admin.Core.Tests.csproj b/Admin.Core.Tests/Admin.Core.Tests.csproj index 115398ea3..44bf7752a 100644 --- a/Admin.Core.Tests/Admin.Core.Tests.csproj +++ b/Admin.Core.Tests/Admin.Core.Tests.csproj @@ -7,8 +7,8 @@ - - + + all diff --git a/Admin.Core/Admin.Core.csproj b/Admin.Core/Admin.Core.csproj index f35a3cf1a..6b5105bed 100644 --- a/Admin.Core/Admin.Core.csproj +++ b/Admin.Core/Admin.Core.csproj @@ -44,12 +44,12 @@ - + - - + + - + diff --git a/Admin.Core/Logs/LogHandler.cs b/Admin.Core/Logs/LogHandler.cs index 57a2eb8e0..fd6bc6b3f 100644 --- a/Admin.Core/Logs/LogHandler.cs +++ b/Admin.Core/Logs/LogHandler.cs @@ -1,10 +1,13 @@ -using System.Linq; +using System; +using System.Linq; using System.Diagnostics; using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using Microsoft.Extensions.Logging; using Admin.Core.Common.Output; using Admin.Core.Service.Admin.OprationLog; using Admin.Core.Service.Admin.OprationLog.Input; -using Microsoft.AspNetCore.Mvc.Filters; //using Newtonsoft.Json; namespace Admin.Core.Logs @@ -14,14 +17,17 @@ namespace Admin.Core.Logs /// public class LogHandler : ILogHandler { + private readonly ILogger _logger; private readonly ApiHelper _apiHelper; private readonly IOprationLogService _oprationLogService; public LogHandler( + ILogger logger, ApiHelper apiHelper, IOprationLogService oprationLogService ) { + _logger = logger; _apiHelper = apiHelper; _oprationLogService = oprationLogService; } @@ -30,7 +36,7 @@ public async Task LogAsync(ActionExecutingContext context, ActionExecutionDelega { var sw = new Stopwatch(); sw.Start(); - dynamic actionResult = (await next()).Result; + var actionExecutedContext = await next(); sw.Stop(); //操作参数 @@ -38,19 +44,29 @@ public async Task LogAsync(ActionExecutingContext context, ActionExecutionDelega //操作结果 //var result = JsonConvert.SerializeObject(actionResult?.Value); - var res = actionResult?.Value as IResponseOutput; - - var input = new OprationLogAddInput + try { - ApiMethod = context.HttpContext.Request.Method.ToLower(), - ApiPath = context.ActionDescriptor.AttributeRouteInfo.Template.ToLower(), - ElapsedMilliseconds = sw.ElapsedMilliseconds, - Status = res?.Success, - Msg = res?.Msg - }; - input.ApiLabel = _apiHelper.GetApis().FirstOrDefault(a => a.Path == input.ApiPath)?.Label; + var input = new OprationLogAddInput + { + ApiMethod = context.HttpContext.Request.Method.ToLower(), + ApiPath = context.ActionDescriptor.AttributeRouteInfo.Template.ToLower(), + ElapsedMilliseconds = sw.ElapsedMilliseconds + }; - await _oprationLogService.AddAsync(input); + if (actionExecutedContext.Result is ObjectResult result && result.Value is IResponseOutput res) + { + input.Status = res.Success; + input.Msg = res.Msg; + } + + input.ApiLabel = _apiHelper.GetApis().FirstOrDefault(a => a.Path == input.ApiPath)?.Label; + + await _oprationLogService.AddAsync(input); + } + catch (Exception ex) + { + _logger.LogError("操作日志插入异常:{@ex}", ex); + } } } }