You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.2 KiB
JavaScript

import {createRouter, createWebHashHistory} from 'vue-router'
import {setupLayouts} from 'virtual:generated-layouts'
import generatedRoutes from 'virtual:generated-pages'
import {ConfigGetAction, $response, AdminStatusAction} from "~/api"
import {reGetAdmin} from "~/tool/info"
import {$favicon} from "~/tool/favicon"
import {
useStore, useSaveTokenType, useSessionToken, useToken, useRouterActive
} from '~/store'
const no_login_list = ['login', '404'];
const $router_active = useRouterActive()
const router = createRouter({
history: createWebHashHistory(import.meta.env.BASE_URL), routes: setupLayouts(generatedRoutes)
})
const updateRouterActive = (matched) => {
matched.shift()
const last = matched[matched.length - 1]
if (no_login_list.indexOf(last.name) !== -1) return
setTimeout(() => {
$router_active.value = matched.map((item) => {
return {
title: 'title' in item.meta ? item.meta.title : item.name,
key: item.name
}
})
})
}
router.beforeEach(async (to, from, next) => {
window.$loading.start()
const $store = useStore()
if (!$store.config) {
const response = await ConfigGetAction(['Logo', 'Favicon', 'Login欢迎图片', '网站名称'])
$response(response, () => {
$store.config = response.data
})
$favicon($store.config['Favicon'])
}
document.title = ('title' in to.meta && to.meta.title !== '首页') ? `${to.meta.title} ${$store.config['网站名称']}` : $store.config['网站名称']
if (no_login_list.indexOf(to.name) === -1) {
const $save_token_type = useSaveTokenType()
let $token;
if ($save_token_type.value === 'local') {
$token = useToken()
} else {
$token = useSessionToken()
}
if ($token.value === '') {
next('/login?f=' + encodeURIComponent(to.fullPath))
setTimeout(() => {
window.$loading.finish()
})
} else {
const response = await AdminStatusAction()
$response(response, () => {
if (!$store.admin_info) reGetAdmin()
updateRouterActive(to.matched.map(item => item))
next()
}, next)
setTimeout(() => {
window.$loading.finish()
})
}
} else {
next()
setTimeout(() => {
window.$loading.finish()
})
}
})
export default router