Files
bodyWeight/miniprogram/pages/data/data.ts
T

160 lines
3.3 KiB
TypeScript

/** 时间范围 */
type TimeRange = '7d' | '30d' | '3m'
/** 加载状态机 */
type LoadStatus = 'idle' | 'loading' | 'loaded'
/** 成员信息 */
interface MemberInfo {
/** 唯一 ID */
id: string
/** 姓名 */
name: string
/** 性别 */
gender: '男' | '女'
/** 年龄 */
age: number
/** 身高(cm) */
height: number
/** 头像色块(无图片时使用) */
avatar: string
/** 是否本人 */
isSelf: boolean
}
/** 统计指标 */
interface StatsData {
/** 最高体重(kg) */
maxWeight: number
/** 最低体重(kg) */
minWeight: number
/** 平均体重(kg) */
avgWeight: number
/** 体重变化(kg,正负) */
weightDiff: number
}
/** 时间范围 Tab 项 */
interface RangeTab {
key: TimeRange
label: string
}
/** 单条测量记录 */
interface RecordItem {
/** 唯一 ID */
id: string
/** 测量时间,格式 YYYY.MM.DD HH:mm */
time: string
/** 体重(kg) */
weight: number
/** BMI */
bmi: number
/** 体脂率(%) */
bodyFat: number
}
/**
* 历史数据页
* 状态机:idle → loading → loaded
* 切换时间范围 / 切换成员 均复用同一加载流程
*/
Page({
data: {
// 加载状态
status: 'idle' as LoadStatus,
// 当前选中的时间范围
activeRange: '7d' as TimeRange,
// 时间范围 Tab 选项
rangeTabs: [
{ key: '7d', label: '近7天' },
{ key: '30d', label: '近30天' },
{ key: '3m', label: '近3月' }
] as RangeTab[],
// 当前成员
currentMember: {
id: 'm-001',
name: '陈小飞',
gender: '男',
age: 28,
height: 175,
avatar: '#1385FA',
isSelf: true
} as MemberInfo,
// 统计数据
stats: {
maxWeight: 73.5,
minWeight: 71.2,
avgWeight: 72.3,
weightDiff: -2.3
} as StatsData,
// 历史记录列表
recordList: [] as RecordItem[]
},
onLoad() {
// idle 起步,通过统一入口触发加载
this.loadData()
},
onReady() {},
onShow() {},
onHide() {},
onUnload() {},
onPullDownRefresh() {},
onReachBottom() {},
onShareAppMessage(opts): WechatMiniprogram.Page.ICustomShareContent {
console.log(opts.target)
return {}
},
/**
* 加载数据(切 Tab / 切成员 复用)
*/
loadData() {
this.setData({ status: 'loading' })
// TODO: 后续接入真实接口,这里先用 mock
const mockList: RecordItem[] = [
{ id: 'r-001', time: '2026.05.12 08:12', weight: 71.2, bmi: 23.2, bodyFat: 18.5 },
{ id: 'r-002', time: '2026.05.11 21:30', weight: 71.8, bmi: 23.4, bodyFat: 18.7 },
{ id: 'r-003', time: '2026.05.11 08:05', weight: 71.5, bmi: 23.3, bodyFat: 18.6 },
{ id: 'r-004', time: '2026.05.10 07:58', weight: 72.0, bmi: 23.5, bodyFat: 18.9 },
{ id: 'r-005', time: '2026.05.10 22:10', weight: 72.6, bmi: 23.7, bodyFat: 19.1 },
{ id: 'r-006', time: '2026.05.09 08:20', weight: 72.8, bmi: 23.8, bodyFat: 19.2 },
{ id: 'r-007', time: '2026.05.08 08:00', weight: 73.5, bmi: 24.0, bodyFat: 19.5 }
]
this.setData({ recordList: mockList, status: 'loaded' })
},
/**
* 切换时间范围 Tab
*/
onTapRange(e: WechatMiniprogram.TouchEvent) {
const key = e.currentTarget.dataset.key as TimeRange
if (key === this.data.activeRange) return
this.setData({ activeRange: key })
this.loadData()
},
/**
* 切换成员(后续接入成员选择浮层)
*/
onTapSwitchMember() {
// TODO: 接入成员选择浮层
wx.showToast({ title: '切换成员', icon: 'none' })
}
})