篮球口袋教练 HarmonyOS 学习应用(05):练习记录与体能训练计划

📅 2026/7/28 16:13:42 👁️ 阅读次数 📝 编程学习
篮球口袋教练 HarmonyOS 学习应用(05):练习记录与体能训练计划

“今天练了什么”只有在能回看、能统计时才有价值。篮球口袋教练将练习记录作为独立数据项保存,练习页负责录入与展示,统计页从同一组记录计算总次数、总时长、平均评分和本周次数。训练计划则作为课程内容提供方法,不与用户实际完成记录混为一谈。

一、记录模型保存一次训练的事实

练习记录至少包含类型、内容、时长、评分和时间。保存时由服务读取现有列表、追加新记录,再同步更新响应式状态和持久化数据;页面刷新不需要重新拼装不同来源的临时变量。

static add(log: PracticeLog): void { const logs = PracticeLogService.all() logs.unshift(log) AppStorage.setOrCreate(StorageKeys.PRACTICE_LOGS, logs) PreferencesHelper.get().persist(StorageKeys.PRACTICE_LOGS, logs) }
数据用途不能替代什么
练习类型与内容说明训练做了什么不是课程完成状态
时长汇总训练投入不是视频播放时长
满意度回顾主观感受不是考试成绩
时间戳计算本周和历史统计不是训练计划日期

二、计划内容与实际记录各司其职

体能训练课程给出“一周训练安排”的方法:2 天技术、2 天体能、1 天实战、1 天投篮、1 天恢复。它帮助用户安排节奏,但不会自动生成练习记录。只有用户保存真实训练内容,统计页面才增加次数和时长。

这种区分避免了一个常见误导:用户看过计划,不等于已经完成计划;用户新增一条记录,也不等于完成整周安排。两种数据保留各自的含义,复盘时才不会把建议当成事实。

三、运行回读的记录链路

模拟器中新增并保存了一条“体能训练”记录,内容为“核心力量与折返跑训练”,时长 30 分钟,满意度 3 星。重启应用后,练习记录页回读到总次数 1、总时长 30 分钟、平均评分 3.0、本周 1 次和完整记录卡片。由此可知该记录不是仅存在于当前页面内存。

四、为什么统计应从原始记录计算

总次数、总时长和平均评分都是派生结果。若把它们和原始记录分别保存,删除或修正一条记录时容易发生不一致。更稳妥的方式是保存原始日志,在需要展示时按统一规则计算汇总;空列表则返回清晰的零值和空状态。

const totalMinutes = logs.reduce((sum, item) => sum + item.duration, 0) const averageRating = logs.length === 0 ? 0 : logs.reduce((sum, item) => sum + item.rating, 0) / logs.length

练习记录解决的是“已经做过什么”,训练计划解决的是“接下来如何安排”。当这两条线在界面上并列而不混写时,用户才能既看见建议,也看见属于自己的真实训练轨迹。