1
0
Переглянути джерело

新增 appconfig新增validate权限验证配置
新增 dbconfig新增assemblyNames程序集配置
修复 租户登录后设置角色菜单,菜单未正确显示的问题
优化 dbconfig多数据库配置

zhontai 2 роки тому
батько
коміт
07b4819413
32 змінених файлів з 284 додано та 535 видалено
  1. 11 2
      src/hosts/ZhonTai.Host/Configs/appconfig.json
  2. 8 5
      src/hosts/ZhonTai.Host/Configs/dbconfig.json
  3. 28 1
      src/platform/ZhonTai.Admin/Core/Configs/AppConfig.cs
  4. 19 44
      src/platform/ZhonTai.Admin/Core/Configs/DbConfig.cs
  5. 4 10
      src/platform/ZhonTai.Admin/Core/Consts/DbKeys.cs
  6. 1 1
      src/platform/ZhonTai.Admin/Core/Consts/FilterNames.cs
  7. 49 68
      src/platform/ZhonTai.Admin/Core/Db/DBServiceCollectionExtensions.cs
  8. 1 1
      src/platform/ZhonTai.Admin/Core/Db/Data/SyncData.cs
  9. 18 15
      src/platform/ZhonTai.Admin/Core/Db/DbHelper.cs
  10. 0 175
      src/platform/ZhonTai.Admin/Core/Db/FreeSqlCloudExtesions.cs
  11. 4 8
      src/platform/ZhonTai.Admin/Core/Db/Transaction/TransactionAsyncInterceptor.cs
  12. 2 23
      src/platform/ZhonTai.Admin/Core/Db/Transaction/UnitOfWorkManagerCloud.cs
  13. 11 18
      src/platform/ZhonTai.Admin/Core/HostApp.cs
  14. 2 1
      src/platform/ZhonTai.Admin/Core/Repositories/RepositoryBase.cs
  15. 3 2
      src/platform/ZhonTai.Admin/Repositories/Api/ApiRepository.cs
  16. 3 2
      src/platform/ZhonTai.Admin/Repositories/Dictionary/DictionaryRepository.cs
  17. 3 2
      src/platform/ZhonTai.Admin/Repositories/DictionaryType/DictionaryTypeRepository.cs
  18. 3 2
      src/platform/ZhonTai.Admin/Repositories/Document/DocumentRepository.cs
  19. 3 2
      src/platform/ZhonTai.Admin/Repositories/DocumentImage/DocumentImageRepository.cs
  20. 3 2
      src/platform/ZhonTai.Admin/Repositories/LoginLog/LoginLogRepository.cs
  21. 3 2
      src/platform/ZhonTai.Admin/Repositories/OprationLog/OprationLogRepository.cs
  22. 2 1
      src/platform/ZhonTai.Admin/Repositories/Org/OrgRepository.cs
  23. 3 2
      src/platform/ZhonTai.Admin/Repositories/Permission/PermissionRepository.cs
  24. 3 2
      src/platform/ZhonTai.Admin/Repositories/Role/RoleRepository.cs
  25. 3 2
      src/platform/ZhonTai.Admin/Repositories/Tenant/TenantRepository.cs
  26. 3 2
      src/platform/ZhonTai.Admin/Repositories/User/UserRepository.cs
  27. 3 2
      src/platform/ZhonTai.Admin/Repositories/UserStaff/UserStaffRepository.cs
  28. 3 2
      src/platform/ZhonTai.Admin/Repositories/View/ViewRepositoryRepository.cs
  29. 3 14
      src/platform/ZhonTai.Admin/Services/Auth/AuthService.cs
  30. 6 9
      src/platform/ZhonTai.Admin/Services/Permission/PermissionService.cs
  31. 16 33
      src/platform/ZhonTai.Admin/Services/Tenant/TenantService.cs
  32. 60 80
      src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

+ 11 - 2
src/hosts/ZhonTai.Host/Configs/appconfig.json

@@ -9,6 +9,15 @@
   "assemblyNames": [ "ZhonTai.Admin" ],
   //租户
   "tenant": true,
+  //分布式事务唯一标识admin,为空则不生成分布式事务表
+  "distributeKey": "",
+  //验证
+  "validate": {
+    //登录
+    "login": true,
+    //权限
+    "permission": true
+  },
   //Swagger文档
   "swagger": {
     //启用
@@ -24,7 +33,7 @@
       }
     ]
   },
-  //新版Api文档
+  //ZhonTai接口文档
   "apiUI": {
     //启用
     "enable": true,
@@ -48,7 +57,7 @@
     //事物
     "transaction": true
   },
