From aeabe8ccb7c47cdbcf46b81381bd0bd43d8d72d0 Mon Sep 17 00:00:00 2001 From: piexlmax <303176530@qq.com> Date: Sun, 26 Dec 2021 22:44:29 +0800 Subject: [PATCH] fixed: #825 --- web/src/permission.js | 104 ++++++++++++++++++++-------------- web/src/view/layout/index.vue | 2 +- 2 files changed, 63 insertions(+), 43 deletions(-) diff --git a/web/src/permission.js b/web/src/permission.js index 51747d0d..152803b3 100644 --- a/web/src/permission.js +++ b/web/src/permission.js @@ -6,52 +6,72 @@ let asyncRouterFlag = 0 const whiteList = ['Login', 'Init'] const getRouter = async() => { - await store.dispatch('router/SetAsyncRouter') - await store.dispatch('user/GetUserInfo') - const asyncRouters = store.getters['router/asyncRouters'] - asyncRouters.forEach(asyncRouter => { - router.addRoute(asyncRouter) - }) + await store.dispatch('router/SetAsyncRouter') + await store.dispatch('user/GetUserInfo') + const asyncRouters = store.getters['router/asyncRouters'] + asyncRouters.forEach(asyncRouter => { + router.addRoute(asyncRouter) + }) } -router.beforeEach(async(to, from, next) => { - 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 }) - } else { - next() +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] + if (element.name === "layout") { + to.matched.splice(i, 1) + await handleKeepAlive(to) + } + // 如果没有按需加载完成则等待加载 + if (typeof element.components.default === 'function') { + await element.components.default() + await handleKeepAlive(to) + } + } } - } else { - // 不在白名单中并且已经登陆的时候 - if (token) { - // 添加flag防止多次获取动态路由和栈溢出 - if (!asyncRouterFlag) { - asyncRouterFlag++ - await getRouter() - next({ ...to, replace: true }) - } else { - if (to.matched.length) { - next() +} + +router.beforeEach(async(to, from, next) => { + to.meta.matcheds =JSON.parse(JSON.stringify(to.matched)) + 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 }) } else { - next({ path: '/layout/404' }) + next() } - } - } - // 不在白名单中并且未登陆的时候 - if (!token) { - next({ - name: 'Login', - query: { - redirect: document.location.hash + } 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 + } + }) } - }) } - } -}) +}) \ No newline at end of file diff --git a/web/src/view/layout/index.vue b/web/src/view/layout/index.vue index d24cc171..7f82aca4 100644 --- a/web/src/view/layout/index.vue +++ b/web/src/view/layout/index.vue @@ -152,7 +152,7 @@ export default { return this.$route.meta.title || '当前页面' }, matched() { - return this.$route.matched + return this.$route.meta.matcheds } }, created() { -- GitLab