篮球口袋教练 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
练习记录解决的是“已经做过什么”,训练计划解决的是“接下来如何安排”。当这两条线在界面上并列而不混写时,用户才能既看见建议,也看见属于自己的真实训练轨迹。
更多推荐



所有评论(0)