Sfoglia il codice sorgente

1、优化二级缓存(必须是内存缓存) 2、登录接口增加按钮权限集合 3、默认超级用户账号superAdmin

zuohuaijun 3 anni fa
parent
commit
bf3124f3de

+ 9 - 7
Admin.NET/Admin.NET.Application/AppConfig.json

@@ -4,13 +4,15 @@
     "DbConnection": {
         "ConnectionConfigs": [
             // 默认第一个为主库
-            {
-                "ConfigId": "Dilon",
-                "DbType": "Sqlite", // MySql、SqlServer、Sqlite、Oracle、PostgreSQL、Dm、Kdbndp、Oscar、MySqlConnector、Access
-                "ConnectionString": "DataSource=./Admin.NET.db",
-                "EnableInitDb": true, // 启用库表初始化
-                "EnableDiffLog": false // 启用库表差异日志
-            },
+          {
+            "ConfigId": "Dilon",
+            "DbType": "Sqlite", // MySql、SqlServer、Sqlite、Oracle、PostgreSQL、Dm、Kdbndp、Oscar、MySqlConnector、Access
+            //"DbType": "PostgreSQL",
+            "ConnectionString": "DataSource=./Admin.NET.db",
+            //"ConnectionString": "PORT=5432;DATABASE=test;HOST=82.156.201.225;PASSWORD=hp111;USER ID=pgsql;",
+            "EnableInitDb": true, // 启用库表初始化
+            "EnableDiffLog": false // 启用库表差异日志
+          },
             // 其他业务库
             {
                 "ConfigId": "Test",

+ 1 - 1
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -40,7 +40,7 @@
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.20" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
-    <PackageReference Include="Masuit.Tools.Core" Version="2.5.4.3" />
+    <PackageReference Include="Masuit.Tools.Core" Version="2.5.5" />
   </ItemGroup>
 
   <ItemGroup>

+ 19 - 9
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -27,7 +27,7 @@
         </member>
         <member name="T:Admin.NET.Core.SqlSugarCache">
             <summary>
-            SqlSugar二级缓存
+            SqlSugar二级缓存(必须是内存缓存)
             </summary>
         </member>
         <member name="T:Admin.NET.Core.CacheConst">
@@ -3560,14 +3560,19 @@
             用户Id
             </summary>
         </member>
+        <member name="P:Admin.NET.Core.Service.LoginOutput.RoleInfo">
+            <summary>
+            角色
+            </summary>
+        </member>
         <member name="P:Admin.NET.Core.Service.LoginOutput.Token">
             <summary>
             令牌Token
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.Service.LoginOutput.RoleInfo">
+        <member name="P:Admin.NET.Core.Service.LoginOutput.RefreshToken">
             <summary>
-            角色
+            刷新Token
             </summary>
         </member>
         <member name="T:Admin.NET.Core.Service.LoginUserInfoOutput">
@@ -3620,6 +3625,11 @@
             角色集合
             </summary>
         </member>
+        <member name="P:Admin.NET.Core.Service.LoginUserInfoOutput.Buttons">
+            <summary>
+            按钮权限集合
+            </summary>
+        </member>
         <member name="P:Admin.NET.Core.Service.LoginRole.RoleName">
             <summary>
             角色名称
@@ -7327,19 +7337,19 @@
             配置实体假删除过滤器
             </summary>
         </member>
-        <member name="M:Admin.NET.Core.SqlSugarSetup.SetOrgEntityFilter(SqlSugar.SqlSugarScopeProvider)">
+        <member name="M:Admin.NET.Core.SqlSugarSetup.SetTenantEntityFilter(SqlSugar.SqlSugarScopeProvider)">
             <summary>
-            配置实体机构过滤器
+            配置租户过滤器
             </summary>
         </member>
-        <member name="M:Admin.NET.Core.SqlSugarSetup.SetCustomEntityFilter(SqlSugar.SqlSugarScopeProvider)">
+        <member name="M:Admin.NET.Core.SqlSugarSetup.SetOrgEntityFilter(SqlSugar.SqlSugarScopeProvider)">
             <summary>
-            配置自定义实体过滤器
+            配置用户机构范围过滤器
             </summary>
         </member>
-        <member name="M:Admin.NET.Core.SqlSugarSetup.SetTenantEntityFilter(SqlSugar.SqlSugarScopeProvider)">
+        <member name="M:Admin.NET.Core.SqlSugarSetup.SetCustomEntityFilter(SqlSugar.SqlSugarScopeProvider)">
             <summary>
-            配置租户实体过滤器
+            配置自定义过滤器
             </summary>
         </member>
         <member name="T:Admin.NET.Core.SqlSugarUnitOfWork">

+ 2 - 2
Admin.NET/Admin.NET.Core/Cache/SqlSugarCache.cs

@@ -3,11 +3,11 @@
 namespace Admin.NET.Core;
 
 /// <summary>
-/// SqlSugar二级缓存
+/// SqlSugar二级缓存(必须是内存缓存)
 /// </summary>
 public class SqlSugarCache : ICacheService, ISingleton
 {
-    private static readonly ICache _cache = App.GetRequiredService<ICache>();
+    private static readonly ICache _cache = Cache.Default;
 
     public void Add<V>(string key, V value)
     {

+ 1 - 1
Admin.NET/Admin.NET.Core/SeedData/SysUserSeedData.cs

@@ -13,7 +13,7 @@ public class SysUserSeedData : ISqlSugarEntitySeedData<SysUser>
     {
         return new[]
         {
-            new SysUser{ Id=252885263000000, UserName="vben", Password="e10adc3949ba59abbe56e057f20f883e", NickName="超级管理员", RealName="超级管理员", Phone="18020030720", Birthday=DateTime.Parse("1986-06-28"), Sex=GenderEnum.Male, UserType=UserTypeEnum.SuperAdmin, Remark="超级管理员", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), TenantId=142307070918780 },
+            new SysUser{ Id=252885263000000, UserName="superAdmin", Password="e10adc3949ba59abbe56e057f20f883e", NickName="超级管理员", RealName="超级管理员", Phone="18020030720", Birthday=DateTime.Parse("1986-06-28"), Sex=GenderEnum.Male, UserType=UserTypeEnum.SuperAdmin, Remark="超级管理员", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), TenantId=142307070918780 },
             new SysUser{ Id=252885263003721, UserName="admin", Password="e10adc3949ba59abbe56e057f20f883e", NickName="管理员", RealName="管理员", Phone="18020030720", Birthday=DateTime.Parse("1986-06-28"), Sex=GenderEnum.Male, UserType=UserTypeEnum.Admin, Remark="管理员", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrgId=252885263003721, PosId=252885263003720, TenantId=142307070918780 },
             new SysUser{ Id=252885263003722, UserName="guest", Password="e10adc3949ba59abbe56e057f20f883e", NickName="普通用户", RealName="普通用户", Phone="18020030720", Birthday=DateTime.Parse("1986-06-28"), Sex=GenderEnum.Female, UserType=UserTypeEnum.None, Remark="普通账号", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrgId=252885263003722, PosId=252885263003721, TenantId=142307070918780 },
 

+ 7 - 2
Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginOutput.cs

@@ -10,13 +10,18 @@ public class LoginOutput
     /// </summary>
     public long UserId { get; set; }
 
+    /// <summary>
+    /// 角色
+    /// </summary>
+    public LoginRole RoleInfo { get; set; }
+
     /// <summary>
     /// 令牌Token
     /// </summary>
     public string Token { get; set; }
 
     /// <summary>
-    /// 角色
+    /// 刷新Token
     /// </summary>
-    public LoginRole RoleInfo { get; set; }
+    public string RefreshToken { get; set; }
 }

+ 5 - 0
Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginUserInfoOutput.cs

@@ -49,6 +49,11 @@ public class LoginUserInfoOutput
     /// 角色集合
     /// </summary>
     public List<LoginRole> Roles { get; set; }
+
+    /// <summary>
+    /// 按钮权限集合
+    /// </summary>
+    public List<string> Buttons { get; set; }
 }
 
 public class LoginRole

+ 9 - 1
Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs

@@ -16,6 +16,7 @@ public class SysAuthService : IDynamicApiController, ITransient
     private readonly IEventPublisher _eventPublisher;
     private readonly SysUserService _sysUserService;
     private readonly SysUserRoleService _sysUserRoleService;
+    private readonly SysMenuService _sysMenuService;
     private readonly ISysOnlineUserService _sysOnlineUserService;
     private readonly IMemoryCache _cache;
 
@@ -26,6 +27,7 @@ public class SysAuthService : IDynamicApiController, ITransient
         IEventPublisher eventPublisher,
         SysUserService sysUserService,
         SysUserRoleService sysUserRoleService,
+        SysMenuService sysMenuService,
         ISysOnlineUserService sysOnlineUserService,
         IMemoryCache cache)
     {
@@ -36,6 +38,7 @@ public class SysAuthService : IDynamicApiController, ITransient
         _eventPublisher = eventPublisher;
         _sysUserService = sysUserService;
         _sysUserRoleService = sysUserRoleService;
+        _sysMenuService = sysMenuService;
         _sysOnlineUserService = sysOnlineUserService;
         _cache = cache;
     }
@@ -91,7 +94,8 @@ public class SysAuthService : IDynamicApiController, ITransient
         return new LoginOutput
         {
             UserId = user.Id,
-            Token = accessToken
+            Token = accessToken,
+            RefreshToken = refreshToken
         };
     }
 
@@ -112,6 +116,9 @@ public class SysAuthService : IDynamicApiController, ITransient
         // 数据范围
         var dataScopes = await _sysUserService.GetUserOrgIdList();
 
+        // 按钮权限
+        var buttons = await _sysMenuService.GetPermCodeList();
+
         // 登录日志
         var client = Parser.GetDefault().Parse(_httpContextAccessor.HttpContext.Request.Headers["User-Agent"]);
         await _eventPublisher.PublishAsync("Add:VisLog", new SysLogVis
@@ -141,6 +148,7 @@ public class SysAuthService : IDynamicApiController, ITransient
                 RoleName = u.Name,
                 Value = u.Code
             }).ToList(),
