From 367cfc9d5d8e1293cc28df6276d3291dc6af7725 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Sat, 10 Oct 2026 12:54:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=8F=AD=E7=BA=A7=E4=B8=8B=E6=8B=89):=20?= =?UTF-8?q?=E5=85=A8=E7=AB=99=E7=9A=84=E7=8F=AD=E7=BA=A7=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E6=8C=89=E5=B9=B4=E7=BA=A7=E5=88=86=E7=BB=84=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=B9=B4=E7=BA=A7=E5=9C=A8=E4=B8=8A=EF=BC=8C=E7=BB=84=E9=87=8C?= =?UTF-8?q?=E6=8C=89=E7=8F=AD=E5=8F=B7=E6=8E=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 登录框、提交列表、数据统计、排名、课堂看板、题单班级视图、班级 PK 七处统一走 groupClassOptions。 Co-Authored-By: Claude Opus 5.5 --- apps/web/src/oj/class/pk.vue | 28 ++++-------- apps/web/src/oj/classroom/board.vue | 11 +---- .../oj/problemset/components/ClassView.vue | 18 ++++---- apps/web/src/oj/rank/list.vue | 10 ++--- apps/web/src/oj/submission/utils.ts | 44 +++++++++++++++++-- apps/web/src/shared/components/Login.vue | 19 ++++---- 6 files changed, 71 insertions(+), 59 deletions(-) diff --git a/apps/web/src/oj/class/pk.vue b/apps/web/src/oj/class/pk.vue index f1e0cf0..a3b08c2 100644 --- a/apps/web/src/oj/class/pk.vue +++ b/apps/web/src/oj/class/pk.vue @@ -4,7 +4,7 @@ import { MdPreview } from "md-editor-v3" import "md-editor-v3/lib/preview.css" import { useThemeVars } from "naive-ui" import { getClassBattle, getClassPk } from "oj/api" -import { classLabel } from "oj/submission/utils" +import { classLabel, groupClassOptions } from "oj/submission/utils" import { useAIStream } from "shared/composables/aiStream" import { useBreakpoints } from "shared/composables/breakpoints" import { useUserStore } from "shared/store/user" @@ -102,25 +102,13 @@ function setPeriod(value: ClassPkPeriod) { } /** 「+ 加一个班」:这学期在用的班(班级对抗里有的),按年级分组,自己年级放最前 */ -const addOptions = computed(() => { - const grade = selected.value[0]?.slice(0, 2) - const groups = new Map() - for (const item of battle.value) { - if (selected.value.includes(item.className)) continue - const key = item.className.slice(0, 2) - const list = groups.get(key) ?? [] - list.push({ label: classLabel(item.className), value: item.className }) - groups.set(key, list) - } - return [...groups] - .sort((a, b) => (a[0] === grade ? -1 : b[0] === grade ? 1 : b[0].localeCompare(a[0]))) - .map(([key, children]) => ({ - type: "group" as const, - label: `${key} 级`, - key, - children: children.sort((a, b) => a.value.localeCompare(b.value, "zh", { numeric: true })), - })) -}) +const addOptions = computed(() => + groupClassOptions( + battle.value.map((item) => item.className).filter((name) => !selected.value.includes(name)), + undefined, + selected.value[0]?.slice(0, 2), + ), +) const mode = computed(() => { if (!pk.value || pk.value.classes.length < 2) return "empty" diff --git a/apps/web/src/oj/classroom/board.vue b/apps/web/src/oj/classroom/board.vue index 8a94636..f63e93e 100644 --- a/apps/web/src/oj/classroom/board.vue +++ b/apps/web/src/oj/classroom/board.vue @@ -1,5 +1,6 @@