# 循环训练(简化版 + 配置持久化)实现概览 ## 做了什么 在「自由训练」并列新增**「循环训练」入口**,让用户自定义 每组时长 / 组数 / 组间休息(外加每周目标次数,仅作显示),并把这些设置**本地持久化**——下次打开直接沿用,无需重填。这正是你要的"简化版 + 至少要有循环训练设置的持久化"。 ## 核心设计 - **数据模型零入侵**:循环记录以 `planId:'circuit'` 落库,`getPlanDay` 不会把它算进每日计划进度;`duration` 仍存"有效撑总秒 = 组数×每组秒"(不含休息),排行榜 / 里程碑 / 统计零改动。 - **状态机独立**:`utils/circuitTimer.js` 是 `idle→working→resting→…→done` 的 FSM,复用现有 `Timer` 的 `Date.now` + `onAppShow` 前台补偿风格;`stop()` 返回有效撑总秒,直接复用 timer 页现有保存逻辑。 - **配置持久化**:`storage.getCircuitConfig / saveCircuitConfig` 存本地,含默认值与范围校验,不进云同步(纯设备偏好)。 - **阶段提示**:语音只有固定 6 个 key、无"第N组 / 休息"词,故阶段切换用**震动 + 屏上文本**提示,完成复用 `complete` 语音——不过度依赖 TTS。进度环在循环模式恒中性灰(避免每阶段都"已达标"变绿误导)。 ## 改动文件 | 文件 | 改动 | |---|---| | `utils/storage.js` | 加 circuit 配置读写(本地持久化) | | `utils/circuitTimer.js` | 新:循环状态机 | | `pages/timer/timer.{js,wxml,wxss}` | circuit 模式分支、状态条、阶段提示、完成/保存 | | `pages/index/index.{js,wxml,wxss}` | 「循环训练」入口 + 配置弹窗(stepper + 持久化) | | `utils/icons.js` | 加 `repeat` / `repeatFill` 图标 | | `pages/records/records.{js,wxml}` | 循环记录显示「循环 N组×Ms」 | ## 验证 - 6 个 JS 文件全部通过 `node --check`。 - 未改动 `plan.js` / 云函数 / 榜单 / 云同步逻辑,首提风险低。 ## 未做(可选后续) - 周频次硬追踪(仅存 `sessionsPerWeek` 作显示,未做"本周 X/N 次"计数) - 逐周自动进阶 - 设置页统一管理入口 ## 真机注意 - 环形进度用 countUp 动画,不进固定 rpx 盒,规避字体缩放溢出(首页 `_readFontScale` 思路已避开)。 - 主色 / 渐变底图标用 White 变体;`repeatFill` 为橙主题色,在 ghost 按钮浅底 OK。