Files
KF-OnlineJudge/frontend/src/router/index.ts
T

112 lines
3.4 KiB
TypeScript

import { createRouter, createWebHistory } from 'vue-router'
import { useSession } from '../composables/useSession'
export const router = createRouter({
history: createWebHistory(),
scrollBehavior: (to, _from, saved) => saved ?? (to.hash ? { el: to.hash } : { top: 0 }),
routes: [
{
path: '/',
name: 'home',
meta: { title: '首页' },
component: () => import('../views/HomeView.vue'),
},
{
path: '/problems',
meta: { title: '题库' },
component: () => import('../views/ProblemsView.vue'),
},
{
path: '/problems/:id',
meta: { title: '题目详情' },
component: () => import('../views/ProblemDetailView.vue'),
},
{
path: '/trainings',
meta: { title: '训练' },
component: () => import('../views/TrainingsView.vue'),
},
{
path: '/trainings/:id',
meta: { title: '训练详情' },
component: () => import('../views/TrainingDetailView.vue'),
},
{
path: '/contests',
meta: { title: '比赛' },
component: () => import('../views/ContestsView.vue'),
},
{
path: '/contests/:id',
meta: { title: '比赛详情' },
component: () => import('../views/ContestDetailView.vue'),
},
{
path: '/submissions',
meta: { title: '评测' },
component: () => import('../views/SubmissionsView.vue'),
},
{
path: '/submissions/:id',
meta: { title: '评测详情' },
component: () => import('../views/SubmissionDetailView.vue'),
},
{
path: '/rankings',
meta: { title: '排名' },
component: () => import('../views/RankingsView.vue'),
},
{
path: '/discussions',
meta: { title: '讨论' },
component: () => import('../views/DiscussionsView.vue'),
},
{
path: '/discussions/:id',
meta: { title: '讨论详情' },
component: () => import('../views/DiscussionDetailView.vue'),
},
{ path: '/teams', meta: { title: '团队' }, component: () => import('../views/TeamsView.vue') },
{
path: '/teams/create',
meta: { title: '创建团队' },
component: () => import('../views/CreateTeamView.vue'),
},
{
path: '/users/:username',
meta: { title: '个人主页' },
component: () => import('../views/ProfileView.vue'),
},
{ path: '/login', meta: { title: '登录' }, component: () => import('../views/AuthView.vue') },
{
path: '/register',
meta: { title: '注册' },
component: () => import('../views/AuthView.vue'),
},
{
path: '/logout',
meta: { title: '退出登录' },
component: () => import('../views/LogoutView.vue'),
},
{ path: '/about', meta: { title: '关于' }, component: () => import('../views/AboutView.vue') },
{
path: '/:pathMatch(.*)*',
name: 'not-found',
meta: { title: '页面不存在' },
component: () => import('../views/NotFoundView.vue'),
},
],
})
router.beforeEach(async (to) => {
if (to.path === '/submissions' || to.path.startsWith('/submissions/') || to.path === '/logout') {
try {
if (await useSession().refresh()) return true
} catch {
return { path: '/login', query: { next: to.fullPath, unavailable: '1' } }
}
return { path: '/login', query: { next: to.fullPath } }
}
})
router.afterEach((to) => {
document.title = `${String(to.meta.title ?? '首页')} · KF OnlineJudge`
})