191 lines
5.6 KiB
Markdown
191 lines
5.6 KiB
Markdown
|
|
# 考核功能"数据操作异常"问题修复方案
|
|||
|
|
|
|||
|
|
> 创建时间:2026-02-26
|
|||
|
|
> 问题:陪伴员点击"开始考核"后显示"数据操作异常"
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 问题分析
|
|||
|
|
|
|||
|
|
### 现象
|
|||
|
|
1. 前端显示"数据操作异常"
|
|||
|
|
2. 后端返回 200 状态码,但 `data` 为空对象 `{}`
|
|||
|
|
3. 数据库日志显示查询成功(Total: 1)
|
|||
|
|
|
|||
|
|
### 根本原因
|
|||
|
|
**数据库中没有考核题目数据**,导致 `startExam()` 方法中:
|
|||
|
|
```java
|
|||
|
|
List<ExamQuestion> allQuestions = examQuestionMapper.selectList(wrapper);
|
|||
|
|
// allQuestions 为空列表
|
|||
|
|
Collections.shuffle(allQuestions);
|
|||
|
|
List<ExamQuestion> selectedQuestions = allQuestions.stream()
|
|||
|
|
.limit(10)
|
|||
|
|
.collect(Collectors.toList());
|
|||
|
|
// selectedQuestions 也为空,无法创建考核
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 解决方案
|
|||
|
|
|
|||
|
|
### 方案1:添加考核题目数据(推荐)
|
|||
|
|
|
|||
|
|
#### 步骤1:检查数据
|
|||
|
|
执行SQL:`Archive/[一次性]检查考核题目数据-2026-02-26.sql`
|
|||
|
|
|
|||
|
|
#### 步骤2:创建题目数据
|
|||
|
|
如果题目不足,需要添加考核题目。每个等级至少需要 10 道题。
|
|||
|
|
|
|||
|
|
**示例SQL:**
|
|||
|
|
```sql
|
|||
|
|
-- 插入金牌陪伴员考核题目
|
|||
|
|
INSERT INTO exam_question (level, question_type, question_content, option_a, option_b, option_c, option_d, correct_answer, score, deleted) VALUES
|
|||
|
|
('king', 'single', '陪伴员的首要职责是什么?', '完成教学任务', '关注学生身心健康', '提高学生成绩', '维护课堂纪律', 'B', 10, 0),
|
|||
|
|
('king', 'single', '面对情绪低落的学生,应该如何处理?', '忽略情绪,继续上课', '耐心倾听,给予关怀', '批评学生不专心', '通知家长处理', 'B', 10, 0),
|
|||
|
|
('king', 'single', '陪伴员应该如何与家长沟通?', '只报告问题', '定期反馈,积极沟通', '避免沟通', '只在家长询问时回复', 'B', 10, 0),
|
|||
|
|
-- ... 继续添加更多题目,至少10题
|
|||
|
|
;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 方案2:添加数据验证(临时方案)
|
|||
|
|
|
|||
|
|
修改 `ExamService.startExam()` 方法,添加数据验证:
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@Transactional
|
|||
|
|
public Map<String, Object> startExam(Long teacherId, String targetLevel) {
|
|||
|
|
// 查询题目
|
|||
|
|
LambdaQueryWrapper<ExamQuestion> wrapper = new LambdaQueryWrapper<>();
|
|||
|
|
wrapper.eq(ExamQuestion::getLevel, targetLevel);
|
|||
|
|
wrapper.eq(ExamQuestion::getDeleted, 0);
|
|||
|
|
List<ExamQuestion> allQuestions = examQuestionMapper.selectList(wrapper);
|
|||
|
|
|
|||
|
|
// ✅ 添加数据验证
|
|||
|
|
if (allQuestions == null || allQuestions.size() < 10) {
|
|||
|
|
throw new RuntimeException("考核题目不足,请联系管理员添加题目(当前题目数:" +
|
|||
|
|
(allQuestions == null ? 0 : allQuestions.size()) + ",需要:10)");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ... 后续代码
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 方案3:前端优化错误提示
|
|||
|
|
|
|||
|
|
修改前端 `test.vue` 的错误处理:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
async startExam() {
|
|||
|
|
try {
|
|||
|
|
this.loading = true
|
|||
|
|
const res = await examApi.start({ targetLevel: this.targetLevel })
|
|||
|
|
|
|||
|
|
if (res.code === 200 && res.data) {
|
|||
|
|
// 检查返回数据是否完整
|
|||
|
|
if (!res.data.examRecordId) {
|
|||
|
|
uni.showModal({
|
|||
|
|
title: '数据异常',
|
|||
|
|
content: '考核题目数据不完整,请联系管理员',
|
|||
|
|
showCancel: false,
|
|||
|
|
success: () => {
|
|||
|
|
uni.navigateBack()
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
this.examRecordId = res.data.examRecordId
|
|||
|
|
this.totalQuestions = res.data.totalQuestions
|
|||
|
|
this.remainingTime = res.data.duration
|
|||
|
|
|
|||
|
|
// 开始倒计时
|
|||
|
|
this.startTimer()
|
|||
|
|
|
|||
|
|
// 加载第一题
|
|||
|
|
await this.loadNextQuestion()
|
|||
|
|
} else {
|
|||
|
|
uni.showToast({
|
|||
|
|
title: res.message || '开始考核失败',
|
|||
|
|
icon: 'none'
|
|||
|
|
})
|
|||
|
|
setTimeout(() => {
|
|||
|
|
uni.navigateBack()
|
|||
|
|
}, 1500)
|
|||
|
|
}
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('开始考核失败:', error)
|
|||
|
|
uni.showToast({
|
|||
|
|
title: error.message || '网络错误',
|
|||
|
|
icon: 'none',
|
|||
|
|
duration: 3000
|
|||
|
|
})
|
|||
|
|
setTimeout(() => {
|
|||
|
|
uni.navigateBack()
|
|||
|
|
}, 3000)
|
|||
|
|
} finally {
|
|||
|
|
this.loading = false
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 实施步骤
|
|||
|
|
|
|||
|
|
### 立即执行(推荐)
|
|||
|
|
|
|||
|
|
1. **检查数据**
|
|||
|
|
```bash
|
|||
|
|
# 在数据库中执行
|
|||
|
|
mysql -u root -p peidu < Archive/[一次性]检查考核题目数据-2026-02-26.sql
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **添加题目数据**
|
|||
|
|
- 如果题目不足,创建并执行插入SQL
|
|||
|
|
- 每个等级(king/gold)至少添加 10 道题
|
|||
|
|
|
|||
|
|
3. **重新测试**
|
|||
|
|
- 陪伴员登录
|
|||
|
|
- 点击"开始考核"
|
|||
|
|
- 验证能否正常进入考核页面
|
|||
|
|
|
|||
|
|
### 后续优化
|
|||
|
|
|
|||
|
|
1. **添加后端验证**
|
|||
|
|
- 在 `startExam()` 方法中添加题目数量检查
|
|||
|
|
- 返回友好的错误提示
|
|||
|
|
|
|||
|
|
2. **前端优化**
|
|||
|
|
- 改进错误提示信息
|
|||
|
|
- 添加数据完整性检查
|
|||
|
|
|
|||
|
|
3. **管理后台**
|
|||
|
|
- 添加题目管理功能
|
|||
|
|
- 支持在线添加/编辑考核题目
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 预期结果
|
|||
|
|
|
|||
|
|
修复后:
|
|||
|
|
- ✅ 陪伴员点击"开始考核"能正常进入考核页面
|
|||
|
|
- ✅ 显示题目内容和选项
|
|||
|
|
- ✅ 能够正常答题和提交
|
|||
|
|
- ✅ 完成考核后显示成绩
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 相关文件
|
|||
|
|
|
|||
|
|
- 后端Service:`peidu/backend/src/main/java/com/peidu/service/ExamService.java`
|
|||
|
|
- 后端Controller:`peidu/backend/src/main/java/com/peidu/controller/ExamController.java`
|
|||
|
|
- 前端页面:`peidu/uniapp/src/teacher-package/pages/exam/test.vue`
|
|||
|
|
- API接口:`peidu/uniapp/api/teacherLevel.js`
|
|||
|
|
- 检查SQL:`Archive/[一次性]检查考核题目数据-2026-02-26.sql`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**修复优先级:** P0(紧急)
|
|||
|
|
**预计修复时间:** 30分钟(添加题目数据)
|
|||
|
|
|