# BBB · Body Building Buddy > 中文、纯本地的健身训练与进度追踪 PWA。入口:https://bbb.ku3600.top/ ## 应用功能 - **今天**:查看当天训练、热身、有氧或休息安排;训练日可逐组记录并查看训练小结。 - **进度**:查看训练与体重趋势,回看每日记录。 - **饮食**:根据个人资料和训练安排计算热量目标并提供搭配参考;不记录食物或饮水。 - **设置**:编辑个人资料、训练周期、训练与热身模板;导入、导出或清空本机数据。 ## 数据与隐私边界 - 训练记录、个人资料和设置只保存在当前浏览器的 `localStorage`,不会上传或跨设备同步;清除浏览器数据可能导致记录丢失,可在“设置 → 数据”导出 JSON 备份。 - 仅能访问网络的 Agent 无法读取用户设备上的记录。要管理现有记录,Agent 必须能操作保存这些记录的同一个 BBB 浏览器页面并在该页面执行 JavaScript;另开一个隔离浏览器或仅打开分享链接不等于获得数据访问权。 - 不要将本地记录或备份发给 BBB 以外的服务。只读取完成用户请求所需的数据;用户未明确要求时不要读取或导出个人记录。 - 仅在用户明确要求时写入记录或修改设置;写入前确认日期与具体内容。删除模板、热身、动作或活动记录,以及覆盖导入、清空数据前必须再次确认。技术参数 `{ confirmed: true }` 不代替用户授权。 ## 页面内本地 API 页面加载后可通过 `window.BBB` 调用同步接口。它不是 HTTP 服务,不接受跨进程或其他网站的直接调用。先读取 `getCapabilities()` 确认当前版本支持的方法;只按任务需要读取数据,勿为方便而导出完整状态。 ```js window.BBB.getCapabilities(); window.BBB.getDayPlan('YYYY-MM-DD'); window.BBB.getWorkout('YYYY-MM-DD'); window.BBB.recordSet('YYYY-MM-DD', '动作ID', 1, { weight: 40, reps: 10 }); ``` 也可使用统一入口: ```js window.BBB.handle({ id: 'req-1', method: 'getDayPlan', params: ['YYYY-MM-DD'] }); ``` 成功返回 `{ id, ok: true, result }`;失败返回 `{ id, ok: false, error: { name, message } }`。查询结果是副本,修改副本不会改动应用数据。写入会保存到本机并刷新页面;保存失败会返回错误。 ### 能力速查 - **只读**:`getCapabilities`、`getSnapshot`、`getDayPlan(date?)`、`getWorkout(date?)`、`getProgress(from, to?)`、`getDietPlan(date?)`、`getActivitySessions(from?, to?)`、`getBodyweightLog(from?, to?)`、`getTemplates`、`getWarmups`、`getExerciseLibrary`、`exportJSON`。 - **训练记录**:`startWorkout(date)`、`recordSet(date, exId, setNumber, values)`、`undoSet(date, exId)`、`setWarmupItem(date, zeroBasedIndex, done)`、`finishWorkout(date)`。 - **攀岩/有氧记录**:`recordActivitySession(session)`、`deleteActivitySession(id, { confirmed: true })`。活动日期为 `YYYY-MM-DD`;活动类型为 `climbing` 或 `cardio`,需提供 `durationMinutes`。攀岩入口会根据模板安排和实际记录自动显示;攀岩记录还可含类型、难度体系与线路列表。 - **体重、资料、饮食设置**:`logBodyweight(value)`、`setBodyweight(date, value)`、`updateProfile(fields)`、`updateDietSettings(fields)`。 - **训练模板**:`createTemplate(template)`、`updateTemplate(id, template)`、`duplicateTemplate(id)`、`setActiveTemplate(id, startDate?)`、`restartProgram(startDate?)`、`deleteTemplate(id, { confirmed: true })`、`setDayWarmup(templateId, weekday, warmupId)`。 - **热身与动作库**:`createWarmup(warmup)`、`updateWarmup(id, warmup)`、`duplicateWarmup(id)`、`deleteWarmup(id, { confirmed: true })`;`createCustomExercise(exercise)`、`updateCustomExercise(id, exercise)`、`deleteCustomExercise(id, { confirmed: true })`。 - **数据管理**:`importData(state, { confirmed: true })`、`resetData({ confirmed: true })`。导入会覆盖当前数据。 日期统一使用 `YYYY-MM-DD`。`recordSet` 的组号从 1 开始,按计划顺序记录;重量动作传 `{ weight, reps }`,保持动作传 `{ reps }`。重复提交已存在的组会返回 `alreadyRecorded: true`,不会追加。 模板形状为 `{ name, description, weeks, days }`;`days` 必须包含周日到周六各一天,`weekday` 为 0–6,`dayType` 为 `train`/`cardio`/`rest`,训练动作项为 `{ exId, sets, reps, rir }`。动作和热身 ID 必须来自现有库。 `recordActivitySession` 接受 `{ date, type, durationMinutes, rpe?, venue?, notes?, routes?, mode?, gradeSystem? }`;`type` 为 `climbing`/`cardio`,攀岩线路项可含 `{ grade, attempts, sent, style, note }`。`createWarmup` 接受 `{ name, description, items: [{ name, detail }] }`;自定义动作接受 `{ name, type, sets?, reps?, rir?, rest?, unit?, note?, main? }`,`type` 为 `straight`/`unilateral`/`bodyweight`/`hold`。`updateProfile` 支持 `bodyweight`、`height`、`age`、`gender`、`neatLevel`;`updateDietSettings` 支持 `trainingMode`、`trainingKcalManual`、`dietGoal`。 当前不支持实际饮食日志。所有接口仅作用于当前设备、当前 BBB 页面;不会进行远程访问或跨设备同步。