vue2 项目架构--router(四)
src/router/index.js
分两步:一部分是静态路由,一分部是动态路由, 404一定放在最后
import Vue from 'vue'; import Router from 'vue-router'; import Layout from '@/layout'; Vue.use(Router); // 静态路由 export const constantRoutes = [ { path: '/login', component: () => import('@/views/login/index'), hidden: true }, { path: '/404', component: () => import('@/views/error-page/404'), hidden: true }, { path: '/401', component: () => import('@/views/error-page/401'), hidden: true }, { path: '/', component: Layout, redirect: '/dashboard', children: [ { path: 'dashboard', name: 'Dashboard', component: () => import('@/views/dashboard/index'), meta: { title: '仪表盘', icon: 'dashboard', affix: true } } ] } ]; // 动态路由(需要权限的路由) export const asyncRoutes = [ { path: '/system', component: Layout, redirect: '/system/user', name: 'System', meta: { title: '系统管理', icon: 'system', roles: ['admin'] }, children: [ { path: 'user', name: 'User', component: () => import('@/views/system/user/index'), meta: { title: '用户管理', roles: ['admin'] } }, { path: 'role', name: 'Role', component: () => import('@/views/system/role/index'), meta: { title: '角色管理', roles: ['admin'] } } ] }, // 404 页面必须放在最后 { path: '*', redirect: '/404', hidden: true } ]; const createRouter = () => new Router({ mode: 'history', // 需要服务端支持 scrollBehavior: () => ({ y: 0 }), routes: constantRoutes }); const router = createRouter(); // 重置路由 export function resetRouter() { const newRouter = createRouter(); router.matcher = newRouter.matcher; // 重置路由 } export default router;
// 动态路由(需要权限的路由) 是调用接口在后台获取 vuex
GenerateRoutes({ commit }) {
return new Promise(resolve => {
getRouters().then(res => {
// 动态路由整合
const accessedRoutes = filterAsyncRouter(res.data)
accessedRoutes.push({ path: '*', redirect: '/404', hidden: true }
})
.....
beforeach
store.dispatch('GenerateRoutes', { roles }).then(accessRoutes => { // 根据roles权限生成可访问的路由表 router.addRoutes(accessRoutes) // 动态添加可访问路由表 next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 })
后续项目实例出现流程就是这样
浙公网安备 33010602011771号