Blame view
src/router/index.js
3.54 KB
e7ab2c09a
![]() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
import Vue from 'vue' import Router from 'vue-router' import Login from '@/views/Login' import Home from '@/views/Home' import NotFound from '@/views/404' import api from '@/http/api' import store from '@/store' Vue.use(Router) const router = new Router({ routes: [ { path: '/', name: '首页', component: Home, children: [] }, { path: '/login', name: '登录', component: Login }, { path: '/404', name: 'notFound', component: NotFound } ] }) router.beforeEach((to, from, next) => { // 登录界面登录成功之后,会把用户信息保存在会话 // 存在时间为会话生命周期,页面关闭即失效。 let userName = sessionStorage.getItem('user') if (to.path === '/login') { // 如果是访问登录界面,如果用户会话信息存在,代表已登录过,跳转到主页 if(userName) { next({ path: '/' }) } else { next() } } else { if (!userName) { // 如果访问非登录界面,且户会话信息不存在,代表未登录,则跳转到登录界面 next({ path: '/login' }) } else { // 加载动态菜单和路由 addDynamicMenuAndRoutes(userName, to, from) next() } } }) /** * 加载动态菜单和路由 */ function addDynamicMenuAndRoutes(userName, to, from) { if(store.state.app.menuRouteLoaded) { console.log('动态菜单和路由已经存在.') return } api.menu.findNavTree({'userName':userName}) .then(res => { // 添加动态路由 let dynamicRoutes = addDynamicRoutes(res.data) router.options.routes[0].children = router.options.routes[0].children.concat(dynamicRoutes) router.addRoutes(router.options.routes) // 保存加载状态 store.commit('menuRouteLoaded', true) // 保存菜单树 store.commit('setNavTree', res.data) }).then(res => { api.user.findPermissions({'name':userName}).then(res => { // 保存用户权限标识集合 store.commit('setPerms', res.data) }) }) .catch(function(res) { }) } /** * 添加动态(菜单)路由 * @param {*} menuList 菜单列表 * @param {*} routes 递归创建的动态(菜单)路由 */ function addDynamicRoutes (menuList = [], routes = []) { var temp = [] for (var i = 0; i < menuList.length; i++) { if (menuList[i].children && menuList[i].children.length >= 1) { temp = temp.concat(menuList[i].children) } else if (menuList[i].url && /\S/.test(menuList[i].url)) { menuList[i].url = menuList[i].url.replace(/^\//, '') // 创建路由配置 var route = { path: menuList[i].url, component: null, name: menuList[i].name, meta: { icon: menuList[i].icon, index: menuList[i].id } } try { // 根据菜单URL动态加载vue组件,这里要求vue组件须按照url路径存储 // 如url="sys/user",则组件路径应是"@/views/sys/user.vue",否则组件加载不到 let array = menuList[i].url.split('/') let url = '' for(let i=0; i<array.length; i++) { url += array[i].substring(0,1).toUpperCase() + array[i].substring(1) + '/' } url = url.substring(0, url.length - 1) route['component'] = resolve => require([`@/views/${url}`], resolve) } catch (e) {} routes.push(route) } } if (temp.length >= 1) { addDynamicRoutes(temp, routes) } else { console.log('动态路由加载...') console.log(routes) console.log('动态路由加载完成.') } return routes } export default router |