peixue-dev/Archive/[一次性]考核功能数据异常修复方案-2026-02-26.md

5.6 KiB
Raw Permalink Blame History

考核功能"数据操作异常"问题修复方案

创建时间2026-02-26
问题:陪伴员点击"开始考核"后显示"数据操作异常"


问题分析

现象

  1. 前端显示"数据操作异常"
  2. 后端返回 200 状态码,但 data 为空对象 {}
  3. 数据库日志显示查询成功Total: 1

根本原因

数据库中没有考核题目数据,导致 startExam() 方法中:

List<ExamQuestion> allQuestions = examQuestionMapper.selectList(wrapper);
// allQuestions 为空列表
Collections.shuffle(allQuestions);
List<ExamQuestion> selectedQuestions = allQuestions.stream()
    .limit(10)
    .collect(Collectors.toList());
// selectedQuestions 也为空,无法创建考核

解决方案

方案1添加考核题目数据推荐

步骤1检查数据

执行SQLArchive/[一次性]检查考核题目数据-2026-02-26.sql

步骤2创建题目数据

如果题目不足,需要添加考核题目。每个等级至少需要 10 道题。

示例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() 方法,添加数据验证:

@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 的错误处理:

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. 检查数据

    # 在数据库中执行
    mysql -u root -p peidu < Archive/[一次性]检查考核题目数据-2026-02-26.sql
    
  2. 添加题目数据

    • 如果题目不足创建并执行插入SQL
    • 每个等级king/gold至少添加 10 道题
  3. 重新测试

    • 陪伴员登录
    • 点击"开始考核"
    • 验证能否正常进入考核页面

后续优化

  1. 添加后端验证

    • startExam() 方法中添加题目数量检查
    • 返回友好的错误提示
  2. 前端优化

    • 改进错误提示信息
    • 添加数据完整性检查
  3. 管理后台

    • 添加题目管理功能
    • 支持在线添加/编辑考核题目

预期结果

修复后:

  • 陪伴员点击"开始考核"能正常进入考核页面
  • 显示题目内容和选项
  • 能够正常答题和提交
  • 完成考核后显示成绩

相关文件

  • 后端Servicepeidu/backend/src/main/java/com/peidu/service/ExamService.java
  • 后端Controllerpeidu/backend/src/main/java/com/peidu/controller/ExamController.java
  • 前端页面:peidu/uniapp/src/teacher-package/pages/exam/test.vue
  • API接口peidu/uniapp/api/teacherLevel.js
  • 检查SQLArchive/[一次性]检查考核题目数据-2026-02-26.sql

修复优先级: P0紧急
预计修复时间: 30分钟添加题目数据