移动端清单、测量记录、模版、图表和日报。公开前端部署于 GitHub Pages;记录存储在私有仓库。没有令牌时仅显示登录页。
需要 Node.js 20 或更新版本,无第三方构建依赖。
npm run build
npm run check
npm test编辑 src/,不要直接编辑 index.html。构建脚本按照 src/build.json 中的顺序把样式与脚本内联,发布产物仍为单个 HTML。脚本模块目前共享编译后的作用域;这是一次保留现有行为的拆分,没有改为框架或运行时动态加载。
生成文件内含源码及构建脚本的 SHA-256。--check 会逐字节比较生成结果;只改 HTML 或忘记构建都会失败。提交必须同时包含源码和产物。.nojekyll 保留。
GitHub Actions 自动执行一致性检查和回归测试。仓库当前使用 main 分支的 Pages 发布方式,验证工作流本身不是分支保护规则,不能阻止别人绕过检查直接发布;协作者必须遵守 AGENTS.md。不要把“检查工作流失败”误认为“Pages 一定不会更新”。
src/index.template.html:页面结构。src/styles/:样式;保留原样式顺序以避免视觉回归。src/app/store.js:本机缓存、操作队列、会话和同步状态。src/app/storage-files.js:GitHub API、文件路由、SHA/ETag、冲突重试和按需读取。src/app/tasks.js、scheduling.js、template-model.js:基础事项、排程和模版规则。today.js、interaction.js、dialogs.js、templates.js:清单与触控交互。charts.js、history.js、reports.js:图表、历史和导出。lifecycle.js:跨日、前后台同步、自动更新;main.js最后启动应用。tests/:使用虚构记录的 API 和 DOM 模拟测试,不连接正式数据。
私有仓库固定为 SYQ1001/dc-9f2a-data:
| 文件 | 内容 |
|---|---|
meta.json |
schema、数据代次、配置与日期路径约定 |
config.json |
模版和共享配置 |
days/YYYY/MM/DD.json |
当天事项及当天指标 |
数据文件格式为 { "schema": 2, "epoch": "daily-v2-20260913", "entries": {} }。entries 仍然是扁平键;config 前缀只进配置文件,days/vitals 的同一日期进入同一个日文件。meta 文件不含记录。
每个文件独立维护 SHA、ETag 和缓存。操作立即持久保存,按文件组成批次,顺序提交。提交前读最新文件,SHA 冲突重新合并;回包丢失可安全重放;部分文件成功不会清除其他文件的待上传操作。打勾和跳过按后写生效,配置的同字段分歧仍需选择。
前台 20 秒检查配置和今天;条件请求使用 ETag。历史目录和过去日期只在打开历史/图表或选择日期时按需获取,不参加 20 秒轮询。趋势不另建派生汇总文件。
已登录设备用云端缓存离线显示,修改进持久队列。令牌保存在 care.sync.github.v1;新缓存和队列使用 care.shared.cache.v4、care.shared.sync.v4。缓存只有云端副本,队列覆盖在渲染结果上,不是独立本地模式。退出会检查未上传修改,确认后清除会话缓存和队列。
浏览器在关闭或后台时可能中断请求,后台提交只能尽力;持久队列在再次打开并联网后继续同步。尚未建立新版缓存的设备,第一次进入新版需要联网。
本次切换之前只有测试记录,因此不迁移旧数据。新版忽略并清除旧测试缓存/队列,保留令牌和 UI 偏好。新代次的记录不会在后续正常更新时清除。
旧 data.json 暂时保留为隔离的测试入口,新版绝不读取或写入。这样旧版仍可上传它的测试队列,然后按原有机制自动刷新。立即把旧文件改成墓碑,会导致旧队列无法完成,进而阻挡旧代码的自动更新。
自动更新在页面打开、回前台、联网和前台定期检查时运行,确认新版且没有输入、弹窗、未同步修改时刷新。不能远程唤醒关闭或被系统挂起的页面;若极旧客户端没有自动更新逻辑,或旧测试队列已有无法自动解决的冲突,也不能靠发布新代码强迫它刷新。无需重新添加主屏幕图标。
测试覆盖登录/离线缓存/重开补传、跨文件部分失败、跨日、多设备 SHA 冲突、编辑中提交、回包丢失、路径校验、15 秒超时、模版只读和餐后联动、事项详情删除、惯性滚动触控及自动更新保护。触摸测试为事件模拟,真实 iPhone 手感仍需设备验证。