diff --git a/apps/web/src/oj/problem/components/ResultPane.vue b/apps/web/src/oj/problem/components/ResultPane.vue new file mode 100644 index 0000000..978f896 --- /dev/null +++ b/apps/web/src/oj/problem/components/ResultPane.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/apps/web/src/oj/problem/components/ResultTabLabel.vue b/apps/web/src/oj/problem/components/ResultTabLabel.vue new file mode 100644 index 0000000..478121b --- /dev/null +++ b/apps/web/src/oj/problem/components/ResultTabLabel.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/apps/web/src/oj/problem/components/SubmissionEffects.vue b/apps/web/src/oj/problem/components/SubmissionEffects.vue index 6114280..717b5ea 100644 --- a/apps/web/src/oj/problem/components/SubmissionEffects.vue +++ b/apps/web/src/oj/problem/components/SubmissionEffects.vue @@ -73,9 +73,8 @@ function settleReview() { function closeCommentPanel() { commentPanel.value = false - // 点评价弹窗时,结果面板会当成「点了外面」收起来 —— 而「下一题」就在面板里 - // (LessonNext),评价完得把它重新打开 - submissionStore.showResult = true + // 「下一题」在结果页签里(LessonNext),评价完回到那里 —— 学生点评之前可能切去看了题目 + submissionStore.revealResult() settleReview() } diff --git a/apps/web/src/oj/problem/components/SubmitCode.vue b/apps/web/src/oj/problem/components/SubmitCode.vue index b00338d..f7b98cb 100644 --- a/apps/web/src/oj/problem/components/SubmitCode.vue +++ b/apps/web/src/oj/problem/components/SubmitCode.vue @@ -1,6 +1,5 @@ diff --git a/apps/web/src/oj/problem/detail.vue b/apps/web/src/oj/problem/detail.vue index 7e5092e..68cb644 100644 --- a/apps/web/src/oj/problem/detail.vue +++ b/apps/web/src/oj/problem/detail.vue @@ -11,6 +11,7 @@ import { useSubmissionStore } from "oj/store/submission" import { useFlowchartStore } from "oj/store/flowchart" // 判完之后该发生的事(烟花、点评、回题单)。静态引入:它得在第一次判完之前就挂好 import SubmissionEffects from "./components/SubmissionEffects.vue" +import ResultTabLabel from "./components/ResultTabLabel.vue" // 抽成具名 loader,便于进页面时与接口并行预取编辑器 chunk。 // 题库、比赛、题单三种入口用的是同一个编辑器:原来比赛和题单用的是另一个精简版, @@ -25,6 +26,7 @@ const ProblemSubmission = defineAsyncComponent(() => import("./components/Proble const ProblemReaction = defineAsyncComponent(() => import("./components/ProblemReaction.vue")) const ProblemFlowchart = defineAsyncComponent(() => import("./components/ProblemFlowchart.vue")) const MyFlowchartTab = defineAsyncComponent(() => import("./components/MyFlowchartTab.vue")) +const ResultPane = defineAsyncComponent(() => import("./components/ResultPane.vue")) interface Props { problemID: string @@ -55,13 +57,15 @@ const canShowFlowchart = computed( ) const tabOptions = computed(() => { + // 桌面上「结果」紧跟在「题目」后面;手机上编辑器也是一个页签,「结果」排在「代码」后面 const options: string[] = ["content"] + if (!isMobile.value) options.push("result") if (canShowFlowchart.value) { options.push("flowchart") } if (isMobile.value) { - options.push("editor") + options.push("editor", "result") } options.push("info") if (!contestID) { @@ -93,6 +97,18 @@ watch(currentTab, (tab) => { }) }) +// 交上去、或者语法检查没过:切到「结果」。提交按钮在编辑器那边,页签归这一页管 +const submissionStore = useSubmissionStore() +watch( + () => submissionStore.resultSeq, + () => { + currentTab.value = "result" + }, +) + +// 结果页签的标题带状态图标(ResultTabLabel),n-tab-pane 的 tab 接受渲染函数 +const resultTab = () => h(ResultTabLabel) + watch( () => myFlowchartStore.showing, (showing) => { @@ -175,9 +191,13 @@ watch(