Files
OJ2/apps/web/src/routes.ts
T
xuyueandClaude Opus 5.5 ce0093fc29
Deploy / deploy (push) Canceled after 0s
feat(班级PK): 班级 PK 页重做:两个班看比分和每道题谁赢,三个班以上看题目对照格,学生也能比
- 两个班:大比分 + 一次就对副比分,每道题左右两根条、差得最多的在上,下面每周人均和全班分布
- 三个班以上:一行一道题、一格一个班,越深做对的人越多,皇冠是这道做得最好的班;右边谁领先的题多和赛跑
- 学生自己的班标「你们班」,输掉的题写「再 N 人做对就打平」;AI 分析只给老师,直接在页面里出
- 去掉综合分、雷达图、十张柱状图;手机版按稿改成上下排和页签
- 排名页、班级对抗、班级详情的入口对登录的人都开放,带上当前的班

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 09:06:21 +08:00

364 lines
11 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { RouteRecordRaw } from "vue-router"
export const ojs: RouteRecordRaw = {
path: "/",
component: () => import("shared/layout/default.vue"),
children: [
// 登录后是个人首页,没登录还是题目列表(见 oj/home/index.vue)
{ path: "", component: () => import("oj/home/index.vue"), name: "home" },
{ path: "problem", component: () => import("oj/problem/list.vue"), name: "problems" },
{
path: "problem/:problemID",
component: () => import("oj/problem/detail.vue"),
props: true,
name: "problem",
},
{
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: "class",
component: () => import("oj/contest/pages/class.vue"),
props: true,
meta: { requiresAuth: true },
name: "contest class",
},
],
},
{
path: "contest/:contestID/problem/:problemID",
component: () => import("oj/problem/detail.vue"),
props: true,
name: "contest problem",
meta: { requiresAuth: true },
},
{
path: "rank",
name: "rank",
component: () => import("oj/rank/list.vue"),
},
{
path: "classroom",
name: "classroom board",
component: () => import("oj/classroom/board.vue"),
meta: { requiresAuth: true, requiresTeacherAdmin: true },
},
{
path: "statistics",
name: "statistics",
component: () => import("oj/statistics/index.vue"),
meta: { requiresAuth: true, requiresTeacherAdmin: true },
},
{
path: "class",
name: "class",
component: () => import("oj/class/pk.vue"),
meta: { requiresAuth: true },
},
{
path: "announcement",
name: "announcements",
component: () => import("oj/announcement/list.vue"),
},
{
path: "user",
component: () => import("oj/user/index.vue"),
meta: { requiresAuth: true },
},
{
path: "achievement",
name: "achievement",
component: () => import("oj/achievement/index.vue"),
meta: { requiresAuth: true },
},
{
path: "setting",
component: () => import("oj/user/setting.vue"),
meta: { requiresAuth: true },
},
{
path: "message",
component: () => import("oj/user/message.vue"),
meta: { requiresAuth: true },
},
{
path: "learn/:type/:step",
name: "learn",
component: () => import("oj/learn/index.vue"),
props: true,
},
{
path: "ai-analysis",
name: "ai",
component: () => import("oj/ai/analysis.vue"),
meta: { requiresAuth: true },
},
{
path: "flowchart",
name: "flowchart",
component: () => import("oj/flowchart/index.vue"),
},
{
path: "problemset",
component: () => import("oj/problemset/list.vue"),
name: "problemsets",
},
{
path: "problemset/:problemSetId",
component: () => import("oj/problemset/detail.vue"),
props: true,
name: "problemset",
},
{
path: "problemset/:problemSetId/problem/:problemID",
component: () => import("oj/problem/detail.vue"),
props: true,
name: "problemset problem",
meta: { requiresAuth: true },
},
],
}
export const admins: RouteRecordRaw = {
path: "/admin",
component: () => import("shared/layout/admin.vue"),
children: [
{
path: "",
name: "admin home",
component: () => import("admin/setting/home.vue"),
meta: { requiresSuperAdmin: true },
},
{
path: "config",
name: "admin config",
component: () => import("admin/setting/config.vue"),
meta: { requiresSuperAdmin: true },
},
{
path: "user/list",
name: "admin user list",
component: () => import("admin/user/list.vue"),
meta: { requiresSuperAdmin: true },
},
{
path: "user/generate",
name: "admin user generate",
component: () => import("admin/user/generate.vue"),
meta: { requiresSuperAdmin: true },
},
// admin和super_admin都可以访问的路由 (需要题目权限)
{
path: "problem/list",
name: "admin problem list",
component: () => import("admin/problem/list.vue"),
meta: { requiresProblemPermission: true },
},
{
path: "problem/tags",
name: "admin tag list",
component: () => import("admin/problem/tags.vue"),
meta: { requiresProblemPermission: true },
},
{
path: "problem/create",
name: "admin problem create",
component: () => import("admin/problem/editor.vue"),
meta: { requiresProblemPermission: true },
},
{
path: "problem/edit/:problemID",
name: "admin problem edit",
component: () => import("admin/problem/editor.vue"),
props: true,
meta: { requiresProblemPermission: true },
},
{
path: "contest/list",
name: "admin contest list",
component: () => import("admin/contest/list.vue"),
meta: { requiresTeacherAdmin: true },
},
{
path: "contest/create",
name: "admin contest create",
component: () => import("admin/contest/detail.vue"),
meta: { requiresTeacherAdmin: true },
},
{
path: "contest/edit/:contestID",
name: "admin contest edit",
component: () => import("admin/contest/detail.vue"),
props: true,
meta: { requiresTeacherAdmin: true },
},
{
path: "contest/:contestID/problem/list",
name: "admin contest problem list",
component: () => import("admin/problem/list.vue"),
props: true,
meta: { requiresTeacherAdmin: true },
},
{
path: "contest/:contestID/problem/create",
name: "admin contest problem create",
component: () => import("admin/problem/editor.vue"),
props: true,
meta: { requiresTeacherAdmin: true },
},
{
path: "contest/:contestID/problem/edit/:problemID",
name: "admin contest problem edit",
component: () => import("admin/problem/editor.vue"),
props: true,
meta: { requiresTeacherAdmin: true },
},
// 只有super_admin可以访问的路由
{
path: "announcement/list",
name: "admin announcement list",
component: () => import("admin/announcement/list.vue"),
meta: { requiresSuperAdmin: true },
},
{
path: "announcement/create",
name: "admin announcement create",
component: () => import("admin/announcement/detail.vue"),
meta: { requiresSuperAdmin: true },
},
{
path: "announcement/edit/:announcementID",
name: "admin announcement edit",
component: () => import("admin/announcement/detail.vue"),
props: true,
meta: { requiresSuperAdmin: true },
},
{
path: "message/list",
name: "admin message list",
component: () => import("admin/communication/messages.vue"),
meta: { requiresSuperAdmin: true },
},
{
path: "tutorial/list",
name: "admin tutorial list",
component: () => import("admin/tutorial/list.vue"),
meta: { requiresSuperAdmin: true },
},
{
path: "tutorial/create",
name: "admin tutorial create",
component: () => import("admin/tutorial/detail.vue"),
meta: { requiresSuperAdmin: true },
},
{
path: "tutorial/edit/:tutorialID",
name: "admin tutorial edit",
component: () => import("admin/tutorial/detail.vue"),
props: true,
meta: { requiresSuperAdmin: true },
},
{
path: "problem/stuck",
name: "admin stuck problems",
component: () => import("admin/problem/Stuck.vue"),
meta: { requiresTeacherAdmin: true },
},
{
path: "problem/top_ac_trend",
name: "admin top ac trend",
component: () => import("admin/problem/TopACTrend.vue"),
meta: { requiresTeacherAdmin: true },
},
// 题单管理路由
{
path: "problemset/list",
name: "admin problemset list",
component: () => import("admin/problemset/list.vue"),
meta: { requiresTeacherAdmin: true },
},
{
path: "achievement/list",
name: "admin achievement list",
// 后端 admin 接口是 super_admin_required,这里必须跟着用
// requiresSuperAdmin,否则教师能进页面但每个请求都 403
component: () => import("admin/achievement/list.vue"),
meta: { requiresSuperAdmin: true },
},
{
path: "problemset/create",
name: "admin problemset create",
component: () => import("admin/problemset/edit.vue"),
meta: { requiresTeacherAdmin: true },
},
{
path: "problemset/edit/:problemSetId",
name: "admin problemset edit",
component: () => import("admin/problemset/edit.vue"),
props: true,
meta: { requiresTeacherAdmin: true },
},
// 原来的「详情」页(题目 / 奖章 / 进度三个页签)并进了一屏编辑,老链接转过去
{
path: "problemset/:problemSetId",
name: "admin problemset detail",
redirect: (to) => ({
name: "admin problemset edit",
params: { problemSetId: to.params.problemSetId },
}),
},
{
path: "ai/reports",
name: "admin ai reports",
component: () => import("admin/ai/list.vue"),
meta: { requiresTeacherAdmin: true },
},
{
path: "learn",
name: "admin learn analytics",
component: () => import("admin/learn/index.vue"),
meta: { requiresTeacherAdmin: true },
},
],
}