原型树是运行时动态形成的委托链,节点仅存直接父级id,查找时单向向上委托直至命中或断链;无多继承,不存冗余祖先路径;新增、移动、删除只需改parent_id,结构变化由数据关系驱动;前端菜单依授权结果自动呈现全选/半选/未选状态。

原型树不是画出来的静态图,而是运行时动态形成的委托链。它的核心不在于“谁是谁的父”,而在于“查不到时往哪托”。节点本身只存直接上级,查找过程自动向上跳转,直到命中或断链。
每个节点只声明一个父级
原型树里没有“多继承”或“继承列表”,每个子节点有且仅有一个 parent_id 字段,指向它的直接原型节点。比如按钮“导出报表”只知道自己属于“报表管理”,不关心“报表管理”上面还有“数据看板”。数据库里也不存祖先路径、全量权限集这类冗余字段。
查找过程是单向向上委托
判断用户能否执行某操作时,系统不做预计算,而是启动一次实时委托:
- 先检查当前节点是否被显式授权(如角色配置中直接勾选了该ID)
- 没命中?立刻查它的 parent_id 对应的节点
- 再没命中?继续往上,直到 parent_id 为 null 或找到授权节点
树形结构由父子关系自然浮现
你不需要手动画一棵“继承树”,只要确保每条记录的 parent_id 指向正确,整棵树就在查询过程中自动展开。新增一个子菜单,只需填对 parent_id;移动一个功能模块,只改 parent_id;删除某个中间节点,所有下级在查找时会自动跨过它,转向更上层的授权点——结构变化完全由数据关系驱动,无需同步更新其他配置。
前端展示可同步反映委托状态
树形菜单组件能根据运行时的授权结果,自动呈现“全选”“半选”“未选”三种状态。比如用户只被授予了“报表管理”(ID=3),那它下面的“导出报表”(ID=5)和“打印报表”(ID=8)都会显示为半选——因为它们自身未被直接授权,但能通过父级委托获得能力。这种视觉反馈,是原型树逻辑在界面上的自然延伸。