-  //日志
+  //数据库日志
   "log": {
     //操作日志
     "operation": true

+ 8 - 5
src/hosts/ZhonTai.Host/Configs/dbconfig.json

@@ -1,9 +1,15 @@
 {
+  //数据库注册键
+  "key": "admindb",
+
   //监听所有操作
   "monitorCommand": false,
   //监听Curd操作
   "curd": true,
 
+  //程序集名称,自动获取实体表,为空则通过ConfigureFreeSql配置
+  "assemblyNames": [ "ZhonTai.Admin" ],
+
   //建库
   "createDb": false,
   //SqlServer,PostgreSQL,Oracle,OdbcOracle,OdbcSqlServer,OdbcMySql,OdbcPostgreSQL,Odbc,OdbcDameng,MsAccess
@@ -42,9 +48,6 @@
   //FreeSql.MySql.MySqlProvider`1,FreeSql.Provider.MySqlConnector
   "providerType": "",
 
-  //分布式事务唯一标识 admin
-  "distributeKey": "",
-
   //读写分离从库列表
   "slaveList": [
     //{
@@ -57,8 +60,8 @@
 
   //多数据库
   //定义MultiDbKeys枚举
-  //使用仓储访问 public ModuleRepository(UnitOfWorkManagerCloud muowm) : base(DbKeys.MultiDb + MultiDbKeys.DbKey, muowm)
-  //使用FreeSqlCloud访问  freeSqlCloud.Use(DbKeys.MultiDb +  MultiDbKeys.DbKey);
+  //使用仓储访问 public ModuleRepository(UnitOfWorkManagerCloud muowm) : base(DbKeys.AdminDb, muowm)
+  //使用FreeSqlCloud访问  freeSqlCloud.Use(DbKeys.AdminDb);
   "dbs": [
     //{
     //  "key": "admindb",

+ 28 - 1
src/platform/ZhonTai.Admin/Core/Configs/AppConfig.cs

@@ -20,7 +20,7 @@ public class AppConfig
     public string[] CorUrls { get; set; }
 
     /// <summary>
-    /// 程序集名称,默认 ZhonTai.Admin
+    /// 程序集名称
     /// </summary>
     public string[] AssemblyNames { get; set; }
 
@@ -29,6 +29,11 @@ public class AppConfig
     /// </summary>
     public bool Tenant { get; set; } = false;
 
+    /// <summary>
+    /// 分布式事务唯一标识
+    /// </summary>
+    public string DistributeKey { get; set; }
+
     /// <summary>
     /// Swagger文档
     /// </summary>
@@ -59,6 +64,11 @@ public class AppConfig
     /// </summary>
     public LogConfig Log { get; set; } = new LogConfig();
 
+    /// <summary>
+    /// 验证配置
+    /// </summary>
+    public ValidateConfig Validate { get; set; } = new ValidateConfig();
+
     /// <summary>
     /// 限流
     /// </summary>
@@ -163,6 +173,23 @@ public class LogConfig
     public bool Operation { get; set; } = true;
 }
 
+/// <summary>
+/// 验证配置
+/// </summary>
+public class ValidateConfig
+{
+    /// <summary>
+    /// 登录
+    /// </summary>
+    public bool Login { get; set; } = true;
+
+    /// <summary>
+    /// 权限
+    /// </summary>
+    public bool Permission { get; set; } = true;
+}
+
+
 /// <summary>
 /// 验证码配置
 /// </summary>

+ 19 - 44
src/platform/ZhonTai.Admin/Core/Configs/DbConfig.cs

@@ -1,4 +1,5 @@
-using DataType = FreeSql.DataType;
+using ZhonTai.Admin.Core.Consts;
+using DataType = FreeSql.DataType;
 
 namespace ZhonTai.Admin.Core.Configs;
 
@@ -7,6 +8,16 @@ namespace ZhonTai.Admin.Core.Configs;
 /// </summary>
 public class DbConfig
 {
+    /// <summary>
+    /// 数据库注册键
+    /// </summary>
+    public string Key { get; set; } = DbKeys.MasterDb;
+
+    /// <summary>
+    /// 程序集名称
+    /// </summary>
+    public string[] AssemblyNames { get; set; }
+
     /// <summary>
     /// 数据库类型
     /// </summary>
@@ -22,11 +33,6 @@ public class DbConfig
     /// </summary>
     public string ProviderType { get; set; }
 
-    /// <summary>
-    /// 空闲时间(分)
-    /// </summary>
-    public int IdleTime { get; set; } = 10;
-
     /// <summary>
     /// 生成数据
     /// </summary>
@@ -35,17 +41,17 @@ public class DbConfig
     /// <summary>
     /// 同步结构
     /// </summary>
-    public bool SyncStructure { get; set; } = true;
+    public bool SyncStructure { get; set; } = false;
 
     /// <summary>
     /// 同步数据
     /// </summary>
-    public bool SyncData { get; set; } = true;
+    public bool SyncData { get; set; } = false;
 
     /// <summary>
     /// 建库
     /// </summary>
-    public bool CreateDb { get; set; } = true;
+    public bool CreateDb { get; set; } = false;
 
     /// <summary>
     /// 建库连接字符串
@@ -70,12 +76,7 @@ public class DbConfig
     /// <summary>
     /// 多数据库
     /// </summary>
-    public MultiDb[] Dbs { get; set; }
-
-    /// <summary>
-    /// 分布式事务唯一标识
-    /// </summary>
-    public string DistributeKey { get; set; }
+    public DbConfig[] Dbs { get; set; }
 
     /// <summary>
     /// 读写分离从库列表
@@ -84,43 +85,17 @@ public class DbConfig
 }
 
 /// <summary>
-/// 多数据
+/// 读写分离从
 /// </summary>
-public class MultiDb
+public class SlaveDb
 {
-    /// <summary>
-    /// 数据库键
-    /// </summary>
-    public string Key { get; set; }
-
     /// <summary>
     /// 数据库类型
     /// </summary>
-    public DataType Type { get; set; }
-
-    /// <summary>
-    /// 数据库字符串
-    /// </summary>
-    public string ConnectionString { get; set; }
+    public int Weight { get; set; } = 1;
 
-    /// <summary>
-    /// 指定程序集
-    /// </summary>
-    public string ProviderType { get; set; }
-}
-
-/// <summary>
-/// 读写分离从库
-/// </summary>
-public class SlaveDb
-{
     /// <summary>
     /// 数据库连接字符串
     /// </summary>
     public string ConnectionString { get; set; }
-
-    /// <summary>
-    /// 数据库类型
-    /// </summary>
-    public int Weight { get; set; } = 1;
 }

+ 4 - 10
src/platform/ZhonTai.Admin/Core/Consts/DbKeys.cs

@@ -11,17 +11,11 @@ public static partial class DbKeys
     /// 主库
     /// </summary>
     [Description("主库")]
-    public const string MasterDb = "masterdb";
+    public static string MasterDb { get; set; } = "masterdb";
 
     /// <summary>
-    /// 
+    /// admin
     /// </summary>
-    [Description("多库")]
-    public const string MultiDb = "multidb_";
-
-    /// <summary>
-    /// 租户数据库
-    /// </summary>
-    [Description("租户数据库")]
-    public const string TenantDb = "tenantdb_";
+    [Description("admin库")]
+    public static string AdminDb { get; set; } = "admindb";
 }

+ 1 - 1
src/platform/ZhonTai.Admin/Core/Consts/FilterNames.cs

@@ -23,7 +23,7 @@ public static partial class FilterNames
     /// 本人权限
     /// </summary>
     [Description("本人权限")]
-    public const string Self = "Selft";
+    public const string Self = "Self";
 
     /// <summary>
     /// 数据权限

+ 49 - 68
src/platform/ZhonTai.Admin/Core/Db/DBServiceCollectionExtensions.cs

@@ -14,25 +14,29 @@ using System.Collections.Concurrent;
 using System.Reflection;
 using ZhonTai.Admin.Domain.User;
 using ZhonTai.Admin.Domain.Role;
+using ZhonTai.Admin.Core.Db.Transaction;
 
 namespace ZhonTai.Admin.Core.Db;
 
 public static class DBServiceCollectionExtensions
 {
     /// <summary>
-    /// 添加主数据库
+    /// 注册数据库
     /// </summary>
-    /// <param name="services"></param>
     /// <param name="freeSqlCloud"></param>
-    /// <param name="env"></param>
+    /// <param name="user"></param>
+    /// <param name="dbConfig"></param>
+    /// <param name="appConfig"></param>
     /// <param name="hostAppOptions"></param>
-    /// <returns></returns>
-    public static void AddMasterDb(this IServiceCollection services, FreeSqlCloud freeSqlCloud, IHostEnvironment env, HostAppOptions hostAppOptions)
+    private static void RegisterDb(
+        FreeSqlCloud freeSqlCloud,
+        IUser user,
+        DbConfig dbConfig,
+        AppConfig appConfig,
+        HostAppOptions hostAppOptions
+    )
     {
-        var dbConfig = ConfigHelper.Get<DbConfig>("dbconfig", env.EnvironmentName);
-        var appConfig = ConfigHelper.Get<AppConfig>("appconfig", env.EnvironmentName);
-
-        //注册主库
+        //注册数据库
         freeSqlCloud.Register(DbKeys.MasterDb, () =>
         {
             //创建数据库
@@ -63,15 +67,14 @@ public static class DBServiceCollectionExtensions
             {
                 freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
                 {
-                    //Console.WriteLine($"{cmd.CommandText}\n{traceLog}\r\n");
-                    Console.WriteLine($"{cmd.CommandText}\r\n");
+                    //Console.WriteLine($"{cmd.CommandText}\n{traceLog}{Environment.NewLine}");
+                    Console.WriteLine($"{cmd.CommandText}{Environment.NewLine}");
                 });
             }
 
             #endregion 监听所有命令
 
             var fsql = freeSqlBuilder.Build();
-            var user = services.BuildServiceProvider().GetService<IUser>();
 
             //软删除过滤器
             fsql.GlobalFilter.ApplyOnly<IDelete>(FilterNames.Delete, a => a.IsDeleted == false);
@@ -109,7 +112,7 @@ public static class DBServiceCollectionExtensions
             );
 
             //配置实体
-            DbHelper.ConfigEntity(fsql, appConfig);
+            DbHelper.ConfigEntity(fsql, appConfig, dbConfig);
 
             hostAppOptions?.ConfigureFreeSql?.Invoke(fsql);
 
@@ -158,7 +161,7 @@ public static class DBServiceCollectionExtensions
                     {
                         MiniProfiler.Current.CustomTiming("CurdBefore", e.Sql);
                     }
-                    Console.WriteLine($"{e.Sql}\r\n");
+                    Console.WriteLine($"{e.Sql}{Environment.NewLine}");
                 };
                 fsql.Aop.CurdAfter += (s, e) =>
                 {
@@ -174,67 +177,45 @@ public static class DBServiceCollectionExtensions
             return fsql;
         });
 
+        //执行注册数据库
+        var fsql = freeSqlCloud.Use(dbConfig.Key);
+        if (dbConfig.SyncStructure)
+        {
+            var _ = fsql.CodeFirst;
+        }
+    }
+
+    /// <summary>
+    /// 添加数据库
+    /// </summary>
+    /// <param name="services"></param>
+    /// <param name="env"></param>
+    /// <param name="hostAppOptions"></param>
+    /// <returns></returns>
+    public static void AddDb(this IServiceCollection services, IHostEnvironment env, HostAppOptions hostAppOptions)
+    {
+        var dbConfig = ConfigHelper.Get<DbConfig>("dbconfig", env.EnvironmentName);
+        var appConfig = ConfigHelper.Get<AppConfig>("appconfig", env.EnvironmentName);
+        var user = services.BuildServiceProvider().GetService<IUser>();
+        var freeSqlCloud = appConfig.DistributeKey.IsNull() ? new FreeSqlCloud() : new FreeSqlCloud(appConfig.DistributeKey);
+        if (dbConfig.Key.NotNull())
+        {
+            DbKeys.MasterDb = dbConfig.Key;
+        }
+        RegisterDb(freeSqlCloud, user, dbConfig, appConfig, hostAppOptions);
+
         //注册多数据库
         if (dbConfig.Dbs?.Length > 0)
         {
             foreach (var db in dbConfig.Dbs)
             {
-                freeSqlCloud.Register(DbKeys.MultiDb + db.Key, () =>
-                {
-                    #region FreeSql
-
-                    var freeSqlBuilder = new FreeSqlBuilder()
-                            .UseConnectionString(db.Type, db.ConnectionString, db.ProviderType.NotNull() ? Type.GetType(db.ProviderType) : null)
-                            .UseAutoSyncStructure(false)
-                            .UseLazyLoading(false)
-                            .UseNoneCommandParameter(true);
-
-                    hostAppOptions?.ConfigureFreeSqlBuilder?.Invoke(freeSqlBuilder);
-
-                    #region 监听所有命令
-
-                    if (dbConfig.MonitorCommand)
-                    {
-                        freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
-                        {
-                            //Console.WriteLine($"{cmd.CommandText}\n{traceLog}\r\n");
-                            Console.WriteLine($"{cmd.CommandText}\r\n");
-                        });
-                    }
-
-                    #endregion 监听所有命令
-
-                    var fsql = freeSqlBuilder.Build();
-
-                    #region 监听Curd操作
-
-                    if (dbConfig.Curd)
-                    {
-                        fsql.Aop.CurdBefore += (s, e) =>
-                        {
-                            if (appConfig.MiniProfiler)
-                            {
-                                MiniProfiler.Current.CustomTiming("CurdBefore", e.Sql);
-                            }
-                            Console.WriteLine($"{e.Sql}\r\n");
-                        };
-                        fsql.Aop.CurdAfter += (s, e) =>
-                        {
-                            if (appConfig.MiniProfiler)
-                            {
-                                MiniProfiler.Current.CustomTiming("CurdAfter", $"{e.ElapsedMilliseconds}");
-                            }
-                        };
-                    }
-
-                    #endregion 监听Curd操作
-
-                    #endregion FreeSql
-
-                    return fsql;
-                });
+                RegisterDb(freeSqlCloud, user, db, appConfig, null);
             }
         }
+
+        services.AddSingleton<IFreeSql>(freeSqlCloud);
+        services.AddSingleton(freeSqlCloud);
+        services.AddScoped<UnitOfWorkManagerCloud>();
     }
 
     /// <summary>

