vue后臺(tái)管理如何配置動(dòng)態(tài)路由菜單
后臺(tái)管理配置動(dòng)態(tài)路由菜單
前段時(shí)間做一個(gè)后臺(tái)管理項(xiàng)目,因?yàn)槌?jí)管理員可以給普通管理員動(dòng)態(tài)更改權(quán)限,所以vue-element-admin里的寫死的權(quán)限路由菜單就不太適合我,自己研究了好半天,經(jīng)歷了各種死循環(huán),終于差不多弄出了一個(gè),可能會(huì)有點(diǎn)啰嗦
總結(jié)一下:
我這個(gè)后臺(tái)分為三個(gè)角色:超級(jí)管理員、企業(yè)管理員和普通管理員。其中,超級(jí)管理員可以查看所有的路由菜單,企業(yè)管理員也是固定的幾個(gè)菜單,所以,超級(jí)管理員和企業(yè)管理員是我在前端寫好的路由菜單里直接配置的權(quán)限,而普通管理員是不固定的,需要后臺(tái)給我返回?cái)?shù)據(jù),自己拼接。
1、首先我們需要有一個(gè)登錄的頁(yè)面,簡(jiǎn)單點(diǎn)的,用戶名和密碼還有一個(gè)登錄按鈕就可以了,我用的是vue-element-admin的模板,它已經(jīng)寫好了,直接拿來(lái)用就可以
2、自己在src-api文件夾中新建一個(gè)js文件來(lái)寫自己的登錄、獲取用戶信息、登出等接口(也可以換掉之前的模擬接口,在api/user.js文件)。
3、點(diǎn)擊登錄按鈕,這時(shí)會(huì)在這個(gè)方法里面調(diào)用store-modules-user.js里的login方法,如下:
4、store-modules-user.js里的login方法就是調(diào)用了自己的登錄接口,當(dāng)然,調(diào)用之前記得先引入文件
上面是我引入的登錄、獲取用戶信息、登出的接口
5、調(diào)用登錄接口后store存儲(chǔ)返回的token等數(shù)據(jù)(根據(jù)自己的需求來(lái),因?yàn)槲液笃谛枰脩鬷d,所以也把用戶id存進(jìn)了store里)
6、這時(shí)調(diào)用同頁(yè)面的getInfo方法,當(dāng)然,這個(gè)方法里也同樣調(diào)用了獲取用戶信息的接口,這步是為了獲取到登錄的用戶的角色,調(diào)用之后,將返回的用戶角色名等存到store里(我還存了其它的數(shù)據(jù),還是那句話,哪些數(shù)據(jù)需要就存哪些)
*** 這里當(dāng)時(shí)我出了一個(gè)bug:當(dāng)我登錄進(jìn)去之后刷新頁(yè)面又跳到了登錄的頁(yè)面,說(shuō)明有關(guān)鍵的數(shù)據(jù)沒(méi)有存儲(chǔ)上,上網(wǎng)一找,token在登錄調(diào)用登錄接口后已經(jīng)用cookie存入了瀏覽器,那應(yīng)該就是我只把id存進(jìn)了store而沒(méi)有存入瀏覽器,才導(dǎo)致一刷新就失去了id,所以我用localStorage/sessionStorage存入了id,在getInfo里才獲取本地存儲(chǔ)的id在存儲(chǔ)到store中
7、由于普通管理員的路由菜單是后臺(tái)返給我的,所以,在getInfo這個(gè)方法中,我也直接調(diào)用了獲取路由菜單的接口,將返回的數(shù)據(jù)通過(guò)拼接來(lái)生成一個(gè)完整的路由菜單,最后將這個(gè)路由菜單數(shù)組保存在store中
注:路由菜單最后一定要放404,格式 :{ path: '*', redirect: '/404', hidden: true } ,切記一定要放在最后?。?!
8、接下來(lái)是去src/permission.js中調(diào)用store-modules-user.js里的getInfo方法,這塊與模板的代碼沒(méi)有區(qū)別,所以就不多敘述。在此方法中調(diào)用了store-modules-permission.js里的generateRoutes的方法
我們?nèi)フ乙幌逻@個(gè)方法,這個(gè)方法其實(shí)是根據(jù)傳過(guò)來(lái)的role來(lái)判斷它能看到的路由菜單。模板里原來(lái)的方法是根據(jù)角色和寫好的路由菜單一一比較,最后把對(duì)應(yīng)上權(quán)限的項(xiàng)放進(jìn)一個(gè)數(shù)組里,我這里的超級(jí)管理員和普通管理員因?yàn)闄?quán)限和路由菜單固定,所以直接套用的代碼。而普通管理員,則是調(diào)用保存在store里的路由菜單數(shù)組,然后賦值給定義好的變量
之后需要更改的地方就沒(méi)有了,就可以測(cè)試登錄了。
這里我犯了一個(gè)比較大的bug:
當(dāng)以普通管理員登錄的時(shí)候,我進(jìn)去之后菜單顯示正常,可是當(dāng)我不管點(diǎn)擊哪個(gè)菜單,都給我跳到了404 。經(jīng)過(guò)一番測(cè)試與排查,我找到了解決方法,是加一個(gè)延時(shí)器,加在generateRoutes方法的這個(gè)地方
之后就運(yùn)行成功了,但是具體原因我其實(shí)不太明白,因?yàn)槲襝onsole.log(accessedRoutes) 出來(lái)的也是正常的路由菜單
這就是大體的配置動(dòng)態(tài)路由菜單的過(guò)程,作為第一次配置成功的心得。
根據(jù)權(quán)限生成動(dòng)態(tài)路由及導(dǎo)航菜單
最近在做一個(gè)后臺(tái)管理項(xiàng)目,涉及到一些菜單權(quán)限控制,具體實(shí)現(xiàn)如下:(話不多說(shuō),直接上代碼)
router/index.js
const Home = resolve => require(['@/views/common/Home.vue'], resolve); const AAA = resolve => require(['@/views/page/AAA.vue'], resolve); const BBB = resolve => require(['@/views/pages/BBB.vue'], resolve); const CCC= resolve => require(['@/views/pages/CCC.vue'], resolve); let routes = [{ path: '/', component: Home, name: '首頁(yè)', redirect: '/AAA', hidden: true, mate: { icon: 'fa fa-home', index: 'AAA' }, children: [{ path: '/AAA', component: AAA, name: '主頁(yè)' }] }] //從服務(wù)器獲取路由,進(jìn)行拼接,所有模塊不再以import的形式引入,只能通過(guò)require方式加載! export const makeRoute = function (items) { let routes = []; for (var i = 0; i < items.length; i++) { // console.log(items[i]); items[i] = formatRoute(items[i]); if (items[i].children) { //遞歸處理子路由的component items[i].children = makeRoute(items[i].children); } } return items; } //格式化路由,使component掛載到路由上,生成addRoutes可用的格式 const formatRoute = (item) => { let route = item; route.component = eval(route.component); return route; } export default routes;
main.js(登錄成功時(shí),后臺(tái)返回有權(quán)限的路由并存在狀態(tài)管理器vuex中)
import Vue from 'vue' import App from './App' import VueRouter from 'vue-router' import axios from 'axios' import store from './store' import routes from './router/index' import { makeRoute } from './router' Vue.use(VueRouter) const router = new VueRouter({ routes }) router.beforeEach((to, from, next) => { //如果目標(biāo)路由為登陸時(shí),恢復(fù)用戶原始狀態(tài) if (to.path === '/login') { window.clearInterval(window.interval); store.commit('logOut'); } let allRoutes = store.getters.allRoutes; let loginStatus = store.getters.loginStatus; //登錄成功時(shí)加載路由及模塊 if (from.path === '/login' && allRoutes !== '' && loginStatus) { let routesObj = makeRoute(store.getters.allRoutes); router.addRoutes(routesObj); } //沒(méi)有登錄時(shí)自動(dòng)跳轉(zhuǎn),開(kāi)發(fā)環(huán)境免登陸時(shí)注釋 if ( to.path !== '/login' && (allRoutes === '' || !loginStatus)) { if(sessionStorage.getItem('userInfo') === null){ next({ path: '/login' }) } else { //刷新當(dāng)前頁(yè)面 //重置store參數(shù) let userInfo = JSON.parse(sessionStorage.getItem('userInfo')); store.commit('setUser', userInfo); if(userInfo.routes){ //重新加載路由及模塊 let routesObj = makeRoute(userInfo.routes); router.addRoutes(routesObj); } next({path: to.path, query: to.query}); } }else{ //路由的next必須存在,否則無(wú)法進(jìn)入下一頁(yè) next(); } })
備注:此方案最大的好處是不用再使用require引入每一個(gè)組件并掛載到路由
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- vue3實(shí)現(xiàn)動(dòng)態(tài)路由及菜單
- vue3實(shí)現(xiàn)動(dòng)態(tài)側(cè)邊菜單欄的幾種方式簡(jiǎn)單總結(jié)
- Vue如何根據(jù)角色獲取菜單動(dòng)態(tài)添加路由
- vue3+element-plus動(dòng)態(tài)路由菜單示例代碼
- Vue3+Element?Plus實(shí)現(xiàn)動(dòng)態(tài)標(biāo)簽頁(yè)以及右鍵菜單功能
- 詳解Vue3如何加載動(dòng)態(tài)菜單
- vue實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)動(dòng)態(tài)菜單
- vue如何從后臺(tái)獲取數(shù)據(jù)生成動(dòng)態(tài)菜單列表
- Vue中實(shí)現(xiàn)動(dòng)態(tài)右鍵菜單的示例代碼
相關(guān)文章
vue打包后出現(xiàn)空白頁(yè)的原因及解決方式詳解
在項(xiàng)目中很多時(shí)候需要用到vue打包成html不需要放在服務(wù)器上就能瀏覽,根據(jù)官網(wǎng)打包出來(lái)的html直接打開(kāi)是顯示空白,下面這篇文章主要給大家介紹了關(guān)于vue打包后出現(xiàn)空白頁(yè)的原因及解決方式的相關(guān)資料,需要的朋友可以參考下2022-07-07vue2.0項(xiàng)目實(shí)現(xiàn)路由跳轉(zhuǎn)的方法詳解
這篇文章主要介紹了vue2.0項(xiàng)目實(shí)現(xiàn)路由跳轉(zhuǎn)的詳細(xì)方法,非常不錯(cuò),具有一定的參考借鑒借鑒價(jià)值,需要的朋友可以參考下2018-06-06Vue3項(xiàng)目中配置TypeScript和JavaScript的兼容
在Vue3開(kāi)發(fā)中,常見(jiàn)的使用JavaScript(JS)編寫代碼,但也會(huì)有調(diào)整編寫語(yǔ)言使用TypeScript(TS)的需求,因此,在Vue3項(xiàng)目設(shè)置中兼容TS和JS是刻不容緩的重要任務(wù),2023-08-08vue實(shí)現(xiàn)移動(dòng)端touch拖拽排序
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)移動(dòng)端touch拖拽排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07vue中如何通過(guò)iframe方式加載本地的vue頁(yè)面
這篇文章主要介紹了vue中如何通過(guò)iframe方式加載本地的vue頁(yè)面,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09Vue3+Element+Ts實(shí)現(xiàn)表單的基礎(chǔ)搜索重置等功能
本文主要介紹了Vue3+Element+Ts實(shí)現(xiàn)表單的基礎(chǔ)搜索重置等功能,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12VUE登錄注冊(cè)頁(yè)面完整代碼(直接復(fù)制)
這篇文章主要給大家介紹了關(guān)于VUE登錄注冊(cè)頁(yè)面的相關(guān)資料,在Vue中可以使用組件來(lái)構(gòu)建登錄注冊(cè)頁(yè)面,文中通過(guò)圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12vue+element-ui實(shí)現(xiàn)主題切換功能
這篇文章主要介紹了vue+element-ui實(shí)現(xiàn)主題切換功能,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06