日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Vue路由權限控制解析

瀏覽:25日期:2022-11-03 17:05:31

前言

本人在公司主要負責中后臺系統的開發,其中路由和權限校驗算是非常重要且最為基本的一環。實際開發項目中,關于登錄和路由權限的控制參照了vue-element-admin這個明星項目,并在此基礎上基于業務進行了整合,接下來我會以這個項目為例,仔細地剖析整個路由和權限校驗的過程,也算是對這個知識點的一些總結。

項目總體目錄結構

進入今天主題之前,我們先來梳理下整個項目,src目錄下的。

api: 接口請求 assets: 靜態資源 components: 通用組件 directive: 自定義指令 filters: 自定義過濾器 icons: 圖標 layout: 布局組件(頁面架構核心) router: 路由配置(路由權限核心模塊) store: 狀態管理 styles: 樣式文件 utils: 工具方法 views: 頁面組件 permission.js 權限管理

對這項目感興趣的同學可以自行,有針對性地學習,除了路由權限校驗的功能以外,也包含了很多有意思的功能,相信能夠學到不少東西。

路由權限控制邏輯

路由處理流程圖

Vue路由權限控制解析

路由處理源碼分析

我們先找到permission.js文件,此處定義全局路由守衛,也是路由權限中非常關鍵的核心代碼。為方便大家閱讀,只摘取了跟路由相關的代碼

import router from ’./router’import store from ’./store’import { Message } from ’element-ui’import NProgress from ’nprogress’ // progress barimport ’nprogress/nprogress.css’ // progress bar styleimport { getToken } from ’@/utils/auth’ // get token from cookieNProgress.configure({ showSpinner: false }) // NProgress Configurationconst whiteList = [’/login’, ’/auth-redirect’] // 白名單配置router.beforeEach(async(to, from, next) => { // start progress bar NProgress.start() // 有token if (hasToken) { if (to.path === ’/login’) // 如果當前路徑為/login,重定向到首頁 next({ path: ’/’ }) NProgress.done() // hack: https://github.com/PanJiaChen/vue-element-admin/pull/2939 } else { // determine whether the user has obtained his permission roles through getInfo const hasRoles = store.getters.roles && store.getters.roles.length > 0 if (hasRoles) { next() } else { try { // 獲取用戶信息 const { roles } = await store.dispatch(’user/getInfo’) // 根據用戶的角色,動態生成路由 const accessRoutes = await store.dispatch(’permission/generateRoutes’, roles) // 動態添加路由 (將基本的路由信息跟動態路由進行合并) router.addRoutes(accessRoutes) // 繼續訪問 next({ ...to, replace: true }) } catch (error) { // 刪除token await store.dispatch(’user/resetToken’) Message.error(error || ’Has Error’) // 重定向到登錄頁面 next(`/login?redirect=${to.path}`) NProgress.done() } } } } else { // 沒有token if (whiteList.indexOf(to.path) !== -1) { // 如果在白名單中,則不需要進行任何校驗,直接放行 next() } else { // 如果不存在于白名單中,則重定向到登錄頁面. next(`/login?redirect=${to.path}`) NProgress.done() } }})router.afterEach(() => { // finish progress bar NProgress.done()})

注意到,代碼中的/login?redirect=${jto.path}, 這里的redirect參數主要是用于,在用戶登錄成功后進行跳轉的頁面路徑。具體功能在/views/login/index.vue文件下

