vue后臺管理如何配置動態(tài)路由菜單
后臺管理配置動態(tài)路由菜單
前段時間做一個后臺管理項目,因為超級管理員可以給普通管理員動態(tài)更改權限,所以vue-element-admin里的寫死的權限路由菜單就不太適合我,自己研究了好半天,經歷了各種死循環(huán),終于差不多弄出了一個,可能會有點啰嗦
總結一下:
我這個后臺分為三個角色:超級管理員、企業(yè)管理員和普通管理員。其中,超級管理員可以查看所有的路由菜單,企業(yè)管理員也是固定的幾個菜單,所以,超級管理員和企業(yè)管理員是我在前端寫好的路由菜單里直接配置的權限,而普通管理員是不固定的,需要后臺給我返回數據,自己拼接。
1、首先我們需要有一個登錄的頁面,簡單點的,用戶名和密碼還有一個登錄按鈕就可以了,我用的是vue-element-admin的模板,它已經寫好了,直接拿來用就可以

2、自己在src-api文件夾中新建一個js文件來寫自己的登錄、獲取用戶信息、登出等接口(也可以換掉之前的模擬接口,在api/user.js文件)。
3、點擊登錄按鈕,這時會在這個方法里面調用store-modules-user.js里的login方法,如下:

4、store-modules-user.js里的login方法就是調用了自己的登錄接口,當然,調用之前記得先引入文件

上面是我引入的登錄、獲取用戶信息、登出的接口
5、調用登錄接口后store存儲返回的token等數據(根據自己的需求來,因為我后期需要用戶id,所以也把用戶id存進了store里)
6、這時調用同頁面的getInfo方法,當然,這個方法里也同樣調用了獲取用戶信息的接口,這步是為了獲取到登錄的用戶的角色,調用之后,將返回的用戶角色名等存到store里(我還存了其它的數據,還是那句話,哪些數據需要就存哪些)
*** 這里當時我出了一個bug:當我登錄進去之后刷新頁面又跳到了登錄的頁面,說明有關鍵的數據沒有存儲上,上網一找,token在登錄調用登錄接口后已經用cookie存入了瀏覽器,那應該就是我只把id存進了store而沒有存入瀏覽器,才導致一刷新就失去了id,所以我用localStorage/sessionStorage存入了id,在getInfo里才獲取本地存儲的id在存儲到store中
![]()

7、由于普通管理員的路由菜單是后臺返給我的,所以,在getInfo這個方法中,我也直接調用了獲取路由菜單的接口,將返回的數據通過拼接來生成一個完整的路由菜單,最后將這個路由菜單數組保存在store中
注:路由菜單最后一定要放404,格式 :{ path: '*', redirect: '/404', hidden: true } ,切記一定要放在最后?。?!
8、接下來是去src/permission.js中調用store-modules-user.js里的getInfo方法,這塊與模板的代碼沒有區(qū)別,所以就不多敘述。在此方法中調用了store-modules-permission.js里的generateRoutes的方法

我們去找一下這個方法,這個方法其實是根據傳過來的role來判斷它能看到的路由菜單。模板里原來的方法是根據角色和寫好的路由菜單一一比較,最后把對應上權限的項放進一個數組里,我這里的超級管理員和普通管理員因為權限和路由菜單固定,所以直接套用的代碼。而普通管理員,則是調用保存在store里的路由菜單數組,然后賦值給定義好的變量


之后需要更改的地方就沒有了,就可以測試登錄了。
這里我犯了一個比較大的bug:
當以普通管理員登錄的時候,我進去之后菜單顯示正常,可是當我不管點擊哪個菜單,都給我跳到了404 。經過一番測試與排查,我找到了解決方法,是加一個延時器,加在generateRoutes方法的這個地方

之后就運行成功了,但是具體原因我其實不太明白,因為我console.log(accessedRoutes) 出來的也是正常的路由菜單
這就是大體的配置動態(tài)路由菜單的過程,作為第一次配置成功的心得。
根據權限生成動態(tài)路由及導航菜單
最近在做一個后臺管理項目,涉及到一些菜單權限控制,具體實現如下:(話不多說,直接上代碼)
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: '首頁',
redirect: '/AAA',
hidden: true,
mate: {
icon: 'fa fa-home',
index: 'AAA'
},
children: [{
path: '/AAA',
component: AAA,
name: '主頁'
}]
}]
//從服務器獲取路由,進行拼接,所有模塊不再以import的形式引入,只能通過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(登錄成功時,后臺返回有權限的路由并存在狀態(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) => {
//如果目標路由為登陸時,恢復用戶原始狀態(tài)
if (to.path === '/login') {
window.clearInterval(window.interval);
store.commit('logOut');
}
let allRoutes = store.getters.allRoutes;
let loginStatus = store.getters.loginStatus;
//登錄成功時加載路由及模塊
if (from.path === '/login' && allRoutes !== '' && loginStatus) {
let routesObj = makeRoute(store.getters.allRoutes);
router.addRoutes(routesObj);
}
//沒有登錄時自動跳轉,開發(fā)環(huán)境免登陸時注釋
if ( to.path !== '/login' && (allRoutes === '' || !loginStatus)) {
if(sessionStorage.getItem('userInfo') === null){
next({ path: '/login' })
} else {
//刷新當前頁面
//重置store參數
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必須存在,否則無法進入下一頁
next();
}
})備注:此方案最大的好處是不用再使用require引入每一個組件并掛載到路由
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
vue3?process.env.XXX環(huán)境變量不生效的解決方法
這篇文章主要給大家介紹了關于vue3?process.env.XXX環(huán)境變量不生效的解決方法,通過文中介紹的方法可以很方便的解決遇到的問題,對大家學習或者使用vue3具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08

