permission.js 1.43 KB
import router from './router'
import store from './store'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'
import getPageTitle from '@/utils/get-page-title'

NProgress.configure({ showSpinner: false })

const whiteList = ['/login', '/404']

router.beforeEach(async (to, from, next) => {
  NProgress.start()

  document.title = getPageTitle(to.meta.title)

  const hasToken = getToken()

  if (!hasToken) {
    if (whiteList.indexOf(to.path) !== -1) {
      next()
      return
    }

    next(`/login?redirect=${to.path}`)
    NProgress.done()
    return
  }

  if (to.path === '/login') {
    next({ path: '/' })
    NProgress.done()
    return
  }

  const hasGetUserInfo = store.getters.userType
  if (hasGetUserInfo) {
    next()
    return
  }

  try {
    const userInfo = await store.dispatch('user/getInfo')
    const {
      permissionKeys,
      type
    } = userInfo
    const routes = await store.dispatch('permission/generateRoutes', {
      permissions: permissionKeys,
      type
    })
    console.log(routes)
    router.addRoutes(routes)
    console.log('to', to, router.match(to))
    if (router.match(to)?.name === '404') {
      to = routes?.[0]
    }
    next({ ...to, replace: true })
  } catch (error) {
    console.error(error)
    await store.dispatch('user/resetToken')
    next(`/login?redirect=${to.path}`)
    NProgress.done()
  }
})

router.afterEach(() => {
  NProgress.done()
})