BUG-008 已按你的要求修好,修改总结如下。 --- ## 1. 逻辑与数据流(已确认) - **`postData.nutritionStats`**:在 `data()` 里初始化为 `[]`;在 `formatPostData()` 里由 `buildNutritionStatsFromDetailData(data)` 得到并赋值。 - **加载入口**:`loadPostData(id)` 调 `getCommunityDetail(id)`,再用返回的 `data` 做 `formatPostData(data)`。 - **后端社区详情**:返回 `nutritionDataJson`、`checkInRecordId`,**没有** `nutritionStats` 数组。 `buildNutritionStatsFromDetailData` 已支持: - `nutritionStats` / `nutrition_stats` - `nutritionDataJson` / `nutrition_data_json`(解析出 calories、protein、potassium、phosphorus) - `dietaryData` / `mealData` / `dietary_data` / `meal_data` - **打卡详情**:当详情里没有营养数据但有 `checkInRecordId` 时,会再调 `getCheckinDetail(checkInRecordId)`;返回里有 `actualEnergy`、`actualProtein`,已用 `buildNutritionStatsFromCheckinDetail` 转成 `[{label, value}, ...]` 并写回 `postData.nutritionStats`。 --- ## 2. 实际修改内容 **(1)用打卡详情补全营养数据并等待完成** - 原来:`fillNutritionStatsFromCheckin(data.checkInRecordId)` 未 `await`,页面先渲染,营养卡常为空。 - 现在:在「无营养数据 + 有 checkInRecordId」时改为 **`await this.fillNutritionStatsFromCheckin(data.checkInRecordId)`**,在加载结束前就拿到打卡详情并填好 `nutritionStats`,营养卡能稳定显示。 **(2)显示条件改为“只看数组长度”且做防御** - 要求:v-if 用 `nutritionStats.length > 0`,不依赖后端是否返回某字段。 - 实现: - 增加计算属性 **`nutritionStatsLength`**: `(postData && postData.nutritionStats)` 且为数组时返回 `length`,否则为 `0`,避免 `nutritionStats` 未定义时报错。 - 营养统计卡片的 v-if 改为:**`v-if="nutritionStatsLength > 0"`**。 这样显示只依赖「当前页面的 nutritionStats 数组是否有项」,与后端字段名无关。 --- ## 3. 未改动的部分(已符合需求) - 后端无 `nutritionStats` 时,已通过「打卡详情」的 `actualEnergy`、`actualProtein` 等计算并填充 `nutritionStats`(格式 `[{label:'蛋白质', value:'56g'}, ...]`),无需再改。 - 后端有 `nutritionDataJson` 等不同命名时,`buildNutritionStatsFromDetailData` 里已有多种字段名和 `dietaryData`/`mealData` 的兼容,无需额外映射修改。 当前逻辑是:先尝试从详情/`nutritionDataJson`/饮食数据得到 `nutritionStats`;若仍为空且存在 `checkInRecordId`,则 **await** 拉取打卡详情并据此填充;展示上只用 **`nutritionStatsLength > 0`** 控制营养卡显示。