import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title'
NProgress . configure ( { showSpinner : false } ) // NProgress Configuration
const whiteList = [ '/menu' , '/login' , '/auth-redirect' , '/kban' , '/sliao' , '/pwpg' , '/pwfk' , '/llpg' , '/llfk' , '/hxpg' , '/hxfk' , '/qgpg' , '/qgfl' ] // no redirect whitelist
export function flatRoutes ( routes ) {
let ret = [ ] ;
routes . forEach ( it => {
const r = { ... it , children : [ ] } ;
it . children . forEach ( it2 => {
// 把三级移动到二级,以避免keep-alive无法缓存多级路由的状态
if ( it2 . children && it2 . children . length > 0 ) {
it2 . children . forEach ( it3 => r . children . push ( { ... it3 , children : null } ) ) ;
return ;
}
// 直接添加二级路由
r . children . push ( { ... it2 , children : null } ) ;
} ) ;
ret . push ( r ) ;
} ) ;
return ret ;
}
router . beforeEach ( async ( to , from , next ) => {
// start progress bar
NProgress . start ( )
// set page title
document . title = getPageTitle ( to . meta . title )
// determine whether the user has logged in
const hasToken = getToken ( )
if ( hasToken ) {
if ( to . path === '/login' ) {
// if is logged in, redirect to the home page
next ( { path : '/' } )
NProgress . done ( ) // hack: https://github.com/PanJiaChen/vue-element-admin/pull/2939
} else {
// determine whether the user has obtained his permission roles through getInfo
const hasRoles = store . getters . roles && store . getters . roles . length > 0
if ( hasRoles ) {
next ( )
} else {
// next()
try {
// get user info
// note: roles must be a object array! such as: ['admin'] or ,['developer','editor']
// const { roles } = await store.dispatch('user/getInfo')
const { menu } = await store . dispatch ( 'user/getInfo' )
if ( menu . length === 0 ) {
throw new Error ( '没有任何菜单信息! getInfo' )
}
// generate accessible routes map based on roles
// console.log(roles)
// const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
let accessRoutes = await store . dispatch ( 'permission/generateRoutes' , menu )
accessRoutes = flatRoutes ( accessRoutes ) ;
// dynamically add accessible routes
router . addRoutes ( accessRoutes )
// hack method to ensure that addRoutes is complete
// set the replace: true, so the navigation will not leave a history record
next ( { ... to , replace : true } )
} catch ( error ) {
// remove token and go to login page to re-login
await store . dispatch ( 'user/resetToken' )
Message . error ( error || 'Has Error' )
next ( ` /menu?redirect= ${ to . path } ` )
NProgress . done ( )
}
}
}
} else {
/* has no token*/
if ( whiteList . indexOf ( to . path ) !== - 1 ) {
// in the free login whitelist, go directly
next ( )
} else {
// other pages that do not have permission to access are redirected to the login page.
next ( ` /menu?redirect= ${ to . path } ` )
NProgress . done ( )
}
}
} )
router . afterEach ( ( ) => {
// finish progress bar
NProgress . done ( )
} )