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 @@
+
+
+
+
+
+ {{ label }}还剩 {{ lesson.remaining }} 道
+
+
+ 下一题:{{ lesson.next.problemDisplayId }} {{ lesson.next.title }}
+
+
+
+
+ {{ label }}都做完了,一共 {{ lesson.total }} 道 🎉
+
+ 去题单继续练
+
+
+
+
+
+
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,
}
}