From b05b24dded15068964cfbbeb12fc608b2eb61078 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=AD=90=E6=82=A6?= <1731695011@qq.com> Date: Sun, 24 May 2026 20:36:18 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=96=E7=A8=8B?= =?UTF-8?q?=E9=A2=98=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/Exercise/ExerciseDetail.vue | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/frontend/src/views/Exercise/ExerciseDetail.vue b/frontend/src/views/Exercise/ExerciseDetail.vue index baeef9d..2c53e52 100644 --- a/frontend/src/views/Exercise/ExerciseDetail.vue +++ b/frontend/src/views/Exercise/ExerciseDetail.vue @@ -12,7 +12,7 @@
{{ exercise.description }}
- +示例 {{ i + 1 }}:
输入:{{ tc.input }}
@@ -48,7 +48,7 @@
-
+
Date: Sun, 24 May 2026 23:25:16 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=9D=E7=95=99=E7=BC=96=E7=A8=8B?=
=?UTF-8?q?=E9=A2=98=E5=88=87=E6=8D=A2=E8=AF=AD=E8=A8=80=E8=8D=89=E7=A8=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/views/Exercise/ExerciseDetail.vue | 53 +++++++++++++++++--
1 file changed, 50 insertions(+), 3 deletions(-)
diff --git a/frontend/src/views/Exercise/ExerciseDetail.vue b/frontend/src/views/Exercise/ExerciseDetail.vue
index 2c53e52..19d1968 100644
--- a/frontend/src/views/Exercise/ExerciseDetail.vue
+++ b/frontend/src/views/Exercise/ExerciseDetail.vue
@@ -166,6 +166,7 @@ const activeCaseIndex = ref(0)
const activeResultType = ref(null)
const code = ref(DEFAULT_TEMPLATES['c++'])
const exercise = ref(LOCAL_EXERCISE)
+const skipNextCodeSave = ref(false)
function parseJsonField(value, fallback) {
if (Array.isArray(value) || (value && typeof value === 'object')) {
@@ -192,6 +193,41 @@ function normalizeInitialCode(value) {
return initialCode && typeof initialCode === 'object' ? initialCode : DEFAULT_TEMPLATES
}
+function isSupportedLanguage(lang) {
+ return Object.prototype.hasOwnProperty.call(DEFAULT_TEMPLATES, lang)
+}
+
+function draftStorageKey(exerciseId = exercise.value.id) {
+ return `exercise-detail:drafts:v1:${exerciseId}`
+}
+
+function safeParseDrafts(exerciseId = exercise.value.id) {
+ try {
+ const raw = localStorage.getItem(draftStorageKey(exerciseId))
+ const parsed = raw ? JSON.parse(raw) : {}
+ return parsed && typeof parsed === 'object' ? parsed : {}
+ } catch {
+ return {}
+ }
+}
+
+function saveDraft(lang, value, exerciseId = exercise.value.id) {
+ if (!isSupportedLanguage(lang) || !exerciseId) return
+ const drafts = safeParseDrafts(exerciseId)
+ drafts[lang] = value
+ localStorage.setItem(draftStorageKey(exerciseId), JSON.stringify(drafts))
+}
+
+function loadDraft(lang, exerciseId = exercise.value.id) {
+ if (!isSupportedLanguage(lang) || !exerciseId) return null
+ const draft = safeParseDrafts(exerciseId)[lang]
+ return typeof draft === 'string' ? draft : null
+}
+
+function loadInitialCode(lang) {
+ return exercise.value.initialCode?.[lang] || DEFAULT_TEMPLATES[lang] || ''
+}
+
async function loadExercise() {
const id = route.params.id
if (!id) return
@@ -208,7 +244,8 @@ async function loadExercise() {
initialCode: normalizeInitialCode(data.initialCode),
testCases: normalizeTestCases(data.testCases),
}
- code.value = exercise.value.initialCode?.[selectedLanguage.value] || DEFAULT_TEMPLATES[selectedLanguage.value] || ''
+ skipNextCodeSave.value = true
+ code.value = loadDraft(selectedLanguage.value, data.id) ?? loadInitialCode(selectedLanguage.value)
activeCaseIndex.value = 0
}
} catch (e) {
@@ -220,14 +257,24 @@ onMounted(() => {
loadExercise()
})
-watch(selectedLanguage, (lang) => {
- code.value = exercise.value.initialCode?.[lang] || DEFAULT_TEMPLATES[lang] || ''
+watch(selectedLanguage, (lang, oldLang) => {
+ saveDraft(oldLang, code.value)
+ skipNextCodeSave.value = true
+ code.value = loadDraft(lang) ?? loadInitialCode(lang)
runResult.value = null
submitResult.value = null
activeResultType.value = null
resultTab.value = 'cases'
})
+watch(code, (value) => {
+ if (skipNextCodeSave.value) {
+ skipNextCodeSave.value = false
+ return
+ }
+ saveDraft(selectedLanguage.value, value)
+})
+
const monacoLanguage = computed(() =>
({ 'c++': 'cpp', 'c': 'c', 'python': 'python' }[selectedLanguage.value] || 'cpp')
)