108 lines
3.7 KiB
JavaScript
108 lines
3.7 KiB
JavaScript
import router from './router'
|
||
import store from './store'
|
||
import { Message } from 'element-ui'
|
||
import NProgress from 'nprogress'
|
||
import 'nprogress/nprogress.css'
|
||
import { getAccessToken } from '@/utils/auth'
|
||
import { isRelogin } from '@/utils/request'
|
||
|
||
NProgress.configure({ showSpinner: false })
|
||
|
||
/**
|
||
* 从菜单树中查找 jumpFlag===1 的默认跳转路径
|
||
* 若打标在父节点则取其下第一个可见叶子路径;若在叶子则直接返回该路径
|
||
*/
|
||
function findDefaultPathFromMenus(menus) {
|
||
if (!Array.isArray(menus) || menus.length === 0) return null
|
||
|
||
function dfs(list, parentPath = '') {
|
||
for (const item of list) {
|
||
if (item.visible === false) continue
|
||
const rawPath = item.path || ''
|
||
const currentPath = rawPath.startsWith('/')
|
||
? rawPath
|
||
: `${parentPath}/${rawPath}`.replace(/\/+/g, '/')
|
||
|
||
if (item.jumpFlag === 1) {
|
||
if (item.children && item.children.length > 0) {
|
||
const childPath = dfs(item.children, currentPath)
|
||
return childPath != null ? childPath : currentPath
|
||
}
|
||
return currentPath
|
||
}
|
||
if (item.children && item.children.length > 0) {
|
||
const found = dfs(item.children, currentPath)
|
||
if (found != null) return found
|
||
}
|
||
}
|
||
return null
|
||
}
|
||
return dfs(menus)
|
||
}
|
||
|
||
// 增加三方登陆 update by 芋艿
|
||
const whiteList = ['/login', '/social-login', '/auth-redirect', '/bind', '/register', '/oauthLogin/gitee']
|
||
|
||
router.beforeEach((to, from, next) => {
|
||
NProgress.start()
|
||
if (getAccessToken()) {
|
||
to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
|
||
/* has token*/
|
||
if (to.path === '/login') {
|
||
next({ path: store.getters.defaultPath || '/' })
|
||
NProgress.done()
|
||
} else {
|
||
if (store.getters.roles.length === 0) {
|
||
isRelogin.show = true
|
||
// 获取字典数据 add by 芋艿
|
||
store.dispatch('dict/loadDictDatas')
|
||
// 获取部门权限
|
||
store.dispatch('GetLevel')
|
||
// 判断当前用户是否已拉取完 user_info 信息
|
||
store.dispatch('GetInfo').then(userInfo => {
|
||
isRelogin.show = false
|
||
// 触发 GenerateRoutes 事件时,将 menus 菜单树传递进去
|
||
store.dispatch('GenerateRoutes', userInfo.menus).then(accessRoutes => {
|
||
// 根据 roles 权限生成可访问的路由表
|
||
router.addRoutes(accessRoutes) // 动态添加可访问路由表
|
||
const defaultPath = findDefaultPathFromMenus(userInfo.menus) || '/'
|
||
store.dispatch('SetDefaultPath', defaultPath)
|
||
// 仅当目标为根路径 '/' 时跳默认页;否则保持当前路径(含刷新场景),避免刷新被误判为“未匹配”而跳到默认页
|
||
if (to.path === '/') {
|
||
next({ path: defaultPath, replace: true })
|
||
} else {
|
||
next({ ...to, replace: true }) // hack方法 确保addRoutes已完成,当前页刷新时保留 to 的路径
|
||
}
|
||
})
|
||
}).catch(err => {
|
||
store.dispatch('LogOut').then(() => {
|
||
Message.error(err)
|
||
next({ path: '/' })
|
||
})
|
||
})
|
||
} else {
|
||
if (to.path === '/') {
|
||
const defaultPath = store.getters.defaultPath || '/'
|
||
next({ path: defaultPath, replace: true })
|
||
} else {
|
||
next()
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
// 没有token
|
||
if (whiteList.indexOf(to.path) !== -1) {
|
||
// 在免登录白名单,直接进入
|
||
next()
|
||
} else {
|
||
const redirect = encodeURIComponent(to.fullPath) // 编码 URI,保证参数跳转回去后,可以继续带上
|
||
next(`/login?redirect=${redirect}`) // 否则全部重定向到登录页
|
||
NProgress.done()
|
||
}
|
||
}
|
||
})
|
||
|
||
router.afterEach(() => {
|
||
NProgress.done()
|
||
})
|