vue如何搭建動態(tài)權(quán)限路由

權(quán)限路由就是根據(jù)登錄的賬號角色的不同返回可操作的頁面不同。當(dāng)前角色可操作的權(quán)限是前后端配合協(xié)同的哎甲。

1.首先搭建一張默認(rèn)的無權(quán)限路由笆载,這里我只寫了一個登錄頁

import Vue from 'vue'

import VueRouter from 'vue-router'

Vue.use(VueRouter)

const routes = [

? {

? ? path: '',

? ? redirect: '/login'

? },

? {

? ? path: '/login',

? ? name: 'login',

? ? component: Login

? }

]

export default router

2.創(chuàng)建?dynamicRoutes.js 文件漏益。這里寫動態(tài)添加的權(quán)限路由表

let dynamicRoutes = [

? {

? ? path: '/father',

? ? component: () => {

? ? ? return import('@/views/Father')

? ? },

? ? name: 'father',

? ? meta: {

? ? ? name: '父親'

? ? },

? ? children: [

? ? ? {

? ? ? ? path: 'son',

? ? ? ? component: () => {

? ? ? ? ? return import('@/views/Father/Son')

? ? ? ? },

? ? ? ? name: 'son',

? ? ? ? meta: {

? ? ? ? ? name: '兒子'

? ? ? ? }

? ? ? }

? ? ]

? }

]

export default dynamicRoutes

3.考慮以后可能多個組件會使用到權(quán)限路由數(shù)據(jù),我們把權(quán)限路由的數(shù)據(jù)和生成權(quán)限路由的方法放到store中掌猛,在下面我只給出action.js里面的方法

import router from '@/router'

import dynamicRoutes from '@/router/dynamicRoutes.js'

// 篩選出有權(quán)限路由

function filterRouter (userRouter = [], allRouter = []) {

? /**

? ? * @param? {Array} userRouter 后臺返回的用戶權(quán)限json

? ? * @param? {Array} allRouter? 前端配置好的所有動態(tài)路由的集合

? ? * @return {Array} realRoutes 過濾后的路由

? */

? let realRoutes = []

? allRouter.forEach(v => {

? ? userRouter.forEach(item => {

? ? ? if (item.name === v.name) {

? ? ? ? // 創(chuàng)建新的對象

? ? ? ? let obj = {

? ? ? ? ? path: v.path,

? ? ? ? ? component: v.component,

? ? ? ? ? name: v.name,

? ? ? ? ? meta: {

? ? ? ? ? ? name: v.meta.name

? ? ? ? ? }

? ? ? ? }

? ? ? ? // 如果后臺返回的有子路由遞歸當(dāng)前方法加入當(dāng)前子路由

? ? ? ? if (item.children && item.children.length > 0) {

? ? ? ? ? obj.children = filterRouter(item.children, v.children)

? ? ? ? }

? ? ? ? realRoutes.push(obj)

? ? ? }

? ? })

? })

? return realRoutes

}

export default {

? // 獲取后臺的路由權(quán)限

? getAsyncRoutes ({ commit }) {

? ? /**

? ? ? * @param? {Array} res 后臺返回的用戶權(quán)限json

? ? */

? ? setTimeout(() => {

? ? ? let res = [

? ? ? ? {

? ? ? ? ? name: 'father',

? ? ? ? ? children: [

? ? ? ? ? ? {

? ? ? ? ? ? ? name: 'son'

? ? ? ? ? ? }

? ? ? ? ? ]

? ? ? ? },

? ? ? ? {

? ? ? ? ? name: 'test'

? ? ? ? }

? ? ? ]

? ? ? // 篩選出有權(quán)限路由

? ? ? let menu = filterRouter(res, dynamicRoutes)

? ? ? // 將404頁面加到最后

? ? ? menu = menu.concat([

? ? ? ? {

? ? ? ? ? path: '/404',

? ? ? ? ? name: '404',

? ? ? ? ? meta: {

? ? ? ? ? ? name: '404'

? ? ? ? ? },

? ? ? ? ? component: () => {

? ? ? ? ? ? return import('@/views/NotFound')

? ? ? ? ? }

? ? ? ? },

? ? ? ? {

? ? ? ? ? path: '**',

? ? ? ? ? redirect: '/404'

? ? ? ? }

? ? ? ])

? ? ? // 存入session

? ? ? if (!window.sessionStorage.getItem('menu')) {

? ? ? ? window.sessionStorage.setItem('menu', JSON.stringify(menu))

? ? ? }

? ? ? router.$addRoutes(menu)? ?//?$addRoutes方法是重新封裝的見下方

? ? ? commit(ADDROUTER, menu)

? ? }, 1000)

? }

}

4.防止刷新路由消失和切換角色路由清空重新添加,我們要改造一下router.js里面的內(nèi)容眉睹,以下是最終的router.js

import Vue from 'vue'

import VueRouter from 'vue-router'

import Login from '@/views/Login'

import store from '@/store'

Vue.use(VueRouter)

const routes = [

? {

? ? path: '',

? ? redirect: '/login'

? },

? {

? ? path: '/login',

? ? name: 'login',

? ? component: Login

? }

]

const router = new VueRouter({

? mode: 'history',

? routes: routes

})

/**

* 為了防止重復(fù)添加路由

* 重新定義$addRoutes,調(diào)用這個方法來添加路由荔茬,這個方法會先重置路由

* 這個路由只會包括非權(quán)限頁,比如登錄頁竹海,再調(diào)用router.addRoutes添加權(quán)限路由

*/

router.$addRoutes = (params) => {

? // 替換現(xiàn)有router的routes

? router.matcher = new VueRouter({ // 重置路由規(guī)則

? ? mode: 'history',

? ? routes

? }).matcher

? router.addRoutes(params) // 添加路由

}

router.onReady(() => {

? // 刷新頁面慕蔚,判斷如果登錄過并且有權(quán)限列表,那么動態(tài)加入權(quán)限路由

? if (window.sessionStorage.getItem('menu')) {

? ? store.dispatch('getAsyncRoutes')

? }

})

export default router

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斋配,一起剝皮案震驚了整個濱河市孔飒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌艰争,老刑警劉巖坏瞄,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異甩卓,居然都是意外死亡鸠匀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進(jìn)店門猛频,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狮崩,“玉大人蛛勉,你說我怎么就攤上這事∧啦瘢” “怎么了诽凌?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坦敌。 經(jīng)常有香客問我侣诵,道長,這世上最難降的妖魔是什么狱窘? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任杜顺,我火速辦了婚禮,結(jié)果婚禮上蘸炸,老公的妹妹穿的比我還像新娘躬络。我一直安慰自己,他們只是感情好搭儒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布穷当。 她就那樣靜靜地躺著,像睡著了一般淹禾。 火紅的嫁衣襯著肌膚如雪馁菜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天铃岔,我揣著相機(jī)與錄音汪疮,去河邊找鬼。 笑死毁习,一個胖子當(dāng)著我的面吹牛智嚷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜓洪,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼纤勒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了隆檀?” 一聲冷哼從身側(cè)響起摇天,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恐仑,沒想到半個月后泉坐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裳仆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年腕让,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡纯丸,死狀恐怖偏形,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情觉鼻,我是刑警寧澤俊扭,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站坠陈,受9級特大地震影響萨惑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仇矾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一庸蔼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贮匕,春花似錦姐仅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至隙疚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磕道,已是汗流浹背供屉。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溺蕉,地道東北人伶丐。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像疯特,于是被迫代替她去往敵國和親哗魂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內(nèi)容