guoyu/log/题目格式问题修复完整说明.md

5.9 KiB
Raw Blame History

题目格式问题修复完整说明

🔍 问题分析

问题现象

  1. 所有新试卷的题目判断为错误
  2. 成绩详情显示"正确答案:暂无"
  3. 旧试卷(修改前的)正常工作
  4. 新试卷(修改后的)不工作

根本原因

在题目编辑页面中,选项和答案保存格式错误:

错误格式(修改后):

{
  "options": "[\"A. 选项内容1\", \"B. 选项内容2\", \"C. 选项内容3\"]",
  "correctAnswer": "A. 选项内容1"
}

正确格式(应该是):

{
  "options": "[\"选项内容1\", \"选项内容2\", \"选项内容3\"]",
  "correctAnswer": "A"
}

为什么旧试卷正常

旧试卷保存的格式是正确的,没有 "A. " 前缀。


已修复的代码

1. questionEdit.vue - 单选题label

位置: 第44行

修改前:

<el-radio :label="option">

修改后:

<el-radio :label="String.fromCharCode(65 + index)">

2. questionEdit.vue - 多选题label

位置: 第59行

修改前:

<el-checkbox :label="option">

修改后:

<el-checkbox :label="String.fromCharCode(65 + index)">

3. questionEdit.vue - 选项保存格式

位置: buildOptionsPayload 方法

修改: 去除选项的 "A. "、"B. " 前缀

const list = this.optionsList.map(item => {
  if (!item) return '';
  const trimmed = item.trim();
  // 去除 "A. "、"B. " 前缀
  const prefixPattern = /^[A-F]\.\s*/;
  return trimmed.replace(prefixPattern, '');
}).filter(item => item);

4. questionEdit.vue - 答案格式化

位置: formatCorrectAnswer 方法

修改: 确保单选题只保存字母A、B、C

5. StudyScoreController.java - 答案判断

位置: normalizeSingleAnswer 方法

修改: 支持去除 "A. " 前缀,只比较字母


🚀 修复步骤

步骤1重新编译前端UI后台管理系统

cd C:\Users\Administrator\Desktop\Project\ry_study-v_03\Study-Vue-redis\ry-study-ui
npm run build:prod
# 或开发模式
npm run dev

步骤2重新编译后端

cd C:\Users\Administrator\Desktop\Project\ry_study-v_03\Study-Vue-redis
mvn clean package -DskipTests
# 重启后端服务

步骤3修复已有的错误数据

执行 SQLlog/Sql/fix_question_format.sql

重要步骤:

3.1 查看有问题的题目

SELECT 
    id,
    question_type,
    options,
    correct_answer
FROM study_question
WHERE options LIKE '%"A. %' OR options LIKE '%"B. %';

3.2 批量修复(谨慎!先备份!)

-- 备份
CREATE TABLE study_question_backup_20251205 AS 
SELECT * FROM study_question;

-- 修复考试14的题目
UPDATE study_question
SET 
    options = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        options,
        '"A. ', '"'),
        '"B. ', '"'),
        '"C. ', '"'),
        '"D. ', '"'),
        '"E. ', '"'),
        '"F. ', '"'),
    correct_answer = CASE 
        WHEN correct_answer LIKE 'A. %' THEN 'A'
        WHEN correct_answer LIKE 'B. %' THEN 'B'
        WHEN correct_answer LIKE 'C. %' THEN 'C'
        WHEN correct_answer LIKE 'D. %' THEN 'D'
        ELSE correct_answer
    END
WHERE exam_id = 14 AND question_type IN ('single', 'multiple');

3.3 验证修复结果

SELECT 
    id,
    options,
    correct_answer
FROM study_question
WHERE exam_id = 14;

应该看到:

options: ["选项内容1","选项内容2"]  ✅
correctAnswer: A  ✅

步骤4重新做题测试

  1. 登录App
  2. 做修复后的试卷
  3. 提交
  4. 查看成绩详情
  5. 检查:
    • 答对的题目显示绿色
    • 答错的题目显示红色
    • 正确答案正常显示

📋 测试清单

测试1新建题目

  1. 在后台管理系统新建一个试卷
  2. 添加题目(单选、多选、判断)
  3. 保存
  4. 执行SQL查看数据格式
    SELECT options, correct_answer 
    FROM study_question 
    WHERE id = {新建的题目ID};
    
  5. 预期结果:
    • options: ["选项1","选项2"]
    • correctAnswer: A

测试2编辑题目

  1. 编辑一个已有题目
  2. 修改选项和答案
  3. 保存
  4. 检查格式是否正确

测试3App端答题

  1. 在App做题
  2. 提交
  3. 查看成绩详情
  4. 预期结果:
    • 答案判断正确
    • 显示正确答案

⚠️ 注意事项

1. 数据迁移

已有的错误数据需要手动修复,不会自动更新。

2. 备份重要

修复数据前务必备份:

CREATE TABLE study_question_backup AS SELECT * FROM study_question;

3. 多选题答案顺序

多选题答案会自动排序A,B,C不影响判断。

4. 判断题

判断题不受影响,使用 "正确"/"错误"。


🔧 如果还有问题

问题A修复后还是不对

检查:

  1. 是否重新编译了前端UI
  2. 是否执行了SQL修复数据
  3. 是否清除了浏览器缓存?

问题B旧试卷也出问题了

原因: 可能误修复了旧数据

解决: 从备份恢复

问题C答案还是显示"暂无"

检查: 数据库中 correct_answer 字段是否为空

SQL

SELECT id, correct_answer FROM study_question WHERE correct_answer IS NULL;

📊 数据格式对比

正确格式

{
  "id": 149,
  "questionType": "single",
  "questionContent": "这是题干",
  "options": "[\"选项1\",\"选项2\",\"选项3\"]",
  "correctAnswer": "A"
}

错误格式(已修复)

{
  "id": 149,
  "questionType": "single",
  "questionContent": "这是题干",
  "options": "[\"A. 选项1\",\"B. 选项2\",\"C. 选项3\"]",
  "correctAnswer": "A. 选项1"
}

完成标志

当看到以下结果时,说明修复成功:

  1. 后台题目保存后SQL查询显示正确格式
  2. App端答题后判断结果正确
  3. 成绩详情显示正确答案
  4. 答对的题目显示绿色,答错的显示红色