deotalandAi/.trae/documents/实现嵌套路由权限过滤.md

3.7 KiB
Raw Blame History

实现完整层级匹配的嵌套路由权限过滤

需求分析

  1. 权限数据格式:router:路由1:路由2:路由3:...,其中 router: 是固定前缀
  2. 匹配规则:所有层级的路由标识都需要依次匹配,每一层路由必须是上一层路由的子路由
  3. 支持任意深度的嵌套路由匹配
  4. 确保路由唯一性,避免重复添加
  5. 如果有重复的父级路由,只添加子路由

解决方案

  1. 解析权限规则将字符串权限规则按冒号分隔得到路由name数组
  2. 创建路由映射表:构建包含所有路由及其嵌套层级关系的映射
  3. 完整层级匹配:根据权限规则的所有层级,依次匹配每一层路由
  4. 构建完整路由树:将匹配到的所有层级路由构建成完整的嵌套结构
  5. 去重处理:确保每个路由只添加一次

实现步骤

  1. 修改 addPermissionRoutes 方法
  2. 解析 permissionRouter 中的权限规则转换为路由name数组
  3. 构建包含所有路由及其层级关系的映射
  4. 遍历每个权限规则,依次匹配每一层路由
  5. 构建完整的嵌套路由树,确保路由唯一性
  6. 将构建好的路由树动态添加到Vue Router中

代码修改点

文件d:\work\Aiproject\DeotalandAi\apps\FrontendDesigner\src\stores\index.js

函数addPermissionRoutes第67-89行

核心逻辑

  1. 替换当前的简单过滤逻辑
  2. 解析权限规则得到路由name数组
  3. 构建包含所有路由及其层级关系的映射
  4. 遍历每个权限规则,依次匹配每一层路由
  5. 构建完整的嵌套路由树
  6. 确保每个路由只添加一次
  7. 将构建好的路由树动态添加到Vue Router中

实现细节

  1. 权限规则解析

    • router:路由1:路由2:路由3 转换为 ['路由1', '路由2', '路由3']
    • 每个数组元素代表一个路由层级
  2. 路由映射构建

    • 递归遍历 permissionRoutes 及其子路由
    • 构建所有路由的name到路由对象的映射
    • 构建父路由到子路由的映射关系
  3. 完整层级匹配

    • 对于每个权限规则数组 [name1, name2, name3]
      • 第一步:检查 name1 是否存在于路由映射中
      • 第二步:检查 name1 的子路由中是否存在 name2
      • 第三步:检查 name2 的子路由中是否存在 name3
      • 以此类推,直到匹配完所有层级
  4. 路由树构建

    • 为每个权限规则构建完整的路由树
    • 确保父级路由存在
    • 避免重复添加路由
    • 只添加匹配到的路由及其父级路由(如果需要)
  5. 去重处理

    • 使用Set或Map确保每个路由只添加一次
    • 确保相同路由的子路由不会被重复添加

预期效果

  • 支持一级路由匹配(如 router:AdminOrders
  • 支持二级嵌套路由匹配(如 router:AdminOrders:AdminContentReview
  • 支持任意深度嵌套路由匹配(如 router:路由1:路由2:路由3:...
  • 所有层级的路由都需要匹配,确保路由完整性
  • 构建完整的嵌套路由结构
  • 确保路由唯一性,避免重复添加

实现示例

// 权限规则示例
const permissionRules = ['router:AdminOrders', 'router:AdminOrders:AdminContentReview', 'router:AdminPermission:AdminRoleManagement'];

// 解析后的规则
const parsedRules = [
  ['AdminOrders'],
  ['AdminOrders', 'AdminContentReview'],
  ['AdminPermission', 'AdminRoleManagement']
];

// 匹配逻辑
// 规则1匹配AdminOrders一级路由
// 规则2先匹配AdminOrders一级路由再在其下匹配AdminContentReview子路由
// 规则3先匹配AdminPermission一级路由再在其下匹配AdminRoleManagement子路由