基于vue-admin-template的角色权限动态路由实现

文章详细介绍了如何在vue-admin-template框架中实现角色权限动态路由,包括设置静态和动态路由表,编写获取用户信息方法,筛选权限,动态添加路由,并在页面中使用筛选后的路由。通过这些步骤,可以根据用户角色动态加载相应的页面权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vue-admin-template框架的概要

vue-template-admin是一个后台管理系统的前端解决方案,它是基于vue和element-ui实现。vue-element-admin是vue-template-admin的专业版,它含有丰富的组件。因此,根据业务逻辑在vue-template-admin进行二次开发,把vue-element-admin当成一个组件仓库,项目中需要用到相应的组件再进行加入。

角色权限动态路由的实现步骤

1. 设置路由表

先找到/src/router.js的文件,框架原本只实现了一个静态路由表,这个用来设置没有权限要求的页面,每个角色均可访问,比如首页,登录页等页面。因此,还需要加入一个动态路由表,即根据用户角色放行相应页面的权限,下面是实现的具体代码。

import Vue from 'vue'
import Router from 'vue-router'
import Layout from '../views/layout/Layout'
//使用router组件
Vue.use(Router)
//静态路由表设置
export const constantRouterMap = [
  //登录页面
  {
   
    path: '/login',
    component: () => import('@/views/login/index'), 
    hidden: true
  },
  //404页面
  {
   
    path: '/404',
    component: () => import('@/views/404'), 
    hidden: true
  },
  //注册页面
  {
   
    path: '/register',
    component: () => import('@/views/register/index'),
    hidden: true
  },
  //首页
  {
   
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    name: 'Dashboard',
    children: [{
   
      path: 'dashboard',
      component: () => import('@/views/dashboard/index'),
      meta: {
    title: '首页', icon: 'dashboard' }
    }]
  },

]

//异步挂载的路由
//动态需要根据权限加载的路由表
//每个页面给哪些角色放行,在roles数组提前写好即可
export const asyncRoutes = [
  //用户设置
  {
   
    path: '/user',
    component: Layout,
    redirect: '/user/usermanagement',
    name: 'User',
    meta: {
   
      title: '用户管理',
      icon: 'list',
      roles: ['admin']
    },
    children: [
      {
   
        path: 'usermanagement',
        name: 'Usermanagement',
        component: () => import('@/views/user/usermanagement/index'),
        meta: {
   
          title: '用户管理',
          icon: 'list',
          roles: ['admin']
        }
      },
      {
   
        path: 'rolemanagement',
        name: 'Rolemanagement',
        component: () => import('@/views/user/rolemanagement/index'),
        meta: {
   
          title: '角色设置',
          icon: 'list',
          roles: ['admin']
        }
      },
    ]
  },
  //建议管理
  {
   
    path: '/advice',
    component: Layout,
    redirect: '/advice/listadvice',
    name: 'Advice',
    meta: {
   
      title: '建议管理',
      icon: 'icon',
      roles: ['admin', 'rm', 'rc', 'sm', 'sc']
    },
    children: [
      {
   
        path: 'listadvice',
        name: 'Listadvice',
        component: () => import('@/views/advice/listadvice/index'),
        meta: {
   
          title: '建议列表',
          icon: 'icon',
          roles: ['admin']
        }
      },
      {
   
        path: 'saveadvice',
        name: 'Saveadvice',
        component: () => import('@/views/advice/saveadvice/index'),
        meta: {
   
          title: '新增建议',
          icon: 'icon',
          roles: ['admin', 'rm', 'rc', 'sm', 'sc']
        }
      },
    ]
  },
  //档案管理
  {
   
    path: '/record',
    component: Layout,
    redirect: '/record/listrecord',
    name: 'Record',
    meta: {
   
      title: '档案管理',
      icon: 'example',
      roles: ['admin', 'rm', 'rc']
    },
    children: [
      {
   
        path: 'allrecord',
        name: 'Allrecord',
        component: () => import('@/views/record/allrecord/index'),
        meta: {
   
          title: '所有档案',
          icon: 'example',
          roles: ['admin']
        }
      },
      {
   
        
要在vue-admin-template中添加角色权限路由,可以按照以下步骤进行操作: 1. 在src目录下创建一个新的文件夹,例如"permission",用于存放与权限相关的文件。 2. 在permission文件夹中创建一个新的文件,例如"permission.js",用于定义权限相关的函数和路由。 3. 在permission.js文件中,首先导入需要的工具和路由配置文件。例如: ```javascript import { constantRoutes } from '@/router' ``` 4. 创建一个函数,用于根据角色权限动态生成路由。例如: ```javascript export function generateRoutes(roles) { // 根据角色权限进行路由过滤 const accessedRoutes = constantRoutes.filter(route => { if (hasPermission(roles, route)) { if (route.children && route.children.length) { route.children = filterAsyncRoutes(route.children, roles) } return true } return false }) return accessedRoutes } ``` 5. 创建一个辅助函数,用于判断当前角色是否有权限访问某个路由。例如: ```javascript function hasPermission(roles, route) { if (route.meta && route.meta.roles) { return roles.some(role => route.meta.roles.includes(role)) } else { return true } } ``` 6. 最后,在permission.js文件中导出生成的路由。例如: ```javascript export default { generateRoutes } ``` 7. 在src/router/index.js文件中,导入permission.js并使用生成的路由。例如: ```javascript import permission from '@/permission/permission' // 在路由的beforeEach钩子中根据角色权限动态生成路由 router.beforeEach(async(to, from, next) => { const hasRoles = store.getters.roles && store.getters.roles.length > 0 if (hasRoles) { next() } else { try { // 获取角色信息,可以根据实际情况修改 const { roles } = await store.dispatch('user/getInfo') // 根据角色权限动态生成路由 const accessedRoutes = permission.generateRoutes(roles) // 添加生成的路由 router.addRoutes(accessedRoutes) // 确保addRoutes完成 next({ ...to, replace: true }) } catch (error) { // 获取角色信息失败时的处理,可以根据实际情况修改 await store.dispatch('user/resetToken') next(`/login?redirect=${to.path}`) } } }) ``` 这样,根据用户的角色权限动态生成的路由将会添加到路由配置中,用户只能访问其有权限的页面。请根据实际情况修改相关代码。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值