最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue后臺(tái)管理如何配置動(dòng)態(tài)路由菜單

 更新時(shí)間:2022年04月02日 15:55:21   作者:小栗子的普  
這篇文章主要介紹了vue后臺(tái)管理如何配置動(dòng)態(tài)路由菜單,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

后臺(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è)登錄的頁面,簡單點(diǎn)的,用戶名和密碼還有一個(gè)登錄按鈕就可以了,我用的是vue-element-admin的模板,它已經(jīng)寫好了,直接拿來用就可以

2、自己在src-api文件夾中新建一個(gè)js文件來寫自己的登錄、獲取用戶信息、登出等接口(也可以換掉之前的模擬接口,在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ù)自己的需求來,因?yàn)槲液笃谛枰脩鬷d,所以也把用戶id存進(jìn)了store里)

6、這時(shí)調(diào)用同頁面的getInfo方法,當(dāng)然,這個(gè)方法里也同樣調(diào)用了獲取用戶信息的接口,這步是為了獲取到登錄的用戶的角色,調(diào)用之后,將返回的用戶角色名等存到store里(我還存了其它的數(shù)據(jù),還是那句話,哪些數(shù)據(jù)需要就存哪些)

*** 這里當(dāng)時(shí)我出了一個(gè)bug:當(dāng)我登錄進(jìn)去之后刷新頁面又跳到了登錄的頁面,說明有關(guān)鍵的數(shù)據(jù)沒有存儲(chǔ)上,上網(wǎng)一找,token在登錄調(diào)用登錄接口后已經(jīng)用cookie存入了瀏覽器,那應(yīng)該就是我只把id存進(jìn)了store而沒有存入瀏覽器,才導(dǎo)致一刷新就失去了id,所以我用localStorage/sessionStorage存入了id,在getInfo里才獲取本地存儲(chǔ)的id在存儲(chǔ)到store中

 7、由于普通管理員的路由菜單是后臺(tái)返給我的,所以,在getInfo這個(gè)方法中,我也直接調(diào)用了獲取路由菜單的接口,將返回的數(shù)據(jù)通過拼接來生成一個(gè)完整的路由菜單,最后將這個(gè)路由菜單數(shù)組保存在store中

注:路由菜單最后一定要放404,格式 :{ path: '*', redirect: '/404', hidden: true } ,切記一定要放在最后?。?!

8、接下來是去src/permission.js中調(diào)用store-modules-user.js里的getInfo方法,這塊與模板的代碼沒有區(qū)別,所以就不多敘述。在此方法中調(diào)用了store-modules-permission.js里的generateRoutes的方法

 我們?nèi)フ乙幌逻@個(gè)方法,這個(gè)方法其實(shí)是根據(jù)傳過來的role來判斷它能看到的路由菜單。模板里原來的方法是根據(jù)角色和寫好的路由菜單一一比較,最后把對應(yīng)上權(quán)限的項(xiàng)放進(jìn)一個(gè)數(shù)組里,我這里的超級(jí)管理員和普通管理員因?yàn)闄?quán)限和路由菜單固定,所以直接套用的代碼。而普通管理員,則是調(diào)用保存在store里的路由菜單數(shù)組,然后賦值給定義好的變量

之后需要更改的地方就沒有了,就可以測試登錄了。

這里我犯了一個(gè)比較大的bug:

當(dāng)以普通管理員登錄的時(shí)候,我進(jìn)去之后菜單顯示正常,可是當(dāng)我不管點(diǎn)擊哪個(gè)菜單,都給我跳到了404 。經(jīng)過一番測試與排查,我找到了解決方法,是加一個(gè)延時(shí)器,加在generateRoutes方法的這個(gè)地方

之后就運(yùn)行成功了,但是具體原因我其實(shí)不太明白,因?yàn)槲襝onsole.log(accessedRoutes) 出來的也是正常的路由菜單

這就是大體的配置動(dòng)態(tài)路由菜單的過程,作為第一次配置成功的心得。

根據(jù)權(quán)限生成動(dòng)態(tài)路由及導(dǎo)航菜單

最近在做一個(gè)后臺(tái)管理項(xiàng)目,涉及到一些菜單權(quán)限控制,具體實(shí)現(xiàn)如下:(話不多說,直接上代碼)

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: '主頁'
    }]
  }]
