feat(home): 首页接入最新测量数据与空态
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
e69db66eab
commit
76879270ba
@@ -211,6 +211,14 @@
|
|||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
line-height: 48rpx;
|
line-height: 48rpx;
|
||||||
margin-right: 10rpx;
|
margin-right: 10rpx;
|
||||||
|
|
||||||
|
&.diff-up {
|
||||||
|
color: #FF4D4F;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.diff-neutral {
|
||||||
|
color: #252535;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> view:nth-of-type(2) {
|
> view:nth-of-type(2) {
|
||||||
@@ -315,6 +323,32 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.empty-state {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
padding-top: 160rpx;
|
||||||
|
|
||||||
|
.empty-icon {
|
||||||
|
width: 193rpx;
|
||||||
|
height: 138rpx;
|
||||||
|
margin-bottom: 40rpx;
|
||||||
|
|
||||||
|
image {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.empty-text {
|
||||||
|
color: #808080;
|
||||||
|
height: 30rpx;
|
||||||
|
font-size: 30rpx;
|
||||||
|
line-height: 30rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.detailedData {
|
.detailedData {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border-radius: 24rpx;
|
border-radius: 24rpx;
|
||||||
|
|||||||
@@ -10,6 +10,42 @@ interface PageUserInfo {
|
|||||||
height: number
|
height: number
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 身体成分单项指标 */
|
||||||
|
interface LefuBodyDatum {
|
||||||
|
bodyParamKey: string
|
||||||
|
currentValue: string
|
||||||
|
[key: string]: any
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 测量历史详情 */
|
||||||
|
interface MeasureHistoryVO {
|
||||||
|
recordId?: string
|
||||||
|
height?: number
|
||||||
|
weight?: number
|
||||||
|
weightChange?: number
|
||||||
|
bmi?: number
|
||||||
|
bmiType?: string
|
||||||
|
fatRate?: number
|
||||||
|
fatValue?: number
|
||||||
|
examTime?: string
|
||||||
|
bodyDataList?: LefuBodyDatum[]
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 页面展示用最近测量记录 */
|
||||||
|
interface WeightRecord {
|
||||||
|
weight: number
|
||||||
|
weightDecimal: string
|
||||||
|
date: string
|
||||||
|
diff: number
|
||||||
|
height: number
|
||||||
|
bmi: number
|
||||||
|
bmiLabel: string
|
||||||
|
bodyFat: number
|
||||||
|
bodyFatMass: number
|
||||||
|
bodyWater: number
|
||||||
|
protein: number
|
||||||
|
}
|
||||||
|
|
||||||
/** 将体重数字拆成整数 + 小数字符串 */
|
/** 将体重数字拆成整数 + 小数字符串 */
|
||||||
const splitWeight = (weight: number): { int: number; decimal: string } => {
|
const splitWeight = (weight: number): { int: number; decimal: string } => {
|
||||||
const str = weight.toFixed(2)
|
const str = weight.toFixed(2)
|
||||||
@@ -17,14 +53,23 @@ const splitWeight = (weight: number): { int: number; decimal: string } => {
|
|||||||
return { int: Number(intPart), decimal: `.${decPart}` }
|
return { int: Number(intPart), decimal: `.${decPart}` }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 从 bodyDataList 提取指标数值 */
|
||||||
|
const pickValue = (list: LefuBodyDatum[] = [], key: string): number => {
|
||||||
|
const item = list.find((d) => d?.bodyParamKey === key)
|
||||||
|
const v = parseFloat(item?.currentValue ?? '')
|
||||||
|
return isNaN(v) ? 0 : v
|
||||||
|
}
|
||||||
|
|
||||||
Page({
|
Page({
|
||||||
data: {
|
data: {
|
||||||
record: null,
|
hasData: false,
|
||||||
|
record: null as WeightRecord | null,
|
||||||
userInfo: null as PageUserInfo | null,
|
userInfo: null as PageUserInfo | null,
|
||||||
},
|
},
|
||||||
|
|
||||||
onShow() {
|
onShow() {
|
||||||
this._loadUserInfo()
|
this._loadUserInfo()
|
||||||
|
this.loadData()
|
||||||
},
|
},
|
||||||
|
|
||||||
// 从缓存回显用户信息
|
// 从缓存回显用户信息
|
||||||
@@ -41,6 +86,38 @@ Page({
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 拉取最新一次测量记录
|
||||||
|
loadData() {
|
||||||
|
const raw = wx.getStorageSync('userInfo') as UserInfo | null
|
||||||
|
if (!raw?.userId) return
|
||||||
|
get<MeasureHistoryVO>('weighingScale/v3/getMeasureHistory', {
|
||||||
|
userId: raw.userId,
|
||||||
|
}, { loading: false })
|
||||||
|
.then((res: any) => {
|
||||||
|
const d: MeasureHistoryVO = res.result
|
||||||
|
if (!d) {
|
||||||
|
this.setData({ hasData: false, record: null })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const { int, decimal } = splitWeight(d.weight ?? 0)
|
||||||
|
const record: WeightRecord = {
|
||||||
|
weight: int,
|
||||||
|
weightDecimal: decimal,
|
||||||
|
date: d.examTime ?? '',
|
||||||
|
diff: d.weightChange ?? 0,
|
||||||
|
height: d.height ?? 0,
|
||||||
|
bmi: d.bmi ?? 0,
|
||||||
|
bmiLabel: d.bmiType ?? '',
|
||||||
|
bodyFat: d.fatRate ?? 0,
|
||||||
|
bodyFatMass: d.fatValue ?? 0,
|
||||||
|
bodyWater: pickValue(d.bodyDataList, 'ppWaterKg'),
|
||||||
|
protein: pickValue(d.bodyDataList, 'ppProteinKg'),
|
||||||
|
}
|
||||||
|
this.setData({ hasData: true, record })
|
||||||
|
})
|
||||||
|
.catch(() => {})
|
||||||
|
},
|
||||||
|
|
||||||
onShareAppMessage(): WechatMiniprogram.Page.ICustomShareContent {
|
onShareAppMessage(): WechatMiniprogram.Page.ICustomShareContent {
|
||||||
return {
|
return {
|
||||||
title: '智能蓝牙秤',
|
title: '智能蓝牙秤',
|
||||||
|
|||||||
@@ -17,76 +17,82 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view class="recentMeasurements">
|
<block wx:if="{{ hasData }}">
|
||||||
<view class="recentMeasurementsTitle">
|
<view class="recentMeasurements">
|
||||||
<view></view>
|
<view class="recentMeasurementsTitle">
|
||||||
<view>最近测量</view>
|
<view></view>
|
||||||
<view class="arrow" bind:tap="onTapDetailedReport">详细报告</view>
|
<view>最近测量</view>
|
||||||
</view>
|
<view class="arrow" bind:tap="onTapDetailedReport">详细报告</view>
|
||||||
<view class="recentMeasurementsContent">
|
</view>
|
||||||
<view class="recentMeasurementsContentTop">
|
<view class="recentMeasurementsContent">
|
||||||
<view class="recentMeasurementsContentTopL">
|
<view class="recentMeasurementsContentTop">
|
||||||
<view>
|
<view class="recentMeasurementsContentTopL">
|
||||||
<view>68</view>
|
|
||||||
<view>.20</view>
|
|
||||||
<view>kg</view>
|
|
||||||
</view>
|
|
||||||
<view>07-22 09:30</view>
|
|
||||||
</view>
|
|
||||||
<view class="recentMeasurementsContentTopR">
|
|
||||||
<view>
|
|
||||||
<view>2.6</view>
|
|
||||||
<view>
|
<view>
|
||||||
<view>↑</view>
|
<view>{{ record.weight }}</view>
|
||||||
|
<view>{{ record.weightDecimal }}</view>
|
||||||
<view>kg</view>
|
<view>kg</view>
|
||||||
</view>
|
</view>
|
||||||
|
<view>{{ record.date }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="recentMeasurementsContentTopR">
|
||||||
|
<view>
|
||||||
|
<view class="{{ record.diff < 0 ? 'diff-down' : (record.diff > 0 ? 'diff-up' : 'diff-neutral') }}">{{ record.diff < 0 ? -record.diff : record.diff }}</view>
|
||||||
|
<view>
|
||||||
|
<view>{{ record.diff < 0 ? '↓' : (record.diff > 0 ? '↑' : '') }}</view>
|
||||||
|
<view>kg</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view>{{ record.diff < 0 ? '体重较上次减轻' : (record.diff > 0 ? '体重较上次增加' : '与上次持平') }}</view>
|
||||||
</view>
|
</view>
|
||||||
<view>体重较上次减轻</view>
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
<view class="recentMeasurementsContentLine"></view>
|
||||||
<view class="recentMeasurementsContentLine"></view>
|
<view class="recentMeasurementsContentBottom">
|
||||||
<view class="recentMeasurementsContentBottom">
|
<view>
|
||||||
<view>
|
<view>身高</view>
|
||||||
<view>身高</view>
|
<view>{{ record.height }}<text>cm</text></view>
|
||||||
<view>172<text>cm</text></view>
|
</view>
|
||||||
</view>
|
<view>
|
||||||
<view>
|
<view>BMI<text>{{ record.bmiLabel }}</text></view>
|
||||||
<view>BMI<text>标准</text></view>
|
<view>{{ record.bmi }}</view>
|
||||||
<view>22.4</view>
|
</view>
|
||||||
</view>
|
<view>
|
||||||
<view>
|
<view>体脂率</view>
|
||||||
<view>体脂率</view>
|
<view>{{ record.bodyFat }}<text>%</text></view>
|
||||||
<view>22.1<text>%</text></view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
|
||||||
|
|
||||||
<view class="connect">
|
<view class="connect">
|
||||||
<view>
|
<view>
|
||||||
<image src="/images/home/lianjie.png" mode="aspectFit" />
|
<image src="/images/home/lianjie.png" mode="aspectFit" />
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
|
||||||
|
|
||||||
<view class="detailedData">
|
<view class="detailedData">
|
||||||
<view class="detailedDataTitle">
|
<view class="detailedDataTitle">
|
||||||
<view></view>
|
<view></view>
|
||||||
<view>详细数据</view>
|
<view>详细数据</view>
|
||||||
</view>
|
|
||||||
<view class="detailedDataContent">
|
|
||||||
<view>
|
|
||||||
<view>体脂肪量</view>
|
|
||||||
<view>16.0<text>kg</text></view>
|
|
||||||
</view>
|
</view>
|
||||||
<view>
|
<view class="detailedDataContent">
|
||||||
<view>体水分量</view>
|
<view>
|
||||||
<view>39.8<text>kg</text></view>
|
<view>体脂肪量</view>
|
||||||
</view>
|
<view>{{ record.bodyFatMass }}<text>kg</text></view>
|
||||||
<view>
|
</view>
|
||||||
<view>蛋白质量</view>
|
<view>
|
||||||
<view>1680<text>kcal</text></view>
|
<view>体水分量</view>
|
||||||
|
<view>{{ record.bodyWater }}<text>kg</text></view>
|
||||||
|
</view>
|
||||||
|
<view>
|
||||||
|
<view>蛋白质量</view>
|
||||||
|
<view>{{ record.protein }}<text>kg</text></view>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</block>
|
||||||
|
|
||||||
|
<block wx:else>
|
||||||
|
<empty-data containerStyle="margin: 100rpx 0 200rpx;" />
|
||||||
|
</block>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|||||||
Reference in New Issue
Block a user