| 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}`)}
 |