15分钟拆明白 vue-vben-admin:3条命令跑通动态权限菜单
15分钟拆明白 vue-vben-admin3条命令跑通动态权限菜单【免费下载链接】vue-vben-adminA modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. Its fast!项目地址: https://gitcode.com/GitHub_Trending/vu/vue-vben-admin上周接了个中后台需求甲方说要登录之后按角色看不同菜单。自己从零写这套逻辑路由守卫、菜单生成、缓存失效至少得折腾两天。后来翻到一个开源码仓库叫 vue-vben-adminVue3 Vite TypeScript 的后台管理模板这套动态路由权限机制是现成的连 mock 后端都给你配好了。读完这篇你能自己把整个项目 clone 下来跑起来还知道它的菜单是怎么长出来的。一、项目长什么样monorepo 结构速览先建立个整体印象。这不是单个应用而是一个 pnpm turbo 管理的 monorepo多包工程一个仓库里装好几个互相依赖的包。apps 目录下躺着 5 套前端应用Ant Design、Element Plus、Naive、TDesign 各一套加一个 mock 服务packages 目录放的是被各应用复用的公共代码internal 目录放工程配置。重点看这三个目录playground/功能最全的演示应用文档里让你跑的默认就是它登录、权限、布局全有packages/effects/权限控制、请求封装、布局这些有效果的公共模块apps/backend-mock/基于 Nitro 的假后端登录、菜单接口全在这特性说明权限模式前端/后端/混合三种模式切换多 UI 库一套架构适配 4 种组件库内置能力国际化、主题、Tab 页、Mock 接口工具链Vite TypeScript Vitest Playwright搞清楚目录分工之后下一步拆它最核心的机制登录之后那套菜单到底怎么来的。二、拆明白动态路由权限菜单为什么登录后才出现它解决什么问题不同角色登录后看到的菜单必须不一样但路由表又不能全量加载给所有人。核心思路用大白话说应用启动时只注册几条核心路由登录页、404 这些业务路由先不加载。第一次点进任何业务页面时路由守卫拦下来拿当前用户的角色调一次generateAccessible把该角色能看的路由算出来动态挂到 router 上顺手把菜单也生成好。整个过程只跑一次之后靠一个isAccessChecked标记跳过。packages/effects/access/src/ 是这套机制的实现地guard 里的关键几行长这样// 没登录 → 跳登录页 if (!accessStore.accessToken) { ... } // 第一次访问拿角色算出路由和菜单 const { accessibleMenus, accessibleRoutes } await generateAccess({ roles: userRoles, router, routes: accessRoutes, // ... });它支持三种 accessModefrontend在前端按角色过滤本地路由表backend直接调接口问后端要菜单mixed两边合并。可以把它想成小区门禁——物业前端模式自己有一张住户名单或者每次刷脸时实时问后台后端模式两种玩法都能进小区。机制讲完下面从零把项目跑起来验证一遍。三、实战5步跑通 vue-vben-admin 到登录进后台第 1 步拿代码官方只支持 pnpm所以后面都围绕它装。git clone https://gitcode.com/GitHub_Trending/vu/vue-vben-admin cd vue-vben-admin npm i -g corepack pnpm installcorepack 是 Node 自带的包管理器管理器装上它之后pnpm install会自动用项目锁定的 pnpm 版本省得你纠结版本对不对。第 2 步挑应用启动。装完直接跑 devpnpm dev # 交互提示里选择 vben/playground # 浏览器打开 http://localhost:5555选 playground 是因为它是 demo 最全的应用如果只想看 Ant Design 版选vben/web-antd也一样。第 3 步登录。页面右上角默认已经填了演示账号账密是vben / 123456点登录。注意看菜单是登录成功那一瞬间才刷出来的——这就是第二节那个守卫在干活此刻generateAccess正在把路由挂进 router。第 4 步摸一摸配置。登录后顶部有一排偏好设置入口里面能切布局、主题、accessMode。把权限模式从 frontend 换成 backend 再重新登录会发现菜单改由 apps/backend-mock/ 的假接口返回页面结构完全没动——这就是前端要菜单还是后端发菜单的差异。第 5 步看懂本地路由长什么样。frontend 模式下菜单来源是 playground/src/router/routes/modules/ 里的路由模块每个文件一个菜单目录比如 dashboard 模块const routes: RouteRecordRaw[] [ { meta: { icon: lucide:layout-dashboard, order: -1, title: ... }, name: Dashboard, path: /dashboard, children: [ { name: Analytics, path: analytics, component: () import(...) }, // ... ], }, ];order控制菜单排序component用动态 import 实现懒加载。以后加一个菜单页就是在 modules 里照葫芦画瓢加一个文件。跑完这五步你手上应该有一个亮着的工作台页面左侧是按角色过滤后的菜单顶上是 Tab 页签分析页里图表、表格全是现成的登录态和路由表都真实存在内存里。四、新手最常踩的 5 个坑老手分享几个真实会翻车的地方语气随便点。现象npm install直接报错退出。原因项目preinstall里写了only-allow pnpm故意只放行 pnpm。解法老老实实pnpm install别用 npm/yarn 碰它。现象装依赖时提示 pnpm 版本不满足或者装一半失败。原因引擎要求 pnpm 11Node 也要 22.18 / 24.12。解法先npm i -g corepack再装它会自动切到项目packageManager字段锁定的版本。现象依赖装好了一启动就各种怪错甚至装依赖时中文路径下直接失败。原因存放代码的目录含所有父级目录不能有中文、日文、空格。解法把仓库挪到类似~/code/vue-vben-admin的纯英文路径重跑pnpm install。现象改了 playground/src/preferences.ts 里的配置刷新页面死活不生效。原因偏好配置会缓存到浏览器本地存储源码里的注释也写了更改配置后请清空缓存。解法清掉站点存储或者换个无痕窗口再看。现象照着旧博客的 v2 教程写代码组件名、目录全对不上。原因5.0 做了彻底重构和旧版本不兼容仓库结构、组件写法都变了。解法新需求用 5.x维护老项目才切 v2 分支两边代码别混着抄。坑都绕过去了这套代码还能往哪深挖五、接下来可以往哪走三个方向按性价比排。先啃权限机制全文。docs/src/guide/ 里的 in-depth 目录有 access 专章把三种 accessMode 的边界情况比如menuVisibleWithForbidden菜单可见但页面 403都写清楚了对照着 packages/effects/access/src/ 源码读一遍两小时能读完。再把手工路由换成后端模式练一遍。自己用 backend-mock 加一条假菜单走通接口发菜单 → 前端渲染的链路这比纯读代码印象深得多。最后补测试肌肉。仓库自带 Vitest Playwright跑一下就能看到效果pnpm test:unit和pnpm test:e2e分别是单元和端到端测试Playwright 配置在 playground/playwright.config.ts。建议下一步就把你手头项目的登录 按角色显示菜单模块照这套 guard generateAccess 的写法重写一版试试写之前先别看答案你会发现守卫里其实只有几十行关键逻辑。【免费下载链接】vue-vben-adminA modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. Its fast!项目地址: https://gitcode.com/GitHub_Trending/vu/vue-vben-admin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考