+            Buttons = buttons
         };
     }
 

+ 154 - 75
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -1,3 +1,5 @@
+using Masuit.Tools;
+
 namespace Admin.NET.Core;
 
 public static class SqlSugarSetup
@@ -122,26 +124,14 @@ public static class SqlSugarSetup
                     Console.WriteLine(DateTime.Now + $"\r\n**********差异日志开始**********\r\n{Environment.NewLine}{JsonConvert.SerializeObject(LogDiff)}{Environment.NewLine}**********差异日志结束**********\r\n");
                 };
 
-                // 缓存处理过滤器
-                var cacheKey = $"DB:{config.ConfigId}";
-                var queryFilterProvider = db.DataCache.Get<QueryFilterProvider>(cacheKey);
-                if (queryFilterProvider == null)
-                {
-                    // 配置实体假删除过滤器
-                    SetDeletedEntityFilter(db);
-                    // 配置实体机构过滤器
-                    SetOrgEntityFilter(db);
-                    // 配置自定义实体过滤器
-                    SetCustomEntityFilter(db);
-                    // 配置租户实体过滤器
-                    SetTenantEntityFilter(db);
-
-                    db.DataCache.Add(cacheKey, db.QueryFilter);
-                }
-                else
-                {
-                    db.QueryFilter = queryFilterProvider;
-                }
+                // 配置实体假删除过滤器
+                SetDeletedEntityFilter(db);
+                // 配置租户过滤器
+                SetTenantEntityFilter(db);
+                // 配置用户机构范围过滤器
+                SetOrgEntityFilter(db);
+                // 配置自定义过滤器
+                SetCustomEntityFilter(db);
             });
         });
 
