guoyu/_已清理文件备份_周六 22512/md/修复APP学习进度显示问题.md
2025-12-06 20:11:36 +08:00

7.0 KiB
Raw Blame History

修复APP学习进度显示问题

🎯 问题描述

现象:

  • APP显示学习进度14.29%
  • HBuilder控制台输出18%
  • 后台管理界面显示:18%

问题: APP端显示的进度与后端计算的进度不一致


🔍 问题原因

根本原因:前端重新计算了进度

APP端pages/course/detail.vue

// 前端重新计算进度第658-789行
calculateCourseProgress() {
    // ... 复杂的判断逻辑
    this.courseProgress = Math.round((completedCount / totalCount) * 100)
    // 结果14.29%
}

后端StudyLearningRecordServiceImpl.java

// 后端已经计算好了进度
private BigDecimal calculateCourseProgress(Long studentId, Long courseId) {
    // 已完成课件数 / 总课件数 * 100
    return progress; // 18.00
}

问题:

  1. 后端返回了准确的进度值:learningRecord.progress = 18.00
  2. APP端没有使用后端的值而是重新计算
  3. 前端和后端的判断标准不完全一致
  4. 导致显示差异14.29% vs 18%

修复内容

文件: fronted_uniapp/pages/course/detail.vue

修改1loadLearningRecord方法第635行

修改前:

async loadLearningRecord() {
    const record = records.find(r => r.courseId === this.courseId)
    if (record) {
        this.learningRecord = record
        // ❌ 没有设置 courseProgress
    }
}

修改后:

async loadLearningRecord() {
    const record = records.find(r => r.courseId === this.courseId)
    if (record) {
        this.learningRecord = record
        // ✅ 直接使用后端返回的进度值
        this.courseProgress = Math.round(record.progress || 0)
        console.log('[课程学习] ✅ 学习记录已加载:', {
            progress: record.progress,
            courseProgress: this.courseProgress
        })
    } else {
        this.courseProgress = 0
    }
}

修改2calculateCourseProgress方法第665-789行

修改前:

calculateCourseProgress() {
    // ❌ 前端重新计算进度120行复杂逻辑
    const totalCount = this.coursewareList.length
    let completedCount = 0
    
    // ... 遍历课件,判断是否完成
    
    this.courseProgress = Math.round((completedCount / totalCount) * 100)
    // 结果14.29%
}

修改后:

calculateCourseProgress() {
    // ✅ 不再前端计算直接使用后端返回的progress
    console.log('[课程学习]  使用后端计算的进度:', this.courseProgress + '%')
    return
    
    /* 已废弃的前端计算逻辑(已注释)
    ... 120行代码 ...
    */
}

📊 效果对比

修复前:

位置 显示进度 来源
APP端 14.29% 前端重新计算
HBuilder控制台 18% 后端计算
后台管理 18% 后端计算

问题: APP显示不一致


修复后:

位置 显示进度 来源
APP端 18% 后端计算
HBuilder控制台 18% 后端计算
后台管理 18% 后端计算

结果: 所有端显示一致


🔍 为什么会出现差异?

前端计算逻辑(已废弃):

// 视频完成标准(前端)
isCompleted = videoPosition >= realDuration * 0.9  // 观看90%即算完成

// 或者特殊判断
if (videoPosition === maxPositionFromHistory && videoPosition >= 3) {
    isCompleted = true  // 播放到最大位置即算完成
}

后端计算逻辑(正确):

// 视频完成标准(后端)
if (duration <= 0 && videoPosition >= 3) {
    isCompleted = true;  // 无配置时长播放3秒即完成
} else if (realDuration > 0 && videoPosition >= realDuration * 0.9) {
    isCompleted = true;  // 观看90%即算完成
}

差异原因:

  1. 前端使用 maxPositionFromHistory(历史最大播放位置)判断
  2. 后端使用 videoPosition(当前播放位置)和配置的 duration 判断
  3. 判断标准略有不同,导致完成状态判断不一致
  4. 最终进度计算结果不同

解决方案的优势

1. 统一数据源

  • 所有端都使用后端计算的进度
  • 避免前后端不一致

2. 减少重复计算

  • 前端不需要重新计算复杂的进度逻辑
  • 减少代码复杂度
  • 提高性能

3. 易于维护

  • 进度计算逻辑只在后端维护
  • 前端只负责显示
  • 后续修改只需改后端

4. 数据准确

  • 后端有完整的数据库数据
  • 计算更精确
  • 前端可能数据不完整

🧪 测试验证

测试步骤:

  1. 保存修改后的文件

    fronted_uniapp/pages/course/detail.vue
    
  2. 重新运行APP

    HBuilderX → 运行 → 运行到手机或模拟器
    
  3. 查看学习记录

    打开APP → 我的 → 学习记录
    
  4. 验证进度显示

    检查显示的进度是否与后台一致
    

预期结果:

✅ APP显示18%
✅ 控制台输出18%
✅ 后台管理18%
✅ 三者一致

📝 补充说明

关于 calculateCourseProgress 方法

虽然该方法已被废弃(改为直接使用后端进度),但代码中仍有多处调用:

// 这些调用仍然存在,但方法内部已改为直接返回
this.calculateCourseProgress()  // 约7处调用

为什么不删除调用?

  1. 保持代码结构完整
  2. 避免影响其他逻辑
  3. 方法内部已改为空操作直接return
  4. 不会产生副作用

如果需要清理:

// 可以删除所有 calculateCourseProgress() 调用
// 但必须确保 loadLearningRecord() 在所有需要显示进度的地方都被调用

🎯 核心改变总结

项目 修改前 修改后
进度来源 前端计算 后端返回
计算位置 calculateCourseProgress loadLearningRecord
显示值 14.29% 18%
一致性 不一致 一致
代码复杂度 120行计算逻辑 1行赋值

📞 验证清单

  • 文件已保存
  • APP已重新运行
  • 查看学习记录页面
  • 查看课程详情页面
  • 查看首页课程列表
  • 检查进度是否为18%
  • 检查是否与后台一致
  • 检查控制台日志

修复完成时间: 2025-12-05 18:00

修复文件:

  • fronted_uniapp/pages/course/detail.vue

影响范围:

  • 课程详情页面的学习进度显示
  • 学习记录页面的进度显示
  • 首页课程列表的进度显示

后续建议:

  • 其他页面也应检查是否使用了前端计算进度
  • 统一使用后端返回的 progress 字段

总结APP端学习进度显示问题已修复现在APP、控制台、后台三者显示一致。