当前位置: 首页 > news >正文

Vue 权限管理终极实践:动态路由 + 按钮级权限控制

文章目录

  • 一、权限管理整体思路
  • 二、路由权限实现
  • 三、按钮级权限指令实现
  • 四、注意事项
  • 五、完整流程图解

一、权限管理整体思路

在后台管理系统中,权限控制通常分为:

  1. 路由权限: 控制用户能否进入特定页面
  2. 按钮权限: 控制页面内操作按钮的显示/隐藏
  3. 菜单权限: 根据权限动态生成侧边栏菜单

采用以下技术方案:

  • 动态路由: 通过接口获取权限列表,过滤出有权限得路由
  • 自定义指令: 实现按钮级权限控制
  • 递归组件: 生成动态菜单

二、路由权限实现

1.定义路由结构

// router/index.js
const constantRoutes = [{path: '/login',component: () => import('@/views/login'),hidden: true},{path: '/404',component: () => import('@/views/404'),hidden: true}
]const asyncRoutes = [{path: '/user',component: Layout,meta: { title: '用户管理', permission: ['admin'] },children: [{path: 'list',component: () => import('@/views/user/list'),meta: { title: '用户列表', permission: ['admin'] }}]},// ...其他路由
]

2.路由过滤逻辑

// utils/permission.js
export function filterRoutes(routes, permissions) {return routes.filter(route => {if (route.meta?.permission) {return route.meta.permission.some(p => permissions.includes(p))}return true}).map(route => {if (route.children) {route.children = filterRoutes(route.children, permissions)}return route})
}

3.动态注册路由

// store/modules/permission.js
actions: {generateRoutes({ commit }, permissions) {return new Promise(resolve => {let accessedRoutes = filterRoutes(asyncRoutes, permissions)// 添加404兜底accessedRoutes.push({ path: '*', redirect: '/404', hidden: true })commit('SET_ROUTES', accessedRoutes)resolve(accessedRoutes)})}
}// 登录后调用
const permissionList = ['admin'] // 从接口获取
const accessRoutes = await store.dispatch('permission/generateRoutes', permissionList)
router.addRoutes(accessRoutes)

三、按钮级权限指令实现

1.创建自定义指令

// directives/permission.js
export default {inserted(el, binding, vnode) {const { value } = bindingconst permissions = store.getters.permissionsif (value && value instanceof Array) {const hasPermission = permissions.some(p => value.includes(p))if (!hasPermission) {el.parentNode && el.parentNode.removeChild(el)}} else {throw new Error('权限值需为数组格式,例如 v-permission="[\'admin\']"')}}
}

2.全局注册指令

// main.js
import permission from './directives/permission'
Vue.directive('permission', permission)

3.使用示例

<template><el-button v-permission="['admin']">删除用户</el-button>
</template>

四、注意事项

1.路由匹配规则: 建议使用 name 作为权限标识,比 path 更稳定
2.404处理: 动态路由需最后添加404页面
3.页面刷新: 需在 Vuex 持久化存储权限数据
4.按钮隐藏方式: 推荐直接移除 DOM 而非隐藏,避免通过开发者工具修改
5.后端校验: 前端控制仅为体验优化,关键接口必须后端校验

五、完整流程图解

用户登录 → 获取权限列表 → 过滤路由 → 动态注册路由 → 生成菜单↓存储权限到Vuex → 按钮指令校验

相关文章:

  • AI基础知识(02):机器学习的任务类型、学习方式、工作流程
  • Linux 网络编程 day5 多路IO转接之改进select and poll
  • 并发设计模式实战系列(16):屏障(Barrier)
  • Facebook如何运用AI实现元宇宙的无限可能?
  • RabbitMQ 添加新用户和配置权限
  • [监控看板]Grafana+Prometheus+Exporter监控疑难排查
  • 模型状态量
  • WPF之高级布局技术
  • 从设备交付到并网调试:CET中电技术分布式光伏全流程管控方案详解
  • 如何打造系统级低延迟RTSP/RTMP播放引擎?
  • 机器人系统设置
  • OpenJDK21源码编译指南(Linux环境)
  • 【[std::thread]与[qt类的对象自己的线程管理方法]】
  • cuda多维线程的实例
  • C++中指针使用详解(4)指针的高级应用汇总
  • 标题:基于自适应阈值与K-means聚类的图像行列排序与拼接处理
  • 一个关于fsaverage bem文件的说明
  • 五一感想:知识产权加速劳动价值!
  • window 显示驱动开发-线程和同步级别一级(二)
  • SecureCrt设置显示区域横列数
  • 四问当前旱情:还会持续多久
  • 习近平《在庆祝中华全国总工会成立100周年暨全国劳动模范和先进工作者表彰大会上的讲话》单行本出版
  • 又一日军“慰安妇”制度受害者去世,大陆在世幸存者仅7人
  • 李云泽:大型保险集团资本补充已经提上日程
  • 巴基斯坦宣布关闭全国空域48小时
  • 河南博物院:警惕非官方网络平台 “买讲解保进馆” 等虚假信息