vue 權限菜單

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

整體流程如下
1、在router.js中只存放不需要權限的路由。
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中只掛載不需要權限的路由

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));
    /*調用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);
// 用戶手動刷新頁面,這時路由會被重設,要重新新增
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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容