refactor(题目): 比赛和题单改用题库那个编辑器——题单里的求助终于接得上,一键换中文标点也能用了

比赛和题单原来用的是另一个精简版编辑器(BasicEditor),没有协作绑定、也没有
错误标记扩展:题单里学生点「求助」,老师接单后编辑器绑不上;比赛和题单里
「把中文标点都换成英文」点了没反应、出错行也不标红。三种入口统一成 ProblemEditor,
删掉 BasicEditor。流程图仍然只在题库入口出现(语言列表那道闸没动)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-09-28 13:18:58 +08:00
1 parent 0daa74651d
commit a8b83ba762
3 files changed
+9 -81

No files matched your search

@@ -1,71 +0,0 @@
<script lang="ts" setup>
import { storeToRefs } from "pinia"
import { useCodeStore } from "oj/store/code"
import { useProblemStore } from "oj/store/problem"
import { SOURCES } from "utils/constants"
import CodeEditor from "shared/components/CodeEditor.vue"
import { useBreakpoints } from "shared/composables/breakpoints"
import storage from "utils/storage"
import type { LANGUAGE } from "utils/types"
import { beginEditTrace, editTraceExtensions } from "oj/problem/utils/editTrace"
import EditorToolbar from "./EditorToolbar.vue"
const route = useRoute()
const codeStore = useCodeStore()
const problemStore = useProblemStore()
const { problem } = storeToRefs(problemStore)
const { isDesktop } = useBreakpoints()
const contestID = route.params.contestID || null
const storageKey = computed(
() => `problem_${problem.value!._id}_contest_${contestID}_lang_${codeStore.code.language}`,
)
const editorHeight = computed(() =>
isDesktop.value ? "calc(100vh - 133px)" : "calc(100vh - 172px)",
)
function loadCode() {
codeStore.code.language = problemStore.supportedLanguage(codeStore.code.language)
const savedCode = storage.get(storageKey.value)
codeStore.setCode(
savedCode ||
problem.value!.template[codeStore.code.language] ||
SOURCES[codeStore.code.language],
)
beginEditTrace(`problem_${problem.value!._id}_contest_${contestID}`, codeStore.code.value.length)
}
onMounted(loadCode)
// 换题时组件复用、不重新挂载,和 ProblemEditor 一样得自己重新载入
watch(() => problem.value?._id, loadCode)
const changeCode = (v: string) => {
storage.set(storageKey.value, v)
}
const changeLanguage = (v: LANGUAGE) => {
const savedCode = storage.get(storageKey.value)
codeStore.setCode(
savedCode && storageKey.value.split("_").pop() === v
? savedCode
: problem.value!.template[codeStore.code.language] || SOURCES[codeStore.code.language],
)
}
</script>
<template>
<n-flex vertical>
<EditorToolbar :storage-key="storageKey" @change-language="changeLanguage" />
<CodeEditor
v-model:value="codeStore.code.value"
:language="codeStore.code.language"
:height="editorHeight"
:extra-extensions="editTraceExtensions"
@update:model-value="changeCode"
/>
</n-flex>
</template>