@@ -161,7 +151,6 @@ public static class SqlSugarSetup
         // 创建数据库
         dbOptions.ConnectionConfigs.ForEach(config =>
         {
-            if (!config.EnableInitDb) return;
             if (config.DbType == SqlSugar.DbType.Oracle) return;
             db.GetConnectionScope(config.ConfigId).DbMaintenance.CreateDatabase();
         });
@@ -174,7 +163,7 @@ public static class SqlSugarSetup
         {
             var tAtt = entityType.GetCustomAttribute<TenantAttribute>();
             var configId = tAtt == null ? SqlSugarConst.ConfigId : tAtt.configId.ToString();
-            if (!dbOptions.ConnectionConfigs.FirstOrDefault(u => u.ConfigId == configId.ToString()).EnableInitDb)
+            if (!dbOptions.ConnectionConfigs.FirstOrDefault(u => u.ConfigId == configId).EnableInitDb)
                 continue;
             var db2 = db.GetConnectionScope(configId);
             db2.CodeFirst.InitTables(entityType);
@@ -220,50 +209,133 @@ public static class SqlSugarSetup
     /// </summary>
     private static void SetDeletedEntityFilter(SqlSugarScopeProvider db)
     {
-        // 获取所有继承基类数据表集合
-        var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass
-            && (u.BaseType == typeof(EntityBase) || u.BaseType == typeof(EntityTenant) || u.BaseType == typeof(DataEntityBase)));
-        if (!entityTypes.Any()) return;
+        // 配置实体假删除缓存
+        var cacheKey = $"DB:{db.CurrentConnectionConfig.ConfigId}:FAKEDELETE";
+        var tableFilterItemList = db.DataCache.Get<List<TableFilterItem<object>>>(cacheKey);
+        if (tableFilterItemList == null)
+        {
+            // 获取基类实体数据表
+            var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass
+                && (u.BaseType == typeof(EntityBase) || u.BaseType == typeof(EntityTenant) || u.BaseType == typeof(DataEntityBase)));
+            if (!entityTypes.Any()) return;
 
-        foreach (var entityType in entityTypes)
+            var tableFilterItems = new List<TableFilterItem<object>>();
+            foreach (var entityType in entityTypes)
+            {
+                // 排除非当前数据库实体
+                var tAtt = entityType.GetCustomAttribute<TenantAttribute>();
+                if ((tAtt != null && (string)db.CurrentConnectionConfig.ConfigId != tAtt.configId.ToString()) ||
+                    (tAtt == null && (string)db.CurrentConnectionConfig.ConfigId != SqlSugarConst.ConfigId))
+                    continue;
+
+                Expression<Func<DataEntityBase, bool>> dynamicExpression = u => u.IsDelete == false;
+                var tableFilterItem = new TableFilterItem<object>(entityType, dynamicExpression);
+                tableFilterItems.Add(tableFilterItem);
+                db.QueryFilter.Add(tableFilterItem);
+            }
+            db.DataCache.Add(cacheKey, tableFilterItems);
+        }
+        else
         {
-            // 排除非当前数据库实体
-            var tAtt = entityType.GetCustomAttribute<TenantAttribute>();
-            if ((tAtt != null && (string)db.CurrentConnectionConfig.ConfigId != tAtt.configId.ToString()) ||
-                (tAtt == null && (string)db.CurrentConnectionConfig.ConfigId != SqlSugarConst.ConfigId))
-                continue;
+            tableFilterItemList.ForEach(u =>
+            {
+                db.QueryFilter.Add(u);
+            });
+        }
+    }
+
+    /// <summary>
+    /// 配置租户过滤器
+    /// </summary>
+    private static void SetTenantEntityFilter(SqlSugarScopeProvider db)
+    {
+        var tenantId = App.User?.FindFirst(ClaimConst.TenantId)?.Value;
+        if (string.IsNullOrWhiteSpace(tenantId)) return;
+
+        // 配置租户缓存
+        var cacheKey = $"DB:{db.CurrentConnectionConfig.ConfigId}:TENANTID:{tenantId}";
+        var tableFilterItemList = db.DataCache.Get<List<TableFilterItem<object>>>(cacheKey);
+        if (tableFilterItemList == null)
+        {
+            // 获取租户实体数据表
+            var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass
+                && u.BaseType == typeof(EntityTenant));
+            if (!entityTypes.Any()) return;
+
+            var tableFilterItems = new List<TableFilterItem<object>>();
+            foreach (var entityType in entityTypes)
+            {
+                // 排除非当前数据库实体
+                var tAtt = entityType.GetCustomAttribute<TenantAttribute>();
+                if ((tAtt != null && (string)db.CurrentConnectionConfig.ConfigId != tAtt.configId.ToString()) ||
+                    (tAtt == null && (string)db.CurrentConnectionConfig.ConfigId != SqlSugarConst.ConfigId))
+                    continue;
 
-            Expression<Func<DataEntityBase, bool>> dynamicExpression = u => u.IsDelete == false;
-            db.QueryFilter.Add(new TableFilterItem<object>(entityType, dynamicExpression));
+                Expression<Func<EntityTenant, bool>> dynamicExpression = u => u.TenantId == long.Parse(tenantId);
+                var tableFilterItem = new TableFilterItem<object>(entityType, dynamicExpression);
+                tableFilterItems.Add(tableFilterItem);
+                db.QueryFilter.Add(tableFilterItem);
+            }
+            db.DataCache.Add(cacheKey, tableFilterItems);
+        }
+        else
+        {
+            tableFilterItemList.ForEach(u =>
+            {
+                db.QueryFilter.Add(u);
+            });
         }
     }
 
     /// <summary>
