286 lines
5.9 KiB
Markdown
286 lines
5.9 KiB
Markdown
# 题目格式问题修复完整说明
|
||
|
||
## 🔍 问题分析
|
||
|
||
### 问题现象
|
||
1. ❌ 所有新试卷的题目判断为错误
|
||
2. ❌ 成绩详情显示"正确答案:暂无"
|
||
3. ✅ 旧试卷(修改前的)正常工作
|
||
4. ❌ 新试卷(修改后的)不工作
|
||
|
||
### 根本原因
|
||
在题目编辑页面中,选项和答案保存格式错误:
|
||
|
||
**错误格式(修改后):**
|
||
```json
|
||
{
|
||
"options": "[\"A. 选项内容1\", \"B. 选项内容2\", \"C. 选项内容3\"]",
|
||
"correctAnswer": "A. 选项内容1"
|
||
}
|
||
```
|
||
|
||
**正确格式(应该是):**
|
||
```json
|
||
{
|
||
"options": "[\"选项内容1\", \"选项内容2\", \"选项内容3\"]",
|
||
"correctAnswer": "A"
|
||
}
|
||
```
|
||
|
||
### 为什么旧试卷正常
|
||
旧试卷保存的格式是正确的,没有 "A. " 前缀。
|
||
|
||
---
|
||
|
||
## ✅ 已修复的代码
|
||
|
||
### 1. questionEdit.vue - 单选题label
|
||
**位置:** 第44行
|
||
|
||
**修改前:**
|
||
```vue
|
||
<el-radio :label="option">
|
||
```
|
||
|
||
**修改后:**
|
||
```vue
|
||
<el-radio :label="String.fromCharCode(65 + index)">
|
||
```
|
||
|
||
### 2. questionEdit.vue - 多选题label
|
||
**位置:** 第59行
|
||
|
||
**修改前:**
|
||
```vue
|
||
<el-checkbox :label="option">
|
||
```
|
||
|
||
**修改后:**
|
||
```vue
|
||
<el-checkbox :label="String.fromCharCode(65 + index)">
|
||
```
|
||
|
||
### 3. questionEdit.vue - 选项保存格式
|
||
**位置:** buildOptionsPayload 方法
|
||
|
||
**修改:** 去除选项的 "A. "、"B. " 前缀
|
||
|
||
```javascript
|
||
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(后台管理系统)
|
||
```bash
|
||
cd C:\Users\Administrator\Desktop\Project\ry_study-v_03\Study-Vue-redis\ry-study-ui
|
||
npm run build:prod
|
||
# 或开发模式
|
||
npm run dev
|
||
```
|
||
|
||
### 步骤2:重新编译后端
|
||
```bash
|
||
cd C:\Users\Administrator\Desktop\Project\ry_study-v_03\Study-Vue-redis
|
||
mvn clean package -DskipTests
|
||
# 重启后端服务
|
||
```
|
||
|
||
### 步骤3:修复已有的错误数据
|
||
执行 SQL:`log/Sql/fix_question_format.sql`
|
||
|
||
**重要步骤:**
|
||
|
||
#### 3.1 查看有问题的题目
|
||
```sql
|
||
SELECT
|
||
id,
|
||
question_type,
|
||
options,
|
||
correct_answer
|
||
FROM study_question
|
||
WHERE options LIKE '%"A. %' OR options LIKE '%"B. %';
|
||
```
|
||
|
||
#### 3.2 批量修复(谨慎!先备份!)
|
||
```sql
|
||
-- 备份
|
||
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 验证修复结果
|
||
```sql
|
||
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查看数据格式:
|
||
```sql
|
||
SELECT options, correct_answer
|
||
FROM study_question
|
||
WHERE id = {新建的题目ID};
|
||
```
|
||
5. 预期结果:
|
||
- options: `["选项1","选项2"]` ✅
|
||
- correctAnswer: `A` ✅
|
||
|
||
### 测试2:编辑题目
|
||
1. 编辑一个已有题目
|
||
2. 修改选项和答案
|
||
3. 保存
|
||
4. 检查格式是否正确
|
||
|
||
### 测试3:App端答题
|
||
1. 在App做题
|
||
2. 提交
|
||
3. 查看成绩详情
|
||
4. 预期结果:
|
||
- 答案判断正确 ✅
|
||
- 显示正确答案 ✅
|
||
|
||
---
|
||
|
||
## ⚠️ 注意事项
|
||
|
||
### 1. 数据迁移
|
||
已有的错误数据需要手动修复,不会自动更新。
|
||
|
||
### 2. 备份重要
|
||
修复数据前务必备份:
|
||
```sql
|
||
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:**
|
||
```sql
|
||
SELECT id, correct_answer FROM study_question WHERE correct_answer IS NULL;
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 数据格式对比
|
||
|
||
### 正确格式
|
||
```json
|
||
{
|
||
"id": 149,
|
||
"questionType": "single",
|
||
"questionContent": "这是题干",
|
||
"options": "[\"选项1\",\"选项2\",\"选项3\"]",
|
||
"correctAnswer": "A"
|
||
}
|
||
```
|
||
|
||
### 错误格式(已修复)
|
||
```json
|
||
{
|
||
"id": 149,
|
||
"questionType": "single",
|
||
"questionContent": "这是题干",
|
||
"options": "[\"A. 选项1\",\"B. 选项2\",\"C. 选项3\"]",
|
||
"correctAnswer": "A. 选项1"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## ✅ 完成标志
|
||
|
||
当看到以下结果时,说明修复成功:
|
||
|
||
1. ✅ 后台题目保存后,SQL查询显示正确格式
|
||
2. ✅ App端答题后,判断结果正确
|
||
3. ✅ 成绩详情显示正确答案
|
||
4. ✅ 答对的题目显示绿色,答错的显示红色
|