0
0
zhontai 3 лет назад
Родитель
Сommit
9101d43acd
30 измененных файлов с 426 добавлено и 595 удалено
  1. 2 0
      Admin.Core.Common/Admin.Core.Common.csproj
  2. 7 2
      Admin.Core.Common/Auth/ClaimAttributes.cs
  3. 5 0
      Admin.Core.Common/Auth/IUser.cs
  4. 16 0
      Admin.Core.Common/Auth/User.cs
  5. 1 1
      Admin.Core.Common/BaseModel/DataIsolationType.cs
  6. 6 0
      Admin.Core.Common/Cache/CacheKey.cs
  7. 4 0
      Admin.Core.Repository/Admin.Core.Repository.csproj
  8. 1 1
      Admin.Core.Repository/Admin/Api/Output/ApiDataOutput.cs
  9. 1 1
      Admin.Core.Repository/Admin/Permission/Output/PermissionDataOutput.cs
  10. 1 1
      Admin.Core.Repository/Admin/View/Output/ViewDataOutput.cs
  11. 1 1
      Admin.Core.Repository/Base/Data.cs
  12. 40 38
      Admin.Core.Repository/Base/DbHelper.cs
  13. 102 12
      Admin.Core.Repository/Base/IdleBusExtesions.cs
  14. 3 1
      Admin.Core.Repository/Base/MyUnitOfWorkManager.cs
  15. 98 94
      Admin.Core.Service/Admin/Auth/AuthService.cs
  16. 6 1
      Admin.Core.Service/Admin/Auth/Output/AuthLoginOutput.cs
  17. 12 9
      Admin.Core.Service/Admin/Permission/PermissionService.cs
  18. 1 0
      Admin.Core.Service/Admin/Tenant/Input/TenantAddInput.cs
  19. 2 1
      Admin.Core.Service/Admin/Tenant/Output/TenantListOutput.cs
  20. 14 1
      Admin.Core.Service/Admin/User/UserService.cs
  21. 45 0
      Admin.Core/Admin.Core.Common.xml
  22. 0 25
      Admin.Core/Admin.Core.Model.xml
  23. 5 185
      Admin.Core/Admin.Core.Service.xml
  24. 0 87
      Admin.Core/Admin.Core.xml
  25. 2 1
      Admin.Core/Controllers/Admin/AuthController.cs
  26. 38 20
      Admin.Core/Db/DBServiceCollectionExtensions.cs
  27. 0 107
      Admin.Core/Db/TenantDBServiceCollectionExtensions.cs
  28. 1 2
      Admin.Core/Logs/ApiHelper.cs
  29. 11 3
      Admin.Core/Startup.cs
  30. 1 1
      Admin.Core/configs/appconfig.json

+ 2 - 0
Admin.Core.Common/Admin.Core.Common.csproj

@@ -39,6 +39,8 @@
     <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.11.0" />
     <PackageReference Include="UAParser" Version="3.1.46" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.12" />
+	<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.1.0" />
+	<PackageReference Include="Autofac.Extras.DynamicProxy" Version="6.0.0" />
   </ItemGroup>
 
 </Project>

+ 7 - 2
Admin.Core.Common/Auth/ClaimAttributes.cs

@@ -33,11 +33,16 @@
         /// <summary>
         /// 租户Id
         /// </summary>
-        public const string TenantId = "tenantid";
+        public const string TenantId = "ti";
 
         /// <summary>
         /// 租户类型
         /// </summary>
-        public const string TenantType = "tenanttype";
+        public const string TenantType = "tt";
+
+        /// <summary>
+        /// 数据隔离
+        /// </summary>
+        public const string DataIsolationType = "dit";
     }
 }

+ 5 - 0
Admin.Core.Common/Auth/IUser.cs

@@ -32,5 +32,10 @@ namespace Admin.Core.Common.Auth
         /// 租户类型
         /// </summary>
         TenantType? TenantType { get; }
+
+        /// <summary>
+        /// 数据隔离
+        /// </summary>
+       DataIsolationType? DataIsolationType { get; }
     }
 }

+ 16 - 0
Admin.Core.Common/Auth/User.cs

@@ -100,5 +100,21 @@ namespace Admin.Core.Common.Auth
                 return null;
             }
         }
+
+        /// <summary>
+        /// 数据隔离
+        /// </summary>
+        public virtual DataIsolationType? DataIsolationType
+        {
+            get
+            {
+                var dataIsolationType = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.DataIsolationType);
+                if (dataIsolationType != null && dataIsolationType.Value.NotNull())
+                {
+                    return (DataIsolationType)Enum.Parse(typeof(DataIsolationType), dataIsolationType.Value, true);
+                }
+                return null;
+            }
+        }
     }
 }

+ 1 - 1
Admin.Core.Model/Admin/DataIsolationType.cs → Admin.Core.Common/BaseModel/DataIsolationType.cs

@@ -1,7 +1,7 @@
 
 using System.ComponentModel;
 
-namespace Admin.Core.Model.Admin
+namespace Admin.Core.Common.BaseModel
 {
     /// <summary>
     /// 数据隔离类型

+ 6 - 0
Admin.Core.Common/Cache/CacheKey.cs

@@ -31,5 +31,11 @@ namespace Admin.Core.Common.Cache
         /// </summary>
         [Description("用户信息")]
         public const string UserInfo = "admin:user:{0}:info";
+
+        /// <summary>
+        /// 租户信息 admin:tenant:租户主键:info
+        /// </summary>
+        [Description("租户信息")]
+        public const string TenantInfo = "admin:tenant:{0}:info";
     }
 }

+ 4 - 0
Admin.Core.Repository/Admin.Core.Repository.csproj

@@ -23,6 +23,10 @@
     <Compile Remove="Base\BaseRepository.cs" />
   </ItemGroup>
 
+  <ItemGroup>
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.0" />
+  </ItemGroup>
+
   <ItemGroup>
     <ProjectReference Include="..\Admin.Core.Model\Admin.Core.Model.csproj" />
   </ItemGroup>

+ 1 - 1
Admin.Core.Service/Admin/Api/Output/ApiDataOutput.cs → Admin.Core.Repository/Admin/Api/Output/ApiDataOutput.cs

@@ -1,7 +1,7 @@
 using Newtonsoft.Json;
 using System.Collections.Generic;
 