-    /// 配置实体机构过滤器
+    /// 配置用户机构范围过滤器
     /// </summary>
     private static void SetOrgEntityFilter(SqlSugarScopeProvider db)
     {
-        // 获取业务数据表集合
-        var dataEntityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass
-            && u.BaseType == typeof(DataEntityBase));
-        if (!dataEntityTypes.Any()) return;
-
         var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value;
         if (string.IsNullOrWhiteSpace(userId)) return;
 
-        // 获取用户机构Id集合
-        var orgIds = App.GetService<SysCacheService>().GetOrgIdList(long.Parse(userId));
-        if (orgIds == null || orgIds.Count == 0) return;
+        // 配置用户机构范围缓存
+        var cacheKey = $"DB:{db.CurrentConnectionConfig.ConfigId}:USERID:{userId}";
+        var tableFilterItemList = db.DataCache.Get<List<TableFilterItem<object>>>(cacheKey);
+        if (tableFilterItemList == null)
+        {
+            // 获取用户所属机构
+            var orgIds = App.GetService<SysCacheService>().GetOrgIdList(long.Parse(userId));
+            if (orgIds == null || orgIds.Count == 0) return;
+
+            // 获取业务实体数据表
+            var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass
+                && u.BaseType == typeof(DataEntityBase));
+            if (!entityTypes.Any()) return;
 
