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
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
|