vue路由+权限

  1. router.js
import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

import loginLayout from '../views/layout/loginLayout'
import Layout from '../views/layout/layout'
/**
* @description: 路由表配置
* @hidden {*} 是否在菜单隐藏路由 true 隐藏
* @noAuth {*} //不需要控制权限的添加 路由表添加noAuth:true字段
*/
export const routes = [
 {
   path: '/',
   redirect: '/login',
   hidden: true
 },
 {
   path: '/login',
   name: 'Login',
   component: () => import('@/views/login/login'),
   hidden: true
 },
 {
   path: '/home',
   name: 'Home',
   component: () => import('@/views/home/home'),
   hidden: true,
   meta: { title: '首页', icon: '' }
 },
 {
   path: '/errPage',
   name: 'ErrPage',
   component: () => import('@/views/404'),
   hidden: true
 },
]
export const asyncRoutesMap=[
 {
   path: '/dashboard',
   name: 'Dashboard',
   component: Layout,
   // redirect:{name:'Work'},
   meta: { title: '工作台', icon: 'el-icon-s-management' },
   hidden: false,
   children: [
     {
       path: 'work',
       name: 'Work',
       component: () => import('@/views/work'),
       redirect: { name:'WorkList'},
       meta: { title: '业务', icon: 'el-icon-s-order' },
       hidden: false,
       children: [
         {
           path: 'workList',
           name: 'WorkList',
           component: () => import('@/views/work/list'),
           meta: { title: '', noAuth:true },
           hidden: true,
         },
         {
           path: 'detail',
           name: 'Detail',
           component: () => import('@/views/work/detail'),
           meta: { title: '业务详情', noAuth: true},
           hidden: true,
         },
       ]
     },
   ]
 },
 {
   path: '/hoy',
   name: 'Hoy',
   component: Layout,
   //redirect:{name:'MyHoy'},
   meta: { title: 'Hoy', icon: 'el-icon-s-flag' },
   hidden: false,
   children: [
     {
       path: 'myHoy',
       name: 'MyHoy',
       component: () => import('@/views/myHoy'),
       meta: { title: '我的Hoy', icon: 'el-icon-s-custom' },
       hidden: false,
     },
   ]
 },
 {
   path: '*',
   redirect: '/errPage',
   hidden: true
 }
]
export default new VueRouter({
 mode: 'history',
 scrollBehavior: () => ({ y: 0 }),
 routes
})

  1. permission.js
/**
 * @Author: DDY
 * @Date: 2021-09-04 20:42:08
 * @description: 权限路由守卫
 */
import router from './router/index';
import { asyncRoutesMap } from './router/index';
import store from './store'
import NProgress from 'nprogress' // Progress 进度条
import 'nprogress/nprogress.css'// Progress 进度条样式
import { Message } from 'element-ui'

const whiteList = ['/login','/404'] // 不重定向白名单
router.beforeEach((to, from, next) => {
    NProgress.start()
    if (whiteList.indexOf(to.path) !== -1) {
        next()
    } else {
        const token = store.getters['token'];
        if (token){
            let asyncRouets = store.state.User.asyncRoutes;
            if (asyncRouets.length){
                //处理过有权限的路由信息
                next()
            }else{
                store.dispatch('User/getUserInfo').then(res => {
                    let permissions_url = store.state.User.asyncRoutesName
                    //根据权限name处理路由表
                    const addRoutes = filterAsyncRouter(permissions_url, asyncRoutesMap)
                    store.commit('User/SET_ASYNC_ROUTES', addRoutes)
                    router.addRoutes(addRoutes) // 动态添加可访问路由表
                    if (res.length){
                        next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
                    }else{
                        Message({
                            duration:5000,
                            type:'error',
                            message: '您没有查看页面的权限!'
                        })
                        next('/')
                    }
                }).catch((err) => {
                    store.dispatch('User/logOut').then(() => {
                        Message.error(err || 'Verification failed, please login again')
                        next('/')
                    })
                })
            }
        }else{
            next('/')
        }

    }
})

function resolveRoute() {
    //跳转对应的地址
    let env = process.env.NODE_ENV;
    let hostName = location.hostname;
    NProgress.done()
}

/**
 * 通过meta.url判断是否与当前用户权限匹配
 * @param {*} permissions_url  接口返回的权限 [{name:'xxx'}]
 * @param {*} route  某条路由信息
 */
export const hasPermission=function(permissions_url, route) {
    if (route.name) {
        return permissions_url.some(item => {
            return route.name == item.name
        })
    } else {
        return true
    }
}
/**
 * @description: 用户所拥有的权限AsyncRouter 路由表
 * @param {*} permissions_url  接口返回的权限 [{name:'xxx'}]
 * @param {*} asyncRouterMap  路由表所有的异步路由 []
 * @return {*}  用户所拥有的权限AsyncRouter 路由表
 */
export const filterAsyncRouter = function (permissions_url, asyncRouterMap) {
    const accessedRouters = asyncRouterMap.filter(route => { //返回符合条件的路由
        if (route.meta && route.meta.noAuth) {  //不需要控制权限的添加 路由表添加noAuth:true字段
            return true;
        }
        if (hasPermission(permissions_url, route)) { //符合条件的
            if (route.children && route.children.length) {
                route.children=filterAsyncRouter(permissions_url, route.children);
            }
            return true;
        }
        return false;
    });
    return accessedRouters
}

router.afterEach(() => {
    NProgress.done() // 结束Progress
})
  1. store>modules>user.js
    /**
     * @description: 设置用户拥有权限的路由配置列表
     */
    SET_ASYNC_ROUTES: (state, routesInfo) => {
        state.asyncRoutes =  routesInfo;
    },
    /**
     * @description: 设置用户拥有权限的路由名称
     */    
    SET_ASYNC_ROUTES_NAME: (state, routesInfo) => {
        state.asyncRoutesName =  routesInfo;
    },
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容