管理端前端二次开发:加页面、加菜单、加权限点

Vue 3 + Vite + Element Plus。三处必须同步改:路由、菜单、权限点。少改一处就会出现「页面能进但菜单没有」或「菜单点了 403」。

学完能做到 新增一个业务页面,出现在侧边栏正确分组下,且只有授权角色能看到。

开始之前

  • 私有化部署且有前端源码
  • 熟悉 Vue 3 与 Vue Router

操作步骤

三个目录先认路

src/pages/ 放页面组件(按业务域分子目录);src/router/index.ts 注册路由并声明 meta.permissions;src/layouts/AppMenu.vue 定义侧边栏菜单(按组拆成数组,如 productionAll)。三处都要改。

加页面

在 src/pages/ 对应业务域下建 .vue 文件。同目录现有页面就是最好的模板,照抄数据加载、分页、权限按钮的写法,不要自己发明一套。

注册路由

在 src/router/index.ts 的 appChildren 里加一条,meta.title 用 i18n key(如 menu.xxx),meta.permissions 填该页要求的权限点。i18n key 要在 src/locales/zh-CN.ts 的 menu 段里同时补上中英文,否则菜单会显示 key 名。

加入菜单

在 AppMenu.vue 对应分组的数组里加一条 { path, i18nKey, permissions, icon }。permissions 与路由保持一致 —— 不一致会出现「菜单看得见但点进去 403」或反过来。

权限点从哪来

权限点在数据库 permissions 表(共 55 个),前端只做展示级控制,真正的拦截在后端。如果新页面需要新权限点,要在后端 permissions 表插入记录、在角色里勾选,前端才能引用 —— 前端硬写一个不存在的 code,权限判断永远为 false。

构建与替换

改完 npm run build,把 dist 产物替换到站点目录(或按你们的部署方式)。注意浏览器缓存:改了资源指纹后一般会自动失效,但 index.html 常被 CDN 缓存,必要时手动刷新。

代码示例

ts路由注册(src/router/index.ts)
{
  path: 'workshop-stat',
  name: 'workshop-stat',
  component: () => import('@/pages/reports/WorkshopStatPage.vue'),
  meta: {
    title: () => i18n.global.t('menu.workshopStat'),
    permissions: ['report.view'],   // 与 AppMenu 保持一致
  },
},
ts菜单项(src/layouts/AppMenu.vue)
// 放进合适的分组数组(例如 dataCenterAll / productionAll)
{
  path: '/reports/workshop-stat',
  i18nKey: 'menu.workshopStat',
  permissions: ['report.view'],
  icon: DataAnalysis,      // 从 @element-plus/icons-vue 引入
},
tsi18n 文案(src/locales/zh-CN.ts 的 menu 段)
menu: {
  // ...
  workshopStat: '车间统计',
},

示例中的域名、租户编码、密钥请替换成你自己的。生产环境不要把密钥写进前端代码。

容易踩的坑

菜单里显示的是 menu.xxx 而不是中文?
i18n key 没在 locales 里注册。zh-CN.ts 是主语言,缺了它一定会显示 key;en-US.ts 缺了会回落显示 key。两处都补。
页面能进但菜单不显示?
AppMenu 里的 permissions 与路由不一致,或者该用户角色没勾这个权限点。先用管理员账号(全权限)验证是配置问题还是代码问题。
改了代码构建后页面白屏,控制台报 chunk 加载失败?
旧资源被替换但浏览器还在引用旧文件名。项目里有 chunk-reload 兜底逻辑,但强刷一次更快。CI 部署时建议保留上一版资源一个版本。
能不能只改前端不改后端?
纯展示类页面可以。只要涉及数据读写,就必须有后端接口 —— 前端直接连库是不可能的,也没有任何安全性。

接着看

还有别的问题?

先看常见问题,或者在系统内提工单,我们会回。