基于参考 JSON 完整数据,重构「肠道菌群报告详情页」,覆盖查看+编辑混合场景。 页面只展示个性化数据(个人测定值),标准说明通过弹出框从知识库获取。
版本: v1.1(v1.0 修正:仅展示个性化数据 + 知识库弹出框 + 异常值颜色箭头)
日期: 2026-07-17
状态: Draft
作者: Sisyphus
pages/health/gut-flora-detail.vue 只展示 5 个评分圆环 + 3 组菌属分类 + 食物推荐/api/health/report/detail 已返回完整数据:report + indicators + gutFlora + diseaseRisksPdfParseService 完成)/pages/health/report-list,未变动)| 决策项 | 选择 | 理由 |
|---|---|---|
| 页面拆分 | 主页 + 3 个详情页 | 食物 224 条 + 菌群 200 条过长,必须分页;指标用手风琴折叠到主页 |
| 模式 | 混合(默认查看 + 编辑切换) | 满足「全字段可编辑」同时保留查看优先体验 |
| 编辑范围 | 仅修改现有条目(不增删) | 当前需求是修正 AI 解析错误,不是新增数据 |
| 保存路径 | 新增 POST /api/health/report/edit |
编辑已发布报告(不用 draftId) |
| 说明展示 | 不内嵌,点击名称弹出知识库 | 页面干净,知识库可独立维护 |
pages/health/
├── gut-flora-detail.vue # 主页 (本文件重写)
├── gut-flora-species-detail.vue # 菌群详情 (新增)
├── gut-flora-foods-detail.vue # 食物推荐 (新增)
└── gut-flora-risks-detail.vue # 疾病风险 (新增)
page.json 中需新增 3 个路径:
| Path | Title |
|---|---|
pages/health/gut-flora-species-detail |
菌群详情 |
pages/health/gut-flora-foods-detail |
饮食推荐 |
pages/health/gut-flora-risks-detail |
疾病风险 |
所有页面(主页手风琴、菌群卡片、营养指标列表)统一使用以下规则:
| 状态 | 颜色 | 箭头 | 示例 |
|---|---|---|---|
正常 / 低风险 |
默认文本 #333 | 无 | 维生素A 84 |
偏高 / 过多 / 高 |
红色 #C62828 | ↑ | 双歧杆菌属↑ 12.8% |
偏低 / 缺乏 / 不足 / 低 |
琥珀色 #E65100 | ↓ | 维生素B1↓ 2 |
异常 |
红色 #C62828 | ⚠ | 炎症水平⚠ 16 |
注意 |
黄色 #F59E0B | ⚠ | 甲状腺疾病⚠ |
实现方式(Vue 2 inline 表达式):
<text :class="'name-' + item.status" v-if="item.status !== '正常'">{{ item.name }}<text class="arrow">{{ arrowMap[item.status] }}</text></text>
<text v-else>{{ item.name }}</text>
不可用方法调用(statusClass(item.status)),必须内联 :class="'status-' + item.status"。
components/health-knowledge-popup.vue每个菌属名/营养素名/指标名都是可点击的,点击后打开一个弹出框显示该项目的知识库说明。
<!-- 使用方式 -->
<text class="kb-link" @tap="showKnowledge(item.type, item.name)">{{ item.name }}</text>
<!-- 弹出框组件 -->
<health-knowledge-popup
:visible="knowledgeVisible"
:item-type="knowledgeType" <!-- 'bacteria' | 'nutrient' | 'indicator' | 'vitamin' | 'amino_acid' -->
:item-name="knowledgeName" <!-- 如 "双歧杆菌属 Bifidobacterium" -->
@close="closeKnowledge" />
┌────────────────────────────────┐
│ 双歧杆菌属 Bifidobacterium [×]│
│ ────────────────────────────── │
│ 【分类】有益菌 │
│ 【正常范围】0.19-14.59% │
│ 【功能说明】 │
│ 最重要的益生菌,参与肠道免疫屏障│
│ 维护,抑制有害菌生长,促进营养 │
│ 物质吸收...(完整说明文字) │
│ │
│ 【相关建议】 │
│ 补充来源:酸奶、开菲尔等发酵食品│
└────────────────────────────────┘
知识库数据存储在独立数据库表 health_knowledge_base 中。
后端接口:
POST /api/health/knowledge/query
body: { itemType: "bacteria", itemName: "双歧杆菌属 Bifidobacterium" }
返回: { code: 200, data: { itemType, itemName, category, normalRange, description, suggestion } }
| 模式 | 显示 | 操作 |
|---|---|---|
| 查看模式 | 只展示数值 + 状态颜色+箭头 | 点击名称弹知识库 |
| 编辑模式 | 数值改为 input / 状态改为 picker | 点击「取消」「保存」 |
查看模式下,名称仍然可点击弹知识库。编辑模式下知识库弹框仍然可用。
┌───────────────────────────────────┐
│ 维生素B1 ↓ 数值: 2 │
│ 正常范围: 4-20 │
└───────────────────────────────────┘
维生素B1 → 可点击,弹出知识库↓ 箭头 + 红色字体(偏低)| Tab | 数据源 |
|---|---|
| 核心菌属 | payload.gutFlora → category="core" |
| 益生菌(菌门) | payload.probioticSpecies → category="probiotic" |
| 有害菌 | category="harmful" |
| 其它菌属 | category="other" |
| 病原菌 | category="pathogen" |
| 肥胖相关 | category="obesity" |
| 便秘相关 | category="constipation" |
| 抑郁相关 | category="depression" |
| 过敏相关 | category="allergy" |
| 腹胀相关 | category="bloating" |
| 失眠相关 | category="insomnia" |
| 全部 | 不过滤 |
无内嵌说明,标准说明通过点击名称弹出知识库获取。
┌─────────────────────────────────────────┐
│ 双歧杆菌属 Bifidobacterium ↑ │ ← 名称可点(弹出知识库), ↑红色(偏高)
│ 丰度 0.2973% | 正常范围 0.19-12.59 │
│ 人群水平 53% | 检出率 97.12% │
└─────────────────────────────────────────┘
itemType="bacteria")可编辑字段:丰度值(bacteriaValue)、状态(status)
不可编辑:菌属名称、正常范围、人群水平、检出率
┌────────────────────────────────────┐
│ 大麦 推荐指数: +10 [主食] │
│ 蛋白12 | 脂肪2 | 碳水73 | 纤维17 │
│ 能量 1481KJ │
└────────────────────────────────────┘
食物无知识库需求(数据自包含),但名称可点击 → 视需求可未来接入。
可编辑字段:推荐指数(score)
重要风险(注意/异常)置顶,其余按风险等级排序。
┌────────────────────────────────────┐
│ 甲状腺疾病 ⚠ │ ← 名称可点弹出知识库
│ 风险值: 0.33 风险等级: [注意] │
└────────────────────────────────────┘
风险等级颜色:低风险→绿、注意→黄/⚠、异常→红
疾病名称可点击 → 弹出知识库(itemType="disease")
可编辑字段:风险值(riskValue)、风险等级(riskLevel picker)
CREATE TABLE IF NOT EXISTS health_knowledge_base (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
item_type VARCHAR(50) NOT NULL COMMENT '类型: bacteria/nutrient/indicator/vitamin/amino_acid/disease',
item_name VARCHAR(200) NOT NULL COMMENT '项目名称(精确匹配)',
category VARCHAR(100) COMMENT '分类(如 有益菌/有害菌)',
normal_range VARCHAR(200) COMMENT '正常范围参考',
description TEXT COMMENT '详细说明',
suggestion TEXT COMMENT '相关建议(如补充来源)',
source VARCHAR(100) COMMENT '数据来源',
created_at DATETIME,
updated_at DATETIME,
UNIQUE KEY uk_type_name (item_type, item_name),
INDEX idx_type (item_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='健康知识库 - 菌属/营养素/指标说明';
参考 JSON 文件中所有菌属的 说明 字段、指标的 健康状况/参考范围等,一次性导入 health_knowledge_base。
POST /api/health/knowledge/query
body: { itemType: "bacteria", itemName: "双歧杆菌属 Bifidobacterium" }
→ { code: 200, data: { id, itemType, itemName, category, normalRange, description, suggestion } }
POST /api/health/knowledge/batch-query
body: { queries: [{ itemType, itemName }, ...] }
→ { code: 200, data: { "bacteria:双歧杆菌属 Bifidobacterium": {...}, ... } }
批查询用于首次加载时预取当前页面所有项目的知识库。单查询用于点击时按需加载。
查看模式 ─[点击编辑]→ 编辑模式 ─[点击取消]→ 查看模式 (丢弃改动)
─[点击保存]→ POST /api/health/report/edit → toast → 重新加载 → 查看模式
进入页面 → onLoad({ reportId }) → loadReportDetail()
GET /api/health/report/detail → 缓存于 this.reportData
点击编辑 → 深拷贝 this.reportData → this.editData → 进入编辑模式
点击取消 → 丢弃 this.editData → 回查看模式
点击保存 →
POST /api/health/report/edit { reportId, payload: { indicators, gutFlora, diseaseRisks, foods }, subjectId }
→ 200 → toast "已保存" → loadReportDetail() 重新拉 → 查看模式
首次加载 → 遍历报告的 indicators/gutFlora,
收集所有不重复的 (itemType, itemName) 对
→ POST /api/health/knowledge/batch-query → 缓存入 this.knowledgeMap
→ 前端 <text @tap="showKnowledge(type, name)"> 直接从缓存取
点击名称 → if (cache[type+name]) → 直接显示
else → POST /api/health/knowledge/query → 显示并加入缓存
?.,全部用 && 短路:class="'status-' + item.status" 内联{
"code": 200,
"data": {
"report": { "id":..., "personName":"某人", "overallScore":57, "gutHealthScore":76, ... },
"indicators": [
{ "category":"营养", "indicatorName":"碳水化合物", "indicatorValue":"96", "status":"正常", "refRange":"..." },
{ "category":"氨基酸", "indicatorName":"胱氨酸", "indicatorValue":"86", "status":"正常", "refRange":"..." },
{ "category":"维生素", "indicatorName":"维生素B1", "indicatorValue":"2", "status":"缺乏", "refRange":"..." },
...
],
"gutFlora": [
{ "bacteriaName":"双歧杆菌属 Bifidobacterium", "bacteriaValue":"0.2973", "category":"core", "status":"偏低", "normalRange":"0.19-12.59", "populationLevel":"53%", "detectionRate":"97.12%" },
...
],
"diseaseRisks": [
{ "diseaseName":"甲状腺疾病", "riskValue":"0.33", "riskLevel":"注意" }
]
}
}
{
"reportId": 123,
"payload": {
"indicators": [...], // 编辑后的完整 list
"gutFlora": [...], // 编辑后的完整 list
"probioticSpecies": [...], // 编辑后的菌门 list
"foods": [...], // 编辑后的食物 list
"diseaseRisks": [...] // 编辑后的疾病风险 list
},
"subjectId": 456
}
// 请求
{ "itemType": "bacteria", "itemName": "双歧杆菌属 Bifidobacterium" }
// 响应
{ "code":200, "data": {
"id":1, "itemType":"bacteria", "itemName":"双歧杆菌属 Bifidobacterium",
"category":"有益菌",
"normalRange":"0.19-14.59",
"description":"最重要的益生菌,参与肠道免疫屏障维护...",
"suggestion":"补充来源:酸奶、开菲尔等发酵食品"
}}
// 请求
{ "queries": [
{"itemType":"bacteria","itemName":"双歧杆菌属 Bifidobacterium"},
{"itemType":"vitamin","itemName":"维生素B1"}
]}
// 响应
{ "code":200, "data": {
"bacteria:双歧杆菌属 Bifidobacterium": { ... },
"vitamin:维生素B1": { ... }
}}
| 改动 | 位置 | 方法 | 说明 |
|---|---|---|---|
| 新建 Entity | entity/HealthKnowledgeBase.java |
— | @TableName("health_knowledge_base") |
| 新建 Mapper | mapper/HealthKnowledgeBaseMapper.java |
— | MyBatis-Plus BaseMapper |
| 新建 Service | service/HealthKnowledgeBaseService.java |
query(itemType, itemName), batchQuery(List<Pair>) |
查知识库 |
| 新建 Controller | controller/HealthKnowledgeBaseController.java |
POST /api/health/knowledge/query, POST /api/health/knowledge/batch-query |
知识库 API |
| 编辑 API | controller/HealthReportController.java |
POST /api/health/report/edit |
编辑已发布报告 |
| 编辑 Service | service/HealthReportService.java |
updateReportFromPayload(reportId, payload, subjectId) |
抹写并刷新 7 维 |
| 数据库迁移 | config/DatabaseInitializer.java |
创建 health_knowledge_base 表 + 导入参考 JSON 的说明数据 |
迁移 N+1 |
| schema.sql | resources/schema.sql |
追加新表 DDL | 同步 |
public HealthKnowledgeBase query(String itemType, String itemName) {
return mapper.selectOne(
new LambdaQueryWrapper<HealthKnowledgeBase>()
.eq(HealthKnowledgeBase::getItemType, itemType)
.eq(HealthKnowledgeBase::getItemName, itemName)
);
}
public Map<String, HealthKnowledgeBase> batchQuery(List<QueryPair> queries) {
// 按 (type, name) 批量查询
}
batch-query 支持一次预取全部知识库条目tests/e2e/flora-microbiome-flow.spec.js 现有场景通过.kb-link、.knowledge-popup 选择器覆盖知识库交互| 文件 | 操作 | 内容 |
|---|---|---|
cfc-frontend/pages/health/gut-flora-detail.vue |
重写 | 长 scroll + 手风琴 + 知识库弹框 + 颜色箭头 + 双模式 |
cfc-frontend/pages/health/gut-flora-species-detail.vue |
新建 | 12 Tab + 卡片(无说明) + 颜色箭头 + 知识库弹框 |
cfc-frontend/pages/health/gut-flora-foods-detail.vue |
新建 | 分类筛选 + 卡片 + 编辑 |
cfc-frontend/pages/health/gut-flora-risks-detail.vue |
新建 | 重要置顶 + 卡片 + 知识库弹框 |
cfc-frontend/components/health-knowledge-popup.vue |
新建 | 通用知识库弹出框组件 |
cfc-frontend/pages.json |
改 | 注册 3 个新页面路径 |
cfc-frontend/utils/api.js |
改 | 新增 editHealthReport、queryKnowledge、batchQueryKnowledge |
cfc-backend/.../entity/HealthKnowledgeBase.java |
新建 | 知识库实体 |
cfc-backend/.../mapper/HealthKnowledgeBaseMapper.java |
新建 | 知识库 Mapper |
cfc-backend/.../service/HealthKnowledgeBaseService.java |
新建 | 知识库 Service |
cfc-backend/.../controller/HealthKnowledgeBaseController.java |
新建 | 知识库 API |
cfc-backend/.../controller/HealthReportController.java |
改 | 新增 POST /api/health/report/edit |
cfc-backend/.../service/HealthReportService.java |
改 | 新增 updateReportFromPayload |
cfc-backend/.../config/DatabaseInitializer.java |
改 | 创建 health_knowledge_base 表 + 导入数据 |
cfc-backend/.../resources/schema.sql |
改 | 追加 health_knowledge_base DDL |
tests/e2e/flora-microbiome-flow.spec.js |
检查/更新 | 适配新选择器 |
| 风险 | 缓解 |
|---|---|
| 200+ 菌属首次加载时 batch-query 知识库可能慢 | 并行请求;知识库表小(<500 行),加索引后毫秒级 |
| 知识库数据导入工作量 | 参考 JSON 已有完整的 说明 字段,可用脚本批量入库 |
| 编辑时大批量数据上传慢 | 前端只提交被改过的索引列表 |
| 编辑后是否破坏 7 维评分 | 编辑路径同样调用 refreshFromGutReport 刷新 |
| mini-program 真机性能(200+ 卡片) | v-if 分组懒加载 |
HealthKnowledgeBase 表迁移 + 实体/Mapper/Service/Controller → mvn clean compilePOST /api/health/report/edit + updateReportFromPayload → mvn clean compilehealth_knowledge_basecomponents/health-knowledge-popup.vue 通用弹框组件gut-flora-foods-detail.vue(最简单)→ 验证编辑流gut-flora-risks-detail.vue + 知识库弹框gut-flora-species-detail.vue + 12 Tab + 颜色箭头 + 知识库弹框gut-flora-detail.vue(手风琴 + 指标知识库 + 颜色箭头 + 双模式)pages.json + utils/api.jstests/e2e/flora-microbiome-flow.spec.js 验证