:练习记录与体能训练计划)
“今天练了什么”只有在能回看、能统计时才有价值。篮球口袋教练将练习记录作为独立数据项保存练习页负责录入与展示统计页从同一组记录计算总次数、总时长、平均评分和本周次数。训练计划则作为课程内容提供方法不与用户实际完成记录混为一谈。一、记录模型保存一次训练的事实练习记录至少包含类型、内容、时长、评分和时间。保存时由服务读取现有列表、追加新记录再同步更新响应式状态和持久化数据页面刷新不需要重新拼装不同来源的临时变量。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练习记录解决的是“已经做过什么”训练计划解决的是“接下来如何安排”。当这两条线在界面上并列而不混写时用户才能既看见建议也看见属于自己的真实训练轨迹。