+ 1 - 1
src/platform/ZhonTai.Admin/Core/Db/Data/SyncData.cs

@@ -17,7 +17,7 @@ public abstract class SyncData
     /// </summary>
     /// <typeparam name="T"></typeparam>
     /// <returns></returns>
-    private bool CheckIdentity<T>() where T : class
+    private static bool CheckIdentity<T>() where T : class
     {
         var isIdentity = false;
         var properties = typeof(T).GetProperties();

+ 18 - 15
src/platform/ZhonTai.Admin/Core/Db/DbHelper.cs

@@ -43,7 +43,7 @@ public class DbHelper
 
         try
         {
-            Console.WriteLine("\r\n create database started");
+            Console.WriteLine($"{Environment.NewLine} create database started");
             var filePath = Path.Combine(AppContext.BaseDirectory, "Configs/createdbsql.txt").ToPath();
             if (File.Exists(filePath))
             {
@@ -66,17 +66,17 @@ public class DbHelper
     /// <summary>
     /// 获得指定程序集表实体
     /// </summary>
-    /// <param name="appConfig"></param>
+    /// <param name="assemblyNames"></param>
     /// <returns></returns>
-    public static Type[] GetEntityTypes(AppConfig appConfig)
+    public static Type[] GetEntityTypes(string[] assemblyNames)
     {
-        if(!(appConfig.AssemblyNames?.Length > 0))
+        if(!(assemblyNames?.Length > 0))
         {
             return null;
         }
 
         Assembly[]  assemblies = DependencyContext.Default.RuntimeLibraries
-            .Where(a => appConfig.AssemblyNames.Contains(a.Name))
+            .Where(a => assemblyNames.Contains(a.Name))
             .Select(o => Assembly.Load(new AssemblyName(o.Name))).ToArray();
 
         var entityTypes = new List<Type>();
@@ -104,7 +104,10 @@ public class DbHelper
     /// <summary>
     /// 配置实体
     /// </summary>
-    public static void ConfigEntity(IFreeSql db, AppConfig appConfig = null)
+    /// <param name="db"></param>
+    /// <param name="appConfig"></param>
+    /// <param name="dbConfig"></param>
+    public static void ConfigEntity(IFreeSql db, AppConfig appConfig = null, DbConfig dbConfig = null)
     {
         //租户生成和操作租户Id
         if (!appConfig.Tenant)
@@ -113,7 +116,7 @@ public class DbHelper
             var tenantId = nameof(ITenant.TenantId);
 
             //获得指定程序集表实体
-            var entityTypes = GetEntityTypes(appConfig);
+            var entityTypes = GetEntityTypes(dbConfig.AssemblyNames);
 
             foreach (var entityType in entityTypes)
             {
@@ -210,7 +213,7 @@ public class DbHelper
     {
         //打印结构比对脚本
         //var dDL = db.CodeFirst.GetComparisonDDLStatements<PermissionEntity>();
-        //Console.WriteLine("\r\n " + dDL);
+        //Console.WriteLine($"{Environment.NewLine} " + dDL);
 
         //打印结构同步脚本
         //db.Aop.SyncStructureAfter += (s, e) =>
@@ -223,7 +226,7 @@ public class DbHelper
 
         // 同步结构
         var dbType = dbConfig.Type.ToString();
-        Console.WriteLine($"\r\n {(msg.NotNull() ? msg : $"sync {dbType} structure")} started");
+        Console.WriteLine($"{Environment.NewLine} {(msg.NotNull() ? msg : $"sync {dbType} structure")} started");
 
         if (dbConfig.Type == DataType.Oracle)
         {
@@ -231,7 +234,7 @@ public class DbHelper
         }
 
         //获得指定程序集表实体
-        var entityTypes = GetEntityTypes(appConfig);
+        var entityTypes = GetEntityTypes(dbConfig.AssemblyNames);
         db.CodeFirst.SyncStructure(entityTypes);
 
         Console.WriteLine($" {(msg.NotNull() ? msg : $"sync {dbType} structure")} succeed");
@@ -322,7 +325,7 @@ public class DbHelper
     {
         try
         {
-            Console.WriteLine("\r\n sync data started");
+            Console.WriteLine($"{Environment.NewLine} sync data started");
 
             if (appConfig.AssemblyNames?.Length > 0)
             {
@@ -344,7 +347,7 @@ public class DbHelper
                 db.Aop.AuditValue -= SyncDataAuditValue;
             }
 
-            Console.WriteLine(" sync data succeed\r\n");
+            Console.WriteLine($" sync data succeed{Environment.NewLine}");
         }
         catch (Exception ex)
         {
@@ -363,7 +366,7 @@ public class DbHelper
     {
         try
         {
-            Console.WriteLine("\r\n generate data started");
+            Console.WriteLine($"{Environment.NewLine} generate data started");
 
             if (appConfig.AssemblyNames?.Length > 0)
             {
@@ -381,11 +384,11 @@ public class DbHelper
                 }
             }
 
-            Console.WriteLine(" generate data succeed\r\n");
+            Console.WriteLine($" generate data succeed{Environment.NewLine}");
         }
         catch (Exception ex)
         {
-            throw new Exception($" generate data failed。\n{ex.Message}\r\n");
+            throw new Exception($" generate data failed。\n{ex.Message}{Environment.NewLine}");
         }
     }
 }

+ 0 - 175
src/platform/ZhonTai.Admin/Core/Db/FreeSqlCloudExtesions.cs

@@ -1,175 +0,0 @@
-using Microsoft.Extensions.DependencyInjection;
-using System;
-using StackExchange.Profiling;
-using FreeSql;
-using ZhonTai.Admin.Core.Auth;
-using ZhonTai.Admin.Core.Configs;
-using ZhonTai.Admin.Core.Dto;
-using ZhonTai.Admin.Core.Entities;
-using ZhonTai.Admin.Domain.Tenant;
-using ZhonTai.Admin.Core.Consts;
-
-namespace ZhonTai.Admin.Core.Db;
-
-public static class FreeSqlCloudExtesions
-{
-    /// <summary>
-    /// 创建FreeSql实例
-    /// </summary>
-    /// <param name="user"></param>
-    /// <param name="appConfig"></param>
-    /// <param name="dbConfig"></param>
-    /// <param name="tenant"></param>
-    /// <returns></returns>
-    private static IFreeSql CreateFreeSql(IUser user, AppConfig appConfig, DbConfig dbConfig, CreateFreeSqlTenantDto tenant)
-    {
-        if(tenant == null)
-        {
-            tenant = new CreateFreeSqlTenantDto
-            {
-                DbType = dbConfig.Type,
-                ConnectionString = dbConfig.ConnectionString
-            };
-        }
-        var freeSqlBuilder = new FreeSqlBuilder()
-        .UseConnectionString(tenant.DbType.Value, tenant.ConnectionString)
-        .UseAutoSyncStructure(false)
-        .UseLazyLoading(false)
-        .UseNoneCommandParameter(true);
-
-        #region 监听所有命令
-
-        if (dbConfig.MonitorCommand)
-        {
-            freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
-            {
-                Console.WriteLine($"{cmd.CommandText}\r\n");
-            });
-        }
-
-        #endregion 监听所有命令
-
-        var fsql = freeSqlBuilder.Build();
-
-        //软删除过滤器
-        fsql.GlobalFilter.ApplyOnly<IDelete>(FilterNames.Delete, a => a.IsDeleted == false);
-
-        //租户过滤器
-        if (appConfig.Tenant)
-        {
-            fsql.GlobalFilter.ApplyOnlyIf<ITenant>(FilterNames.Tenant, () => user?.Id > 0, a => a.TenantId == user.TenantId);
-        }
-
-        //配置实体
-        DbHelper.ConfigEntity(fsql, appConfig);
-
-        #region 监听Curd操作
-
-        if (dbConfig.Curd)
-        {
-            fsql.Aop.CurdBefore += (s, e) =>
-            {
-                if (appConfig.MiniProfiler)
-                {
-                    MiniProfiler.Current.CustomTiming("CurdBefore", e.Sql);
-                }
-                Console.WriteLine($"{e.Sql}\r\n");
-            };
-            fsql.Aop.CurdAfter += (s, e) =>
-            {
-                if (appConfig.MiniProfiler)
-                {
-                    MiniProfiler.Current.CustomTiming("CurdAfter", $"{e.ElapsedMilliseconds}");
-                }
-                Console.WriteLine($"{e.Sql}\r\n");
-            };
-        }
-
-        #endregion 监听Curd操作
-
-        #region 审计数据
-
-        //计算服务器时间
-        var serverTime = fsql.Ado.QuerySingle(() => DateTime.UtcNow);
-        var timeOffset = DateTime.UtcNow.Subtract(serverTime);
-        fsql.Aop.AuditValue += (s, e) =>
-        {
-            DbHelper.AuditValue(e, timeOffset, user);
-        };
-
-        #endregion 审计数据
-
-        return fsql;
-    }
-
-    public static string GetDbKey(this FreeSqlCloud _, IServiceProvider serviceProvider)
-    {
-        var user = serviceProvider.GetRequiredService<IUser>();
-        var appConfig = serviceProvider.GetRequiredService<AppConfig>();
-        var tenantId = user.TenantId;
-        if (appConfig.Tenant && tenantId.HasValue)
-        {
-            return user.DbKey.NotNull() ? user.DbKey : (DbKeys.TenantDb + tenantId);
-        }
-        else
-        {
-            return DbKeys.MasterDb;
-        }
-    }
-
-    /// <summary>
-    /// 获得当前登录用户数据库
-    /// </summary>
-    /// <param name="cloud"></param>
-    /// <param name="serviceProvider"></param>
-    /// <returns></returns>
-    public static IFreeSql GetCurrentDb(this FreeSqlCloud cloud, IServiceProvider serviceProvider)
-    {
-        var user = serviceProvider.GetRequiredService<IUser>();
-        var appConfig = serviceProvider.GetRequiredService<AppConfig>();
-
-        var tenantId = user.TenantId;
-        var dbKey = GetDbKey(cloud, serviceProvider);
-        var exists = cloud.ExistsRegister(dbKey);
-
-        if (!exists)
-        {
-            var dbConfig = serviceProvider.GetRequiredService<DbConfig>();
-            var tenantRepository = serviceProvider.GetRequiredService<ITenantRepository>();
-            var tenant = tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant).WhereDynamic(tenantId).ToOne<CreateFreeSqlTenantDto>();
-            cloud.Register(dbKey, () => CreateFreeSql(user, appConfig, dbConfig, tenant));
-        }
-
-        return cloud.Use(dbKey);
-    }
-
-    /// <summary>
-    /// 获得租户数据库
-    /// </summary>
-    /// <param name="cloud"></param>
-    /// <param name="serviceProvider"></param>
-    /// <param name="tenantId"></param>
-    /// <returns></returns>
-    public static IFreeSql GetTenantDb(this FreeSqlCloud cloud, IServiceProvider serviceProvider, long? tenantId = null)
-    {
-        if (!tenantId.HasValue)
-        {
-            return null;
-        }
-
-        var tenantRepository = serviceProvider.GetRequiredService<ITenantRepository>();
-        var tenant = tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant).WhereDynamic(tenantId).ToOne<CreateFreeSqlTenantDto>();
-        var dbKey = tenant.DbKey.NotNull() ? tenant.DbKey : (DbKeys.TenantDb + tenantId);
-        var exists = cloud.ExistsRegister(dbKey);
-        
-        if (!exists)
-        {
-            var user = serviceProvider.GetRequiredService<IUser>();
-            var dbConfig = serviceProvider.GetRequiredService<DbConfig>();
-            var appConfig = serviceProvider.GetRequiredService<AppConfig>();
-            cloud.Register(dbKey, () => CreateFreeSql(user, appConfig, dbConfig, tenant));
-        }
-
-        return cloud.Use(dbKey);
-    }
-}

+ 4 - 8
src/platform/ZhonTai.Admin/Core/Db/Transaction/TransactionAsyncInterceptor.cs

@@ -1,10 +1,10 @@
-using System;
-using System.Data;
+using System.Data;
 using System.Linq;
 using System.Threading.Tasks;
 using Castle.DynamicProxy;
 using FreeSql;
 using ZhonTai.Admin.Core.Attributes;
+using ZhonTai.Admin.Core.Consts;
 using ZhonTai.Admin.Core.Dto;
 
 namespace ZhonTai.Admin.Core.Db.Transaction;
@@ -13,14 +13,10 @@ public class TransactionAsyncInterceptor : IAsyncInterceptor
 {
     private IUnitOfWork _unitOfWork;
     private readonly UnitOfWorkManagerCloud _unitOfWorkManagerCloud;
-    private readonly FreeSqlCloud _freeSqlCloud;
-    private readonly IServiceProvider _serviceProvider;
 
-    public TransactionAsyncInterceptor(UnitOfWorkManagerCloud unitOfWorkManagerCloud, FreeSqlCloud freeSqlCloud, IServiceProvider serviceProvider)
+    public TransactionAsyncInterceptor(UnitOfWorkManagerCloud unitOfWorkManagerCloud)
     {
         _unitOfWorkManagerCloud = unitOfWorkManagerCloud;
-        _freeSqlCloud = freeSqlCloud;
-        _serviceProvider = serviceProvider;
     }
 
     private bool TryBegin(IInvocation invocation)
@@ -31,7 +27,7 @@ public class TransactionAsyncInterceptor : IAsyncInterceptor
         {
             IsolationLevel? isolationLevel = transaction.IsolationLevel == 0 ? null : transaction.IsolationLevel;
 
-            _unitOfWork = _unitOfWorkManagerCloud.Begin(_freeSqlCloud.GetDbKey(_serviceProvider), transaction.Propagation, isolationLevel);
+            _unitOfWork = _unitOfWorkManagerCloud.Begin(DbKeys.MasterDb, transaction.Propagation, isolationLevel);
             return true;
         }
 

+ 2 - 23
src/platform/ZhonTai.Admin/Core/Db/Transaction/UnitOfWorkManagerCloud.cs

@@ -1,9 +1,6 @@
 using FreeSql;
-using System;
 using System.Collections.Generic;
 using System.Data;
-using ZhonTai.Admin.Core.Auth;
-using ZhonTai.Admin.Core.Configs;
 using ZhonTai.Admin.Core.Consts;
 
 namespace ZhonTai.Admin.Core.Db.Transaction;
@@ -12,34 +9,16 @@ public class UnitOfWorkManagerCloud
 {
     readonly Dictionary<string, UnitOfWorkManager> _managers = new Dictionary<string, UnitOfWorkManager>();
     readonly FreeSqlCloud _cloud;
-    readonly IUser _user;
-    readonly AppConfig _appConfig;
-    readonly IServiceProvider _serviceProvider;
-    public UnitOfWorkManagerCloud(
-        FreeSqlCloud cloud, 
-        IUser user, 
-        AppConfig appConfig, 
-        IServiceProvider serviceProvider)
+    public UnitOfWorkManagerCloud(FreeSqlCloud cloud)
     {
         _cloud = cloud;
-        _user = user;
-        _appConfig = appConfig;
-        _serviceProvider = serviceProvider;
     }
 
     public UnitOfWorkManager GetUnitOfWorkManager(string dbKey)
     {
         if (dbKey.IsNull())
         {
-            if (_appConfig.Tenant && _user.TenantId.HasValue)
-            {
-                dbKey = _user.DbKey.NotNull() ? _user.DbKey : (DbKeys.TenantDb + _user.TenantId);
-                _cloud.GetCurrentDb(_serviceProvider);
-            }
-            else
-            {
-                dbKey = DbKeys.MasterDb;
-            }
+            dbKey = DbKeys.MasterDb;
         }
         if (_managers.TryGetValue(dbKey, out var uowm) == false)
         {

+ 11 - 18
src/platform/ZhonTai.Admin/Core/HostApp.cs

@@ -175,17 +175,7 @@ public class HostApp
         services.AddSingleton(dbConfig);
 
         //添加数据库
-        var freeSqlCloud = dbConfig.DistributeKey.IsNull() ? new FreeSqlCloud() : new FreeSqlCloud(dbConfig.DistributeKey);
-        services.AddSingleton<IFreeSql>(freeSqlCloud);
-        services.AddSingleton(freeSqlCloud);
-        services.AddScoped<UnitOfWorkManagerCloud>();
-        services.AddMasterDb(freeSqlCloud, env, _hostAppOptions);
-        var fsql = freeSqlCloud.Use(DbKeys.MasterDb);
-        if (dbConfig.SyncStructure)
-        {
-            var _ = fsql.CodeFirst;
-        }
-        services.AddSingleton(provider => fsql);
+        services.AddDb(env, _hostAppOptions);
 
         //上传配置
         var uploadConfig = ConfigHelper.Load("uploadconfig", env.EnvironmentName, true);
@@ -424,11 +414,14 @@ public class HostApp
         #endregion 操作日志
 
         #region 控制器
-        void controllersAction(MvcOptions options)
+        void mvcConfigure(MvcOptions options)
         {
             options.Filters.Add<ControllerExceptionFilter>();
             options.Filters.Add<ValidateInputFilter>();
-            options.Filters.Add<ValidatePermissionAttribute>();
+            if(appConfig.Validate.Login || appConfig.Validate.Permission)
+            {
+                options.Filters.Add<ValidatePermissionAttribute>();
+            }
             if (appConfig.Log.Operation)
             {
                 options.Filters.Add<ControllerLogFilter>();
@@ -445,10 +438,10 @@ public class HostApp
 
         var mvcBuilder = appConfig.AppType switch
         {
-            AppType.Controllers => services.AddControllers(controllersAction),
-            AppType.ControllersWithViews => services.AddControllersWithViews(controllersAction),
-            AppType.MVC => services.AddMvc(controllersAction),
-            _ => services.AddControllers(controllersAction)
+            AppType.Controllers => services.AddControllers(mvcConfigure),
+            AppType.ControllersWithViews => services.AddControllersWithViews(mvcConfigure),
+            AppType.MVC => services.AddMvc(mvcConfigure),
+            _ => services.AddControllers(mvcConfigure)
         };
 
         if (assemblies?.Length > 0)
@@ -576,7 +569,7 @@ public class HostApp
         //授权
         app.UseAuthorization();
 
-        //初始化会话数据权限
+        //初始化登录用户数据权限
         app.Use(async (ctx, next) =>
         {
             var user = ctx.RequestServices.GetRequiredService<IUser>();

+ 2 - 1
src/platform/ZhonTai.Admin/Core/Repositories/RepositoryBase.cs

@@ -3,6 +3,7 @@ using System;
 using System.Linq.Expressions;
 using System.Threading.Tasks;
 using ZhonTai.Admin.Core.Auth;
+using ZhonTai.Admin.Core.Consts;
 using ZhonTai.Admin.Core.Db.Transaction;
 
 namespace ZhonTai.Admin.Core.Repositories
@@ -112,7 +113,7 @@ namespace ZhonTai.Admin.Core.Repositories
 
     public class RepositoryBase<TEntity> : RepositoryBase<TEntity, long>, IRepositoryBase<TEntity> where TEntity : class
     {
-        public RepositoryBase(UnitOfWorkManagerCloud uowm) : this("", uowm) { }
+        public RepositoryBase(UnitOfWorkManagerCloud uowm) : this(DbKeys.MasterDb, uowm) { }
         public RepositoryBase(string db, UnitOfWorkManagerCloud uowm) : this(uowm.GetUnitOfWorkManager(db)) { }
         RepositoryBase(UnitOfWorkManager uowm) : base(uowm.Orm)
         {

+ 3 - 2
src/platform/ZhonTai.Admin/Repositories/Api/ApiRepository.cs

@@ -1,4 +1,5 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain.Api;
 
@@ -6,7 +7,7 @@ namespace ZhonTai.Admin.Repositories;
 
 public class ApiRepository : RepositoryBase<ApiEntity>, IApiRepository
 {
-    public ApiRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
+    public ApiRepository(UnitOfWorkManagerCloud uowm) : base(DbKeys.AdminDb, uowm)
     {
     }
 }

+ 3 - 2
src/platform/ZhonTai.Admin/Repositories/Dictionary/DictionaryRepository.cs

@@ -1,4 +1,5 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain.Dictionary;
 
@@ -6,7 +7,7 @@ namespace ZhonTai.Admin.Repositories;
 
 public class DictionaryRepository : RepositoryBase<DictionaryEntity>, IDictionaryRepository
 {
-    public DictionaryRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
+    public DictionaryRepository(UnitOfWorkManagerCloud uowm) : base(DbKeys.AdminDb, uowm)
     {
     }
 }

+ 3 - 2
src/platform/ZhonTai.Admin/Repositories/DictionaryType/DictionaryTypeRepository.cs

@@ -1,4 +1,5 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain.DictionaryType;
 
@@ -6,7 +7,7 @@ namespace ZhonTai.Admin.Repositories;
 
 public class DictionaryTypeRepository : RepositoryBase<DictionaryTypeEntity>, IDictionaryTypeRepository
 {
-    public DictionaryTypeRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
+    public DictionaryTypeRepository(UnitOfWorkManagerCloud uowm) : base(DbKeys.AdminDb, uowm)
     {
     }
 }

+ 3 - 2
src/platform/ZhonTai.Admin/Repositories/Document/DocumentRepository.cs

@@ -1,4 +1,5 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain.Document;
 
@@ -6,7 +7,7 @@ namespace ZhonTai.Admin.Repositories;
 
 public class DocumentRepository : RepositoryBase<DocumentEntity>, IDocumentRepository
 {
-    public DocumentRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
+    public DocumentRepository(UnitOfWorkManagerCloud uowm) : base(DbKeys.AdminDb, uowm)
     {
     }
 }

+ 3 - 2
src/platform/ZhonTai.Admin/Repositories/DocumentImage/DocumentImageRepository.cs

@@ -1,4 +1,5 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain.DocumentImage;
 
@@ -6,7 +7,7 @@ namespace ZhonTai.Admin.Repositories;
 
 public class DocumentImageRepository : RepositoryBase<DocumentImageEntity>, IDocumentImageRepository
 {
-    public DocumentImageRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
+    public DocumentImageRepository(UnitOfWorkManagerCloud uowm) : base(DbKeys.AdminDb, uowm)
     {
     }
 }

+ 3 - 2
src/platform/ZhonTai.Admin/Repositories/LoginLog/LoginLogRepository.cs

@@ -1,4 +1,5 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain.LoginLog;
 
@@ -6,7 +7,7 @@ namespace ZhonTai.Admin.Repositories;
 
 public class LoginLogRepository : RepositoryBase<LoginLogEntity>, ILoginLogRepository
 {
-    public LoginLogRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
+    public LoginLogRepository(UnitOfWorkManagerCloud uowm) : base(DbKeys.AdminDb, uowm)
     {
     }
 }

+ 3 - 2
src/platform/ZhonTai.Admin/Repositories/OprationLog/OprationLogRepository.cs

@@ -1,4 +1,5 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain.OprationLog;
 
@@ -6,7 +7,7 @@ namespace ZhonTai.Admin.Repositories;
 
 public class OprationLogRepository : RepositoryBase<OprationLogEntity>, IOprationLogRepository
 {
-    public OprationLogRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
+    public OprationLogRepository(UnitOfWorkManagerCloud uowm) : base(DbKeys.AdminDb, uowm)
     {
     }
 }

+ 2 - 1
src/platform/ZhonTai.Admin/Repositories/Org/OrgRepository.cs

@@ -1,5 +1,6 @@
 using System.Collections.Generic;
 using System.Threading.Tasks;
+using ZhonTai.Admin.Core.Consts;
 using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain;
@@ -10,7 +11,7 @@ namespace ZhonTai.Admin.Repositories;
 public class OrgRepository : RepositoryBase<OrgEntity>, IOrgRepository
 {
     private readonly IRepositoryBase<UserOrgEntity> _userOrgRepository;
-    public OrgRepository(UnitOfWorkManagerCloud uowm, IRepositoryBase<UserOrgEntity> userOrgRepository) : base(uowm)
+    public OrgRepository(UnitOfWorkManagerCloud uowm, IRepositoryBase<UserOrgEntity> userOrgRepository) : base(DbKeys.AdminDb, uowm)
     {
         _userOrgRepository = userOrgRepository;
     }

+ 3 - 2
src/platform/ZhonTai.Admin/Repositories/Permission/PermissionRepository.cs

@@ -1,4 +1,5 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain.Permission;
 
@@ -6,7 +7,7 @@ namespace ZhonTai.Admin.Repositories;
 
 public class PermissionRepository : RepositoryBase<PermissionEntity>, IPermissionRepository
 {
-    public PermissionRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
+    public PermissionRepository(UnitOfWorkManagerCloud uowm) : base(DbKeys.AdminDb, uowm)
     {
     }
 }

+ 3 - 2
src/platform/ZhonTai.Admin/Repositories/Role/RoleRepository.cs

@@ -1,4 +1,5 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain.Role;
 
@@ -6,7 +7,7 @@ namespace ZhonTai.Admin.Repositories;
 
 public class RoleRepository : RepositoryBase<RoleEntity>, IRoleRepository
 {
-    public RoleRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
+    public RoleRepository(UnitOfWorkManagerCloud uowm) : base(DbKeys.AdminDb, uowm)
     {
     }
 }

+ 3 - 2
src/platform/ZhonTai.Admin/Repositories/Tenant/TenantRepository.cs

@@ -1,4 +1,5 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain.Tenant;
 
@@ -6,7 +7,7 @@ namespace ZhonTai.Admin.Repositories;
 
 public class TenantRepository : RepositoryBase<TenantEntity>, ITenantRepository
 {
-    public TenantRepository(UnitOfWorkManagerCloud muowm) : base(muowm)
+    public TenantRepository(UnitOfWorkManagerCloud muowm) : base(DbKeys.AdminDb, muowm)
     {
     }
 }

+ 3 - 2
src/platform/ZhonTai.Admin/Repositories/User/UserRepository.cs

@@ -1,4 +1,5 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain.User;
 
@@ -6,7 +7,7 @@ namespace ZhonTai.Admin.Repositories;
 
 public class UserRepository : RepositoryBase<UserEntity>, IUserRepository
 {
-    public UserRepository(UnitOfWorkManagerCloud muowm) : base(muowm)
+    public UserRepository(UnitOfWorkManagerCloud muowm) : base(DbKeys.AdminDb, muowm)
     {
 
     }

+ 3 - 2
src/platform/ZhonTai.Admin/Repositories/UserStaff/UserStaffRepository.cs

@@ -1,4 +1,5 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain.UserStaff;
 
@@ -6,7 +7,7 @@ namespace ZhonTai.Admin.Repositories;
 
 public class UserStaffRepository : RepositoryBase<UserStaffEntity>, IUserStaffRepository
 {
-    public UserStaffRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
+    public UserStaffRepository(UnitOfWorkManagerCloud uowm) : base(DbKeys.AdminDb, uowm)
     {
 
     }

+ 3 - 2
src/platform/ZhonTai.Admin/Repositories/View/ViewRepositoryRepository.cs

@@ -1,4 +1,5 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain.View;
 
@@ -6,7 +7,7 @@ namespace ZhonTai.Admin.Repositories;
 
 public class ViewRepository : RepositoryBase<ViewEntity>, IViewRepository
 {
-    public ViewRepository(UnitOfWorkManagerCloud muowm) : base(muowm)
+    public ViewRepository(UnitOfWorkManagerCloud muowm) : base(DbKeys.AdminDb, muowm)
     {
     }
 }

+ 3 - 14
src/platform/ZhonTai.Admin/Services/Auth/AuthService.cs

@@ -31,9 +31,7 @@ using ZhonTai.Common.Helpers;
 using ZhonTai.DynamicApi;
 using ZhonTai.DynamicApi.Attributes;
 using FreeSql;
-using Microsoft.Extensions.DependencyInjection;
 using ZhonTai.Admin.Domain.TenantPermission;
-using ZhonTai.Admin.Core.Db;
 
 namespace ZhonTai.Admin.Services.Auth;
 
@@ -134,21 +132,12 @@ public class AuthService : BaseService, IAuthService, IDynamicApi
                 User = await _userRepository.GetAsync<AuthUserProfileDto>(User.Id)
             };
 
-
-            IFreeSql db = _permissionRepository.Orm;
-            if (User.TenantAdmin)
-            {
-                var cloud = ServiceProvider.GetRequiredService<FreeSqlCloud>();
-                db = cloud.Use(DbKeys.MasterDb);
-            }
-
-            var permissionRepository = db.GetRepositoryBase<PermissionEntity>();
-            var menuSelect = permissionRepository.Select;
-
-            var dotSelect = permissionRepository.Select.Where(a => a.Type == PermissionType.Dot);
+            var menuSelect = _permissionRepository.Select;
+            var dotSelect = _permissionRepository.Select.Where(a => a.Type == PermissionType.Dot);
 
             if (!User.PlatformAdmin)
             {
+                var db = _permissionRepository.Orm;
                 if (User.TenantAdmin)
                 {
                     menuSelect = menuSelect.Where(a =>

+ 6 - 9
src/platform/ZhonTai.Admin/Services/Permission/PermissionService.cs

@@ -34,6 +34,7 @@ public class PermissionService : BaseService, IPermissionService, IDynamicApi
     private readonly AppConfig _appConfig;
     private readonly IPermissionRepository _permissionRepository;
     private readonly IRoleRepository _roleRepository;
+    private IUserRepository _userRepository => LazyGetRequiredService<IUserRepository>();
     private readonly IRepositoryBase<RolePermissionEntity> _rolePermissionRepository;
     private readonly IRepositoryBase<TenantPermissionEntity> _tenantPermissionRepository;
     private readonly IRepositoryBase<UserRoleEntity> _userRoleRepository;
@@ -172,10 +173,10 @@ public class PermissionService : BaseService, IPermissionService, IDynamicApi
                 .Where(b => b.PermissionId == a.Id && b.TenantId == User.TenantId)
                 .Any()
             )
-            .OrderBy(a => new { a.ParentId, a.Sort })
-            .ToListAsync(a => new { a.Id, a.ParentId, a.Label, a.Type });
+            .AsTreeCte(up: true)
+            .ToListAsync(a => new { a.Id, a.ParentId, a.Label, a.Type, a.Sort });
 
-        var menus = permissions
+        var menus = permissions.DistinctBy(a => a.Id).OrderBy(a => a.ParentId).ThenBy(a => a.Sort)
             .Select(a => new
             {
                 a.Id,
@@ -480,10 +481,6 @@ public class PermissionService : BaseService, IPermissionService, IDynamicApi
     [Transaction]
     public virtual async Task<IResultOutput> SaveTenantPermissionsAsync(PermissionSaveTenantPermissionsInput input)
     {
-        //获得租户db
-        var cloud = ServiceProvider.GetRequiredService<FreeSqlCloud>();
-        var tenantDb = cloud.GetTenantDb(ServiceProvider, input.TenantId);
-
         //查询租户权限
         var permissionIds = await _tenantPermissionRepository.Select.Where(d => d.TenantId == input.TenantId).ToListAsync(m => m.PermissionId);
 
@@ -493,7 +490,7 @@ public class PermissionService : BaseService, IPermissionService, IDynamicApi
         {
             await _tenantPermissionRepository.DeleteAsync(m => m.TenantId == input.TenantId && deleteIds.Contains(m.PermissionId));
             //删除租户下关联的角色权限
-            await tenantDb.GetRepositoryBase<RolePermissionEntity>().DeleteAsync(a => deleteIds.Contains(a.PermissionId));
+            await _rolePermissionRepository.DeleteAsync(a => deleteIds.Contains(a.PermissionId));
         }
 
         //批量插入租户权限
@@ -513,7 +510,7 @@ public class PermissionService : BaseService, IPermissionService, IDynamicApi
         }
 
         //清除租户下所有用户权限缓存
-        var userIds = await tenantDb.GetRepositoryBase<UserEntity>().Select.Where(a => a.TenantId == input.TenantId).ToListAsync(a => a.Id);
+        var userIds = await _userRepository.Select.Where(a => a.TenantId == input.TenantId).ToListAsync(a => a.Id);
         if(userIds.Any())
         {
             foreach (var userId in userIds)

+ 16 - 33
src/platform/ZhonTai.Admin/Services/Tenant/TenantService.cs

@@ -19,8 +19,6 @@ using ZhonTai.Admin.Core.Configs;
 using ZhonTai.Admin.Domain.Org;
 using ZhonTai.Admin.Domain.UserStaff;
 using ZhonTai.Admin.Domain;
-using FreeSql;
-using ZhonTai.Admin.Core.Db;
 
 namespace ZhonTai.Admin.Services.Tenant;
 
@@ -30,28 +28,18 @@ namespace ZhonTai.Admin.Services.Tenant;
 [DynamicApi(Area = AdminConsts.AreaName)]
 public class TenantService : BaseService, ITenantService, IDynamicApi
 {
-    private readonly ITenantRepository _tenantRepository;
-    private readonly IRoleRepository _roleRepository;
-    private readonly IUserRepository _userRepository;
-    private readonly IRepositoryBase<UserRoleEntity> _userRoleRepository;
-    private readonly IRepositoryBase<RolePermissionEntity> _rolePermissionRepository;
-    private IUserStaffRepository _staffRepository => LazyGetRequiredService<IUserStaffRepository>();
+    private ITenantRepository _tenantRepository => LazyGetRequiredService<ITenantRepository>();
+    private IRoleRepository _roleRepository => LazyGetRequiredService<IRoleRepository>();
+    private IUserRepository _userRepository => LazyGetRequiredService<IUserRepository>();
+    private IOrgRepository _orgRepository => LazyGetRequiredService<IOrgRepository>();
+    private IRepositoryBase<UserRoleEntity> _userRoleRepository => LazyGetRequiredService<IRepositoryBase<UserRoleEntity>>();
+    private IRepositoryBase<RolePermissionEntity> _rolePermissionRepository => LazyGetRequiredService<IRepositoryBase<RolePermissionEntity>>();
+    private IUserStaffRepository _userStaffRepository => LazyGetRequiredService<IUserStaffRepository>();
     private IRepositoryBase<UserOrgEntity> _userOrgRepository => LazyGetRequiredService<IRepositoryBase<UserOrgEntity>>();
     private AppConfig _appConfig => LazyGetRequiredService<AppConfig>();
 
-    public TenantService(
-        ITenantRepository tenantRepository,
-        IRoleRepository roleRepository,
-        IUserRepository userRepository,
-        IRepositoryBase<UserRoleEntity> userRoleRepository,
-        IRepositoryBase<RolePermissionEntity> rolePermissionRepository
-    )
+    public TenantService()
     {
-        _tenantRepository = tenantRepository;
-        _roleRepository = roleRepository;
-        _userRepository = userRepository;
-        _userRoleRepository = userRoleRepository;
-        _rolePermissionRepository = rolePermissionRepository;
     }
 
     /// <summary>
@@ -114,9 +102,6 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
         TenantEntity entity = Mapper.Map<TenantEntity>(input);
         TenantEntity tenant = await _tenantRepository.InsertAsync(entity);
         long tenantId = tenant.Id;
-
-        var cloud = LazyGetRequiredService<FreeSqlCloud>();
-        var tenantDb = cloud.GetTenantDb(ServiceProvider, tenantId);
         
         //添加部门
         var org = new OrgEntity
@@ -127,8 +112,7 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
             ParentId = 0,
             MemberCount = 1
         };
-        
-        await tenantDb.GetRepositoryBase<OrgEntity>().InsertAsync(org);
+        await _orgRepository.InsertAsync(org);
 
         //添加主管理员
         string pwd = MD5Encrypt.Encrypt32(_appConfig.DefaultPassword);
@@ -144,7 +128,7 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
             Type = UserType.TenantAdmin,
             OrgId = org.Id
         };
-        await tenantDb.GetRepositoryBase<UserEntity>().InsertAsync(user);
+        await _userRepository.InsertAsync(user);
 
         long userId = user.Id;
 
@@ -154,7 +138,7 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
             Id = userId,
             TenantId = tenantId
         };
-        await tenantDb.GetRepositoryBase<UserStaffEntity>().InsertAsync(emp);
+        await _userStaffRepository.InsertAsync(emp);
 
         //添加用户部门
         var userOrg = new UserOrgEntity
@@ -162,9 +146,8 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
             UserId = userId,
             OrgId = org.Id
         };
-        await tenantDb.GetRepositoryBase<UserOrgEntity>().InsertAsync(userOrg);
+        await _userOrgRepository.InsertAsync(userOrg);
 
-        var roleRepository = tenantDb.GetRepositoryBase<RoleEntity>();
         //添加角色分组
         var roleGroup = new RoleEntity
         {
@@ -172,7 +155,7 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
             TenantId = tenantId,
             Name = "系统默认"
         };
-        await roleRepository.InsertAsync(roleGroup);
+        await _roleRepository.InsertAsync(roleGroup);
 
         //添加角色
         var role = new RoleEntity
@@ -183,7 +166,7 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
             ParentId = roleGroup.Id,
             DataScope = DataScope.All
         };
-        await roleRepository.InsertAsync(role);
+        await _roleRepository.InsertAsync(role);
 
         //添加用户角色
         var userRole = new UserRoleEntity()
@@ -191,7 +174,7 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
             UserId = userId,
             RoleId = role.Id
         };
-        await tenantDb.GetRepositoryBase<UserRoleEntity>().InsertAsync(userRole);
+        await _userRoleRepository.InsertAsync(userRole);
 
         //更新租户的用户
         tenant.UserId = userId;
@@ -238,7 +221,7 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
         await _userRoleRepository.Where(a => a.User.TenantId == id).DisableGlobalFilter(FilterNames.Tenant).ToDelete().ExecuteAffrowsAsync();
 
         //删除员工
-        await _staffRepository.Where(a => a.TenantId == id).DisableGlobalFilter(FilterNames.Tenant).ToDelete().ExecuteAffrowsAsync();
+        await _userStaffRepository.Where(a => a.TenantId == id).DisableGlobalFilter(FilterNames.Tenant).ToDelete().ExecuteAffrowsAsync();
 
         //删除用户部门
         await _userOrgRepository.Where(a => a.User.TenantId == id).DisableGlobalFilter(FilterNames.Tenant).ToDelete().ExecuteAffrowsAsync();

+ 60 - 80
src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

@@ -273,7 +273,7 @@
         </member>
         <member name="P:ZhonTai.Admin.Core.Configs.AppConfig.AssemblyNames">
             <summary>
-            程序集名称,默认 ZhonTai.Admin
+            程序集名称
             </summary>
         </member>
         <member name="P:ZhonTai.Admin.Core.Configs.AppConfig.Tenant">
@@ -281,6 +281,11 @@
             租户类型
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Core.Configs.AppConfig.DistributeKey">
+            <summary>
+            分布式事务唯一标识
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Core.Configs.AppConfig.Swagger">
             <summary>
             Swagger文档
@@ -311,6 +316,11 @@
             日志配置
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Core.Configs.AppConfig.Validate">
+            <summary>
+            验证配置
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Core.Configs.AppConfig.RateLimit">
             <summary>
             限流
@@ -406,6 +416,21 @@
             操作日志
             </summary>
         </member>
+        <member name="T:ZhonTai.Admin.Core.Configs.ValidateConfig">
+            <summary>
+            验证配置
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Core.Configs.ValidateConfig.Login">
+            <summary>
+            登录
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Core.Configs.ValidateConfig.Permission">
+            <summary>
+            权限
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Core.Configs.VarifyCodeConfig">
             <summary>
             验证码配置
@@ -456,6 +481,16 @@
             数据库配置
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Core.Configs.DbConfig.Key">
+            <summary>
+            数据库注册键
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Core.Configs.DbConfig.AssemblyNames">
+            <summary>
+            程序集名称
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Core.Configs.DbConfig.Type">
             <summary>
             数据库类型
@@ -471,11 +506,6 @@
             指定程序集
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Core.Configs.DbConfig.IdleTime">
-            <summary>
-            空闲时间(分)
-            </summary>
-        </member>
         <member name="P:ZhonTai.Admin.Core.Configs.DbConfig.GenerateData">
             <summary>
             生成数据
@@ -521,56 +551,26 @@
             多数据库
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Core.Configs.DbConfig.DistributeKey">
-            <summary>
-            分布式事务唯一标识
-            </summary>
-        </member>
         <member name="P:ZhonTai.Admin.Core.Configs.DbConfig.SlaveList">
             <summary>
             读写分离从库列表
             </summary>
         </member>
-        <member name="T:ZhonTai.Admin.Core.Configs.MultiDb">
-            <summary>
-            多数据库
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Core.Configs.MultiDb.Key">
+        <member name="T:ZhonTai.Admin.Core.Configs.SlaveDb">
             <summary>
-            数据库键
+            读写分离从库
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Core.Configs.MultiDb.Type">
+        <member name="P:ZhonTai.Admin.Core.Configs.SlaveDb.Weight">
             <summary>
             数据库类型
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Core.Configs.MultiDb.ConnectionString">
-            <summary>
-            数据库字符串
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Core.Configs.MultiDb.ProviderType">
-            <summary>
-            指定程序集
-            </summary>
-        </member>
-        <member name="T:ZhonTai.Admin.Core.Configs.SlaveDb">
-            <summary>
-            读写分离从库
-            </summary>
-        </member>
         <member name="P:ZhonTai.Admin.Core.Configs.SlaveDb.ConnectionString">
             <summary>
             数据库连接字符串
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Core.Configs.SlaveDb.Weight">
-            <summary>
-            数据库类型
-            </summary>
-        </member>
         <member name="T:ZhonTai.Admin.Core.Configs.JwtConfig">
             <summary>
             Jwt配置
@@ -706,19 +706,14 @@
             数据库键名
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Core.Consts.DbKeys.MasterDb">
+        <member name="P:ZhonTai.Admin.Core.Consts.DbKeys.MasterDb">
             <summary>
             主库
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Core.Consts.DbKeys.MultiDb">
-            <summary>
-            多库
-            </summary>
-        </member>
-        <member name="F:ZhonTai.Admin.Core.Consts.DbKeys.TenantDb">
+        <member name="P:ZhonTai.Admin.Core.Consts.DbKeys.AdminDb">
             <summary>
-            租户数据
+            admin库
             </summary>
         </member>
         <member name="T:ZhonTai.Admin.Core.Consts.FilterNames">
@@ -792,17 +787,20 @@
             <param name="dbConfig"></param>
             <returns></returns>
         </member>
-        <member name="M:ZhonTai.Admin.Core.Db.DbHelper.GetEntityTypes(ZhonTai.Admin.Core.Configs.AppConfig)">
+        <member name="M:ZhonTai.Admin.Core.Db.DbHelper.GetEntityTypes(System.String[])">
             <summary>
             获得指定程序集表实体
             </summary>
-            <param name="appConfig"></param>
+            <param name="assemblyNames"></param>
             <returns></returns>
         </member>
-        <member name="M:ZhonTai.Admin.Core.Db.DbHelper.ConfigEntity(IFreeSql,ZhonTai.Admin.Core.Configs.AppConfig)">
+        <member name="M:ZhonTai.Admin.Core.Db.DbHelper.ConfigEntity(IFreeSql,ZhonTai.Admin.Core.Configs.AppConfig,ZhonTai.Admin.Core.Configs.DbConfig)">
             <summary>
             配置实体
             </summary>
+            <param name="db"></param>
+            <param name="appConfig"></param>
+            <param name="dbConfig"></param>
         </member>
         <member name="M:ZhonTai.Admin.Core.Db.DbHelper.AuditValue(FreeSql.Aop.AuditValueEventArgs,System.TimeSpan,ZhonTai.Admin.Core.Auth.IUser)">
             <summary>
@@ -843,12 +841,21 @@
             <returns></returns>
             <exception cref="T:System.Exception"></exception>
         </member>
-        <member name="M:ZhonTai.Admin.Core.Db.DBServiceCollectionExtensions.AddMasterDb(Microsoft.Extensions.DependencyInjection.IServiceCollection,FreeSql.FreeSqlCloud,Microsoft.Extensions.Hosting.IHostEnvironment,ZhonTai.Admin.Core.Startup.HostAppOptions)">
+        <member name="M:ZhonTai.Admin.Core.Db.DBServiceCollectionExtensions.RegisterDb(FreeSql.FreeSqlCloud,ZhonTai.Admin.Core.Auth.IUser,ZhonTai.Admin.Core.Configs.DbConfig,ZhonTai.Admin.Core.Configs.AppConfig,ZhonTai.Admin.Core.Startup.HostAppOptions)">
             <summary>
-            添加主数据库
+            注册数据库
             </summary>
-            <param name="services"></param>
             <param name="freeSqlCloud"></param>
+            <param name="user"></param>
+            <param name="dbConfig"></param>
+            <param name="appConfig"></param>
+            <param name="hostAppOptions"></param>
+        </member>
+        <member name="M:ZhonTai.Admin.Core.Db.DBServiceCollectionExtensions.AddDb(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Hosting.IHostEnvironment,ZhonTai.Admin.Core.Startup.HostAppOptions)">
+            <summary>
+            添加数据库
+            </summary>
+            <param name="services"></param>
             <param name="env"></param>
             <param name="hostAppOptions"></param>
             <returns></returns>
@@ -861,33 +868,6 @@
             <param name="context"></param>
             <param name="version">版本</param>
         </member>
-        <member name="M:ZhonTai.Admin.Core.Db.FreeSqlCloudExtesions.CreateFreeSql(ZhonTai.Admin.Core.Auth.IUser,ZhonTai.Admin.Core.Configs.AppConfig,ZhonTai.Admin.Core.Configs.DbConfig,ZhonTai.Admin.Core.Dto.CreateFreeSqlTenantDto)">
-            <summary>
-            创建FreeSql实例
-            </summary>
-            <param name="user"></param>
-            <param name="appConfig"></param>
-            <param name="dbConfig"></param>
-            <param name="tenant"></param>
-            <returns></returns>
-        </member>
-        <member name="M:ZhonTai.Admin.Core.Db.FreeSqlCloudExtesions.GetCurrentDb(FreeSql.FreeSqlCloud,System.IServiceProvider)">
-            <summary>
-            获得当前登录用户数据库
-            </summary>
-            <param name="cloud"></param>
-            <param name="serviceProvider"></param>
-            <returns></returns>
-        </member>
-        <member name="M:ZhonTai.Admin.Core.Db.FreeSqlCloudExtesions.GetTenantDb(FreeSql.FreeSqlCloud,System.IServiceProvider,System.Nullable{System.Int64})">
-            <summary>
-            获得租户数据库
-            </summary>
-            <param name="cloud"></param>
-            <param name="serviceProvider"></param>
-            <param name="tenantId"></param>
-            <returns></returns>
-        </member>
         <member name="M:ZhonTai.Admin.Core.Db.FreeSqlDbContextExtensions.GetRepositoryBase``2(IFreeSql,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
             <summary>
             返回默认仓库类