-namespace Admin.Core.Service.Admin.Api.Output
+namespace Admin.Core.Repository.Admin.Output
 {
     public class ApiDataOutput
     {

+ 1 - 1
Admin.Core.Service/Admin/Permission/Output/PermissionDataOutput.cs → Admin.Core.Repository/Admin/Permission/Output/PermissionDataOutput.cs

@@ -2,7 +2,7 @@
 using Newtonsoft.Json;
 using System.Collections.Generic;
 
-namespace Admin.Core.Service.Admin.Permission.Output
+namespace Admin.Core.Repository.Admin.Permission.Output
 {
     public class PermissionDataOutput
     {

+ 1 - 1
Admin.Core.Service/Admin/View/Output/ViewDataOutput.cs → Admin.Core.Repository/Admin/View/Output/ViewDataOutput.cs

@@ -1,7 +1,7 @@
 using Newtonsoft.Json;
 using System.Collections.Generic;
 
-namespace Admin.Core.Service.Admin.View.Output
+namespace Admin.Core.Repository.Admin.View.Output
 {
     public class ViewDataOutput
     {

+ 1 - 1
Admin.Core/Db/Data.cs → Admin.Core.Repository/Base/Data.cs

@@ -1,6 +1,6 @@
 using Admin.Core.Model.Admin;
 
-namespace Admin.Core.Db
+namespace Admin.Core.Repository
 {
     /// <summary>
     /// 数据

+ 40 - 38
Admin.Core/Db/DbHelper.cs → Admin.Core.Repository/Base/DbHelper.cs

@@ -12,16 +12,16 @@ using Admin.Core.Model.Admin;
 using System.Collections.Generic;
 using System.Reflection;
 using Admin.Core.Common.BaseModel;
-using Admin.Core.Service.Admin.Api.Output;
-using Admin.Core.Service.Admin.View.Output;
-using Admin.Core.Service.Admin.Permission.Output;
 using FreeSql.Aop;
 using Admin.Core.Common.Attributes;
 using Admin.Core.Common.Auth;
 using Yitter.IdGenerator;
 using Admin.Core.Common.Extensions;
+using Admin.Core.Repository.Admin.Output;
+using Admin.Core.Repository.Admin.View.Output;
+using Admin.Core.Repository.Admin.Permission.Output;
 
-namespace Admin.Core.Db
+namespace Admin.Core.Repository
 {
     public class DbHelper
     {
@@ -97,7 +97,7 @@ namespace Admin.Core.Db
         public static void ConfigEntity(IFreeSql db, AppConfig appConfig = null)
         {
             //租户生成和操作租户Id
-            if (appConfig.Tenant)
+            if (!appConfig.Tenant)
             {
                 var iTenant = nameof(ITenant);
                 var tenantId = nameof(ITenant.TenantId);
@@ -261,48 +261,46 @@ namespace Admin.Core.Db
 
             try
             {
-                if (!await db.Queryable<T>().AnyAsync())
+                if (await db.Queryable<T>().AnyAsync())
                 {
-                    if (data?.Length > 0)
-                    {
-                        var repo = db.GetRepository<T>();
-                        var insert = db.Insert<T>();
-                        if (unitOfWork != null)
-                        {
-                            repo.UnitOfWork = unitOfWork;
-                            insert = insert.WithTransaction(tran);
-                        }
+                    Console.WriteLine($" table: {tableName} record already exists");
+                    return;
+                }
 
-                        var isIdentity = CheckIdentity<T>();
-                        if (isIdentity)
-                        {
-                            if (dbConfig.Type == DataType.SqlServer)
-                            {
-                                var insrtSql = insert.AppendData(data).InsertIdentity().ToSql();
-                                await repo.Orm.Ado.ExecuteNonQueryAsync($"SET IDENTITY_INSERT {tableName} ON\n {insrtSql} \nSET IDENTITY_INSERT {tableName} OFF");
-                            }
-                            else
-                            {
-                                await insert.AppendData(data).InsertIdentity().ExecuteAffrowsAsync();
-                            }
-                        }
-                        else
-                        {
-                            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
-                            await repo.InsertAsync(data);
-                        }
+                if (!(data?.Length > 0))
+                {
+                    Console.WriteLine($" table: {tableName} import data []");
+                    return;
+                }
+
+                var repo = db.GetRepository<T>();
+                var insert = db.Insert<T>();
+                if (unitOfWork != null)
+                {
+                    repo.UnitOfWork = unitOfWork;
+                    insert = insert.WithTransaction(tran);
+                }
 
-                        Console.WriteLine($" table: {tableName} sync data succeed");
+                var isIdentity = CheckIdentity<T>();
+                if (isIdentity)
+                {
+                    if (dbConfig.Type == DataType.SqlServer)
+                    {
+                        var insrtSql = insert.AppendData(data).InsertIdentity().ToSql();
+                        await repo.Orm.Ado.ExecuteNonQueryAsync($"SET IDENTITY_INSERT {tableName} ON\n {insrtSql} \nSET IDENTITY_INSERT {tableName} OFF");
                     }
                     else
                     {
-                        Console.WriteLine($" table: {tableName} import data []");
+                        await insert.AppendData(data).InsertIdentity().ExecuteAffrowsAsync();
                     }
                 }
                 else
                 {
-                    Console.WriteLine($" table: {tableName} record already exists");
+                    repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
+                    await repo.InsertAsync(data);
                 }
+
+                Console.WriteLine($" table: {tableName} sync data succeed");
             }
             catch (Exception ex)
             {
@@ -436,8 +434,9 @@ namespace Admin.Core.Db
         /// 生成极简数据
         /// </summary>
         /// <param name="db"></param>
+        /// <param name="appConfig"></param>
         /// <returns></returns>
-        public static async Task GenerateSimpleJsonDataAsync(IFreeSql db)
+        public static async Task GenerateSimpleJsonDataAsync(IFreeSql db, AppConfig appConfig = null)
         {
             try
             {
@@ -567,6 +566,7 @@ namespace Admin.Core.Db
                     a.Phone,
                     a.Email,
                     a.TenantType,
+                    a.DataIsolationType,
                     a.DbType,
                     a.ConnectionString,
                     a.IdleTime,
@@ -602,7 +602,9 @@ namespace Admin.Core.Db
                 //Formatting.Indented, 
                 settings
                 );
-                var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Db/Data/data.json").ToPath();
+
+                var fileName = appConfig.Tenant ? "data-share.json" : "data.json";
+                var filePath = Path.Combine(Directory.GetCurrentDirectory(), $"Db/Data/{fileName}").ToPath();
                 FileHelper.WriteFile(filePath, jsonData);
                 #endregion
 

+ 102 - 12
Admin.Core.Repository/Base/IdleBusExtesions.cs

@@ -1,20 +1,110 @@
-using Admin.Core.Common.Configs;
-using Admin.Core.Common.Consts;
+using Admin.Core.Common.Auth;
+using Admin.Core.Common.BaseModel;
+using Admin.Core.Common.Cache;
+using Admin.Core.Common.Configs;
+using Admin.Core.Model.Admin;
+using FreeSql;
+using Microsoft.Extensions.DependencyInjection;
+using System;
 
 namespace Admin.Core.Repository
 {
     public static class IdleBusExtesions
     {
-        public static IFreeSql GetTenant(this IdleBus<IFreeSql> ib, long? tenantId, AppConfig appConfig)
+        /// <summary>
+        /// 获得FreeSql实例
+        /// </summary>
+        /// <param name="ib"></param>
+        /// <param name="serviceProvider"></param>
+        /// <returns></returns>
+        public static IFreeSql GetFreeSql(this IdleBus<IFreeSql> ib, IServiceProvider serviceProvider)
         {
-            var tenantName = AdminConsts.TenantName;
-            //需要查询租户数据库类型
-            //if (appConfig.TenantDbType == TenantDbType.Own)
-            //{
-            //    tenantName = "tenant_" + tenantId?.ToString();
-            //}
-            var freeSql = ib.Get(tenantName);
-            return freeSql;
+            var user = serviceProvider.GetRequiredService<IUser>();
+            var appConfig = serviceProvider.GetRequiredService<AppConfig>();
+
+            if (appConfig.Tenant && user.DataIsolationType == DataIsolationType.OwnDb)
+            {
+                var tenantName = "tenant_" + user.TenantId?.ToString();
+                ib.TryRegister(tenantName, () => CreateFreeSql(user, appConfig, serviceProvider));
+                return ib.Get(tenantName);
+            }
+            else
+            {
+                var freeSql = serviceProvider.GetRequiredService<IFreeSql>();
+                return freeSql;
+            }
+        }
+
+        /// <summary>
+        /// 创建FreeSql实例
+        /// </summary>
+        /// <param name="user"></param>
+        /// <param name="appConfig"></param>
+        /// <param name="serviceProvider"></param>
+        /// <returns></returns>
+        private static IFreeSql CreateFreeSql(IUser user, AppConfig appConfig, IServiceProvider serviceProvider)
+        {
+            var dbConfig = serviceProvider.GetRequiredService<DbConfig>();
+            var cache = serviceProvider.GetRequiredService<ICache>();
+
+            //查询租户数据库信息
+            var key = string.Format(CacheKey.TenantInfo, user.TenantId);
+            var tenant = cache.GetOrSetAsync(key, async () =>
+            {
+                var freeSql = serviceProvider.GetRequiredService<IFreeSql>();
+                var tenantRepository = freeSql.GetRepository<TenantEntity>();
+                return await tenantRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(user.TenantId).ToOneAsync(a => new { a.DbType, a.ConnectionString });
+            }).Result;
+
+            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.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == false);
+
+            //配置实体
+            DbHelper.ConfigEntity(fsql, appConfig);
+
+            #region 监听Curd操作
+
+            if (dbConfig.Curd)
+            {
+                fsql.Aop.CurdBefore += (s, e) =>
+                {
+                    Console.WriteLine($"{e.Sql}\r\n");
+                };
+            }
+
+            #endregion 监听Curd操作
+
+            #region 审计数据
+
+            //计算服务器时间
+            var serverTime = fsql.Select<DualEntity>().Limit(1).First(a => DateTime.UtcNow);
+            var timeOffset = DateTime.UtcNow.Subtract(serverTime);
+            fsql.Aop.AuditValue += (s, e) =>
+            {
+                DbHelper.AuditValue(e, timeOffset, user);
+            };
+
+            #endregion 审计数据
+
+            return fsql;
         }
     }
-}
+}

+ 3 - 1
Admin.Core.Repository/Base/MyUnitOfWorkManager.cs

@@ -3,12 +3,14 @@
 using FreeSql;
 using Admin.Core.Common.Auth;
 using Admin.Core.Common.Configs;
+using System;
+using Admin.Core.Repository.Admin;
 
 namespace Admin.Core.Repository
 {
     public class MyUnitOfWorkManager : UnitOfWorkManager
     {
-        public MyUnitOfWorkManager(IdleBus<IFreeSql> ib, IUser user, AppConfig appConfig) : base(ib.GetTenant(user.TenantId, appConfig))
+        public MyUnitOfWorkManager(IdleBus<IFreeSql> ib, IServiceProvider serviceProvider) : base(ib.GetFreeSql(serviceProvider))
         {
         }
     }

+ 98 - 94
Admin.Core.Service/Admin/Auth/AuthService.cs

@@ -1,24 +1,24 @@
-using System;
-using System.Linq;
-using System.Threading.Tasks;
-using Admin.Core.Model.Admin;
-using Admin.Core.Common.Output;
-using Admin.Core.Repository.Admin;
 using Admin.Core.Common.Cache;
 using Admin.Core.Common.Configs;
 using Admin.Core.Common.Helpers;
+using Admin.Core.Common.Output;
+using Admin.Core.Model.Admin;
+using Admin.Core.Repository.Admin;
 using Admin.Core.Service.Admin.Auth.Input;
 using Admin.Core.Service.Admin.Auth.Output;
+using System;
+using System.Linq;
+using System.Threading.Tasks;
 
 namespace Admin.Core.Service.Admin.Auth
 {
     public class AuthService : BaseService, IAuthService
     {
-        private readonly ICache _cache;
         private readonly AppConfig _appConfig;
-        private readonly VerifyCodeHelper _verifyCodeHelper;
-        private readonly IUserRepository _userRepository;
+        private readonly ICache _cache;
         private readonly IPermissionRepository _permissionRepository;
+        private readonly IUserRepository _userRepository;
+        private readonly VerifyCodeHelper _verifyCodeHelper;
         private readonly ITenantRepository _tenantRepository;
 
         public AuthService(
@@ -38,9 +38,85 @@ namespace Admin.Core.Service.Admin.Auth
             _tenantRepository = tenantRepository;
         }
 
+        public async Task<IResponseOutput> GetPassWordEncryptKeyAsync()
+        {
+            //写入Redis
+            var guid = Guid.NewGuid().ToString("N");
+            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);
+        }
+
+        public async Task<IResponseOutput> GetUserInfoAsync()
+        {
+            if (!(User?.Id > 0))
+            {
+                return ResponseOutput.NotOk("未登录!");
+            }
+
+            var key = string.Format(CacheKey.UserInfo, User.Id);
+            var output = await _cache.GetOrSetAsync(key, async () =>
+            {
+                var authUserInfoOutput = new AuthUserInfoOutput { };
+                //用户信息
+                authUserInfoOutput.User = await _userRepository.GetAsync<AuthUserProfileDto>(User.Id);
+
+                //用户菜单
+                authUserInfoOutput.Menus = await _permissionRepository.Select
+                    .Where(a => new[] { PermissionType.Group, PermissionType.Menu }.Contains(a.Type))
+                    .Where(a =>
+                        _permissionRepository.Orm.Select<RolePermissionEntity>()
+                        .InnerJoin<UserRoleEntity>((b, c) => b.RoleId == c.RoleId && c.UserId == User.Id)
+                        .Where(b => b.PermissionId == a.Id)
+                        .Any()
+                    )
+                    .OrderBy(a => a.ParentId)
+                    .OrderBy(a => a.Sort)
+                    .ToListAsync(a => new AuthUserMenuDto { ViewPath = a.View.Path });
+
+                //用户权限点
+                authUserInfoOutput.Permissions = await _permissionRepository.Select
+                    .Where(a => new[] { PermissionType.Api, PermissionType.Dot }.Contains(a.Type))
+                    .Where(a =>
+                        _permissionRepository.Orm.Select<RolePermissionEntity>()
+                        .InnerJoin<UserRoleEntity>((b, c) => b.RoleId == c.RoleId && c.UserId == User.Id)
+                        .Where(b => b.PermissionId == a.Id)
+                        .Any()
+                    )
+                    .ToListAsync(a => a.Code);
+
+                return authUserInfoOutput;
+            });
+
+            return ResponseOutput.Ok(output);
+        }
+
+        public async Task<IResponseOutput> GetVerifyCodeAsync(string lastKey)
+        {
+            var img = _verifyCodeHelper.GetBase64String(out string code);
+
+            //删除上次缓存的验证码
+            if (lastKey.NotNull())
+            {
+                await _cache.DelAsync(lastKey);
+            }
+
+            //写入Redis
+            var guid = Guid.NewGuid().ToString("N");
+            var key = string.Format(CacheKey.VerifyCodeKey, guid);
+            await _cache.SetAsync(key, code, TimeSpan.FromMinutes(5));
+
+            var data = new AuthGetVerifyCodeOutput { Key = guid, Img = img };
+            return ResponseOutput.Ok(data);
+        }
+
         public async Task<IResponseOutput> LoginAsync(AuthLoginInput input)
         {
             #region 验证码校验
+
             if (_appConfig.VarifyCode.Enable)
             {
                 var verifyCodeKey = string.Format(CacheKey.VerifyCodeKey, input.VerifyCodeKey);
@@ -63,11 +139,12 @@ namespace Admin.Core.Service.Admin.Auth
                     return ResponseOutput.NotOk("验证码已过期!", 1);
                 }
             }
-            #endregion
+
+            #endregion 验证码校验
 
             UserEntity user = null;
 
-            user = await _userRepository.Select.DisableGlobalFilter("Tenant").Where(a=> a.UserName == input.UserName).ToOneAsync();
+            user = await _userRepository.Select.DisableGlobalFilter("Tenant").Where(a => a.UserName == input.UserName).ToOneAsync();
             //user = (await _userRepository.GetAsync(a => a.UserName == input.UserName));
 
             if (!(user?.Id > 0))
@@ -76,6 +153,7 @@ namespace Admin.Core.Service.Admin.Auth
             }
 
             #region 解密
+
             if (input.PasswordKey.NotNull())
             {
                 var passwordEncryptKey = string.Format(CacheKey.PassWordEncryptKey, input.PasswordKey);
@@ -95,7 +173,8 @@ namespace Admin.Core.Service.Admin.Auth
                     return ResponseOutput.NotOk("解密失败!", 1);
                 }
             }
-            #endregion
+
+            #endregion 解密
 
             var password = MD5Encrypt.Encrypt32(input.Password);
             if (user.Password != password)
@@ -105,92 +184,17 @@ namespace Admin.Core.Service.Admin.Auth
 
             var authLoginOutput = Mapper.Map<AuthLoginOutput>(user);
 
-            ////需要查询租户数据库类型
-            //if(_appConfig.TenantDbType != TenantDbType.None)
-            //{
-            //    authLoginOutput.TenantType = await _tenantRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(user.TenantId).ToOneAsync(a => a.TenantType);
-            //}
+            if (_appConfig.Tenant)
+            {
+                var tenant = await _tenantRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(user.TenantId).ToOneAsync(a => new { a.TenantType, a.DataIsolationType });
+                authLoginOutput.TenantType = tenant.TenantType;
+                authLoginOutput.DataIsolationType = tenant.DataIsolationType;
+            }
 
             //登录清空用户缓存
             await _cache.DelAsync(string.Format(CacheKey.UserInfo, user.Id));
 
             return ResponseOutput.Ok(authLoginOutput);
         }
-
-        public async Task<IResponseOutput> GetUserInfoAsync()
-        {
-            if (!(User?.Id > 0))
-            {
-                return ResponseOutput.NotOk("未登录!");
-            }
-
-            var key = string.Format(CacheKey.UserInfo, User.Id);
-            var output = await _cache.GetOrSetAsync(key, async () => 
-            {
-                var authUserInfoOutput = new AuthUserInfoOutput { };
-                //用户信息
-                authUserInfoOutput.User = await _userRepository.GetAsync<AuthUserProfileDto>(User.Id);
-
-                //用户菜单
-                authUserInfoOutput.Menus = await _permissionRepository.Select
-                    .Where(a => new[] { PermissionType.Group, PermissionType.Menu }.Contains(a.Type))
-                    .Where(a =>
-                        _permissionRepository.Orm.Select<RolePermissionEntity>()
-                        .InnerJoin<UserRoleEntity>((b, c) => b.RoleId == c.RoleId && c.UserId == User.Id)
-                        .Where(b => b.PermissionId == a.Id)
-                        .Any()
-                    )
-                    .OrderBy(a => a.ParentId)
-                    .OrderBy(a => a.Sort)
-                    .ToListAsync(a => new AuthUserMenuDto { ViewPath = a.View.Path });
-
-                //用户权限点
-                authUserInfoOutput.Permissions = await _permissionRepository.Select
-                    .Where(a => new[] { PermissionType.Api, PermissionType.Dot }.Contains(a.Type))
-                    .Where(a =>
-                        _permissionRepository.Orm.Select<RolePermissionEntity>()
-                        .InnerJoin<UserRoleEntity>((b, c) => b.RoleId == c.RoleId && c.UserId == User.Id)
-                        .Where(b => b.PermissionId == a.Id)
-                        .Any()
-                    )
-                    .ToListAsync(a => a.Code);
-
-                return authUserInfoOutput;
-            });
-            
-
-            return ResponseOutput.Ok(output);
-        }
-
-        public async Task<IResponseOutput> GetVerifyCodeAsync(string lastKey)
-        {
-            var img = _verifyCodeHelper.GetBase64String(out string code);
-
-            //删除上次缓存的验证码
-            if (lastKey.NotNull())
-            {
-                await _cache.DelAsync(lastKey);
-            }
-
-            //写入Redis
-            var guid = Guid.NewGuid().ToString("N");
-            var key = string.Format(CacheKey.VerifyCodeKey, guid);
-            await _cache.SetAsync(key, code, TimeSpan.FromMinutes(5));
-
-            var data = new AuthGetVerifyCodeOutput { Key = guid, Img = img };
-            return ResponseOutput.Ok(data);
-        }
-
-        public async Task<IResponseOutput> GetPassWordEncryptKeyAsync()
-        {
-            //写入Redis
-            var guid = Guid.NewGuid().ToString("N");
-            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);
-        }
     }
-}
+}

+ 6 - 1
Admin.Core.Service/Admin/Auth/Output/AuthLoginOutput.cs

@@ -29,6 +29,11 @@ namespace Admin.Core.Service.Admin.Auth.Output
         /// <summary>
         /// 租户类型
         /// </summary>
-        public TenantType? TenantType { get; set; } = Common.BaseModel.TenantType.Tenant;
+        public TenantType? TenantType { get; set; }
+
+        /// <summary>
+        /// 数据隔离
+        /// </summary>
+        public DataIsolationType? DataIsolationType { get; set; }
     }
 }

+ 12 - 9
Admin.Core.Service/Admin/Permission/PermissionService.cs

@@ -21,12 +21,15 @@ namespace Admin.Core.Service.Admin.Permission
         private readonly IPermissionRepository _permissionRepository;
         private readonly IRoleRepository _roleRepository;
         private readonly IRolePermissionRepository _rolePermissionRepository;
+        private readonly ITenantRepository _tenantRepository;
+
         public PermissionService(
             AppConfig appConfig,
             ICache cache,
             IPermissionRepository permissionRepository,
             IRoleRepository roleRepository,
-            IRolePermissionRepository rolePermissionRepository
+            IRolePermissionRepository rolePermissionRepository,
+            ITenantRepository tenantRepository
         )
         {
             _appConfig = appConfig;
@@ -34,6 +37,7 @@ namespace Admin.Core.Service.Admin.Permission
             _permissionRepository = permissionRepository;
             _roleRepository = roleRepository;
             _rolePermissionRepository = rolePermissionRepository;
+            _tenantRepository = tenantRepository;
         }
 
         public async Task<IResponseOutput> GetAsync(long id)
@@ -229,15 +233,14 @@ namespace Admin.Core.Service.Admin.Permission
 
         public async Task<IResponseOutput> GetPermissionList()
         {
-            ////需要查询租户数据库类型
             var permissions = await _permissionRepository.Select
-                //.WhereIf(_appConfig.TenantDbType == TenantDbType.Share, a =>
-                //    _permissionRepository.Orm.Select<RolePermissionEntity>()
-                //    .InnerJoin<TenantEntity>((b, c) => b.RoleId == c.RoleId && c.Id == User.TenantId)
-                //    .DisableGlobalFilter("Tenant")
-                //    .Where(b => b.PermissionId == a.Id)
-                //    .Any()
-                //)
+                .WhereIf(_appConfig.Tenant && User.TenantType == TenantType.Tenant && User.DataIsolationType == DataIsolationType.Share, a =>
+                    _permissionRepository.Orm.Select<RolePermissionEntity>()
+                    .InnerJoin<TenantEntity>((b, c) => b.RoleId == c.RoleId && c.Id == User.TenantId)
+                    .DisableGlobalFilter("Tenant")
+                    .Where(b => b.PermissionId == a.Id)
+                    .Any()
+                )
                 .OrderBy(a => a.ParentId)
                 .OrderBy(a => a.Sort)
                 .ToListAsync(a => new { a.Id, a.ParentId, a.Label, a.Type });

+ 1 - 0
Admin.Core.Service/Admin/Tenant/Input/TenantAddInput.cs

@@ -1,4 +1,5 @@
 
+using Admin.Core.Common.BaseModel;
 using Admin.Core.Model.Admin;
 
 namespace Admin.Core.Service.Admin.Tenant.Input

+ 2 - 1
Admin.Core.Service/Admin/Tenant/Output/TenantListOutput.cs

@@ -1,4 +1,5 @@
-using Admin.Core.Model.Admin;
+using Admin.Core.Common.BaseModel;
+using Admin.Core.Model.Admin;
 using Newtonsoft.Json;
 using System;
 

+ 14 - 1
Admin.Core.Service/Admin/User/UserService.cs

@@ -11,6 +11,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;
+using Admin.Core.Common.Configs;
 
 namespace Admin.Core.Service.Admin.User
 {
@@ -20,27 +21,39 @@ namespace Admin.Core.Service.Admin.User
     public class UserService : BaseService, IUserService
     {
         private readonly ICache _cache;
+        private readonly AppConfig _appConfig;
         private readonly IUserRepository _userRepository;
         private readonly IUserRoleRepository _userRoleRepository;
         private readonly IRolePermissionRepository _rolePermissionRepository;
+        private readonly ITenantRepository _tenantRepository;
 
         public UserService(
             ICache cache,
+            AppConfig appConfig,
             IUserRepository userRepository,
             IUserRoleRepository userRoleRepository,
-            IRolePermissionRepository rolePermissionRepository
+            IRolePermissionRepository rolePermissionRepository,
+            ITenantRepository tenantRepository
         )
         {
             _cache = cache;
+            _appConfig = appConfig;
             _userRepository = userRepository;
             _userRoleRepository = userRoleRepository;
             _rolePermissionRepository = rolePermissionRepository;
+            _tenantRepository = tenantRepository;
         }
 
         public async Task<ResponseOutput<AuthLoginOutput>> GetLoginUserAsync(long id)
         {
             var output = new ResponseOutput<AuthLoginOutput>();
             var entityDto = await _userRepository.GetAsync<AuthLoginOutput>(id);
+            if (_appConfig.Tenant)
+            {
+                var tenant = await _tenantRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(User.TenantId).ToOneAsync(a => new { a.TenantType, a.DataIsolationType });
+                output.Data.TenantType = tenant.TenantType;
+                output.Data.DataIsolationType = tenant.DataIsolationType;
+            }
             return output.Ok(entityDto);
         }
 

+ 45 - 0
Admin.Core/Admin.Core.Common.xml

@@ -64,6 +64,11 @@
             租户类型
             </summary>
         </member>
+        <member name="F:Admin.Core.Common.Auth.ClaimAttributes.DataIsolationType">
+            <summary>
+            数据隔离
+            </summary>
+        </member>
         <member name="T:Admin.Core.Common.Auth.IUser">
             <summary>
             用户信息接口
@@ -94,6 +99,11 @@
             租户类型
             </summary>
         </member>
+        <member name="P:Admin.Core.Common.Auth.IUser.DataIsolationType">
+            <summary>
+            数据隔离
+            </summary>
+        </member>
         <member name="T:Admin.Core.Common.Auth.User">
             <summary>
             用户信息
@@ -124,6 +134,11 @@
             租户类型
             </summary>
         </member>
+        <member name="P:Admin.Core.Common.Auth.User.DataIsolationType">
+            <summary>
+            数据隔离
+            </summary>
+        </member>
         <member name="T:Admin.Core.Common.Auth.UserIdentiyServer">
             <summary>
             用户信息
@@ -134,6 +149,31 @@
             用户Id
             </summary>
         </member>
+        <member name="T:Admin.Core.Common.BaseModel.DataIsolationType">
+            <summary>
+            数据隔离类型
+            </summary>
+        </member>
+        <member name="F:Admin.Core.Common.BaseModel.DataIsolationType.OwnDb">
+            <summary>
+            独立数据库
+            </summary>
+        </member>
+        <member name="F:Admin.Core.Common.BaseModel.DataIsolationType.OwnDt">
+            <summary>
+            独立数据表
+            </summary>
+        </member>
+        <member name="F:Admin.Core.Common.BaseModel.DataIsolationType.Schema">
+            <summary>
+            共享数据库,独立架构
+            </summary>
+        </member>
+        <member name="F:Admin.Core.Common.BaseModel.DataIsolationType.Share">
+            <summary>
+            共享数据库
+            </summary>
+        </member>
         <member name="P:Admin.Core.Common.BaseModel.IEntity`1.Id">
             <summary>
             主键Id
@@ -309,6 +349,11 @@
             用户信息 admin:user:用户主键:info
             </summary>
         </member>
+        <member name="F:Admin.Core.Common.Cache.CacheKey.TenantInfo">
+            <summary>
+            租户信息 admin:tenant:租户主键:info
+            </summary>
+        </member>
         <member name="T:Admin.Core.Common.Cache.CacheType">
             <summary>
             缓存类型

+ 0 - 25
Admin.Core/Admin.Core.Model.xml

@@ -49,31 +49,6 @@
             启用
             </summary>
         </member>
-        <member name="T:Admin.Core.Model.Admin.DataIsolationType">
-            <summary>
-            数据隔离类型
-            </summary>
-        </member>
-        <member name="F:Admin.Core.Model.Admin.DataIsolationType.OwnDb">
-            <summary>
-            独立数据库
-            </summary>
-        </member>
-        <member name="F:Admin.Core.Model.Admin.DataIsolationType.OwnDt">
-            <summary>
-            独立数据表
-            </summary>
-        </member>
-        <member name="F:Admin.Core.Model.Admin.DataIsolationType.Schema">
-            <summary>
-            共享数据库,独立架构
-            </summary>
-        </member>
-        <member name="F:Admin.Core.Model.Admin.DataIsolationType.Share">
-            <summary>
-            共享数据库
-            </summary>
-        </member>
         <member name="T:Admin.Core.Model.Admin.DictionaryEntity">
             <summary>
             数据字典

+ 5 - 185
Admin.Core/Admin.Core.Service.xml

@@ -152,56 +152,6 @@
             版本
             </summary>
         </member>
-        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.TenantId">
-            <summary>
-            租户Id
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.Id">
-            <summary>
-            接口Id
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.ParentId">
-            <summary>
-            接口父级
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.Name">
-            <summary>
-            接口命名
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.Label">
-            <summary>
-            接口名称
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.Path">
-            <summary>
-            接口地址
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.HttpMethods">
-            <summary>
-            接口提交方法
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.Description">
-            <summary>
-            说明
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.Sort">
-            <summary>
-            排序
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.Enabled">
-            <summary>
-            启用
-            </summary>
-        </member>
         <member name="P:Admin.Core.Service.Admin.Api.Output.ApiListOutput.Id">
             <summary>
             接口Id
@@ -317,6 +267,11 @@
             租户类型
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Admin.Auth.Output.AuthLoginOutput.DataIsolationType">
+            <summary>
+            数据隔离
+            </summary>
+        </member>
         <member name="P:Admin.Core.Service.Admin.Auth.Output.AuthUserInfoOutput.User">
             <summary>
             用户个人信息
@@ -1170,101 +1125,6 @@
             版本
             </summary>
         </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.TenantId">
-            <summary>
-            租户Id
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Id">
-            <summary>
-            权限Id
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.ParentId">
-            <summary>
-            父级节点
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Label">
-            <summary>
-            权限名称
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Code">
-            <summary>
-            权限编码
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Type">
-            <summary>
-            权限类型
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.ViewId">
-            <summary>
-            视图
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.ApiId">
-            <summary>
-            接口
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Path">
-            <summary>
-            访问地址
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Icon">
-            <summary>
-            图标
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.ApiPath">
-            <summary>
-            接口路径
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Closable">
-            <summary>
-            可关闭
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Opened">
-            <summary>
-            组打开
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.NewWindow">
-            <summary>
-            打开新窗口
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.External">
-            <summary>
-            链接外显
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Hidden">
-            <summary>
-            隐藏
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Sort">
-            <summary>
-            排序
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Enabled">
-            <summary>
-            启用
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Description">
-            <summary>
-            描述
-            </summary>
-        </member>
         <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionListOutput.Id">
             <summary>
             权限Id
@@ -1838,46 +1698,6 @@
             <param name="id"></param>
             <returns></returns>
         </member>
-        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.TenantId">
-            <summary>
-            租户Id
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.Id">
-            <summary>
-            视图Id
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.ParentId">
-            <summary>
-            视图父级
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.Name">
-            <summary>
-            视图命名
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.Label">
-            <summary>
-            视图名称
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.Path">
-            <summary>
-            视图路径
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.Enabled">
-            <summary>
-            启用
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.Description">
-            <summary>
-            说明
-            </summary>
-        </member>
         <member name="P:Admin.Core.Service.Admin.View.Output.ViewListOutput.Id">
             <summary>
             视图Id

+ 0 - 87
Admin.Core/Admin.Core.xml

@@ -743,86 +743,6 @@
             基础控制器
             </summary>
         </member>
-        <member name="T:Admin.Core.Db.Data">
-            <summary>
-            数据
-            </summary>
-        </member>
-        <member name="F:Admin.Core.Db.DbHelper.TimeOffset">
-            <summary>
-            偏移时间
-            </summary>
-        </member>
-        <member name="M:Admin.Core.Db.DbHelper.CreateDatabaseAsync(Admin.Core.Common.Configs.DbConfig)">
-            <summary>
-            创建数据库
-            </summary>
-            <param name="dbConfig"></param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.Core.Db.DbHelper.GetEntityTypes">
-            <summary>
-            获得指定程序集表实体
-            </summary>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.Core.Db.DbHelper.ConfigEntity(IFreeSql,Admin.Core.Common.Configs.AppConfig)">
-            <summary>
-            配置实体
-            </summary>
-        </member>
-        <member name="M:Admin.Core.Db.DbHelper.AuditValue(FreeSql.Aop.AuditValueEventArgs,System.TimeSpan,Admin.Core.Common.Auth.IUser)">
-            <summary>
-            审计数据
-            </summary>
-            <param name="e"></param>
-            <param name="timeOffset"></param>
-            <param name="user"></param>
-        </member>
-        <member name="M:Admin.Core.Db.DbHelper.SyncStructure(IFreeSql,System.String,Admin.Core.Common.Configs.DbConfig,Admin.Core.Common.Configs.AppConfig)">
-            <summary>
-            同步结构
-            </summary>
-        </member>
-        <member name="M:Admin.Core.Db.DbHelper.CheckIdentity``1">
-            <summary>
-            检查实体属性是否为自增长
-            </summary>
-            <typeparam name="T"></typeparam>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.Core.Db.DbHelper.InitDtDataAsync``1(IFreeSql,FreeSql.IUnitOfWork,System.Data.Common.DbTransaction,``0[],Admin.Core.Common.Configs.DbConfig)">
-            <summary>
-            初始化数据表数据
-            </summary>
-            <typeparam name="T"></typeparam>
-            <param name="db"></param>
-            <param name="unitOfWork"></param>
-            <param name="tran"></param>
-            <param name="data"></param>
-            <param name="dbConfig"></param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.Core.Db.DbHelper.SyncDataAuditValue(System.Object,FreeSql.Aop.AuditValueEventArgs)">
-            <summary>
-            同步数据审计方法
-            </summary>
-            <param name="s"></param>
-            <param name="e"></param>
-        </member>
-        <member name="M:Admin.Core.Db.DbHelper.SyncDataAsync(IFreeSql,Admin.Core.Common.Configs.DbConfig,Admin.Core.Common.Configs.AppConfig)">
-            <summary>
-            同步数据
-            </summary>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.Core.Db.DbHelper.GenerateSimpleJsonDataAsync(IFreeSql)">
-            <summary>
-            生成极简数据
-            </summary>
-            <param name="db"></param>
-            <returns></returns>
-        </member>
         <member name="M:Admin.Core.Db.DBServiceCollectionExtensions.AddDbAsync(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Hosting.IHostEnvironment)">
             <summary>
             添加数据库
@@ -837,13 +757,6 @@
             <param name="multiDb"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Db.TenantDBServiceCollectionExtensions.AddTenantDb(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Hosting.IHostEnvironment)">
-            <summary>
-            添加租户数据库
-            </summary>
-            <param name="services"></param>
-            <param name="env"></param>
-        </member>
         <member name="T:Admin.Core.Enums.ApiVersion">
             <summary>
             接口版本

+ 2 - 1
Admin.Core/Controllers/Admin/AuthController.cs

@@ -62,7 +62,8 @@ namespace Admin.Core.Controllers.Admin
                 new Claim(ClaimAttributes.UserName, user.UserName),
                 new Claim(ClaimAttributes.UserNickName, user.NickName),
                 new Claim(ClaimAttributes.TenantId, user.TenantId.ToString()),
-                new Claim(ClaimAttributes.TenantType, user.TenantType.ToString())
+                new Claim(ClaimAttributes.TenantType, user.TenantType.ToString()),
+                new Claim(ClaimAttributes.DataIsolationType, user.DataIsolationType.ToString())
             });
 
             return ResponseOutput.Ok(new { token });

+ 38 - 20
Admin.Core/Db/DBServiceCollectionExtensions.cs

@@ -1,16 +1,15 @@
-using System;
-using System.Threading.Tasks;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
-using FreeSql;
+using Admin.Core.Common.Auth;
+using Admin.Core.Common.BaseModel;
 using Admin.Core.Common.Configs;
-using Admin.Core.Common.Helpers;
-using Admin.Core.Common.Auth;
 using Admin.Core.Common.Dbs;
+using Admin.Core.Common.Helpers;
 using Admin.Core.Model.Admin;
-using System.Reflection;
-using Admin.Core.Common.Attributes;
-using Yitter.IdGenerator;
+using Admin.Core.Repository;
+using FreeSql;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using System;
+using System.Threading.Tasks;
 
 namespace Admin.Core.Db
 {
@@ -23,6 +22,8 @@ namespace Admin.Core.Db
         /// <param name="env"></param>
         public async static Task AddDbAsync(this IServiceCollection services, IHostEnvironment env)
         {
+            services.AddScoped<MyUnitOfWorkManager>();
+
             var dbConfig = new ConfigHelper().Get<DbConfig>("dbconfig", env.EnvironmentName);
 
             //创建数据库
@@ -32,6 +33,7 @@ namespace Admin.Core.Db
             }
 
             #region FreeSql
+
             var freeSqlBuilder = new FreeSqlBuilder()
                     .UseConnectionString(dbConfig.Type, dbConfig.ConnectionString)
                     .UseAutoSyncStructure(false)
@@ -39,6 +41,7 @@ namespace Admin.Core.Db
                     .UseNoneCommandParameter(true);
 
             #region 监听所有命令
+
             if (dbConfig.MonitorCommand)
             {
                 freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
@@ -47,7 +50,8 @@ namespace Admin.Core.Db
                     Console.WriteLine($"{cmd.CommandText}\r\n");
                 });
             }
-            #endregion
+
+            #endregion 监听所有命令
 
             var fsql = freeSqlBuilder.Build();
 
@@ -56,6 +60,7 @@ namespace Admin.Core.Db
             DbHelper.ConfigEntity(fsql, appConfig);
 
             #region 初始化数据库
+
             //同步结构
             if (dbConfig.SyncStructure)
             {
@@ -63,31 +68,35 @@ namespace Admin.Core.Db
             }
 
             #region 审计数据
+
             //计算服务器时间
             var serverTime = fsql.Select<DualEntity>().Limit(1).First(a => DateTime.UtcNow);
             var timeOffset = DateTime.UtcNow.Subtract(serverTime);
             var user = services.BuildServiceProvider().GetService<IUser>();
             DbHelper.TimeOffset = timeOffset;
-            fsql.Aop.AuditValue += (s,e) => 
+            fsql.Aop.AuditValue += (s, e) =>
             {
                 DbHelper.AuditValue(e, timeOffset, user);
             };
-            #endregion
+
+            #endregion 审计数据
 
             //同步数据
             if (dbConfig.SyncData)
             {
                 await DbHelper.SyncDataAsync(fsql, dbConfig, appConfig);
             }
-            #endregion
+
+            #endregion 初始化数据库
 
             //生成数据包
             if (dbConfig.GenerateData && !dbConfig.CreateDb && !dbConfig.SyncData)
             {
-                await DbHelper.GenerateSimpleJsonDataAsync(fsql);
+                await DbHelper.GenerateSimpleJsonDataAsync(fsql, appConfig);
             }
 
             #region 监听Curd操作
+
             if (dbConfig.Curd)
             {
                 fsql.Aop.CurdBefore += (s, e) =>
@@ -95,21 +104,30 @@ namespace Admin.Core.Db
                     Console.WriteLine($"{e.Sql}\r\n");
                 };
             }
-            #endregion
-            #endregion
+
+            #endregion 监听Curd操作
+
+            if (appConfig.Tenant)
+            {
+                fsql.GlobalFilter.Apply<ITenant>("Tenant", a => a.TenantId == user.TenantId);
+            }
+
+            #endregion FreeSql
+
+            services.AddSingleton(fsql);
 
             //导入多数据库
-            if(null != dbConfig.Dbs)
+            if (null != dbConfig.Dbs)
             {
                 foreach (var multiDb in dbConfig.Dbs)
                 {
-
                     switch (multiDb.Name)
                     {
                         case nameof(MySqlDb):
                             var mdb = CreateMultiDbBuilder(multiDb).Build<MySqlDb>();
                             services.AddSingleton(mdb);
                             break;
+
                         default:
                             break;
                     }
@@ -131,4 +149,4 @@ namespace Admin.Core.Db
             .UseNoneCommandParameter(true);
         }
     }
-}
+}

+ 0 - 107
Admin.Core/Db/TenantDBServiceCollectionExtensions.cs

@@ -1,107 +0,0 @@
-using System;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
-using FreeSql;
-using Admin.Core.Common.Configs;
-using Admin.Core.Common.Helpers;
-using Admin.Core.Common.Auth;
-using Admin.Core.Common.BaseModel;
-using Admin.Core.Repository;
-using Admin.Core.Common.Consts;
-using Admin.Core.Model.Admin;
-using Admin.Core.Common.Attributes;
-using System.Reflection;
-using Yitter.IdGenerator;
-
-namespace Admin.Core.Db
-{
-    //public class MyIdleBus : IdleBus<DbName, IFreeSql>
-    //{
-    //    public MyIdleBus() : base(TimeSpan.FromMinutes(30)) { }
-    //}
-
-    public static class TenantDBServiceCollectionExtensions
-    {
-        /// <summary>
-        /// 添加租户数据库
-        /// </summary>
-        /// <param name="services"></param>
-        /// <param name="env"></param>
-        public static void AddTenantDb(this IServiceCollection services, IHostEnvironment env)
-        {
-            services.AddScoped<MyUnitOfWorkManager>();
-            
-            var dbConfig = new ConfigHelper().Get<DbConfig>("dbconfig", env.EnvironmentName);
-            var appConfig = new ConfigHelper().Get<AppConfig>("appconfig", env.EnvironmentName);
-            var user = services.BuildServiceProvider().GetService<IUser>();
-
-            int idleTime = dbConfig.IdleTime > 0 ? dbConfig.IdleTime : 10;
-
-            IdleBus <IFreeSql> ib = new IdleBus<IFreeSql>(TimeSpan.FromMinutes(idleTime));
-
-            var tenantName = AdminConsts.TenantName;
-            //需要查询租户数据库类型
-            //if (appConfig.TenantDbType == TenantDbType.Own)
-            //{
-            //    tenantName = "tenant_" + user.TenantId?.ToString();
-            //}
-            ib.TryRegister(tenantName, () =>
-            {
-                #region FreeSql
-                var freeSqlBuilder = new FreeSqlBuilder()
-                        .UseConnectionString(dbConfig.Type, dbConfig.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.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == false);
-                
-                //配置实体
-                DbHelper.ConfigEntity(fsql, appConfig);
-
-                ////需要查询租户数据库类型
-                //共享数据库
-                //if (appConfig.TenantDbType == TenantDbType.Share)
-                //{
-                //    fsql.GlobalFilter.Apply<ITenant>("Tenant", a => a.TenantId == user.TenantId);
-                //}
-
-                #region 监听Curd操作
-                if (dbConfig.Curd)
-                {
-                    fsql.Aop.CurdBefore += (s, e) =>
-                    {
-                        Console.WriteLine($"{e.Sql}\r\n");
-                    };
-                }
-                #endregion
-
-                #region 审计数据
-                //计算服务器时间
-                var serverTime = fsql.Select<DualEntity>().Limit(1).First(a => DateTime.UtcNow);
-                var timeOffset = DateTime.UtcNow.Subtract(serverTime);
-                fsql.Aop.AuditValue += (s, e) =>
-                {
-                    DbHelper.AuditValue(e, timeOffset, user);
-                };
-                #endregion
-                #endregion
-
-                return fsql;
-            });
-
-            services.AddSingleton(ib);
-        }
-    }
-}

+ 1 - 2
Admin.Core/Logs/ApiHelper.cs

@@ -4,9 +4,8 @@ using System.Linq;
 using System.Collections.Generic;
 using Newtonsoft.Json;
 using Admin.Core.Common.Helpers;
-using Admin.Core.Db;
 using Admin.Core.Common.Attributes;
-
+using Admin.Core.Repository;
 
 namespace Admin.Core.Logs
 {

+ 11 - 3
Admin.Core/Startup.cs

@@ -38,6 +38,8 @@ using AspNetCoreRateLimit;
 using IdentityServer4.AccessTokenValidation;
 using System.IdentityModel.Tokens.Jwt;
 using Yitter.IdGenerator;
+using Autofac.Extensions.DependencyInjection;
+using Admin.Core.Repository;
 
 namespace Admin.Core
 {
@@ -81,10 +83,16 @@ namespace Admin.Core
                 services.TryAddSingleton<IUser, User>();
             }
 
-            //数据库
+            //添加数据库
             services.AddDbAsync(_env).Wait();
-            //租户数据库
-            services.AddTenantDb(_env);
+
+            //添加IdleBus单例
+            var dbConfig = new ConfigHelper().Get<DbConfig>("dbconfig", _env.EnvironmentName);
+            int idleTime = dbConfig.IdleTime > 0 ? dbConfig.IdleTime : 10;
+            IdleBus<IFreeSql> ib = new IdleBus<IFreeSql>(TimeSpan.FromMinutes(idleTime));
+            services.AddSingleton(ib);
+            //数据库配置
+            services.AddSingleton(dbConfig);
 
             //应用配置
             services.AddSingleton(_appConfig);

+ 1 - 1
Admin.Core/configs/appconfig.json

@@ -4,7 +4,7 @@
   //跨域地址
   "corUrls": [ "http://localhost:9000", "http://127.0.0.1:9000" ],
   //租户
-  "Tenant": false,
+  "Tenant": true,
   //Swagger文档
   "swagger": false,
   //统一认证授权服务器