| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- import Vue from 'vue'
- import Router from 'vue-router'
- import Cookies from "js-cookie"
- import Login from '@/views/Login'
- import NotFound from '@/views/Error/404'
- import Home from '@/views/Home'
- import Intro from '@/views/Intro/Intro'
- import Calculate from '@/views/Task/Calculate'
- import Modified from '@/views/Task/Modified'
- import Close from '@/views/Task/Close'
- import Generator from '@/views/Generator/Generator'
- import api from '@/http/api'
- import store from '@/store'
- import { getIFramePath, getIFrameUrl } from '@/utils/iframe'
- import { getToken } from '@/utils/auth'
- import axios from 'axios'
- import { findNavTree } from '@/api/user'
- Vue.use(Router)
- const router = new Router({
- routes: [
- {
- path: '/',
- name: '首页',
- component: Home,
- children: [
- {
- path: '',
- name: '系统介绍',
- component: Intro,
- meta: {
- icon: 'fa fa-home fa-lg',
- index: 0
- }
- },
- {
- path: '/task/calculate',
- name: '出单系统',
- component: Calculate,
- meta: {
- icon: 'fa fa-home fa-lg',
- index: 1
- }
- },
- {
- path: '/task/modified',
- name: '出单系统',
- component: Modified,
- meta: {
- icon: 'fa fa-home fa-lg',
- index: 2
- }
- },
- {
- path: '/task/close',
- name: '已关闭',
- component: Close,
- meta: {
- icon: 'fa fa-home fa-lg',
- index: 3
- }
- }
- ]
- },
- {
- path: '/login',
- name: '登录',
- component: Login
- },
- {
- path: '/404',
- name: 'notFound',
- component: NotFound
- },
- ]
- })
- router.beforeEach((to, from, next) => {
- // 登录界面登录成功之后,会把用户信息保存在会话
- // 存在时间为会话生命周期,页面关闭即失效。
- let token =getToken()
- //let userName = sessionStorage.getItem('user')
- let userName = Cookies.get('user')
- if (to.path === '/login') {
- // 如果是访问登录界面,如果用户会话信息存在,代表已登录过,跳转到主页
- if (token) {
- next({ path: '/' })
- } else {
- next()
- }
- } else {
- if (!token) {
- // 如果访问非登录界面,且户会话信息不存在,代表未登录,则跳转到登录界面
- next({ path: '/login' })
- } else {
- // 加载动态菜单和路由
- addDynamicMenuAndRoutes(userName, to, from)
- next()
- }
- }
- })
- /**
- * 加载动态菜单和路由
- */
- function addDynamicMenuAndRoutes(userName, to, from) {
- // 处理IFrame嵌套页面
- handleIFrameUrl(to.path)
- if (store.state.app.menuRouteLoaded) {
- return
- }
- api.menu.findNavTree({ 'userName': userName }).then(res => {
- // 添加动态路由
- let dynamicRoutes = addDynamicRoutes(res.data)
- // 处理静态组件绑定路由
- handleStaticComponent(router, 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)
- })
- })
- }
- /**
- * 处理路由到本地直接指定页面组件的情况
- * 比如'代码生成'是要求直接绑定到'Generator'页面组件
- */
- function handleStaticComponent(router, dynamicRoutes) {
- for (let j = 0; j < dynamicRoutes.length; j++) {
- if (dynamicRoutes[j].name == '代码生成') {
- dynamicRoutes[j].component = Generator
- break
- }
- }
- router.options.routes[0].children = router.options.routes[0].children.concat(dynamicRoutes)
- }
- /**
- * 处理IFrame嵌套页面
- */
- function handleIFrameUrl(path) {
- // 嵌套页面,保存iframeUrl到store,供IFrame组件读取展示
- let url = path
- let length = store.state.iframe.iframeUrls.length
- for (let i = 0; i < length; i++) {
- let iframe = store.state.iframe.iframeUrls[i]
- if (path != null && path.endsWith(iframe.path)) {
- url = iframe.url
- store.commit('setIFrameUrl', url)
- break
- }
- }
- }
- /**
- * 添加动态(菜单)路由
- * @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
- }
- }
- let path = getIFramePath(menuList[i].url)
- if (path) {
- // 如果是嵌套页面, 通过iframe展示
- route['path'] = path
- route['component'] = resolve => require([`@/views/IFrame/IFrame`], resolve)
- // 存储嵌套页面路由路径和访问URL
- let url = getIFrameUrl(menuList[i].url)
- let iFrameUrl = { 'path': path, 'url': url }
- store.commit('addIFrameUrl', iFrameUrl)
- } else {
- 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 {
- }
- return routes
- }
- export default router
|