permission.js 2.3 KB
Newer Older
Mr.奇淼('s avatar
Mr.奇淼( 已提交
1
import router from './router'
2
import { store } from '@/store/index'
3
import getPageTitle from '@/utils/page'
Mr.奇淼('s avatar
Mr.奇淼( 已提交
4
let asyncRouterFlag = 0
Mr.奇淼('s avatar
Mr.奇淼( 已提交
5

何秀钢 已提交
6
const whiteList = ['Login', 'Init']
7

8
const getRouter = async() => {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
9 10 11 12 13 14
    await store.dispatch('router/SetAsyncRouter')
    await store.dispatch('user/GetUserInfo')
    const asyncRouters = store.getters['router/asyncRouters']
    asyncRouters.forEach(asyncRouter => {
        router.addRoute(asyncRouter)
    })
15 16
}

Mr.奇淼('s avatar
Mr.奇淼( 已提交
17 18 19 20
async function handleKeepAlive(to) {
    if (to.matched && to.matched.length > 2) {
        for (let i = 1; i < to.matched.length; i++) {
            const element = to.matched[i - 1]
Mr.奇淼('s avatar
Mr.奇淼( 已提交
21
            if (element.name === 'layout') {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
22 23 24 25 26 27 28 29 30
                to.matched.splice(i, 1)
                await handleKeepAlive(to)
            }
            // 如果没有按需加载完成则等待加载
            if (typeof element.components.default === 'function') {
                await element.components.default()
                await handleKeepAlive(to)
            }
        }
何秀钢 已提交
31
    }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
32 33 34 35 36 37 38 39 40 41 42 43 44 45
}

router.beforeEach(async(to, from, next) => {
    handleKeepAlive(to)
    const token = store.getters['user/token']
        // 在白名单中的判断情况
    document.title = getPageTitle(to.meta.title)
    if (whiteList.indexOf(to.name) > -1) {
        if (token) {
            if (!asyncRouterFlag) {
                asyncRouterFlag++
                await getRouter()
            }
            next({ name: store.getters['user/userInfo'].authority.defaultRouter })
46
        } else {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
47
            next()
48
        }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
    } else {
        // 不在白名单中并且已经登陆的时候
        if (token) {
            // 添加flag防止多次获取动态路由和栈溢出
            if (!asyncRouterFlag) {
                asyncRouterFlag++
                await getRouter()

                next({...to, replace: true })
            } else {
                if (to.matched.length) {
                    next()
                } else {
                    next({ path: '/layout/404' })
                }
            }
        }
        // 不在白名单中并且未登陆的时候
        if (!token) {
            next({
                name: 'Login',
                query: {
                    redirect: document.location.hash
                }
            })
Mr.奇淼('s avatar
Mr.奇淼( 已提交
74 75
        }
    }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
76
})