Prechádzať zdrojové kódy

😁升级SqlSugar接口过滤器新模式

zuohuaijun 3 rokov pred
rodič
commit
9d7ccdfae5

+ 30 - 10
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -312,6 +312,36 @@
             租户Id
             </summary>
         </member>
+        <member name="T:Admin.NET.Core.IDeletedFilter">
+            <summary>
+            假删除接口过滤器
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.IDeletedFilter.IsDelete">
+            <summary>
+            软删除
+            </summary>
+        </member>
+        <member name="T:Admin.NET.Core.ITenantIdFilter">
+            <summary>
+            租户Id接口过滤器
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.ITenantIdFilter.TenantId">
+            <summary>
+            租户Id
+            </summary>
+        </member>
+        <member name="T:Admin.NET.Core.IOrgIdFilter">
+            <summary>
+            机构Id接口过滤器
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.IOrgIdFilter.CreateOrgId">
+            <summary>
+            创建者部门Id
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.SysCodeGen">
             <summary>
             代码生成表
@@ -7141,16 +7171,6 @@
             缓存全局查询过滤器(内存缓存)
             </summary>
         </member>
-        <member name="M:Admin.NET.Core.SqlSugarFilter.SetDeletedEntityFilter(SqlSugar.SqlSugarScopeProvider)">
-            <summary>
-            配置实体假删除过滤器
-            </summary>
-        </member>
-        <member name="M:Admin.NET.Core.SqlSugarFilter.SetTenantEntityFilter(SqlSugar.SqlSugarScopeProvider)">
-            <summary>
-            配置租户过滤器
-            </summary>
-        </member>
         <member name="M:Admin.NET.Core.SqlSugarFilter.SetOrgEntityFilter(SqlSugar.SqlSugarScopeProvider)">
             <summary>
             配置用户机构范围过滤器

+ 4 - 4
Admin.NET/Admin.NET.Core/Entity/EntityBase.cs

@@ -15,7 +15,7 @@ public abstract class EntityBaseId
 /// <summary>
 /// 框架实体基类
 /// </summary>