watch: { $route: { handler: function(route) { const query = route.query if (query) { //路由查詢參數 this.redirect = query.redirect this.otherQuery = this.getOtherQuery(query) } }, immediate: true }},// methods下的:handleLogin() { // 登錄函數 this.$refs.loginForm.validate(valid => { if (valid) { // 賬號密碼校驗成功后 this.$store.dispatch(’user/login’, this.loginForm) .then(() => { // 直接跳轉到this.redirect 路徑的頁面 this.$router.push({ path: this.redirect || ’/’, query: this.otherQuery }) this.loading = false }) } else { // .. } })},

動態路由配置

我們先來看看路由的定義,在/src/router/index.js文件下

export const constantRoutes = [ // 用來定義普通的路由配置,不需要訪問權限的 // 路由配置對象]export const asyncRoutes = [ // 通過路由元信息meta.roles來設置訪問權限,一般來說是個數組 { path: ’/permission’, component: Layout, redirect: ’/permission/page’, alwaysShow: true, // will always show the root menu name: ’Permission’, meta: { title: ’Permission’, icon: ’lock’, roles: [’admin’, ’editor’] // 通過roles設置路由的權限 }, // ... }]

動態添加路由時,本質上就是根據用戶的角色信息在asyncRoutes路由配置數組中進行路由篩選,找到相對應的路由,與constantRoutes合并生成最新的路由。

動態添加路由邏輯圖

Vue路由權限控制解析

動態路由源碼分析代碼入口: permission.js

const accessRoutes = await store.dispatch(’permission/generateRoutes’, roles)

permission/generateRoutes方法入口文件:/strore/modules/permissions.js

import { asyncRoutes, constantRoutes } from ’@/router’const state = { routes: [], addRoutes: []}const mutations = { SET_ROUTES: (state, routes) => { state.addRoutes = routes state.routes = constantRoutes.concat(routes) }}const actions = { generateRoutes({ commit }, roles) { return new Promise(resolve => { let accessedRoutes if (roles.includes(’admin’)) { // 如果包含了admin,則說明是admin,具有所有模塊的訪問權限 accessedRoutes = asyncRoutes || [] } else { // 如果不是管理員,則需要根據用戶角色roles和異步路由進行篩選 accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) } // 將最終的結果存放到vuex中 commit(’SET_ROUTES’, accessedRoutes) // resolve出去 resolve(accessedRoutes) }) }}

對異步路由進行篩選,并將最終的結果存放到vuex中,并將結果resolve出去

export function hasPermission(roles, route) { if (route.meta && route.meta.roles) { // 如果存在meta.roles // 只要meta.roles中存在與用戶角色列表中相同的值,則說明具有訪問權限 return roles.some(role => route.meta.roles.includes(role)) } else { // 不存在meta或者是不存在meta.roles,則說明是通用模塊,直接放行 return true }}export function filterAsyncRoutes(routes, roles) { const res = [] routes.forEach(route => { const tmp = { ...route } if (hasPermission(roles, tmp)) { // 相對路由數組的每一項進行訪問權限的判斷 if (tmp.children) { // 如果存在children,則遞歸調用篩選函數 tmp.children = filterAsyncRoutes(tmp.children, roles) } // 將處理好的路由配置放入到res中 res.push(tmp) } }) return res}

最后回到/permission.js文件中

const accessRoutes = await store.dispatch(’permission/generateRoutes’, roles)// 這里的accessRoutes就是篩選之后的路由,// 最后通過route.addRoutes將constRoutes和accessRoutes進行合并,生成最終的訪問路由router.addRoutes(accessRoutes)

擴展-按鈕權限

路由權限控制基本流程已經分析完,接下來我們也來看看項目里的按鈕權限控制的實現,實現也比較簡單。

基本用法<div v-permission='[’admin’,’editor’]'></div>import store from ’@/store’function checkPermission(el, binding) { const { value } = binding // 從store中拿到我們訪問接口后,取到用戶角色信息 const roles = store.getters && store.getters.roles if (value && value instanceof Array) { // 判斷傳入的值是不是數組,規范化傳值 if (value.length > 0) { const permissionRoles = value // 只要傳入的permissionRoles中,包含了roles其中的一個值即可,則代表有權限 const hasPermission = roles.some(role => { return permissionRoles.includes(role) }) // 沒有權限則進行刪除,不展示。 // v-permission具體實現可以根據業務場景進行修改 if (!hasPermission) { el.parentNode && el.parentNode.removeChild(el) } } } else { throw new Error(`need roles! Like v-permission='[’admin’,’editor’]'`) }}export default { inserted(el, binding) { checkPermission(el, binding) }, update(el, binding) { checkPermission(el, binding) }}

總結

存在token

存在用戶角色信息,則說明該用戶的最終可訪問的路由已經生成,可以直接放行

不存在用戶信息

1.調用獲取用戶信息接口,獲取到用戶信息, 將用戶信息存放到vuex中

2.判斷用戶角色

如果是管理員則對所有模塊具有訪問權限 非管理員,需要對異步路由進行篩選,通過遍歷異步路由,并通過meta.roles與用戶信息比較,判斷用戶是否具有訪問權限

3.將最終的可訪問路由存放到vuex中,最后通過router.addRoutes,整合最后的路由配置列表

不存在token

如果訪問路由在白名單下,則直接進行訪問

訪問路由不存在白名單下,則重定向到登錄頁面 path: /login?redirect=/xxx,登錄成功后則跳轉到/xxx對應的頁面

以上就是Vue路由權限控制解析的詳細內容,更多關于Vue路由權限控制的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲综合五月| 92国产精品| 欧美一区91| 免费人成黄页网站在线一区二区 | 色在线中文字幕| 国产精品极品在线观看| 国产精品亚洲欧美| 国产一区二区视频在线看| 国产欧美一区二区精品久久久 | 亚洲aa在线| 国产精品一区二区美女视频免费看| 五月综合激情| 99成人超碰| 国产精品腿扒开做爽爽爽挤奶网站| 好看不卡的中文字幕| 中文字幕日韩亚洲| 神马日本精品| 欧美日韩在线网站| 久久高清一区| 国产欧美自拍一区| 欧美日韩国产一区二区在线观看| 久久精品色播| 在线成人直播| 亚洲午夜视频| 国产亚洲网站| 亚洲精品国模| 国产精品乱战久久久| 精品视频自拍| 日韩久久一区二区三区| 亚洲久久一区| 日本不卡视频在线观看| 激情中国色综合| 国产精品成人a在线观看| 91精品一区二区三区综合在线爱| 欧美成人基地 | 亚洲成人不卡| 亚洲一区二区动漫| 亚洲精品伊人| 国产精品激情电影| 午夜av不卡| 欧美.日韩.国产.一区.二区| 午夜国产精品视频| 亚洲精品综合| 欧美日韩午夜| 日韩免费久久| 爽好久久久欧美精品| 日韩精品五月天| 精品久久精品| 欧美日韩日本国产亚洲在线| 日韩av在线免费观看不卡| 精品欧美日韩精品| 午夜国产一区二区| 日本免费新一区视频| 97精品国产福利一区二区三区| 亚洲毛片在线| 青青青国产精品| 免费看久久久| 日本aⅴ精品一区二区三区 | 国产欧美自拍| 九一国产精品| 91精品啪在线观看国产爱臀| 黄色aa久久| 视频一区二区三区中文字幕| 美女av一区| 国产美女一区| 精品久久中文| 亚洲一区国产一区| 美女视频网站久久| 亚洲在线免费| 精品久久一区| 一区二区三区国产在线| 成人影视亚洲图片在线| 免费一级片91| 蜜臀国产一区| 日本欧美久久久久免费播放网| 天堂资源在线亚洲| 国产欧美一区| 亚洲一区二区免费看| 成午夜精品一区二区三区软件| 视频一区免费在线观看| 欧美日韩国产v| 日本成人在线视频网站| 日韩在线不卡| 国产精品一区免费在线| 亚洲欧美久久| 日韩久久视频| 国产精品综合色区在线观看| 夜夜精品视频| 日产午夜精品一线二线三线| 亚洲精品系列| 亚洲激精日韩激精欧美精品| 福利视频一区| 国产日韩精品视频一区二区三区| 99亚洲精品| 欧洲一区二区三区精品| 国产精品毛片视频| 日韩精品一级二级| 亚洲二区精品| 毛片在线网站| 麻豆国产欧美日韩综合精品二区| 中文不卡在线| 99国产精品久久久久久久| 日韩精品免费一区二区三区| 麻豆久久一区| 国产精品久久久久久久久久妞妞| 蜜桃视频第一区免费观看| 国产99久久| 久久精品免费一区二区三区| 精品免费视频| 老司机免费视频一区二区三区| 日韩专区视频网站| 中文精品视频| 激情综合在线| 久久激情网站| 麻豆精品蜜桃| 欧洲av一区二区| av高清不卡| 国产成人免费| 国产一区二区三区精品在线观看 | 夜夜嗨网站十八久久| 今天的高清视频免费播放成人| 国产不卡人人| 国产成人精品999在线观看| 国产精品magnet| 国产日韩欧美中文在线| 亚洲精品乱码| 综合国产精品| 亚洲精品成人一区| 天海翼亚洲一区二区三区| 久久国产福利| 亚洲男女自偷自拍| 中文无码日韩欧| 亚洲在线久久| 日韩av中文字幕一区二区三区| 日韩av一二三| 国产精品xxx在线观看| 亚洲欧洲国产精品一区| 欧美亚洲二区| 国产欧美日韩影院| 久久99久久久精品欧美| 国产高清亚洲| 久久久国产精品入口麻豆| 精品99在线| 国产乱码精品一区二区三区亚洲人 | 国产欧美日韩一区二区三区四区| 国产日韩一区二区三免费高清| 国产精品一区二区av日韩在线| 国产精品嫩模av在线| 欧美精品1区| 精品一区二区三区视频在线播放 | 日韩视频在线一区二区三区| 亚洲高清av| 久久99伊人| 热久久国产精品| 日韩1区2区日韩1区2区| 免费一区二区三区在线视频| 在线天堂中文资源最新版| 欧产日产国产精品视频| 99久久夜色精品国产亚洲1000部| 欧美特黄一区| 少妇精品久久久一区二区三区| 国产欧美啪啪| 成人台湾亚洲精品一区二区| 在线看片国产福利你懂的| 婷婷综合激情| 婷婷久久免费视频| 精品国产一区二区三区2021| 久久久久免费av| 丝袜美腿成人在线| 国产精品一区二区三区av麻| 另类专区亚洲| 麻豆9191精品国产| 国产精品免费精品自在线观看| 欧美三级网址| 欧美综合二区| 国产精品1区| 久久久夜精品| 亚洲精品第一| 国产成人免费av一区二区午夜| 亚洲二区视频| 日韩一区中文| 麻豆国产在线| 久久av一区二区三区| 国产精品大片| 欧美精品九九| 国产精品v亚洲精品v日韩精品| 日韩在线短视频| 日本在线不卡视频一二三区| 精品久久国产一区| 好看的av在线不卡观看| 国产精品网址| 99国产精品一区二区| 欧美日韩国产一区二区在线观看| 日韩美女一区二区三区在线观看| 亚洲毛片在线| 成人小电影网站| 亚洲日产av中文字幕| 成人va天堂| 国产精品777777在线播放| 国产亚洲在线|