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. ✅ 答对的题目显示绿色,答错的显示红色
|