-public abstract class EntityBase : EntityBaseId
+public abstract class EntityBase : EntityBaseId, IDeletedFilter
 {
     /// <summary>
     /// 创建时间
@@ -51,7 +51,7 @@ public abstract class EntityBase : EntityBaseId
 /// <summary>
 /// 业务数据实体基类(数据权限)
 /// </summary>
-public abstract class EntityBaseData : EntityBase
+public abstract class EntityBaseData : EntityBase, IOrgIdFilter
 {
     /// <summary>
     /// 创建者部门Id
@@ -63,7 +63,7 @@ public abstract class EntityBaseData : EntityBase
 /// <summary>
 /// 租户基类实体
 /// </summary>
-public abstract class EntityTenant : EntityBase
+public abstract class EntityTenant : EntityBase, ITenantIdFilter
 {
     /// <summary>
     /// 租户Id
@@ -75,7 +75,7 @@ public abstract class EntityTenant : EntityBase
 /// <summary>
 /// 租户基类实体Id
 /// </summary>
-public abstract class EntityTenantId : EntityBaseId
+public abstract class EntityTenantId : EntityBaseId, ITenantIdFilter
 {
     /// <summary>
     /// 租户Id

+ 34 - 0
Admin.NET/Admin.NET.Core/Entity/IEntityFilter.cs

@@ -0,0 +1,34 @@
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 假删除接口过滤器
+/// </summary>
+public interface IDeletedFilter
+{
+    /// <summary>
+    /// 软删除
+    /// </summary>
+    bool IsDelete { get; set; }
+}
+
+/// <summary>
+/// 租户Id接口过滤器
+/// </summary>
+public interface ITenantIdFilter
+{
+    /// <summary>
+    /// 租户Id
+    /// </summary>
+    long? TenantId { get; set; }
+}
+
+/// <summary>
+/// 机构Id接口过滤器
+/// </summary>
+public interface IOrgIdFilter
+{
+    /// <summary>
+    /// 创建者部门Id
+    /// </summary>
+    long? CreateOrgId { get; set; }
+}

+ 0 - 83
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarFilter.cs

@@ -8,89 +8,6 @@ public static class SqlSugarFilter
     private static readonly ICache _cache = Cache.Default;
 
     /// <summary>
-    /// 配置实体假删除过滤器
-    /// </summary>
-    public static void SetDeletedEntityFilter(SqlSugarScopeProvider db)
-    {
-        var cacheKey = $"db:{db.CurrentConnectionConfig.ConfigId}:IsDelete";
-        var deletedFilter = _cache.Get<ConcurrentDictionary<Type, LambdaExpression>>(cacheKey);
-        if (deletedFilter == null)
-        {
-            // 获取基类实体数据表
-            var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass
-                && (u.BaseType == typeof(EntityBase) || u.BaseType == typeof(EntityTenant) || u.BaseType == typeof(EntityBaseData)));
-            if (!entityTypes.Any()) return;
-
-            deletedFilter = new ConcurrentDictionary<Type, LambdaExpression>();
-            foreach (var entityType in entityTypes)
-            {
-                // 排除非当前数据库实体
-                var tAtt = entityType.GetCustomAttribute<TenantAttribute>();
-                if ((tAtt != null && db.CurrentConnectionConfig.ConfigId.ToString() != tAtt.configId.ToString()) ||
-                    (tAtt == null && db.CurrentConnectionConfig.ConfigId.ToString() != SqlSugarConst.ConfigId))
-                    continue;
-
-                var lambda = DynamicExpressionParser.ParseLambda(new[] {
-                    Expression.Parameter(entityType, "u") }, typeof(bool), $"{nameof(EntityBase.IsDelete)} == @0", false);
-                db.QueryFilter.AddTableFilter(entityType, lambda);
-                deletedFilter.TryAdd(entityType, lambda);
-            }
-            _cache.Add(cacheKey, deletedFilter);
-        }
-        else
-        {
-            foreach (var filter in deletedFilter)
-                db.QueryFilter.AddTableFilter(filter.Key, filter.Value);
-        }
-    }
-
-    /// <summary>
-    /// 配置租户过滤器
-    /// </summary>
-    public 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 tenantFilter = _cache.Get<ConcurrentDictionary<Type, LambdaExpression>>(cacheKey);
-        if (tenantFilter == null)
-        {
-            // 获取租户实体数据表
-            var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass
-                && (u.BaseType == typeof(EntityTenant) || u.BaseType == typeof(EntityTenantId)));
-            if (!entityTypes.Any()) return;
-
-            tenantFilter = new ConcurrentDictionary<Type, LambdaExpression>();
-            foreach (var entityType in entityTypes)
-            {
-                // 获取库隔离租户业务实体
-                var systemTableAtt = entityType.GetCustomAttribute<SystemTableAttribute>();
-                if (systemTableAtt != null)
-                {
-                    // 排除非当前数据库实体
-                    var tenantAtt = entityType.GetCustomAttribute<TenantAttribute>();
-                    if ((tenantAtt != null && db.CurrentConnectionConfig.ConfigId.ToString() != tenantAtt.configId.ToString()) ||
-                        (tenantAtt == null && db.CurrentConnectionConfig.ConfigId.ToString() != SqlSugarConst.ConfigId))
-                        continue;
-                }
-
-                var lambda = DynamicExpressionParser.ParseLambda(new[] {
-                    Expression.Parameter(entityType, "u") }, typeof(bool), $"{nameof(EntityTenant.TenantId)} == @0", long.Parse(tenantId));
-                db.QueryFilter.AddTableFilter(entityType, lambda);
-                tenantFilter.TryAdd(entityType, lambda);
-            }
-            _cache.Add(cacheKey, tenantFilter);
-        }
-        else
-        {
-            foreach (var filter in tenantFilter)
-                db.QueryFilter.AddTableFilter(filter.Key, filter.Value);
-        }
-    }
-
-    /// <summary>
     /// 配置用户机构范围过滤器
     /// </summary>
     public static void SetOrgEntityFilter(SqlSugarScopeProvider db)

+ 7 - 4
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -140,10 +140,13 @@ public static class SqlSugarSetup
             return;
 
         // 配置实体假删除过滤器
-        SqlSugarFilter.SetDeletedEntityFilter(db);
+        db.QueryFilter.AddTableFilter<IDeletedFilter>(u => u.IsDelete == false);
         // 配置租户过滤器
-        SqlSugarFilter.SetTenantEntityFilter(db);
-        // 配置用户机构范围过滤器
+        var tenantId = App.User?.FindFirst(ClaimConst.TenantId)?.Value;
+        if (!string.IsNullOrWhiteSpace(tenantId))
+            db.QueryFilter.AddTableFilter<ITenantIdFilter>(u => u.TenantId == long.Parse(tenantId));
+
+        // 配置用户机构(数据范围)过滤器
         SqlSugarFilter.SetOrgEntityFilter(db);
         // 配置自定义过滤器
         SqlSugarFilter.SetCustomEntityFilter(db);
@@ -232,7 +235,7 @@ public static class SqlSugarSetup
             if (entityInfo.Columns.Any(u => u.IsPrimarykey))
             {
                 // 按主键进行批量增加和更新
-                var storage = dbProvider.CopyNew().StorageableByObject(seedData.ToList()).ToStorage();
+                var storage = dbProvider.StorageableByObject(seedData.ToList()).ToStorage();
                 storage.AsInsertable.ExecuteCommand();
                 var ignoreUpdate = hasDataMethod.GetCustomAttribute<IgnoreUpdateAttribute>();
                 if (ignoreUpdate == null) storage.AsUpdateable.ExecuteCommand();