HOME 3 years ago
parent
commit
b53cdc5184

+ 6 - 0
VCommon.VApplication/Authorization/PermissionNode.cs

@@ -61,5 +61,11 @@ namespace VCommon.VApplication.Authorization
             _tree.CodeHashSet.Add(code);
             _tree.CodeHashSet.Add(code);
             return node;
             return node;
         }
         }
+
+        public void Traverse(Action<PermissionNode> visitor)
+        {
+            visitor(this);
+            foreach (var child in Children) child.Traverse(visitor);
+        }
     }
     }
 }
 }

+ 1 - 1
VCommon.VApplication/Authorization/PermissionNodeOutput.cs

@@ -4,7 +4,7 @@ namespace VCommon.VApplication.Authorization
 {
 {
     public class PermissionNodeOutput
     public class PermissionNodeOutput
     {
     {
-        public List<PermissionNodeOutput> Children { get; } = new List<PermissionNodeOutput>();
+        public List<PermissionNodeOutput> Children { get; } = new();
         public string Code { get; }
         public string Code { get; }
         public string Name { get; }
         public string Name { get; }
         public string Description { get; }
         public string Description { get; }

+ 15 - 5
VCommon.VApplication/Authorization/PermissionTree.cs

@@ -24,22 +24,22 @@ namespace VCommon.VApplication.Authorization
 
 
         public IReadOnlyCollection<PermissionNode> Roots => _roots;
         public IReadOnlyCollection<PermissionNode> Roots => _roots;
 
 
-        public PermissionNode CreateRootNode(string code, string name, string description = null, string nameForOperator = null, string descriptionForOperator = null, MultiTenancySides side = MultiTenancySides.Both)
+        public PermissionNode CreateRootNode(string code, string name, string description = null, string nameForOperator = null, string descriptionForOperator = null, MultiTenancySides side = MultiTenancySides.Both, object customData = null)
         {
         {
             if (CodeHashSet.Contains(code)) throw new ArgumentException($"重复的权限代码:{code},名称:{name}");
             if (CodeHashSet.Contains(code)) throw new ArgumentException($"重复的权限代码:{code},名称:{name}");
-            var node = new PermissionNode(this, code, name, description, nameForOperator, descriptionForOperator, side);
+            var node = new PermissionNode(this, code, name, description, nameForOperator, descriptionForOperator, side, customData);
             _roots.Add(node);
             _roots.Add(node);
             _allNode.Add(node);
             _allNode.Add(node);
             CodeHashSet.Add(code);
             CodeHashSet.Add(code);
             return node;
             return node;
         }
         }
 
 
-        public IReadOnlyCollection<PermissionNodeOutput> Filter(MultiTenancySides side, IReadOnlyCollection<string> licPerms)
+        public IReadOnlyCollection<PermissionNodeOutput> Filter(MultiTenancySides side, IReadOnlyCollection<string> licPerms, object customData = null)
         {
         {
-            return FltTree(_roots, side, licPerms == null ? null : new HashSet<string>(licPerms));
+            return FltTree(_roots, side, licPerms == null ? null : new HashSet<string>(licPerms), customData: customData);
         }
         }
 
 
-        private static IReadOnlyCollection<PermissionNodeOutput> FltTree(IReadOnlyCollection<PermissionNode> nodesFrom, MultiTenancySides side, IReadOnlySet<string> licPerms, List<PermissionNodeOutput> output = null)
+        private static IReadOnlyCollection<PermissionNodeOutput> FltTree(IReadOnlyCollection<PermissionNode> nodesFrom, MultiTenancySides side, IReadOnlySet<string> licPerms, List<PermissionNodeOutput> output = null, object customData = null)
         {
         {
             output ??= new List<PermissionNodeOutput>();
             output ??= new List<PermissionNodeOutput>();
 
 
@@ -49,6 +49,8 @@ namespace VCommon.VApplication.Authorization
 
 
                 if (node.TenancySide != MultiTenancySides.Both && node.TenancySide != side) continue;
                 if (node.TenancySide != MultiTenancySides.Both && node.TenancySide != side) continue;
 
 
+                if (customData == null || false == customData.Equals(node.CustomData)) continue;
+
                 var copy = side == MultiTenancySides.Tenant
                 var copy = side == MultiTenancySides.Tenant
                     ? new PermissionNodeOutput(node.Code, node.Name, node.Description)
                     ? new PermissionNodeOutput(node.Code, node.Name, node.Description)
                     : new PermissionNodeOutput(node.Code, node.NameForOperator ?? node.Name, node.DescriptionForOperator ?? node.Description);
                     : new PermissionNodeOutput(node.Code, node.NameForOperator ?? node.Name, node.DescriptionForOperator ?? node.Description);
@@ -69,5 +71,13 @@ namespace VCommon.VApplication.Authorization
             _codeHashSet = null;
             _codeHashSet = null;
             return toReturn;
             return toReturn;
         }
         }
+
+        public void Lookup(Action<PermissionNode> visit)
+        {
+            foreach (var node in Roots)
+            {
+                node.Traverse(visit);
+            }
+        }
     }
     }
 }
 }

+ 4 - 4
VCommon/DataModel/TreeModel.cs

@@ -6,22 +6,22 @@ namespace VCommon.DataModel
     public class TreeModel<T>
     public class TreeModel<T>
     {
     {
         public T Node { get; set; }
         public T Node { get; set; }
-        public IReadOnlyCollection<TreeModel<T>> Child { get; set; }
+        public IReadOnlyCollection<TreeModel<T>> Children { get; set; }
 
 
         public TreeModel()
         public TreeModel()
         {
         {
         }
         }
 
 
-        public TreeModel(T node, IReadOnlyCollection<TreeModel<T>> child)
+        public TreeModel(T node, IReadOnlyCollection<TreeModel<T>> children)
         {
         {
             Node = node;
             Node = node;
-            Child = child;
+            Children = children;
         }
         }
 
 
         public void Traverse(Action<T> visitor)
         public void Traverse(Action<T> visitor)
         {
         {
             visitor(Node);
             visitor(Node);
-            foreach (var child in Child) child.Traverse(visitor);
+            foreach (var child in Children) child.Traverse(visitor);
         }
         }
     }
     }
 }
 }