vue権限メニュー
3901 ワード
ルーティングとメニューがバックグラウンドで返されると、メニューとルーティングのフォーマットは実際の状況とバックグラウンドで相談して返されます.
全体の流れは以下の1、router.jsには権限を必要としないルーティングのみが格納される.2、login.vueでは、要求されたルーティングおよびメニューデータがローカルおよびvuexに存在します.3、vuexでルーティングデータを処理し、addRouteで追加する
router.jsには権限を必要としないルーティングのみがマウントされます
loginコンポーネントで要求を送信し、取得したデータをlocalStorageとvuexにそれぞれ格納する.
vuexでstore/modules/addRouterを作成します.js,addRouteでルーティングを追加する
components.js定義ルーティング
Menufilter.jsバックエンドで返されるcomponentフィールドを置き換える
ダイナミックルーティングが追加されました.ページをリフレッシュすると無効になります.mainが必要です.jsに格納されている再割り当て.
大功を成し遂げる.リファレンスhttps://github.com/liuyangjike/dynamic-router
全体の流れは以下の1、router.jsには権限を必要としないルーティングのみが格納される.2、login.vueでは、要求されたルーティングおよびメニューデータがローカルおよびvuexに存在します.3、vuexでルーティングデータを処理し、addRouteで追加する
/* */
path: [{
component: 'Home', /* , , */
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コンポーネントで要求を送信し、取得したデータをlocalStorageとvuexにそれぞれ格納する.
/*login.vue*/
import { mapActions } from 'vuex'
methods: {
...mapActions(['add_Routes']),
login({
name: 'admin',
password: '******'
}).then(res => {
if(res.code == 200) {
/* */
localStorage.setItem('token', res.data.token);
localStorage.setItem('menu', JSON.stringify(res.data.menu));
localStorage.setItem('routes', JSON.stringify(res.data.routes));
/* vuex, */
this.add_Routes(res.data.path);
}
})
}
vuexで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);
});
}
};
ダイナミックルーティングが追加されました.ページをリフレッシュすると無効になります.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