基於Vue element admin實現動態路由

2022-09-09 08:15:14 字數 3776 閱讀 2852

通常我們在vue專案中都是前端配置好路由的,但在一些專案中我們可能會遇到許可權控制,這樣我們就涉及到動態路由的設定了

動態路由設定一般有兩種:

(1)、簡單的角色路由設定: 比如只涉及到管理員和普通使用者的許可權。通常直接在前端進行簡單的角色許可權設定

(2)、複雜的路由許可權設定: 比如oa系統、多種角色的許可權配置。通常需要後端返回路由列表,前端渲染使用

(1)配置專案路由許可權

// router.js

import vue from 'vue'

import router from 'vue-router'

import layout from '@/layout'

vue.use(router)

let asyncroutes = [

,children: [},}

]}, ]

let router = new router(),

routes: asyncroutes

})export default router

(2)新建乙個公共的asyncrouter.js檔案
// asyncrouter.js

//判斷當前角色是否有訪問許可權

function haspermission(roles, route) else

}// 遞迴過濾非同步路由表,篩選角色許可權路由

export function filterasyncroutes(routes, roles)

if (haspermission(roles, tmp))

res.push(tmp)}})

return res

}

3)建立路由守衛:建立公共的permission.js檔案,設定路由守衛
import router from './router'

import store from './store'

import nprogress from 'nprogress' // 進度條外掛程式

import 'nprogress/nprogress.css' // 進度條樣式

import from '@/utils/auth'

import from '@/utils/asyncrouter.js'

nprogress.configure() // 進度條配置

const whitelist = ['/login']

router.beforeeach(async (to, from, next) => )

nprogress.done()

} else else )

} catch (error) `)

nprogress.done()}}

}} else else `)

// 結束精度條

nprogress.done()}}

})router.aftereach(() => )

(4)在main.js中引入permission.js檔案

(5)在login登入的時候將roles儲存到store中(1)配置專案路由檔案,該檔案中沒有路由,或者存在一部分公共路由,即沒有許可權的路由

import vue from 'vue'

import router from 'vue-router'

import layout from '@/layout';

vue.use(router)

// 配置專案中沒有涉及許可權的公共路由

export const constantroutes = [,,

]const createrouter = () => new router(),

routes: constantroutes

})const router = createrouter()

export function resetrouter()

export default router

(2)新建乙個公共的asyncrouter.js檔案
// 引入路由檔案這種的公共路由

import from '../router';

// layout 元件是專案中的主頁面,切換路由時,僅切換layout中的元件

import layout from '@/layout';

export function getasyncroutes(routes) ;

if (item.component) else `],resolve)

// 此處用reqiure比較好,import引入變數會有各種莫名的錯誤

// newitem.component = (() => import(`@/views/$`));}}

for (const key in item)

}// 若遍歷的當前路由存在子路由,需要對子路由進行遞迴遍歷

if (newitem.children && newitem.children.length)

res.push(newitem)

})// 返回處理好且可用的路由陣列

return res

}

(3)建立路由守衛:建立公共的permission.js檔案,設定路由守衛
//  進度條引入設定如上面第一種描述一樣

import router from './router'

import store from './store'

import nprogress from 'nprogress' // progress bar

import 'nprogress/nprogress.css' // progress bar style

import from '@/utils/auth' // get token from cookie

import from '@/utils/asyncrouter'

const whitelist = ['/login'];

router.beforeeach( async (to, from, next) => )

nprogress.done()

} else else )

} catch (error) `)

nprogress.done()}}

}} else else `)

nprogress.done()}}

})router.aftereach(() => )

(4)在main.js中引入permission.js檔案

(5)在login登入的時候將路由資訊儲存到store中

//  登入介面呼叫後,呼叫路由介面,後端返回相應使用者的路由res.router,我們需要儲存到store中,方便其他地方拿取

this.$store.dispatch("addroutes", res.router);

到這裡,整個動態路由就可以走通了,但是頁面跳轉、路由守衛處理是非同步的,會存在動態路由新增後跳轉的是空白頁面,這是因為路由在執行next()時,router裡面的資料還不存在,此時,你可以通過window.location.reload()來重新整理路由

routerlist = [

, "children": [

},},]}

]

注意:vue是單頁面應用程式,所以頁面一重新整理資料部分資料也會跟著丟失,所以我們需要將store中的資料儲存到本地,才能保證路由不丟失。關於vue頁面重新整理儲存頁面狀態,可以檢視 vue如何在頁面重新整理時保留狀態資訊

AspectJ基於xml和基於註解

一 基於xml 執行的切入點中具體方法有返回值,則方法結束會立即執行後置通知,然後再執行環繞通知的放行之後的 2 連線點即所有可能的方法,切入點是正真被切的方法,連線點方法名 其中,只有環繞通知的切入點引數不一樣,是可以放行的切入點 3 異常通知是處理異常 切面類中的異常通知的方法引數列表中異常引數...

拓撲排序(基於dfs 基於佇列)

dfs函式的返回值表示是否成環,若存在有向環,則不存在拓撲排序。不包含有向環的有向圖稱為有向無環圖 dag 可以借助dfs完成拓撲排序,在訪問完乙個結點時把他加入當前拓撲序的首部。舉個栗子 比如乙個 1,2 1,3 2,3 的有向無環圖,就先搜尋1,再遞迴搜尋2,再搜尋3,3沒有出度了,於是放進拓撲...

基於insert update delete的注入

inset注入原理 所謂inset注入就是指我們前端註冊的資訊會被後台通過insert操作插入到資料庫裡邊去,若此時後台沒有做出相應的處理就會構成insert注入。insert注入方法 insert用法例如 insert into member username,pw,phonenum,email,...