-        foreach (var dataEntityType in dataEntityTypes)
+            var tableFilterItems = new List<TableFilterItem<object>>();
+            foreach (var entityType in entityTypes)
+            {
+                // 排除非当前数据库实体
+                var tAtt = entityType.GetCustomAttribute<TenantAttribute>();
+                if ((tAtt != null && (string)db.CurrentConnectionConfig.ConfigId != tAtt.configId.ToString()) ||
+                    (tAtt == null && (string)db.CurrentConnectionConfig.ConfigId != SqlSugarConst.ConfigId))
+                    continue;
+
+                Expression<Func<DataEntityBase, bool>> dynamicExpression = u => orgIds.Contains((long)u.CreateOrgId);
+                var tableFilterItem = new TableFilterItem<object>(entityType, dynamicExpression);
+                tableFilterItems.Add(tableFilterItem);
+                db.QueryFilter.Add(tableFilterItem);
+            }
+            db.DataCache.Add(cacheKey, tableFilterItems);
+        }
+        else
         {
-            Expression<Func<DataEntityBase, bool>> dynamicExpression = u => orgIds.Contains((long)u.CreateOrgId);
-            db.QueryFilter.Add(new TableFilterItem<object>(dataEntityType, dynamicExpression));
+            tableFilterItemList.ForEach(u =>
+            {
+                db.QueryFilter.Add(u);
+            });
         }
     }
 
     /// <summary>
