185 lines
5.2 KiB
TypeScript
185 lines
5.2 KiB
TypeScript
import { RouteRecordRaw } from "vue-router"
|
|
import { getProfile } from "./shared/api"
|
|
import { loadChart } from "./shared/composables/chart"
|
|
import { STORAGE_KEY, USER_TYPE } from "./utils/constants"
|
|
import storage from "./utils/storage"
|
|
|
|
export const routes: RouteRecordRaw[] = [
|
|
{
|
|
path: "/",
|
|
component: () => import("~/shared/layout/default.vue"),
|
|
children: [
|
|
{ path: "", component: () => import("oj/problem/list.vue") },
|
|
{
|
|
path: "problem/:problemID",
|
|
component: () => import("oj/problem/detail.vue"),
|
|
props: true,
|
|
name: "problem",
|
|
beforeEnter: loadChart,
|
|
},
|
|
{
|
|
path: "submission",
|
|
component: () => import("oj/submission/list.vue"),
|
|
name: "submissions",
|
|
},
|
|
{
|
|
path: "submission/:submissionID",
|
|
component: () => import("oj/submission/detail.vue"),
|
|
props: true,
|
|
meta: { requiresAuth: true },
|
|
},
|
|
{
|
|
path: "contest",
|
|
component: () => import("oj/contest/list.vue"),
|
|
name: "contests",
|
|
},
|
|
{
|
|
path: "contest/:contestID",
|
|
component: () => import("oj/contest/detail.vue"),
|
|
props: true,
|
|
meta: { requiresAuth: true },
|
|
children: [
|
|
{
|
|
path: "",
|
|
component: () => import("oj/contest/pages/problems.vue"),
|
|
props: true,
|
|
meta: { requiresAuth: true },
|
|
name: "contest problems",
|
|
},
|
|
{
|
|
path: "submission",
|
|
component: () => import("oj/submission/list.vue"),
|
|
meta: { requiresAuth: true },
|
|
name: "contest submissions",
|
|
},
|
|
{
|
|
path: "rank",
|
|
component: () => import("oj/contest/pages/rank.vue"),
|
|
props: true,
|
|
meta: { requiresAuth: true },
|
|
name: "contest rank",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: "contest/:contestID/problem/:problemID",
|
|
component: () => import("oj/problem/detail.vue"),
|
|
props: true,
|
|
name: "contest problem",
|
|
meta: { requiresAuth: true },
|
|
beforeEnter: loadChart,
|
|
},
|
|
{
|
|
path: "rank",
|
|
component: () => import("oj/rank/list.vue"),
|
|
beforeEnter: loadChart,
|
|
},
|
|
{
|
|
path: "user",
|
|
component: () => import("oj/user/index.vue"),
|
|
meta: { requiresAuth: true },
|
|
},
|
|
{
|
|
path: "setting",
|
|
component: () => import("oj/user/setting.vue"),
|
|
meta: { requiresAuth: true },
|
|
},
|
|
{
|
|
path: "learn",
|
|
redirect: "learn/step-1",
|
|
},
|
|
{
|
|
path: "learn/:step+",
|
|
component: () => import("learn/index.vue"),
|
|
name: "learn",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: "/admin",
|
|
component: () => import("~/shared/layout/admin.vue"),
|
|
beforeEnter: async () => {
|
|
if (!storage.get(STORAGE_KEY.AUTHED)) return "/"
|
|
const res = await getProfile()
|
|
if (res.data.user.admin_type === USER_TYPE.REGULAR_USER) return "/"
|
|
},
|
|
children: [
|
|
{
|
|
path: "",
|
|
name: "admin home",
|
|
component: () => import("~/admin/setting/home.vue"),
|
|
},
|
|
{
|
|
path: "config",
|
|
name: "admin config",
|
|
component: () => import("admin/setting/config.vue"),
|
|
},
|
|
{
|
|
path: "announcement",
|
|
name: "admin announcement",
|
|
component: () => import("admin/setting/announcement.vue"),
|
|
},
|
|
{
|
|
path: "user/list",
|
|
name: "admin user list",
|
|
component: () => import("admin/user/list.vue"),
|
|
},
|
|
{
|
|
path: "user/importing",
|
|
name: "admin user importing",
|
|
component: () => import("~/admin/user/importing.vue"),
|
|
},
|
|
{
|
|
path: "problem/list",
|
|
name: "admin problem list",
|
|
component: () => import("admin/problem/list.vue"),
|
|
},
|
|
{
|
|
path: "problem/create",
|
|
name: "admin problem create",
|
|
component: () => import("admin/problem/detail.vue"),
|
|
},
|
|
{
|
|
path: "problem/edit/:problemID",
|
|
name: "admin problem edit",
|
|
component: () => import("admin/problem/detail.vue"),
|
|
props: true,
|
|
},
|
|
{
|
|
path: "contest/list",
|
|
name: "admin contest list",
|
|
component: () => import("admin/contest/list.vue"),
|
|
},
|
|
{
|
|
path: "contest/create",
|
|
name: "admin contest create",
|
|
component: () => import("admin/contest/detail.vue"),
|
|
},
|
|
{
|
|
path: "contest/edit/:contestID",
|
|
name: "admin contest edit",
|
|
component: () => import("admin/contest/detail.vue"),
|
|
props: true,
|
|
},
|
|
{
|
|
path: "contest/:contestID/problem/list",
|
|
name: "admin contest problem list",
|
|
component: () => import("admin/problem/list.vue"),
|
|
props: true,
|
|
},
|
|
{
|
|
path: "contest/:contestID/problem/create",
|
|
name: "admin contest problem create",
|
|
component: () => import("admin/problem/detail.vue"),
|
|
props: true,
|
|
},
|
|
{
|
|
path: "contest/:contestID/problem/edit/:problemID",
|
|
name: "admin contest problem edit",
|
|
component: () => import("admin/problem/detail.vue"),
|
|
props: true,
|
|
},
|
|
],
|
|
},
|
|
]
|