vue中 根据权限 动态的设置路由

本篇文章主要讲的是使用vue的框架 vue-element-admin, 来解决根据不同的角色权限, 显示不同的路由.

 ⽅式⼀,后台返回⾓⾊树形路由表,前端添加动态路由

 ⽅式⼆,后台返回⽤户⾓⾊,前端在路由表⾥添加⾓⾊路由权限

下面详细的来讲一下,这两种方法:

 动态路由⽅式⼀

      后台返回⾓⾊树形路由表,前端添加动态路由。登录获 取到⽤户的信息之后,通过⽤户⾓⾊访问后台接⼝获取动态路由,依赖后台接⼝返回路由表

      后台数据样例如下:

    

const serviceMap = [
 // 登录界⾯
 {
 path: '/login',
 // 这⾥后台返回的是component: 'login',前端需要处理成以下代码
 component: map['login'],
 hidden: true
 },
 // ⾸⻚
 {
 path: '/',
 component: Layout,
 redirect: '/dashboard',
 children: [{
 path: 'dashboard',
 name: 'Dashboard',
 component: map['dashboard'],
 meta: { title: '⾸⻚', icon: 'dashboard' }
 }]
 },
 {

 path: '/customer',
 component: Layout,
 children: [
 {
 path: 'list',
 name: 'customer',
 // 这⾥后台返回的是component: 'customer',前端需要处理成以下代码
 component: map['customer'],
 meta: {
 roles: ['customer'],
 title: '顾客管理',
 icon: 'peo'
 }
 }
 ]
 },
 // 产品管理
 {
 path: '/product',
 component: Layout,
 children: [
 {
 path: 'list',
 name: 'product',
 component: map['product'],
 meta: { title: '产品管理', icon: 'table' }
 }
 ]
 },
 // 审核
 {
 path: '/examine',
 component: Layout,
 meta: { title: '审核⼤厅', icon: 'tree' },
 children: [
 {
 path: 'waiterExamine',
 component: map['waiterExamine'],
 meta: { title: '员⼯审核' }
 },
 {
 path: 'cashExamine',
 component: map['cashExamine'],
 meta: { title: '提现审核' }
 },
 ]
 },
 // 404报错提示⻚⾯
 {
 path: '/404',
 component: map['error'],
 hidden: true
 },

 { path: '*', redirect: '/404', hidden: true }
]

前端最终将路由表动态添加到路由中,下⽅的router对象是引⼊的

import router from '@/router/index';
router.options.routes = serviceMap;
router.addRoutes(serviceMap);

动态路由⽅式⼆

     后台返回⽤户⾓⾊,前端在路由表⾥添加⾓⾊路由权限

     需要操作的文件有:

                                 

1. src/router/index.js
2. src/store/modules/user.js
3. src/store/getters.js
4. src/permission.js
5. src/store/modules/permission.js

1. 操作src/router/index.js

     在该⽂件内内置两组路由,⼀组是基本路由constantRoutes,⼀组是需要权限控制的路由asyncRoutes, 将来在权限控制的路由组内过滤出对应的路由表,在需要权限控制的路由内添加如下代表权限的代码 meta: { roles: ['教师'] }

export const constantRoutes = [
// 登录界⾯
{
 path: '/login',
 component: () => import('@/views/login/index'),
 hidden: true
},
// ⾸⻚
{
 path: '/',
 component: Layout,
 redirect: '/dashboard',
 children: [{
 path: 'dashboard',
 name: 'Dashboard',
 component: () => import('@/views/dashboard/index'),
 meta: { title: '⾸⻚', icon: 'dashboard' }
 }]
},
// 404报错提示⻚⾯
{

 path: '/404',
 component: () => import('@/views/404'),
 hidden: true
},
{ path: '*', redirect: '/404', hidden: true }
];
// 需要动态处理的路由
export const asyncRoutes = [
// 顾客管理
{
 path: '/customer',
 component: Layout,
 meta: { roles: ['教师'] },
 children: [
 {
 path: 'list',
 name: 'customer',
 component: () => import('@/views/customer/index'),
 meta: {
 roles: ['教师'],
 title: '顾客管理',
 icon: 'peo'
 }
 }
 ]
},
// 审核
{
 path: '/examine',
 component: Layout,
 meta: { roles: ['审核管理员'], title: '审核⼤厅', icon: 'tree' },
 children: [
 {
 path: 'waiterExamine',
 component: () => import('@/views/examine/waiterExamine'),
 meta: { title: '员⼯审核' }
 },
 {
 path: 'cashExamine',
 component: () => import('@/views/examine/cashExamine'),
 meta: { title: '提现审核' }
 },
 ]
},
]