-    /// 配置自定义实体过滤器
+    /// 配置自定义过滤器
     /// </summary>
     private static void SetCustomEntityFilter(SqlSugarScopeProvider db)
     {
@@ -271,39 +343,46 @@ public static class SqlSugarSetup
         if (App.User?.FindFirst(ClaimConst.SuperAdmin)?.Value == ((int)UserTypeEnum.SuperAdmin).ToString())
             return;
 
-        // 获取继承自定义实体过滤器接口的类集合
-        var entityFilterTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass
-            && u.GetInterfaces().Any(i => i.HasImplementedRawGeneric(typeof(IEntityFilter))));
-        if (!entityFilterTypes.Any()) return;
-
-        foreach (var entityFilter in entityFilterTypes)
+        // 配置用户机构范围缓存
+        var cacheKey = $"DB:{db.CurrentConnectionConfig.ConfigId}:CUSTOM";
+        var tableFilterItemList = db.DataCache.Get<List<TableFilterItem<object>>>(cacheKey);
+        if (tableFilterItemList == null)
         {
-            var instance = Activator.CreateInstance(entityFilter);
-            var entityFilterMethod = entityFilter.GetMethod("AddEntityFilter");
-            var entityFilters = ((IList)entityFilterMethod?.Invoke(instance, null))?.Cast<object>();
-            if (entityFilters == null) continue;
-            foreach (TableFilterItem<object> filter in entityFilters)
-                db.QueryFilter.Add(filter);
-        }
-    }
+            // 获取自定义实体过滤器
+            var entityFilterTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass
+                && u.GetInterfaces().Any(i => i.HasImplementedRawGeneric(typeof(IEntityFilter))));
+            if (!entityFilterTypes.Any()) return;
 
-    /// <summary>
-    /// 配置租户实体过滤器
-    /// </summary>
-    private static void SetTenantEntityFilter(SqlSugarScopeProvider db)
-    {
-        // 获取租户实体数据表集合
-        var dataEntityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass
-            && u.BaseType == typeof(EntityTenant));
-        if (!dataEntityTypes.Any()) return;
+            var tableFilterItems = new List<TableFilterItem<object>>();
+            foreach (var entityFilter in entityFilterTypes)
+            {
+                var instance = Activator.CreateInstance(entityFilter);
+                var entityFilterMethod = entityFilter.GetMethod("AddEntityFilter");
+                var entityFilters = ((IList)entityFilterMethod?.Invoke(instance, null))?.Cast<object>();
+                if (entityFilters == null) continue;
 
-        var tenantId = App.User?.FindFirst(ClaimConst.TenantId)?.Value;
-        if (string.IsNullOrWhiteSpace(tenantId)) return;
+                entityFilters.ForEach(u =>
+                {
+                    var tableFilterItem = (TableFilterItem<object>)u;
+                    var entityType = tableFilterItem.GetType().GetProperty("type", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(tableFilterItem, null) as Type;
+                    // 排除非当前数据库实体
+                    var tAtt = entityType.GetCustomAttribute<TenantAttribute>();
+                    if ((tAtt != null && (string)db.CurrentConnectionConfig.ConfigId != tAtt.configId.ToString()) ||
+                        (tAtt == null && (string)db.CurrentConnectionConfig.ConfigId != SqlSugarConst.ConfigId))
+                        return;
 
-        foreach (var dataEntityType in dataEntityTypes)
+                    tableFilterItems.Add(tableFilterItem);
+                    db.QueryFilter.Add(tableFilterItem);
+                });
+            }
+            db.DataCache.Add(cacheKey, tableFilterItems);
+        }
+        else
         {
-            Expression<Func<EntityTenant, bool>> dynamicExpression = u => u.TenantId == long.Parse(tenantId);
-            db.QueryFilter.Add(new TableFilterItem<object>(dataEntityType, dynamicExpression));
+            tableFilterItemList.ForEach(u =>
+            {
+                db.QueryFilter.Add(u);
+            });
         }
     }
 }

+ 1 - 0
Admin.NET/Admin.NET.Web.Entry/SingleFilePublish.cs

@@ -32,6 +32,7 @@ public class SingleFilePublish : ISingleFilePublish
             "Admin.NET.Application",
             "Admin.NET.Core",
             "Admin.NET.Web.Core",
+            "BusinessSystem",
         };
     }
 }