关键在于权限数据驱动路由行为:将角色、权限码等存入pinia/vuex,通过路由守卫校验store状态,动态注册权限路由,并复用同一权限源控制菜单与按钮显示。

把 Vue 状态管理(比如 Vuex 或 Pinia)和路由权限配置结合起来,关键在于让权限数据驱动路由行为——不是硬编码谁能看到什么页面,而是让状态决定哪些路由能被加载、哪些跳转该被拦截、哪些菜单该被渲染。
权限数据统一存进状态管理
用户登录后拿到的角色、权限码、菜单列表等,不要只存在组件或局部变量里,必须存进 Vuex/Pinia 的 store 中。例如:
-
store/modules/user.js 存用户基本信息和
permissions数组(如['user_view', 'order_edit']) - store/modules/permission.js 负责过滤路由、缓存已生成的权限路由、记录加载状态
- 避免在路由守卫里反复调用 API 或读 localStorage,所有判断都基于 store 中已就绪的状态
路由守卫中读取状态做校验
全局前置守卫 router.beforeEach 是权限控制的主入口,但它本身不负责获取权限,只负责消费:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 检查
to.meta.requiresAuth,若为 true,再从store.state.user.permissions中查是否有对应to.meta.permission - 对嵌套路由,用
to.matched.some(r => r.meta.permission)向上找最近的权限标识 - 无权限时,
next('/403')或next({ name: 'NoAccess' }),不建议直接next(false)阻断,要给明确反馈
动态路由注册依赖状态变更
权限路由不能写死在 new VueRouter({ routes }) 里,而要等用户登录、权限数据就位后再注入:
- 定义两套路由:常量路由(
constantRoutes,含登录页、404 等) + 异步路由模板(asyncRoutes,带meta.permission) - 登录成功后,在 action 中调用
filterAsyncRoutes(asyncRoutes, store.state.user.permissions)得到真实可用路由 - 用
router.addRoute()(Vue Router 4)或router.addRoutes()(Vue Router 3)逐条添加,确保 Vue Devtools 和 SSR 友好 - 刷新页面时,需在
store初始化阶段从持久化存储(如 sessionStorage)恢复权限,并触发一次路由重生成
菜单与按钮权限也复用同一份状态
侧边栏菜单、操作按钮是否显示,不应另起一套权限逻辑,而应和路由权限同源:
- 菜单项配置可直接复用
asyncRoutes中的meta.title、meta.icon、meta.permission - 自定义指令如
v-permission="['user_delete']"内部也是读取store.state.user.permissions - 这样新增一个功能页时,只需在路由配置里加一条带
meta.permission的记录,菜单、按钮、守卫全部自动生效
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










