feat: 补齐 Garmin 未同步的数据,并各自配上界面
审计 57 个接口后,把账号里真有数据却从未入库的部分补上。全部走同步模块, 界面只读本地库。 新增数据 - 体重与身体成分(体脂率/肌肉量/体水分/骨量/内脏脂肪/代谢年龄) - 血压(接口通,账号暂无记录) - 跑步成绩预测(5 公里 / 10 公里 / 半马 / 全马) - 爬坡分、饮水量、出汗量 → health_data 新增七列 - 全天曲线:心率 / 压力 / 身体电量 / 呼吸 / 血氧 - 挑战赛(徽章挑战与好友挑战,与一次性的徽章不同,有周期和进度) - 已配对设备 新增界面 - /body/ 身体成分:体重大数字 + BMI 分级 + 体脂肌肉曲线 + 血压表格 - /race/ 成绩预测:四个距离的预测成绩与配速,以及预测随时间的变化 - /challenges/ 挑战赛:按类型筛选,有目标的显示进度条 - /devices/ 已配对设备 - 每日页新增「全天曲线」,这是存日内采样的主要目的 - 健康页新增「身体成分」分组与「更多」入口,运动页加挑战赛与成绩预测入口 同步开销 - 日内曲线每天五个请求,14 天以内的同步顺带拉,更长的历史交给后台 「补齐详细数据」,否则一年的同步会多出约 1800 个请求 - 原来的「补齐运动详情」扩展为统一的补齐任务,分阶段上报进度 日内采样抽稀到每天 240 点:手机图表分辨不出更多,只会把行撑大。 全量 446 项测试通过。 Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,7 @@ import Skeleton from '../components/Skeleton';
|
||||
import Screen from '../components/Screen';
|
||||
import { daysAgo, today as todayIso } from '../lib/day';
|
||||
import './Health.css';
|
||||
import './Settings.css';
|
||||
|
||||
const WINDOW_DAYS = 30;
|
||||
|
||||
@@ -18,6 +19,14 @@ const SECTIONS: Array<{ title: string; items: string[] }> = [
|
||||
{ title: '睡眠', items: ['sleepDuration', 'sleepQuality', 'deepShare', 'remShare'] },
|
||||
{ title: '活动', items: ['steps', 'intensityMinutes', 'floorsAscended', 'distance'] },
|
||||
{ title: '能量', items: ['caloriesBurned', 'activeCalories', 'bmrCalories', 'sedentary'] },
|
||||
{ title: '身体成分', items: ['weight', 'bodyFat', 'hydration', 'hillScore'] },
|
||||
];
|
||||
|
||||
/* Screens that are not a single metric, so they get their own entries. */
|
||||
const LINKS: Array<[string, string, string]> = [
|
||||
['/body/', '身体成分与血压', '体重、体脂、肌肉量、血压记录'],
|
||||
['/race/', '成绩预测', '5 公里到全马的预测完赛时间'],
|
||||
['/challenges/', '挑战赛', '徽章挑战与好友挑战'],
|
||||
];
|
||||
|
||||
function BodyAge({ data }: { data: FitnessAge | null }) {
|
||||
@@ -161,6 +170,21 @@ function HealthPage() {
|
||||
</section>
|
||||
))}
|
||||
|
||||
<section className="sec">
|
||||
<h3 className="sec-title">更多</h3>
|
||||
<div className="set-rows">
|
||||
{LINKS.map(([href, label, sub]) => (
|
||||
<Link href={href} className="set-row" key={href}>
|
||||
<span className="set-label">
|
||||
{label}
|
||||
<span className="set-sub">{sub}</span>
|
||||
</span>
|
||||
<span className="set-chevron" aria-hidden="true">›</span>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p className="screen-disclaimer">
|
||||
参考区间为一般人群的定位范围,非诊断标准。如有健康疑问请咨询专业医师。
|
||||
</p>
|
||||
|
||||
Reference in New Issue
Block a user