基本路由constantRoutes注册到路由器对象内

const createRouter = () => new Router({
 // mode: 'history', // require service support
 scrollBehavior: () => ({ y: 0 }),
 routes: constantRoutes
 })

2. 操作src/store/modules/user.js

   在state中添加roles状态

   

roles: []

   在mutations⾥添加SET_ROLES突变

 SET_ROLES: (state, roles) => {
 state.roles = roles
 }

在actions的getInfo添加如下代码,根据获取到的后台数据中的roles⽣成roles['管理员','教师']这种格式的 ⾓⾊信息,然后调⽤突变

getInfo({ commit, state }) {
 return new Promise((resolve, reject) => {
 getInfo(state.token).then(response => {
 const { data } = response
 let roles = data.roles.map(item => item.name)
 // 在src/permission.js中会⽤到这个仓库的roles数据
 commit('SET_ROLES', roles);
 data.roles = roles;
 // 在src/permission.js中会⽤到data中的roles数据
 resolve(data);
 }).catch(error => {
 reject(error)
 })
 })
},

3. 操作src/store/getters.js

      在getters内添加如下代码,将user仓库的roles状态直接暴露到getters中,⽅便src/permission.js中使⽤

roles: state => state.user.roles

4. 操作src/permission.js

    引⼊路由⽂件中的基础路由,等过滤出合适的路由后合并基础路由,设置为路由表。

    

import { constantRoutes } from '@/router'

该⽂件31⾏上下,添加如下代码,部分代码内部已经有

   

//如下代码就是在使⽤仓库中的roles数据,查看学习即可,不⽤动
const hasRoles = store.getters.roles && store.getters.roles.length > 0
if (hasRoles) {
 next()
} else {
 try {
 //如下代码在获取user仓库中的getInfo动作的resolve的data中的roles数据
 const { roles } = await store.dispatch('user/getInfo')
 //如下代码在分发permission仓库的generateRoutes动作,该动作功能是根据当前的⻆⾊从
router.js的权限路由中过滤出符合当前⻆⾊的路由数组。accessRoutes⽬前就是符合权限的路由
表数组
 const accessRoutes = await store.dispatch('permission/generateRoutes',
roles)
 // 路由表⽴即⽣效,constantRoutes.concat(accessRoutes)是进⾏路由的合并
 router.options.routes = constantRoutes.concat(accessRoutes);
 // 添加路由到路由表中
 router.addRoutes(constantRoutes.concat(accessRoutes))
 next({ ...to, replace: true })
 } catch (error) {
 await store.dispatch('user/resetToken')
 Message.error(error || 'Has Error')
 next(`/login?redirect=${to.path}`)
 NProgress.done()
 }
}

5. 操作src/store/modules/permission.js

    src/permission.js中分发了permission仓库中的generateRoutes。在permission仓库中的generateRoutes动作代 码如下:

generateRoutes({ commit }, roles) {
 return new Promise(resolve => {
 let accessedRoutes = [];
 if (roles.includes('管理员')) {
 // 代表如果是管理员⻆⾊,那么有所有的⻆⾊权限,管理员这⼏个字要与router.js的

roles的取值⼀致
 accessedRoutes = asyncRoutes || []
 } else {
 // 如果不是管理员⻆⾊,那么根据对应的⻆⾊过滤权限
 accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
 }
 commit('SET_ROUTES', accessedRoutes)
 resolve(accessedRoutes)
 })
}

 

以上就是全部内容啦,希望对您有所帮助哈,有什么问题欢迎指正和讨论哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值