vue权限与路由拦截

流程思路

通用路由+路由表-->后端返回路由权限数据
数据与路由表相互映射 --> addRoutes
addRoutes --> 全局路由拦截非权限内路由地址
f5刷新页面重新请求路由表

直接上代码

++router/index.js++

import Vue from 'vue'
import Router from 'vue-router'
//挂载到vue上
Vue.use(Router)
// 通用路由
export const constantRouterMap = [
  { path: '/login', component: () => import('@/views/login/index'), hidden: true },
  { path: '/404', component: () => import('@/views/404'), hidden: true },

  {
    path: '',
    component: Layout,
    redirect: 'dashboard',
    children: [{
      path: 'dashboard',
      component: () => import('@/views/dashboard/index'),
      name: 'dashboard',
      meta: { title: '首页', icon: 'dashboard' }
    }]
  }
]
export default new Router({
  // mode: 'history', //后端支持可开
  scrollBehavior: () => ({ y: 0 }), //切换路由时滚动到顶部
  routes: constantRouterMap //默认使用通用路由
})

//路由表,用于跟后端返回数据进行映射
//component属性的值为import进来的模块,如果不这样得做二次映射
export const newRouters = {
  "routes": [
    {
      "path": "/user",
      "component": Layout,
      "redirect": "/user/userList",
      "name": "User",
      "meta": { "title": "用户系统", "icon": "user" },
      "alwaysShow": true,
      "children": [
        {
          "path": "userList",
          "name": "UserList",
          "component": () => import('@/views/UserList/index'),
          "meta": { "title": "用户列表", "icon": "user" }
        }
      ]
    },
    {
      "path": "/webManager",
      "component": Layout,
      "redirect": "/webManager/home",
      "name": "WebManager",
      "meta": { "title": "网站管理", "icon": "money" },
      "alwaysShow": true,
      "children": [
        {
          "path": "home",
          "name": "Home",
          "component": () => import('@/views/WebManager/Home'),
          "meta": { "title": "网站首页管理", "icon": "money" }
        },
        {
          "path": "banner",
          "name": "Banner",
          "component": () => import('@/views/WebManager/Banner'),
          "meta": { "title": "banner管理", "icon": "money", "parents": [ {  "meta": { "title": "网站首页管理" }, "path": "/webManager/home" } ] },
          "hidden": true
        },
        {
          "path": "news",
          "name": "News",
          "component": () => import('@/views/WebManager/News'),
          "meta": { "title": "资讯管理", "icon": "money", "parents": [ {  "meta": { "title": "网站首页管理" }, "path": "/webManager/home" } ] },
          "hidden": true
        }
      ]
    },
    { "path": "*", "redirect": "/404", "hidden": true }
  ]
}

++store/modules/user.js++

// 请求权限(路由)数据接口
import { newRoutersOnline } from '@/api/login'
import router, { newRouters } from '@/router/index'

// 路由映射函数
function recursionRouters(userRouter = [], newRouters = []) {
  let addRouter = []
  userRouter.forEach((userRouterItem, index) => {
    newRouters.forEach((newRoutersItem, index) => {
      if (newRoutersItem.path === userRouterItem.path) {
        const item = newRoutersItem
        if (userRouterItem.children) {
          const children = recursionRouters(userRouterItem.children, newRoutersItem.children)
          if (children.length) {
            item.children = children
          }
        }
        addRouter.push(item)
      }
    })
  })
  return addRouter
}

const user = {
  state: {
    routes: []
  },
  mutations: {
    SET_ROUTES: (state, roles) => {
      state.routes = roles
    }
  },
  actions: {
    SetRoutes({ commit, state }) {
      return new Promise((resolve, reject) => {
        newRoutersOnline().then(res => {
          const newRoutes = recursionRouters(res.data, newRouters.routes)
          commit('SET_ROUTES', [...router.options.routes, ...newRoutes])
          resolve(newRoutes)
        }).catch(error => {
          reject(error)
        })
      })
    },
  }

++permission.js++//全局路由拦截配置文件

++utils/auth++

import Cookies from 'js-cookie'

const TokenKey = 'Admin-Token'

export function getToken() {
  return Cookies.get(TokenKey)
}
import router from './router'
import store from './store'
import NProgress from 'nprogress' // Progress 进度条
import 'nprogress/nprogress.css'// Progress 进度条样式
import { getToken } from '@/utils/auth' // 验权

const whiteList = ['/login', '/404'] // 不重定向白名单

router.beforeEach((to, from, next) => {
  if (getToken()) {
    if (to.path === '/login') {
      next({ path: '/' })
      NProgress.done()
    } else {
      //如果在登录状态,但是路由表丢失的情况下,调用store的请求路由表(适用于刷新页面后丢失store数据)
      if (store.getters.routes.length === 0) {
        store.dispatch('SetRoutes').then(res => {
          //addRoutes应该不用解释了吧。。。
          router.addRoutes(res)
          next({ ...to, replace: true })
        }).catch((err) => {
          store.dispatch('FedLogOut').then(() => {
            Message.error(err || '登陆失效,请重新登陆')
            next({ path: '/' })
          })
        })
      } else {
        next()
      }
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页
      NProgress.done()
    }
  }
}

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