From a63bf6ea071179f2fb3b6b05930e075fd73122fd Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Sun, 27 Sep 2026 22:58:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E9=A2=98=E7=9B=AE):=20=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E4=B9=8B=E5=90=8E=E7=9B=B4=E6=8E=A5=E7=BB=99=E5=87=BA=E8=BF=99?= =?UTF-8?q?=E8=8A=82=E8=AF=BE=E7=9A=84=E4=B8=8B=E4=B8=80=E9=A2=98=EF=BC=9B?= =?UTF-8?q?=E5=9C=A8=E9=A2=98=E7=9B=AE=E9=A1=B5=E9=87=8C=E6=8D=A2=E9=A2=98?= =?UTF-8?q?=E6=97=B6=E4=B8=8D=E5=86=8D=E5=B8=A6=E7=9D=80=E4=B8=8A=E4=B8=80?= =?UTF-8?q?=E9=81=93=E9=A2=98=E7=9A=84=E7=BB=93=E6=9E=9C=E5=92=8C=E8=AF=84?= =?UTF-8?q?=E4=BB=B7=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 72% 的提交一次就通过,每次通过之后学生都要回首页或再问一遍题号去找下一道。 - 结果面板在通过时显示 LessonNext:取 /me/class-activity(老师布置的优先,否则推断), 给出排在当前题后面、还没通过的第一道,后面都做完了再从头找;全做完了显示「都做完了」 并指向题单。当前题不在列表里、比赛、题单入口都不显示 - 评价弹窗关掉后重新打开结果面板:点弹窗时面板会被当成点了外面收起来,「下一题」就在面板里 - 换题(同一组件只换路由参数,有了题号直达和下一题之后成了常规操作)时收掉上一道题的 结果面板、语法错误、还在跟的提交(新增 useSubmissionMonitor.reset),并取消通过后 那两个 1.5 秒的定时器——否则会给还没做的新题弹评价,上一道判完时还会把新题标成已解决 Co-Authored-By: Claude Opus 5.5 --- .../src/oj/problem/components/LessonNext.vue | 75 +++++++++++++++++++ .../problem/components/SubmissionResult.vue | 19 +++++ .../src/oj/problem/components/SubmitCode.vue | 37 ++++++++- .../composables/useSubmissionMonitor.ts | 13 ++++ 4 files changed, 141 insertions(+), 3 deletions(-) create mode 100644 apps/web/src/oj/problem/components/LessonNext.vue diff --git a/apps/web/src/oj/problem/components/LessonNext.vue b/apps/web/src/oj/problem/components/LessonNext.vue new file mode 100644 index 0000000..b8d43b4 --- /dev/null +++ b/apps/web/src/oj/problem/components/LessonNext.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/apps/web/src/oj/problem/components/SubmissionResult.vue b/apps/web/src/oj/problem/components/SubmissionResult.vue index f476f6a..a47e8ef 100644 --- a/apps/web/src/oj/problem/components/SubmissionResult.vue +++ b/apps/web/src/oj/problem/components/SubmissionResult.vue @@ -17,6 +17,7 @@ import { useProblemStore } from "oj/store/problem" import PythonErrorExplain from "./PythonErrorExplain.vue" import RuntimeErrorExplain from "./RuntimeErrorExplain.vue" import WrongAnswerExplain from "./WrongAnswerExplain.vue" +import LessonNext from "./LessonNext.vue" import { useAIStream } from "shared/composables/aiStream" import { submitHintFeedback } from "oj/api" import { MdPreview } from "md-editor-v3" @@ -121,6 +122,18 @@ const sampleCheck = computed(() => { return submission.statisticInfo?.sample_check ?? null }) +/** + * 通过之后给「这节课的下一题」。比赛有自己的题目列表;从题单入口进来的,通过后 + * 1.5 秒会自动跳回题单(SubmitCode 的 goToProblemSetDelayed),这两种都不给 + */ +const route = useRoute() +const showLessonNext = computed( + () => + props.submission?.result === SubmissionStatus.accepted && + problemStore.problem?.contestId == null && + !route.params.problemSetId, +) + const msg = computed(() => { if (!props.submission) return "" // 走 PythonErrorExplain / RuntimeErrorExplain 那两张中文卡片 @@ -288,6 +301,12 @@ const columns: DataTableColumn[] = [ /> + + problem.value?._id, + (next, previous) => { + if (!previous || next === previous) return + showResult.value = false + syntaxErrorInfo.value = "" + commentPanel.value = false + cancelCommentPanel() + cancelGoToProblemSet() + resetSubmission() + }, +) + // ==================== 计算属性 ==================== const buttonState = computed(() => getSubmitButtonState({ diff --git a/apps/web/src/oj/problem/composables/useSubmissionMonitor.ts b/apps/web/src/oj/problem/composables/useSubmissionMonitor.ts index 469e922..0203a4e 100644 --- a/apps/web/src/oj/problem/composables/useSubmissionMonitor.ts +++ b/apps/web/src/oj/problem/composables/useSubmissionMonitor.ts @@ -129,6 +129,18 @@ export function useSubmissionMonitor() { startPollingFallback() } + /** + * 换题的时候丢掉当前这条提交。题目页换题(顶栏题号直达、「下一题」)是同一个组件 + * 复用、只换路由参数,不清的话上一道题的结果面板原样挂在新题上;而且上一道还在判的话, + * 判完触发的「通过」处理会把**新题**标成已解决。提交本身照常判完落库,只是这边不再跟。 + */ + const reset = () => { + pausePolling() + unsubscribe() + submissionId.value = "" + submission.value = undefined + } + // ==================== 计算属性 ==================== const judging = computed(() => submission.value?.result === SubmissionStatus.judging) @@ -159,5 +171,6 @@ export function useSubmissionMonitor() { // 方法 startMonitoring, pausePolling, + reset, } }