/* * * ┏┓   ┏┓ * ┏┛┻━━━┛┻┓ * ┃       ┃ * ┃   ━   ┃ * ┃ >   < ┃ * ┃       ┃ * ┃... ⌒ ... ┃ * ┃       ┃ * ┗━┓   ┏━┛ * ┃   ┃ * ┃   ┃ * ┃   ┃ * ┃   ┃ 神兽保佑 * ┃   ┃ 代码无bug * ┃   ┃ * ┃   ┗━━━┓ * ┃       ┣┓ * ┃       ┏┛ * ┗┓┓┏━┳┓┏┛ * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛ * * @Descripttion: * @version: * @Date: 2021-04-20 11:06:21 * @LastEditors: huzhushan@126.com * @LastEditTime: 2022-09-27 16:35:06 * @Author: huzhushan@126.com * @HomePage: https://huzhushan.gitee.io/vue3-element-admin * @Github: https://github.com/huzhushan/vue3-element-admin * @Donate: https://huzhushan.gitee.io/vue3-element-admin/donate/ */ import { ElLoading } from 'element-plus' import router from '@/router' import { TOKEN } from './pinia/modules/app' import { nextTick } from 'vue' import { useApp } from './pinia/modules/app' import { useAccount } from './pinia/modules/account' import { useMenus } from './pinia/modules/menu' const getPageTitle = title => { const { title: appTitle } = useApp() return title ? `${title} - ${appTitle}` : appTitle } // 白名单 const WhiteList = ['login', 'lock'] let loadingInstance = null router.beforeEach(async to => { // 1. 白名单直接放行 if (WhiteList.includes(to.name)) return true // 2. 未登录强制跳转登录页 if (!window.localStorage[TOKEN]) { return { name: 'login', query: { redirect: to.fullPath }, replace: true, } } const { userinfo, getUserinfo } = useAccount() // 3. 首次加载:获取用户信息 if (!userinfo) { try { await getUserinfo() } catch { loadingInstance?.close() return false } // 获取完用户信息后,如果当前不是 /chat_view,强制跳转 // 这里的 to 可能是登录页(带 redirect)或其他页面 if (to.path !== '/chat_view') { return '/chat_view' } return true // 已在目标页,直接放行 } // 4. 生成动态菜单(如有) const { menus, generateMenus } = useMenus() if (menus.length <= 0) { try { await generateMenus() return to.fullPath // 生成后重新触发导航 } catch { loadingInstance?.close() return false } } // 5. 锁屏检查 if (to.name !== 'lock') { const { authorization } = useApp() if (authorization?.screenCode) { return { name: 'lock', query: { redirect: to.path }, replace: true, } } } // 6. 已登录且非首次,允许自由访问 return true }) router.afterEach(to => { loadingInstance?.close() if (router.currentRoute.value.name === to.name) { nextTick(() => { document.title = getPageTitle(to.meta?.truetitle) }) } })