vue 權(quán)限菜單

當路由和菜單都由后臺返回時,菜單和路由的格式根據(jù)實際情況和后臺商量返回。

整體流程如下
1秒裕、在router.js中只存放不需要權(quán)限的路由账蓉。
2枚碗、在login.vue中將請求到的路由和菜單數(shù)據(jù)存在本地和vuex中。
3铸本、在vuex中處理路由數(shù)據(jù)肮雨,通過addRoute添加

/* 后臺返回的路由格式 */
path: [{
  component: 'Home',  /* 因為后臺返回的數(shù)據(jù)是字符串,前端不能使用箱玷,這里定好名稱前端做匹配 */
  name: 'Home',
  path: '/home',
  children: [{
     component: 'Dome111',
     name: 'Dome111',
     path: '/dome111',
     children: null
  }, {
     component: 'Dome222',
     name: 'Dome222',
     path: '/dome222',
     children: null
  }]
}];
/* 菜單格式自定 */

router.js中只掛載不需要權(quán)限的路由

import Vue from 'vue';
import Router from 'vue-router';

Vue.use(Router);

const routes = [{
    path: '/login',
    name: 'login',
    component: require('@/components/login/login')
  }, {
      path: '*',
      name: '404',
      component: require('@/components/404/404')
  }]
export default new Router({
  routes
});

在login組件中發(fā)送請求怨规,將獲取到的數(shù)據(jù)分別存到localStorage和vuex中;

/*login.vue*/
import { mapActions } from 'vuex'
methods: {
 ...mapActions(['add_Routes']),
 login({
   name: 'admin',
   password: '******'
 }).then(res => {
  if(res.code == 200) {
    /*將獲取到的菜單數(shù)據(jù)和路由數(shù)據(jù)存起來*/
    localStorage.setItem('token', res.data.token);
    localStorage.setItem('menu', JSON.stringify(res.data.menu));
    localStorage.setItem('routes', JSON.stringify(res.data.routes));
    /*調(diào)用vuex锡足,傳入數(shù)據(jù)*/
    this.add_Routes(res.data.path);
   }
 })
}

在vuex中創(chuàng)建 store/modules/addRouter.js波丰, 用以addRoute添加路由

import router from '../../router/index.js'; /* 引入路由表 */
import Menufilter from './menufilter'; /* 用來處理后臺傳過來的component字段 */

const mutations = {
  ADD_ROUTES(state, addRouter) {
    let routes = [];
    Menufilter(routes, addRouter);
    router.addRoutes(routes);
    router.push('/home');
  }
};

const actions = {
  add_Routes({commit}, addrouter) {
    commit('ADD_ROUTES', addrouter);
  }
};

export default {
  mutations,
  actions
};

components.js 定義的路由

const home= () => import('@/components/home'), 
      dome111= () => import('@/components/dome111'), 
      dome222= () => import('@/components/dome222')
export default {
  home,
  dome111,
  dome222,
};

Menufilter.js 用以替換后端返回的component字段

// 路由配置表
import Components from '@/asses/components.js';

export default (routers, data) => {
  generaRouter(routers, data);
};

function generaRouter(routers, data){
  if(data && data.length > 0) {
    data.forEach((item) => {
      let menu = Object.assign({}, item);
      menu.component = Components[menu.component];
      if(item.children){
        menu.children = [];
        generaRouter(menu.children,item.children);
      }
      routers.push(menu);
    });
  }
};

現(xiàn)在動態(tài)路由添加好了,有一個問題是刷新頁面后會失效舶得,需要在main.js中將存儲的重新賦值掰烟。

import Vue from 'vue';
import Vuex from 'vuex';
import App from './App';
import router from './router';
import store from './store/index.js';
Vue.use(Vuex);
// 用戶手動刷新頁面,這時路由會被重設(shè)沐批,要重新新增
if (localStorage.getItem('token')) {
  let path = JSON.parse(localStorage.getItem('routes'));
  store.dispatch("add_Routes", path)
}

router.beforeEach((to, from, next) => {
  let token = localStorage.getItem('token ');
  if(!token && to.path !== '/login') {
    next({name: 'login'});
  } else {
    next();
  }
});

大功告成纫骑。參考https://github.com/liuyangjike/dynamic-router

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市珠插,隨后出現(xiàn)的幾起案子惧磺,更是在濱河造成了極大的恐慌,老刑警劉巖捻撑,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磨隘,死亡現(xiàn)場離奇詭異,居然都是意外死亡顾患,警方通過查閱死者的電腦和手機番捂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來江解,“玉大人设预,你說我怎么就攤上這事±绾樱” “怎么了鳖枕?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵魄梯,是天一觀的道長。 經(jīng)常有香客問我宾符,道長酿秸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任魏烫,我火速辦了婚禮辣苏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哄褒。我一直安慰自己稀蟋,他們只是感情好,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布呐赡。 她就那樣靜靜地躺著退客,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罚舱。 梳的紋絲不亂的頭發(fā)上井辜,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機與錄音管闷,去河邊找鬼粥脚。 笑死,一個胖子當著我的面吹牛包个,可吹牛的內(nèi)容都是我干的刷允。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼碧囊,長吁一口氣:“原來是場噩夢啊……” “哼树灶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起糯而,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤天通,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熄驼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體像寒,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年瓜贾,在試婚紗的時候發(fā)現(xiàn)自己被綠了诺祸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡祭芦,死狀恐怖筷笨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤胃夏,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布轴或,位于F島的核電站,受9級特大地震影響构订,放射性物質(zhì)發(fā)生泄漏侮叮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一悼瘾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧审胸,春花似錦亥宿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碍庵,卻和暖如春映企,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背静浴。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工堰氓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苹享。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓双絮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親得问。 傳聞我的和親對象是個殘疾皇子囤攀,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容