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

vue-admin-template权限管理

在基于 `vue-admin-template` 实现权限管理时,通常需要结合角色权限模型和动态路由机制,以满足不同用户角色对页面访问权限的控制需求。分为路由页面权限和按钮权限:下面是具体实现思路的思维导图和具体代码流程:

0.实现逻辑思维导图:

1. 角色权限模型设计

在权限管理中,最基础的模型是 RBAC( 模型,即基于角色的访问控制。系统中定义多个角色(如管理员、普通用户等),每个角色拥有特定的权限集合,权限可以是菜单访问权限、按钮操作权限等。

在 `vue-admin-template` 中,可以通过扩展路由配置来实现角色权限控制。每个路由对象可以增加 `meta` 字段,用于标识该路由所需的权限角色。

```javascript
{path: '/admin',component: Layout,meta: { roles: ['admin'] },children: [{path: 'dashboard',component: () => import('@/views/dashboard/index'),meta: { roles: ['admin'] }}]
}
```
2. 动态路由机制

`vue-admin-template` 本身是一个基础模板,不包含动态路由功能。要实现权限控制,需要引入动态路由机制。具体流程如下:

1. 用户登录后,向后端请求当前用户的角色信息。
2. 根据角色信息,从前端定义的路由表中筛选出该角色可访问的路由。
3. 使用 `router.addRoutes()` 方法将筛选后的路由添加到 Vue Router 中。

示例代码如下:

```javascript
import { constantRoutes, asyncRoutes } from '@/router'/*** Filter asynchronous routes through permissions* @param routes* @param roles*/
export function filterAsyncRoutes(routes, roles) {const res = []routes.forEach(route => {const tmp = { ...route }if (hasPermission(roles, tmp)) {if (tmp.children) {tmp.children = filterAsyncRoutes(tmp.children, roles)}res.push(tmp)}})return res
}/*** Determine if the route requires permission* @param roles* @param route*/
function hasPermission(roles, route) {if (route.meta && route.meta.roles) {return roles.some(role => route.meta.roles.includes(role))}return true
}const state = {routes: [],addRoutes: []
}const mutations = {SET_ROUTES: (state, routes) => {state.addRoutes = routesstate.routes = constantRoutes.concat(routes)}
}const actions = {generateRoutes({ commit }, roles) {return new Promise(resolve => {let accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)commit('SET_ROUTES', accessedRoutes)resolve(accessedRoutes)})}
}
```
3. 后端权限控制与数据库路由表

在实际项目中,权限配置通常由后端维护,前端从接口获取当前用户的角色信息及可访问的路由列表。这样可以避免每次权限变更都需要重新发布前端代码。

后端可以提供一个接口,例如:

```
GET /api/user/roles
```

返回示例:

```json
{"roles": ["admin", "editor"],"routes": [{"path": "/dashboard","name": "Dashboard","component": "dashboard/index","meta": {"roles": ["admin"]}}]
}
```

前端根据返回的 `routes` 字段动态生成路由表,并通过 `router.addRoutes()` 添加。

4. 按钮权限控制

除了页面级别的权限控制,还需要对按钮级别的操作进行限制。通常可以通过自定义指令或组件封装实现。

示例:自定义 `v-permission` 指令

```javascript
Vue.directive('permission', {inserted(el, binding) {const { value } = bindingconst roles = store.getters.rolesif (value && value instanceof Array && value.length > 0) {const permissionRoles = valueconst hasPermission = roles.some(role => {return permissionRoles.includes(role)})if (!hasPermission) {el.parentNode && el.parentNode.removeChild(el)}} else {throw new Error(`need roles! Like v-permission="['admin','editor']"`)}}
})
```

在模板中使用:

```html
<el-button v-permission="['admin']">删除</el-button>
```
5. 总结

`vue-admin-template` 实现权限管理的核心在于 **角色权限模型 + 动态路由 + 按钮权限控制**。

http://www.dtcms.com/a/345030.html

相关文章:

  • 信创认证是什么?怎么报考?
  • 特级资质信息化迎检核心流程经验分享
  • Pod控制器详解
  • STM32之ADC详解
  • [系统架构设计师]大数据架构设计理论与实践(十九)
  • ​维基框架 (Wiki Framework) 1.1.0 版本发布​ 提供多模型AI辅助开发
  • TNS(ORACLE)协议分析
  • [硬件电路-162]:PID参数受哪些因素影响?
  • 【Redis】缓存和分布式锁
  • MySQL - 视图,事务和索引
  • AAA 服务器与 RADIUS 协议笔记
  • C语言初学笔记【联合与枚举】
  • Unreal Engine USceneComponent
  • 如何实现二维CAD与3D建模工程图关联一体化出图 | 中望3D 2026新亮点
  • android sdk 虚拟机是否可以通过命令行打开?
  • 数字逻辑与数字系统设计之电梯控制器设计
  • 防爆连接器在防爆箱上的作用
  • shell脚本第二阶段-----选择结构
  • Unreal Engine IWYU Include What You Use
  • DLT645仪表通信,串口助手调试读写地址
  • 【C#】观察者模式 + UI 线程调度、委托讲解
  • vuex如何在js文件中使用
  • NVIDIA GB200 架构详解及与 B200/H200/H100 的区别
  • 【芯芯相印】芯片设计生产全流程核心技术术语与实践指南:从架构定义到量产交付的完整图谱
  • NLP学习之Transformer(2)
  • 数据预处理学习笔记
  • Thunderbird 将推出在德国托管的加密电子邮件服务
  • Android Jetpack | Hilt
  • 快速了解深度学习
  • 数学建模--Topsis(Python)