//從服務(wù)器獲取路由,進(jìn)行拼接,所有模塊不再以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(登錄成功時(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);
    }
    //沒有登錄時(shí)自動(dòng)跳轉(zhuǎn),開發(fā)環(huán)境免登陸時(shí)注釋
    if ( to.path !== '/login' && (allRoutes === '' || !loginStatus)) {
      if(sessionStorage.getItem('userInfo') === null){  
        next({ path: '/login' })
      } else {  
        //刷新當(dāng)前頁面
        //重置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必須存在,否則無法進(jìn)入下一頁
      next();
    }
  })

備注:此方案最大的好處是不用再使用require引入每一個(gè)組件并掛載到路由

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vant?Weapp組件picker選擇器初始默認(rèn)選中問題

    Vant?Weapp組件picker選擇器初始默認(rèn)選中問題

    這篇文章主要介紹了Vant?Weapp組件picker選擇器初始默認(rèn)選中問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Vue+java實(shí)現(xiàn)時(shí)間段的搜索示例

    Vue+java實(shí)現(xiàn)時(shí)間段的搜索示例

    本文主要介紹了Vue+java實(shí)現(xiàn)時(shí)間段的搜索示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • vue3?process.env.XXX環(huán)境變量不生效的解決方法

    vue3?process.env.XXX環(huán)境變量不生效的解決方法

    這篇文章主要給大家介紹了關(guān)于vue3?process.env.XXX環(huán)境變量不生效的解決方法,通過文中介紹的方法可以很方便的解決遇到的問題,對大家學(xué)習(xí)或者使用vue3具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • vue學(xué)習(xí)筆記之過濾器的基本使用方法實(shí)例分析

    vue學(xué)習(xí)筆記之過濾器的基本使用方法實(shí)例分析

    這篇文章主要介紹了vue學(xué)習(xí)筆記之過濾器的基本使用方法,結(jié)合實(shí)例形式分析了vue.js過濾器的基本功能、用法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • Vue項(xiàng)目獲取url中的參數(shù)(親測可用)

    Vue項(xiàng)目獲取url中的參數(shù)(親測可用)

    這篇文章主要介紹了Vue項(xiàng)目獲取url中的參數(shù),本文通過兩種情況分析給大家詳細(xì)介紹,感興趣的朋友一起看看吧
    2022-08-08
  • 詳解Nuxt.js Vue服務(wù)端渲染摸索

    詳解Nuxt.js Vue服務(wù)端渲染摸索

    本篇文章主要介紹了詳解Nuxt.js Vue服務(wù)端渲染摸索,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • Vue中keep-alive組件作用詳解

    Vue中keep-alive組件作用詳解

    這篇文章主要為大家詳細(xì)介紹了Vue中keep-alive組件的作用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • vue中element 上傳功能的實(shí)現(xiàn)思路

    vue中element 上傳功能的實(shí)現(xiàn)思路

    這篇文章主要介紹了vue中element 的上傳功能的實(shí)現(xiàn)思路,本文大概通過兩種實(shí)現(xiàn)思路,具體內(nèi)容詳情大家跟隨腳本之家小編一起看看吧
    2018-07-07
  • Vue實(shí)例初始化為渲染函數(shù)設(shè)置檢查源碼剖析

    Vue實(shí)例初始化為渲染函數(shù)設(shè)置檢查源碼剖析

    這篇文章主要為大家介紹了Vue實(shí)例初始化為渲染函數(shù)設(shè)置檢查源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • MVVM模型在Vue中的使用詳解

    MVVM模型在Vue中的使用詳解

    MVVM模型主要是為了分離視圖(View)和模型(Model),其優(yōu)點(diǎn)為:低耦合、可重用性、獨(dú)立開發(fā)以及可測試,視圖和模型分離的特點(diǎn)給了 Vue 很大的啟發(fā),這篇文章主要介紹了MVVM模型在Vue中的使用,需要的朋友可以參考下
    2022-11-11

最新評論

武平县| 长岭县| 偏关县| 泸西县| 娄烦县| 大埔区| 云南省| 吴堡县| 益阳市| 潍坊市| 宜君县| 安顺市| 奇台县| 北安市| 博湖县| 雷波县| 闸北区| 临泉县| 龙井市| 成安县| 离岛区| 墨江| 富蕴县| 托里县| 岑溪市| 崇仁县| 新绛县| 白河县| 汤阴县| 彰化市| 大足县| 铁岭县| 灵石县| 绍兴市| 舟曲县| 淮北市| 拜泉县| 石城县| 蛟河市| 那坡县| 交城县|