-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/web/src/oj/store/submission.ts b/apps/web/src/oj/store/submission.ts
index a4040a3..0a36e18 100644
--- a/apps/web/src/oj/store/submission.ts
+++ b/apps/web/src/oj/store/submission.ts
@@ -5,6 +5,7 @@ import { useCodeStore } from "oj/store/code"
import { useProblemStore } from "oj/store/problem"
import { useSubmissionMonitor } from "oj/problem/composables/useSubmissionMonitor"
import { useSubmissionHint } from "oj/problem/composables/useSubmissionHint"
+import { useTrialRun } from "oj/problem/composables/useTrialRun"
import { restartEditTrace, snapshotEditTrace } from "oj/problem/utils/editTrace"
import { useCollabStore } from "shared/store/collab"
import { LANGUAGE_FORMAT_VALUE } from "utils/constants"
@@ -22,6 +23,8 @@ import type { SubmitCodePayload } from "utils/types"
* 判完之后「该发生什么」(失败计数、标成已解决、烟花、点评、回题单)不在这里,
* 在页面这一层的 SubmissionEffects —— 它们要路由守卫和弹窗,得挂在一直在的组件上。
*/
+export type ResultSegment = "submit" | "samples" | "custom"
+
export const useSubmissionStore = defineStore("submission", () => {
const problemStore = useProblemStore()
const codeStore = useCodeStore()
@@ -29,15 +32,33 @@ export const useSubmissionStore = defineStore("submission", () => {
const monitor = useSubmissionMonitor()
const hint = useSubmissionHint()
+ const trial = useTrialRun()
/**
* 有新结果要给学生看了(交上去、或者语法检查没过)就 +1。题目页看着它把左栏切到
* 「结果」页签 —— store 不管页签,只说「该看结果了」。
*/
const resultSeq = ref(0)
- function revealResult() {
+ /** 「结果」页签里看哪一段:提交结果 / 运行例子 / 自己输入 */
+ const resultSegment = ref("submit")
+ function revealResult(segment: ResultSegment = "submit") {
+ resultSegment.value = segment
resultSeq.value++
}
+
+ /** 用题目里的例子试跑(Judge0),不算提交 */
+ function runSamples() {
+ const problem = problemStore.problem
+ if (!problem?.samples.length) return
+ revealResult("samples")
+ trial.runSamples({ ...codeStore.code }, problem.samples)
+ }
+
+ /** 用「自己输入」框里的数据跑一次 */
+ function runCustom() {
+ revealResult("custom")
+ trial.runCustom({ ...codeStore.code })
+ }
const isFormatting = ref(false)
const isSubmittingRequest = ref(false)
@@ -130,8 +151,10 @@ export const useSubmissionStore = defineStore("submission", () => {
*/
function reset() {
syntaxErrorInfo.value = ""
+ resultSegment.value = "submit"
monitor.reset()
hint.clearHint()
+ trial.resetTrial()
}
// 题目页换题是同一个组件复用(顶栏题号直达、「下一题」都只换路由参数)
@@ -153,7 +176,10 @@ export const useSubmissionStore = defineStore("submission", () => {
pending: monitor.pending,
submitting: monitor.submitting,
resultSeq,
+ resultSegment,
revealResult,
+ runSamples,
+ runCustom,
isFormatting,
isSubmittingRequest,
syntaxErrorInfo,
@@ -162,5 +188,6 @@ export const useSubmissionStore = defineStore("submission", () => {
reset,
// markRaw:不让 store 把它包成 reactive,组件解构出来的还是 ref
hint: markRaw(hint),
+ trial: markRaw(trial),
}
})
diff --git a/apps/web/src/shared/components/Header.vue b/apps/web/src/shared/components/Header.vue
index 4caab5d..5d6f8d7 100644
--- a/apps/web/src/shared/components/Header.vue
+++ b/apps/web/src/shared/components/Header.vue
@@ -7,7 +7,6 @@ import { useLearnProgress } from "shared/composables/learnProgress"
import { useProblemJump } from "shared/composables/problemJump"
import { useAuthModalStore } from "shared/store/authModal"
import { useCollabStore } from "shared/store/collab"
-import { useScreenModeStore } from "shared/store/screenMode"
import { useConfigStore } from "../store/config"
import { useUserStore } from "../store/user"
@@ -15,7 +14,6 @@ const userStore = useUserStore()
const configStore = useConfigStore()
const collabStore = useCollabStore()
const authStore = useAuthModalStore()
-const screenModeStore = useScreenModeStore()
const route = useRoute()
const router = useRouter()
@@ -31,7 +29,6 @@ const { isDark, toggleDark } = useDarkTransition()
const pendingHelpCount = computed(() => (collabStore.isTeacher ? collabStore.pendingCount : 0))
// 从 store 中获取屏幕模式状态
-const { screenMode } = storeToRefs(screenModeStore)
const names = [
"man-with-chinese-cap-1",
@@ -297,12 +294,6 @@ function goHome() {
- screenModeStore.switchScreenMode()"
- >
- {{ screenMode }}
-
diff --git a/apps/web/src/shared/components/HelpRequestList.vue b/apps/web/src/shared/components/HelpRequestList.vue
index 97009d0..b6f6fb9 100644
--- a/apps/web/src/shared/components/HelpRequestList.vue
+++ b/apps/web/src/shared/components/HelpRequestList.vue
@@ -2,13 +2,11 @@
import { Icon } from "@iconify/vue"
import { useBreakpoints } from "shared/composables/breakpoints"
import { useCollabStore } from "shared/store/collab"
-import { useScreenModeStore } from "shared/store/screenMode"
/** 由顶栏的姓名下拉菜单打开 */
const show = defineModel("show", { default: false })
const collabStore = useCollabStore()
-const screenModeStore = useScreenModeStore()
const router = useRouter()
const route = useRoute()
const message = useMessage()
@@ -69,11 +67,6 @@ const handleAccept = (studentId: number, problemId: string, status: string) => {
return
}
collabStore.accept(studentId)
- // 协作用的是右侧那个编辑器,而「题目」「自测」两种分屏模式下它根本没挂出来 ——
- // 落进那样一个页面就是:学生显示「老师正在帮你」,老师这边什么都没有。
- // 跳到另一道题时 detail.vue 的 init() 会重置分屏模式,**停在同一道题上接单
- // 不会**(路由没变、组件不重建),所以这里显式重置一次。
- screenModeStore.resetScreenMode()
show.value = false
// 已经在这道题的页面上就不跳了(老师正投影着这道题时就是这种)。
// 重复导航在 vue-router 里是一个 rejected promise,不拦一下控制台会报
diff --git a/apps/web/src/shared/store/screenMode.ts b/apps/web/src/shared/store/screenMode.ts
deleted file mode 100644
index d96b32b..0000000
--- a/apps/web/src/shared/store/screenMode.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { defineStore } from "pinia"
-import { ScreenMode } from "utils/constants"
-
-export const useScreenModeStore = defineStore("screenMode", () => {
- const { state: screenMode, next: switchScreenMode } = useCycleList(Object.values(ScreenMode), {
- initialValue: ScreenMode.both,
- })
-
- // 计算属性
- const isBothMode = computed(() => screenMode.value === ScreenMode.both)
- const isCodeOnlyMode = computed(() => screenMode.value === ScreenMode.code)
-
- const shouldShowProblem = computed(
- () => screenMode.value === ScreenMode.both || screenMode.value === ScreenMode.problem,
- )
-
- function resetScreenMode() {
- screenMode.value = ScreenMode.both
- }
-
- return {
- screenMode,
- isBothMode,
- isCodeOnlyMode,
- shouldShowProblem,
- switchScreenMode,
- resetScreenMode,
- }
-})
diff --git a/apps/web/src/utils/constants.ts b/apps/web/src/utils/constants.ts
index 7bc4278..d095327 100644
--- a/apps/web/src/utils/constants.ts
+++ b/apps/web/src/utils/constants.ts
@@ -252,12 +252,6 @@ export const CODE_TEMPLATES = {
SQL: blankTemplate,
} as const
-export enum ScreenMode {
- both = "双栏",
- code = "自测",
- problem = "题目",
-}
-
export enum ChartType {
Rank,
Activity,