From e425fbae532425db6275af17cb9d4fc851431a80 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Mon, 29 Jun 2026 06:19:06 -0600 Subject: [PATCH] fix copy --- src/admin/contest/helper.vue | 1 + .../problem/components/ProblemSubmission.vue | 1 + src/oj/submission/detail.vue | 48 +++++++++---------- src/oj/submission/list.vue | 1 + 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/admin/contest/helper.vue b/src/admin/contest/helper.vue index 1b6505e..0dbd966 100644 --- a/src/admin/contest/helper.vue +++ b/src/admin/contest/helper.vue @@ -313,6 +313,7 @@ onMounted(loadData) :problemID="currentSubmission.problem_display_id" :submissionID="currentSubmission.id" hideList + @copied="toggleCodePanel(false)" /> diff --git a/src/oj/problem/components/ProblemSubmission.vue b/src/oj/problem/components/ProblemSubmission.vue index 92f2196..297bdd6 100644 --- a/src/oj/problem/components/ProblemSubmission.vue +++ b/src/oj/problem/components/ProblemSubmission.vue @@ -334,6 +334,7 @@ watch(query, listSubmissions) :problemID="problemID" :submissionID="submissionID" hideList + @copied="toggleCodePanel(false)" /> diff --git a/src/oj/submission/detail.vue b/src/oj/submission/detail.vue index ef36152..aa324d3 100644 --- a/src/oj/submission/detail.vue +++ b/src/oj/submission/detail.vue @@ -10,11 +10,12 @@ import { submissionMemoryFormat, submissionTimeFormat, utoa, - copyToClipboard, } from "utils/functions" import { Submission } from "utils/types" import SubmissionResultTag from "shared/components/SubmissionResultTag.vue" import { useBreakpoints } from "shared/composables/breakpoints" +import { useCodeStore } from "oj/store/code" +import storage from "utils/storage" const props = defineProps<{ submissionID: string @@ -23,9 +24,12 @@ const props = defineProps<{ hideList?: boolean }>() +// 在弹框中使用时,父组件监听此事件关闭弹框,否则弹框会挡住已更新的编辑器 +const emit = defineEmits<{ copied: [] }>() + const route = useRoute() const router = useRouter() -const message = useMessage() +const codeStore = useCodeStore() const { isMobile, isDesktop } = useBreakpoints() @@ -72,43 +76,37 @@ function copyToCat() { window.open(url, "_blank") } -async function copyToProblem() { - const success = await copyToClipboard(submission.value!.code) - if (success) { - message.success("代码复制成功,需要手动粘贴到题目") - } else { - message.error("代码复制失败") - } +function copyToProblem() { + const { code, language, contest } = submission.value! + // 编辑器的 storageKey 用 display id(problem._id),等于 props.problemID, + // 而非 submission.problem(内部数字 id) + const contestIDForKey = contest || null + const storageKey = `problem_${props.problemID}_contest_${contestIDForKey}_lang_${language}` + storage.set(storageKey, code) + // 设置语言 + 代码:localStorage 覆盖全新挂载的编辑器, + // setCode 覆盖已挂载(同页 modal)的编辑器 + codeStore.setLanguage(language) + codeStore.setCode(code) - const contestID = submission.value!.contest const problemSetId = (route.params.problemSetId as string) ?? "" - if (contestID) { - // 竞赛题目 + if (contest) { router.push({ name: "contest problem", - params: { - contestID: String(contestID), - problemID: props.problemID, - }, + params: { contestID: String(contest), problemID: props.problemID }, }) } else if (problemSetId) { - // 题单题目 router.push({ name: "problemset problem", - params: { - problemSetId: problemSetId, - problemID: props.problemID, - }, + params: { problemSetId, problemID: props.problemID }, }) } else { - // 普通题目 router.push({ name: "problem", - params: { - problemID: props.problemID, - }, + params: { problemID: props.problemID }, }) } + + emit("copied") } onMounted(init) diff --git a/src/oj/submission/list.vue b/src/oj/submission/list.vue index 312817d..d5530cc 100644 --- a/src/oj/submission/list.vue +++ b/src/oj/submission/list.vue @@ -531,6 +531,7 @@ const flowchartColumns = computed(() => { :problemID="problemDisplayID" :submissionID="submissionID" hideList + @copied="toggleCodePanel(false)" />