Sfoglia il codice sorgente

数权属性标记特性

yorkove 2 anni fa
parent
commit
c895940e68

+ 16 - 0
Admin.NET/Admin.NET.Core/Attribute/OwnerOrgAttribute.cs

@@ -0,0 +1,16 @@
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 所属机构数据权限
+/// </summary>
+[SuppressSniffer]
+[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
+public class OwnerOrgAttribute : Attribute
+{
+}

+ 16 - 0
Admin.NET/Admin.NET.Core/Attribute/OwnerUserAttribute.cs

@@ -0,0 +1,16 @@
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 所属用户数据权限
+/// </summary>
+[SuppressSniffer]
+[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
+public class OwnerUserAttribute : Attribute
+{
+}

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

@@ -39,8 +39,9 @@ public abstract class EntityBase : EntityBaseId, IDeletedFilter
     /// <summary>
     /// 创建者Id
     /// </summary>
-    [SugarColumn(ColumnDescription = "创建者Id", IsOnlyIgnoreUpdate = true)]
-    public virtual long? CreateUserId { get; set; }
+    [SugarColumn(ColumnDescription = "创建者Id", IsOnlyIgnoreUpdate = true)]
+    [OwnerUser]
+    public virtual long CreateUserId { get; set; }
 
     ///// <summary>
     ///// 创建者
@@ -91,8 +92,9 @@ public abstract class EntityBaseData : EntityBase, IOrgIdFilter
     /// <summary>
     /// 创建者部门Id
     /// </summary>
-    [SugarColumn(ColumnDescription = "创建者部门Id", IsOnlyIgnoreUpdate = true)]
-    public virtual long? CreateOrgId { get; set; }
+    [SugarColumn(ColumnDescription = "创建者部门Id", IsOnlyIgnoreUpdate = true)]
+    [OwnerOrg]
+    public virtual long CreateOrgId { get; set; }
 
     /// <summary>
     /// 创建者部门

+ 1 - 1
Admin.NET/Admin.NET.Core/Entity/IEntityFilter.cs

@@ -36,5 +36,5 @@ internal interface IOrgIdFilter
     /// <summary>
     /// 创建者部门Id
     /// </summary>
-    long? CreateOrgId { get; set; }
+    long CreateOrgId { get; set; }
 }

+ 56 - 0
Admin.NET/Admin.NET.Core/Extension/SqlSugarFilterExtension.cs

@@ -0,0 +1,56 @@
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Core;
+
+public static class SqlSugarFilterExtension
+{
+    /// <summary>
+    /// 根据指定Attribute获取属性
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="type"></param>
+    /// <returns></returns>
+    private static List<string> GetPropertyNames<T>(this Type type)
+        where T : Attribute
+    {
+        var allProperties = type.GetProperties();
+
+        var properties = allProperties.Where(x => x.CustomAttributes.Any(a => a.AttributeType == typeof(T)));
+
+        return properties.Select(x => x.Name).ToList();
+    }
+
+    /// <summary>
+    /// 获取过滤表达式
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="type"></param>
+    /// <param name="owners"></param>
+    /// <returns></returns>
+    public static LambdaExpression GetConditionExpression<T>(this Type type, List<long> owners)
+        where T : Attribute
+    {
+        var fieldNames = type.GetPropertyNames<T>();
+
+        ParameterExpression parameter = Expression.Parameter(type, "c");
+        Expression right = Expression.Constant(false);
+        fieldNames.ForEach(filedName =>
+        {
+            owners.ForEach(owner =>
+            {
+                Expression left = Expression.Equal(
+                     Expression.Property(parameter, type.GetProperty(filedName)),
+                     Expression.Constant(owner)
+                );
+                right = Expression.Or(left, right);
+            });
+        });
+        var finalExpression = Expression.Lambda(right, new ParameterExpression[] { parameter });
+        return finalExpression;
+    }
+
+}

+ 9 - 5
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarFilter.cs

@@ -66,10 +66,12 @@ public static class SqlSugarFilter
                 // 排除非当前数据库实体
                 var tAtt = entityType.GetCustomAttribute<TenantAttribute>();
                 if ((tAtt != null && db.CurrentConnectionConfig.ConfigId.ToString() != tAtt.configId.ToString()))
-                    continue;
+                    continue;
+
+                //var lambda = DynamicExpressionParser.ParseLambda(new[] {
+                //    Expression.Parameter(entityType, "u") }, typeof(bool), $"@0.Contains(u.{nameof(EntityBaseData.CreateOrgId)}??{default(long)})", orgIds);
+                var lambda = entityType.GetConditionExpression<OwnerOrgAttribute>(orgIds);
 
-                var lambda = DynamicExpressionParser.ParseLambda(new[] {
-                    Expression.Parameter(entityType, "u") }, typeof(bool), $"@0.Contains(u.{nameof(EntityBaseData.CreateOrgId)}??{default(long)})", orgIds);
                 db.QueryFilter.AddTableFilter(entityType, lambda);
                 orgFilter.TryAdd(entityType, lambda);
             }
@@ -114,8 +116,10 @@ public static class SqlSugarFilter
                 if ((tAtt != null && db.CurrentConnectionConfig.ConfigId.ToString() != tAtt.configId.ToString()))
                     continue;
 
-                var lambda = DynamicExpressionParser.ParseLambda(new[] {
-                    Expression.Parameter(entityType, "u") }, typeof(bool), $"u.{nameof(EntityBaseData.CreateUserId)}=@0", userId);
+                //var lambda = DynamicExpressionParser.ParseLambda(new[] {
+                //    Expression.Parameter(entityType, "u") }, typeof(bool), $"u.{nameof(EntityBaseData.CreateUserId)}=@0", userId);
+                var lambda = entityType.GetConditionExpression<OwnerUserAttribute>(new List<long> { long.Parse(userId) });
+
                 db.QueryFilter.AddTableFilter(entityType, lambda);
                 dataScopeFilter.TryAdd(entityType, lambda);
             }