From 1124ca4029d8ce1f8b17c23a0b9cc7bab4c8f9ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=A2=A6?= Date: Thu, 4 Jun 2026 15:17:17 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E5=A4=9A=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/question/Question.vue | 66 ++++++++++--------- .../question/answer/MultipleChoice.vue | 8 +-- 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/components/question/Question.vue b/src/components/question/Question.vue index 549d049..6477bf7 100644 --- a/src/components/question/Question.vue +++ b/src/components/question/Question.vue @@ -56,37 +56,7 @@ const isCompositeStem = computed(() => { return props.data.stem.includes('qml-sq') && props.data.stem.includes('qml-op') }) -function getAnswerCountFromAnswerHtml(answerHtml: unknown) { - if (!answerHtml) return 0 - if (Array.isArray(answerHtml)) return answerHtml.filter(Boolean).length - - if (typeof answerHtml === 'string') { - const raw = answerHtml.trim() - if (!raw) return 0 - - try { - const parsed = JSON.parse(raw) - if (Array.isArray(parsed)) return parsed.filter(Boolean).length - } catch { - /* ignore */ - } - - const plainText = raw - .replace(/<[^>]*>/g, '') - .replace(/ /gi, ' ') - .trim() - if (!plainText) return 0 - return plainText.split(/[,,\s]+/).filter(Boolean).length - } - - return 0 -} - -const isSingleChoiceByAnswerHtml = computed(() => { - return props.data?.stemType === 2 && getAnswerCountFromAnswerHtml(props.data?.answerHtml) === 1 -}) - -// 从 answerHtml 中提取选择题答案字母 (如 "A" 或 "A,B,C") +// 从 answerHtml 中提取选择题答案字母 (如 "A"、"BCD" 或 "A,B,C") function extractChoiceLettersFromAnswerHtml(answerHtml: unknown): string { if (!answerHtml) return '' if (Array.isArray(answerHtml)) { @@ -125,6 +95,40 @@ function extractChoiceLettersFromAnswerHtml(answerHtml: unknown): string { return '' } +// 以 answerHtml 为准:如 "BCD" 为 3 个答案,"A" 或 "A,B" 按逗号/字母解析 +function getAnswerCountFromAnswerHtml(answerHtml: unknown) { + const normalized = extractChoiceLettersFromAnswerHtml(answerHtml) + if (normalized) return normalized.split(',').filter(Boolean).length + + if (!answerHtml) return 0 + if (Array.isArray(answerHtml)) return answerHtml.filter(Boolean).length + + if (typeof answerHtml === 'string') { + const raw = answerHtml.trim() + if (!raw) return 0 + + try { + const parsed = JSON.parse(raw) + if (Array.isArray(parsed)) return parsed.filter(Boolean).length + } catch { + /* ignore */ + } + + const plainText = raw + .replace(/<[^>]*>/g, '') + .replace(/ /gi, ' ') + .trim() + if (!plainText) return 0 + return plainText.split(/[,,\s]+/).filter(Boolean).length + } + + return 0 +} + +const isSingleChoiceByAnswerHtml = computed(() => { + return props.data?.stemType === 2 && getAnswerCountFromAnswerHtml(props.data?.answerHtml) === 1 +}) + // 选择题(单选/多选)的正确答案,优先使用 answerHtml const choiceAnswer = computed(() => { const stemType = props.data?.stemType diff --git a/src/components/question/answer/MultipleChoice.vue b/src/components/question/answer/MultipleChoice.vue index 61ae69c..a9e285c 100644 --- a/src/components/question/answer/MultipleChoice.vue +++ b/src/components/question/answer/MultipleChoice.vue @@ -65,12 +65,12 @@ const content = computed(() => { 'multiple-choice-item': true, pointer: true, active: selectChoice.includes(choiceEnum[idx]), - success: + success: isDeadline && reportFlag && answerArray?.includes(choiceEnum[idx]), + fail: isDeadline && reportFlag && - answerArray?.includes(choiceEnum[idx]) && - stuAnswerArray?.includes(choiceEnum[idx]), - fail: isDeadline && reportFlag && stuAnswerArray?.includes(choiceEnum[idx]), + stuAnswerArray?.includes(choiceEnum[idx]) && + !answerArray?.includes(choiceEnum[idx]), }" @click="handleSelect(idx)" >