| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 | 
							- import router, { resetRouter } from './router'
 
- import Layout from '@/layout'
 
- import { checkToken, refreshToken } from '@/api/system'
 
- import {
 
-   getToken,
 
-   setToken
 
- } from './utils/auth'
 
- import progress from '@/utils/progress'
 
- import store from './store'
 
- import Vue from 'vue'
 
- // 刷新token状态
 
- let isRefreshToken = true
 
- // 路由拦截
 
- router.beforeEach(async (to, from, next) => {
 
-   // debugger
 
-   // 无需登录无需获取动态路由
 
-   if (to?.meta?.noLogin) {
 
-     next()
 
-     return
 
-   }
 
-   // 前往登陆页面判断
 
-   if (to.path === '/login-local') {
 
-     if (!getToken()) {
 
-       next()
 
-       return
 
-     }
 
-     next('/')
 
-     return
 
-   }
 
-   if (to.path === '/login') {
 
-     next('/')
 
-     return
 
-   }
 
-   progress.start()
 
-   try {
 
-     if (from.path !== '/login-local') {
 
-       if (isRefreshToken) {
 
-         isRefreshToken = false
 
-         const { data } = await refreshToken()
 
-         setToken(data)
 
-       } else {
 
-         await checkToken()
 
-       }
 
-     }
 
-     // 判断是否已经存在机构信息
 
-     if (!store.getters.organizationTree.length) {
 
-       store.dispatch('system/getOrganizationTree').catch(e => {
 
-         Vue.prototype.$message.error('获取机构信息失败')
 
-       }).finally(() => {
 
-         onFilterRoutes(to, next)
 
-       })
 
-       return
 
-     }
 
-     onFilterRoutes(to, next)
 
-   } catch (error) {
 
-     Vue.prototype.$message.error(error)
 
-   }
 
- })
 
- router.afterEach((to, from) => {
 
-   progress.done()
 
-   document.title = `${Vue.prototype.$DEFAULT_TITLE} ${to.meta.title ?? ''}`
 
- })
 
- // 路由过滤和跳转
 
- async function onFilterRoutes (to, _next) {
 
-   // 无需更新路由
 
-   if (!store.getters.refresh) {
 
-     _next()
 
-     return
 
-   }
 
-   const _route = store.getters.route
 
-   // 监测是否需要更新路由
 
-   if (_route && _route.length) {
 
-     initRoutes(to, _next, _route)
 
-     return
 
-   }
 
-   try {
 
-     const res = await store.dispatch('menu/getMenu2')
 
-     if (!res || !res.length) {
 
-       // 无权限 返回登录页面
 
-       Vue.prototype.$message.error('无权限账户,请联系管理员')
 
-       store.dispatch('user/userLogout')
 
-       return
 
-     }
 
-     initRoutes(to, _next, res)
 
-   } catch (error) {
 
-     store.dispatch('user/userLogout')
 
-     Vue.prototype.$message.error(error)
 
-   }
 
- }
 
- function initRoutes (to, _next, e) {
 
-   store.commit('menu/SET_REFRESH', false) // 关闭路由刷新
 
-   // 清除路由
 
-   resetRouter()
 
-   const routes = mapASyncRoutes(e) // 路由替换
 
-   routes.forEach(item => {
 
-     router.addRoute(item)
 
-   })
 
-   router.addRoute({ path: '/', redirect: chooseFirst(routes[0]) })
 
-   router.addRoute({ path: '*', redirect: '/404', hidden: true })
 
-   _next({ ...to, replace: true })
 
- }
 
- function chooseFirst (item) {
 
-   if (item.children && item.children.length > 0 && item.component.name === 'layoutIndex') {
 
-     return chooseFirst(item.children[0])
 
-   }
 
-   return item.path
 
- }
 
- // 递归路由 转换为组件对象和路径
 
- function mapASyncRoutes (data) {
 
-   return data.map(item => {
 
-     item.meta.title = item.label
 
-     item.meta.type = item.type
 
-     item.meta.hidden = item.hidden === 0
 
-     item.component = item.component === 'Layout' ? Layout : loadView(item.component)
 
-     if (item.children && item.children.length > 0) {
 
-       item.children = mapASyncRoutes(item.children)
 
-     }
 
-     return item
 
-   })
 
- }
 
- // 路由插件
 
- function loadView (view) {
 
-   return !view ? { render: (c) => c('router-view') } : () => import(`@/views/${view}`)
 
- }
 
 
  |