فهرست منبع

Merge branch 'refs/heads/cfclub' into cfclub-jiapu

# Conflicts:
#	cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java
#	cfc-frontend/config.js
#	cfc-web/.env.development
#	cfc-web/src/views/TaskTemplates.vue
#	cfc-web/src/views/admin/EmotionAlertManage.vue
#	cfc-web/src/views/admin/EnergyRuleManagement.vue
#	cfc-web/src/views/admin/ProductProfitRate.vue
#	cfc-web/src/views/teacher/TeacherTeam.vue
jiapu 3 ماه پیش
والد
کامیت
02e5969211
100فایلهای تغییر یافته به همراه23844 افزوده شده و 877 حذف شده
  1. 2 0
      .gitignore
  2. 110 0
      BOOT-INF/classes/application.yml
  3. 262 0
      cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java
  4. 5 1
      cfc-backend/src/main/java/com/etotem/cfc/config/WebConfig.java
  5. 20 83
      cfc-backend/src/main/java/com/etotem/cfc/controller/DanAssessmentController.java
  6. 74 0
      cfc-backend/src/main/java/com/etotem/cfc/controller/DanReportController.java
  7. 43 18
      cfc-backend/src/main/java/com/etotem/cfc/controller/GrowthTaskController.java
  8. 156 0
      cfc-backend/src/main/java/com/etotem/cfc/controller/HealthKnowledgeBaseController.java
  9. 51 0
      cfc-backend/src/main/java/com/etotem/cfc/controller/HealthReportController.java
  10. 8 4
      cfc-backend/src/main/java/com/etotem/cfc/controller/MarketController.java
  11. 5 1
      cfc-backend/src/main/java/com/etotem/cfc/controller/PackagePaymentController.java
  12. 53 0
      cfc-backend/src/main/java/com/etotem/cfc/controller/ReviewController.java
  13. 27 18
      cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminArticleController.java
  14. 2 2
      cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminController.java
  15. 1 1
      cfc-backend/src/main/java/com/etotem/cfc/controller/admin/ProductSkuController.java
  16. 66 10
      cfc-backend/src/main/java/com/etotem/cfc/controller/ai/AIChatController.java
  17. 1 1
      cfc-backend/src/main/java/com/etotem/cfc/controller/assessment/AssessmentReportController.java
  18. 9 4
      cfc-backend/src/main/java/com/etotem/cfc/controller/family/BindController.java
  19. 10 3
      cfc-backend/src/main/java/com/etotem/cfc/controller/mind/MindFortuneController.java
  20. 52 0
      cfc-backend/src/main/java/com/etotem/cfc/controller/product/ProductOrderController.java
  21. 11 0
      cfc-backend/src/main/java/com/etotem/cfc/dto/DanReportEditDTO.java
  22. 59 0
      cfc-backend/src/main/java/com/etotem/cfc/dto/DanReportUploadVO.java
  23. 10 0
      cfc-backend/src/main/java/com/etotem/cfc/dto/ExecutionCompleteRequest.java
  24. 9 0
      cfc-backend/src/main/java/com/etotem/cfc/dto/ExecutionConfirmRequest.java
  25. 34 0
      cfc-backend/src/main/java/com/etotem/cfc/dto/ExecutionDetailResponse.java
  26. 21 0
      cfc-backend/src/main/java/com/etotem/cfc/dto/ParsedReportPayload.java
  27. 11 6
      cfc-backend/src/main/java/com/etotem/cfc/dto/ProductSkuDTO.java
  28. 14 0
      cfc-backend/src/main/java/com/etotem/cfc/dto/ReviewOrderRequest.java
  29. 16 0
      cfc-backend/src/main/java/com/etotem/cfc/dto/ReviewOrderResponse.java
  30. 20 0
      cfc-backend/src/main/java/com/etotem/cfc/dto/ReviewStatusResponse.java
  31. 15 0
      cfc-backend/src/main/java/com/etotem/cfc/dto/ServiceRateRequest.java
  32. 12 0
      cfc-backend/src/main/java/com/etotem/cfc/dto/SettlementCreateRequest.java
  33. 24 0
      cfc-backend/src/main/java/com/etotem/cfc/dto/TaskParseResult.java
  34. 33 0
      cfc-backend/src/main/java/com/etotem/cfc/entity/ActivityProvision.java
  35. 39 0
      cfc-backend/src/main/java/com/etotem/cfc/entity/DanAssessmentExecution.java
  36. 4 0
      cfc-backend/src/main/java/com/etotem/cfc/entity/DanAssessmentResult.java
  37. 87 0
      cfc-backend/src/main/java/com/etotem/cfc/entity/DanReportUpload.java
  38. 6 0
      cfc-backend/src/main/java/com/etotem/cfc/entity/GrowthTask.java
  39. 16 0
      cfc-backend/src/main/java/com/etotem/cfc/entity/HealthGutFlora.java
  40. 46 0
      cfc-backend/src/main/java/com/etotem/cfc/entity/HealthKnowledgeBase.java
  41. 10 0
      cfc-backend/src/main/java/com/etotem/cfc/entity/ProductOrder.java
  42. 28 0
      cfc-backend/src/main/java/com/etotem/cfc/entity/ReviewOrder.java
  43. 31 0
      cfc-backend/src/main/java/com/etotem/cfc/entity/ServiceRating.java
  44. 33 0
      cfc-backend/src/main/java/com/etotem/cfc/entity/ServiceSettlement.java
  45. 6 0
      cfc-backend/src/main/java/com/etotem/cfc/entity/User.java
  46. 9 0
      cfc-backend/src/main/java/com/etotem/cfc/mapper/ActivityProvisionMapper.java
  47. 9 0
      cfc-backend/src/main/java/com/etotem/cfc/mapper/DanAssessmentExecutionMapper.java
  48. 9 0
      cfc-backend/src/main/java/com/etotem/cfc/mapper/DanReportUploadMapper.java
  49. 7 0
      cfc-backend/src/main/java/com/etotem/cfc/mapper/HealthKnowledgeBaseMapper.java
  50. 2 0
      cfc-backend/src/main/java/com/etotem/cfc/mapper/ProductSkuMapper.java
  51. 16 0
      cfc-backend/src/main/java/com/etotem/cfc/mapper/ReviewOrderMapper.java
  52. 9 0
      cfc-backend/src/main/java/com/etotem/cfc/mapper/ServiceRatingMapper.java
  53. 9 0
      cfc-backend/src/main/java/com/etotem/cfc/mapper/ServiceSettlementMapper.java
  54. 155 0
      cfc-backend/src/main/java/com/etotem/cfc/service/ActivityProvisionService.java
  55. 167 0
      cfc-backend/src/main/java/com/etotem/cfc/service/DanAssessmentExecutionService.java
  56. 1099 2
      cfc-backend/src/main/java/com/etotem/cfc/service/DanReportParseService.java
  57. 273 0
      cfc-backend/src/main/java/com/etotem/cfc/service/DanReportUploadService.java
  58. 136 0
      cfc-backend/src/main/java/com/etotem/cfc/service/DanSettlementService.java
  59. 2 0
      cfc-backend/src/main/java/com/etotem/cfc/service/DimensionEnergySyncService.java
  60. 24 0
      cfc-backend/src/main/java/com/etotem/cfc/service/FamilyContextService.java
  61. 54 21
      cfc-backend/src/main/java/com/etotem/cfc/service/FileStorageService.java
  62. 37 14
      cfc-backend/src/main/java/com/etotem/cfc/service/GrowthTaskService.java
  63. 79 0
      cfc-backend/src/main/java/com/etotem/cfc/service/HealthKnowledgeBaseService.java
  64. 140 9
      cfc-backend/src/main/java/com/etotem/cfc/service/HealthReportService.java
  65. 138 0
      cfc-backend/src/main/java/com/etotem/cfc/service/KnowledgeBaseDataImporter.java
  66. 280 0
      cfc-backend/src/main/java/com/etotem/cfc/service/KnowledgeBaseV3Service.java
  67. 4 0
      cfc-backend/src/main/java/com/etotem/cfc/service/ProductSkuService.java
  68. 16 0
      cfc-backend/src/main/java/com/etotem/cfc/service/ReviewOrderService.java
  69. 114 0
      cfc-backend/src/main/java/com/etotem/cfc/service/ReviewOrderServiceImpl.java
  70. 73 0
      cfc-backend/src/main/java/com/etotem/cfc/service/TaskParseService.java
  71. 8 0
      cfc-backend/src/main/java/com/etotem/cfc/service/UserService.java
  72. 2 0
      cfc-backend/src/main/java/com/etotem/cfc/service/impl/DimensionScoreServiceImpl.java
  73. 4 0
      cfc-backend/src/main/resources/application.yml
  74. 4007 0
      cfc-backend/src/main/resources/data/refs/501999942-某人.json
  75. 4034 0
      cfc-backend/src/main/resources/data/refs/530010234-侯.json
  76. 3928 0
      cfc-backend/src/main/resources/data/refs/儿童示例.json
  77. 4314 0
      cfc-backend/src/main/resources/knowledge-base/报告指标知识库.json
  78. 4 0
      cfc-backend/src/main/resources/mapper/ProductSkuMapper.xml
  79. 23 0
      cfc-backend/src/main/resources/mapper/ReviewOrderMapper.xml
  80. 87 1
      cfc-backend/src/main/resources/schema.sql
  81. 14 5
      cfc-backend/src/test/java/com/etotem/cfc/integration/PlannerBindInviteFlowTest.java
  82. 533 0
      cfc-backend/src/test/java/com/etotem/cfc/service/DanReportParseServiceTest.java
  83. 1 0
      cfc-frontend/.npmrc
  84. 229 0
      cfc-frontend/components/AITaskCard.vue
  85. 174 32
      cfc-frontend/components/FamilyRelationGraph.vue
  86. 157 0
      cfc-frontend/components/feedback-popup.vue
  87. 108 0
      cfc-frontend/components/health-knowledge-popup.vue
  88. 1 1
      cfc-frontend/config.js
  89. 58 66
      cfc-frontend/manifest.json
  90. 36 0
      cfc-frontend/pages.json
  91. 7 14
      cfc-frontend/pages/action/index.vue
  92. 96 52
      cfc-frontend/pages/ai/chat.vue
  93. 1 189
      cfc-frontend/pages/body/index.vue
  94. 138 4
      cfc-frontend/pages/dan-assessment/report-upload.vue
  95. 12 23
      cfc-frontend/pages/discover-detail/product-detail/product-detail.vue
  96. 409 292
      cfc-frontend/pages/health/gut-flora-detail.vue
  97. 201 0
      cfc-frontend/pages/health/gut-flora-foods-detail.vue
  98. 227 0
      cfc-frontend/pages/health/gut-flora-risks-detail.vue
  99. 257 0
      cfc-frontend/pages/health/gut-flora-species-detail.vue
  100. 361 0
      cfc-frontend/pages/health/physical-exam-detail.vue

+ 2 - 0
.gitignore

@@ -23,6 +23,7 @@ Thumbs.db
 *.local
 .env.local
 .env.*.local
+.env.production
 
 # Test artifacts
 .playwright-mcp/
@@ -46,6 +47,7 @@ worktrees/
 !cfc-frontend/static/*.png
 *.png
 !docs/**/*.png
+!cfc-web/public/logo.png
 
 # Python
 *.py

+ 110 - 0
BOOT-INF/classes/application.yml

@@ -0,0 +1,110 @@
+server:
+  port: 9082
+  tomcat:
+    headers:
+      X-Content-Type-Options: nosniff
+      X-Frame-Options: DENY
+      X-XSS-Protection: 1; mode=block
+      Strict-Transport-Security: max-age=31536000; includeSubDomains
+
+spring:
+  servlet:
+    multipart:
+      max-file-size: 50MB
+      max-request-size: 50MB
+  application:
+    name: cfc-backend
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://192.168.16.251:3306/zxyj?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&createDatabaseIfNotExist=true
+    username: zxyj
+    password: zxyj@123
+    hikari:
+      maximum-pool-size: 50
+      minimum-idle: 10
+      connection-timeout: 30000
+      idle-timeout: 600000
+      max-lifetime: 1800000
+      pool-name: CfcHikariPool
+
+sfms:
+  datasource:
+    enabled: false  # 本地开发禁用 SFMS 数据源,需要迁移时改为 true
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://192.168.16.251:3306/zxyj?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&createDatabaseIfNotExist=true
+    username: zxyj
+    password: zxyj@123
+
+mybatis-plus:
+  mapper-locations: classpath*:/mapper/**/*.xml
+  type-aliases-package: com.etotem.cfc.entity
+  configuration:
+    map-underscore-to-camel-case: true
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  global-config:
+    db-config:
+      id-type: auto
+      logic-delete-field: deleted
+      logic-delete-value: 1
+      logic-not-delete-value: 0
+
+jwt:
+  secret: cfc-secret-key-2026-spring-boot-jwt-token
+  expiration: 86400000
+
+zkxz:
+  enabled: false
+  sync-api-url: https://api.zkxz.org.cn/api/
+  login-url: member/login
+  sync-client-url: user/create
+  list-client-url: user/list
+  sync-teacher-url: teacher/create
+  user-report: user/report
+  report-info: report/info
+  zx-user: ""
+  zx-pass: ""
+
+wechat:
+  appid: wx5ba8038ef16fb245
+  secret: 3dae525c6f5e010cc034f59abbd1b1cc
+  mch-id: 1703255039
+  mch-key: wx5ba8038ef16fb245wx5ba8038ef16f
+  api-v3-key: wx5ba8038ef16fb245wx5ba8038ef16f
+  mch-serial-no: 53C2A906094D725BC350A3414AADCA6D79882AAF
+  private-key-path: cert/apiclient_key.pem
+  notify-url: http://cfc.bianwoyou.com.cn/api/payment/notify
+  login-url: https://api.weixin.qq.com/sns/jscode2session
+  phone-url: https://api.weixin.qq.com/wxa/business/getuserphonenumber
+  test-mode: false  # 测试模式:跳过微信API调用,使用模拟数据
+  test-phone: "13800138000"  # 测试模式使用的手机号
+  alert-template-id: ${WECHAT_ALERT_TEMPLATE_ID:}
+  promotion-tier-template-id: ${WECHAT_PROMOTION_TIER_TEMPLATE_ID:}
+  # 小程序码环境:dev=development / test=trial / prod=release
+  env-version: ${WECHAT_ENV_VERSION:release}
+
+dify:
+  base-url: http://dify.bianwoyou.cn/v1
+  api-key: app-rtNSAHG2NFzRsXCGkeZlVNR9
+  nutrition-api-key: app-OnHzTiI6EULUfLyceCDqJkQu  # 精准营养助手
+  tongue-api-key: ""  # 舌诊分析,空字符串=mock模式
+  callback-secret: dify-callback-secret  # Dify Workflow HTTP回调认证密钥
+
+math:
+  verify-mode: dify  # dify | eval; dify=走Dify工作流, eval=服务端计算(兜底)
+  workflow-id: ""    # Dify 数学判题工作流 ID(留空则使用 eval 兜底)
+
+upload:
+  base-dir: /data/cfc-uploads
+  allowed-types: image/jpeg,image/png,image/gif,image/webp
+
+shop:
+  order:
+    payment-timeout-minutes: 30  # 订单超时时间(分钟)
+
+logging:
+  level:
+    com.etotem.cfc: debug
+
+# Admin 登录配置
+admin:
+  skip-captcha: true  # 测试环境跳过验证码,方便自动化测试

+ 262 - 0
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -4363,6 +4363,8 @@ try {
 
         // 迁移40: 添加supplier_admin角色到users.role ENUM
         try {
+            // 先将非法role值统一修正为parent,避免ALTER ENUM时Data truncated错误
+            jdbcTemplate.execute("UPDATE users SET role='parent' WHERE role NOT IN ('parent','child','teacher','supplier_admin')");
             jdbcTemplate.execute("ALTER TABLE users MODIFY COLUMN role ENUM('parent','child','teacher','supplier_admin') NOT NULL DEFAULT 'parent' COMMENT '当前活跃角色'");
             log.info("已添加supplier_admin到users.role ENUM");
         } catch (Exception e) {
@@ -5287,6 +5289,8 @@ try {
         runMigration91();
         runMigration92();
         runMigration93();
+        runMigration94();
+        runMigration95();
         runMigration96();
     }
 
@@ -5883,8 +5887,266 @@ try {
         } catch (Exception e) {
             // 表已存在,忽略错误
         }
+
+        // 迁移 96: product_orders 添加活动provision字段 + activity_provisions 表(活动商品统一管理)
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN activity_id BIGINT DEFAULT NULL COMMENT '关联活动ID(product_type=activity时有效)'");
+            log.info("已添加activity_id列到product_orders表");
+        } catch (Exception e) {
+            // 列已存在,忽略错误
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN provision_status VARCHAR(32) DEFAULT NULL COMMENT '活动provision状态: unprovisioned(待审核)/provisioned(已发货)/signed_in(已签到)/completed(已完成)/cancelled(审核拒绝)'");
+            log.info("已添加provision_status列到product_orders表");
+        } catch (Exception e) {
+            // 列已存在,忽略错误
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN auditor_id BIGINT DEFAULT NULL COMMENT '审核人ID'");
+            log.info("已添加auditor_id列到product_orders表");
+        } catch (Exception e) {
+            // 列已存在,忽略错误
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN audited_at DATETIME DEFAULT NULL COMMENT '审核时间'");
+            log.info("已添加audited_at列到product_orders表");
+        } catch (Exception e) {
+            // 列已存在,忽略错误
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN audit_reason TEXT DEFAULT NULL COMMENT '审核拒绝原因'");
+            log.info("已添加audit_reason列到product_orders表");
+        } catch (Exception e) {
+            // 列已存在,忽略错误
+        }
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS activity_provisions (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "order_id BIGINT NOT NULL COMMENT '商品订单ID', " +
+                    "order_no VARCHAR(64) NOT NULL COMMENT '订单编号', " +
+                    "product_id BIGINT NOT NULL COMMENT '商品ID', " +
+                    "activity_id BIGINT NOT NULL COMMENT '活动ID', " +
+                    "buyer_id BIGINT NOT NULL COMMENT '购买者用户ID', " +
+                    "family_id BIGINT COMMENT '家庭ID', " +
+                    "child_id BIGINT COMMENT '报名孩子ID(签到时填写)', " +
+                    "status VARCHAR(32) NOT NULL DEFAULT 'unprovisioned' COMMENT 'unprovisioned/provisioned/signed_in/completed/cancelled', " +
+                    "qr_code VARCHAR(512) COMMENT '签到二维码', " +
+                    "checked_in_at DATETIME COMMENT '签到时间', " +
+                    "completed_at DATETIME COMMENT '完成时间', " +
+                    "refund_amount INT COMMENT '退款金额(分)', " +
+                    "refund_at DATETIME COMMENT '退款时间', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "INDEX idx_order (order_id), " +
+                    "INDEX idx_activity (activity_id), " +
+                    "INDEX idx_buyer (buyer_id), " +
+                    "INDEX idx_status (status)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动provision记录表'");
+            log.info("已创建activity_provisions表");
+        } catch (Exception e) {
+            // 表已存在,忽略错误
+        }
+
+        // 迁移 97: DAN测评服务佣金配置
+        seedDanCommissionConfig();
+
+        // 迁移 98: 创建 health_knowledge_base 表(菌群/营养知识库)
+        try {
+            jdbcTemplate.execute("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 DEFAULT CURRENT_TIMESTAMP, " +
+                    "`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "UNIQUE KEY `uk_item_type_name` (`item_type`, `item_name`), " +
+                    "KEY `idx_item_type` (`item_type`)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='健康知识库 - 菌属/营养素/指标说明'");
+            log.info("已创建health_knowledge_base表");
+        } catch (Exception e) {
+            // 表已存在,忽略错误
+        }
+    }
+
+    private void seedDanCommissionConfig() {
+        try {
+            jdbcTemplate.execute("INSERT IGNORE INTO sys_config (config_key, config_value, description, created_at) VALUES " +
+                    "('dan_commission_rate', '10', 'DAN测评服务通用佣金比例(%)', NOW()), " +
+                    "('dan_commission_rate_assessor', '10', 'DAN测评评估师佣金比例(%)', NOW()), " +
+                    "('dan_commission_rate_planner', '10', 'DAN测评规划师佣金比例(%)', NOW())");
+            log.info("已初始化DAN测评佣金配置");
+        } catch (Exception e) {
+            log.warn("DAN佣金配置种子数据可能已存在: " + e.getMessage());
+        }
+
+        // 迁移 98: users 表添加软删除标记(@TableLogic)
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN deleted TINYINT DEFAULT 0 COMMENT '软删除标记: 0=未删除, 1=已删除'");
+            log.info("已添加deleted列到users表");
+        } catch (Exception e) {
+            // 列已存在,忽略错误
+        }
+    }
+
+    private void runMigration93() {
+        // 迁移 93: 创建 dan_report_uploads 表(DAN PDF报告独立化)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS dan_report_uploads (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "family_id BIGINT NOT NULL COMMENT '家庭ID', " +
+                    "family_member_id BIGINT NOT NULL COMMENT '家庭成员ID', " +
+                    "uploader_user_id BIGINT NOT NULL COMMENT '上传者用户ID', " +
+                    "dimension VARCHAR(16) NOT NULL COMMENT '维度: mind/wisdom', " +
+                    "report_type VARCHAR(16) COMMENT 'A2/B4', " +
+                    "file_url VARCHAR(500) NOT NULL COMMENT 'PDF文件URL', " +
+                    "file_id VARCHAR(100) COMMENT '媒资文件ID', " +
+                    "file_name VARCHAR(200) COMMENT '原始文件名', " +
+                    "file_size BIGINT COMMENT '文件大小(字节)', " +
+                    "uploaded_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "parsed_items JSON COMMENT '解析的指标项', " +
+                    "parsed_extra JSON COMMENT '解析的额外信息', " +
+                    "parsed_summary TEXT COMMENT '解析的总结文本', " +
+                    "parsed_suggestions TEXT COMMENT '解析的建议文本', " +
+                    "parser_version VARCHAR(32) COMMENT '解析器版本', " +
+                    "parse_status VARCHAR(16) DEFAULT 'pending' COMMENT 'pending/success/failed', " +
+                    "parse_error VARCHAR(500) COMMENT '解析失败原因', " +
+                    "parsed_at DATETIME COMMENT '解析完成时间', " +
+                    "draft_status VARCHAR(16) DEFAULT 'pending' COMMENT 'pending/confirmed/discarded', " +
+                    "confirmed_at DATETIME COMMENT '确认时间', " +
+                    "confirmed_by BIGINT COMMENT '确认操作人用户ID', " +
+                    "edited_items JSON COMMENT '编辑后的指标项', " +
+                    "edited_extra JSON COMMENT '编辑后的额外信息', " +
+                    "edited_summary TEXT COMMENT '编辑后的总结', " +
+                    "edited_suggestions TEXT COMMENT '编辑后的建议', " +
+                    "edit_count INT DEFAULT 0 COMMENT '编辑次数', " +
+                    "linked_result_id BIGINT COMMENT '关联 dan_assessment_results.id', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "deleted_at DATETIME COMMENT '软删除时间', " +
+                    "INDEX idx_family_id (family_id), " +
+                    "INDEX idx_member_id (family_member_id), " +
+                    "INDEX idx_draft_status (draft_status), " +
+                    "INDEX idx_dimension (dimension), " +
+                    "INDEX idx_parse_status (parse_status), " +
+                    "INDEX idx_linked_result (linked_result_id)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='DAN测评PDF报告独立记录'");
+            log.info("已创建dan_report_uploads表");
+        } catch (Exception e) {
+            // 表已存在,忽略
+        }
+    }
+
+    private void runMigration94() {
+        // 迁移 94: dan_assessment_results表添加独立化扩展字段(关联新表)
+        ensureColumn("dan_assessment_results", "source_report_id", "BIGINT DEFAULT NULL COMMENT '关联 dan_report_uploads.id'");
+        ensureColumn("dan_assessment_results", "analysis_status", "VARCHAR(16) DEFAULT 'pending' COMMENT '分析状态: pending/confirmed'");
+        log.info("已添加独立化扩展列到dan_assessment_results表");
+    }
+
+    private void runMigration95() {
+        // 迁移 95: 历史 dan_assessment_results 数据 ETL 回填到 dan_report_uploads
+        // 条件: source='parent_upload' AND source_report_id IS NULL(真正的历史遗留数据)
+        // 注意: 新流程的记录通过 confirmUpload 已正确设置 source_report_id,无需处理
+        try {
+            // Step 1: 插入 dan_report_uploads 记录(来自 dan_assessment_results 的历史数据)
+            jdbcTemplate.execute("INSERT IGNORE INTO dan_report_uploads " +
+                    "(family_id, family_member_id, uploader_user_id, dimension, report_type, " +
+                    "file_url, file_id, draft_status, confirmed_at, confirmed_by, " +
+                    "edited_items, edited_summary, edited_suggestions, linked_result_id, " +
+                    "parsed_status, parse_status, created_at, updated_at) " +
+                    "SELECT " +
+                    "  fm.family_id, " +
+                    "  r.family_member_id, " +
+                    "  r.teacher_id, " +
+                    "  r.dimension, " +
+                    "  r.source, " +
+                    "  COALESCE(r.report_file_id, ''), " +
+                    "  r.report_file_id, " +
+                    "  'confirmed', " +
+                    "  r.created_at, " +
+                    "  r.teacher_id, " +
+                    "  r.structured_analysis, " +
+                    "  r.analysis_report, " +
+                    "  r.growth_suggestions, " +
+                    "  r.id, " +
+                    "  'success', " +
+                    "  'confirmed', " +
+                    "  r.created_at, " +
+                    "  r.updated_at " +
+                    "FROM dan_assessment_results r " +
+                    "LEFT JOIN family_members fm ON fm.id = r.family_member_id " +
+                    "WHERE r.source = 'parent_upload' " +
+                    "  AND r.source_report_id IS NULL " +
+                    "  AND r.draft_status = 'confirmed' " +
+                    "  AND NOT EXISTS (SELECT 1 FROM dan_report_uploads u WHERE u.linked_result_id = r.id)"
+            );
+            log.info("迁移95 Step1: 已将历史 dan_assessment_results 回填到 dan_report_uploads");
+        } catch (Exception e) {
+            log.error("迁移95 Step1 失败: " + e.getMessage());
+        }
+
+        // Step 2: 回填 dan_assessment_results.source_report_id(关联新建的 dan_report_uploads 记录)
+        try {
+            jdbcTemplate.execute("UPDATE dan_assessment_results r " +
+                    "INNER JOIN dan_report_uploads u ON u.linked_result_id = r.id " +
+                    "SET r.source_report_id = u.id " +
+                    "WHERE r.source = 'parent_upload' " +
+                    "  AND r.source_report_id IS NULL " +
+                    "  AND r.draft_status = 'confirmed'"
+            );
+        log.info("迁移95 Step2: 已回填 dan_assessment_results.source_report_id");
+    } catch (Exception e) {
+        log.error("迁移95 Step2 失败: " + e.getMessage());
     }
 
+    // 迁移96: 创建活动订单评价表
+    try {
+        jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS review_orders (" +
+            "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+            "order_id BIGINT NOT NULL COMMENT '订单ID', " +
+            "reviewer_id BIGINT NOT NULL COMMENT '评价人ID', " +
+            "rating INT COMMENT '总体评分', " +
+            "review_text TEXT COMMENT '评价内容', " +
+            "review_at DATETIME COMMENT '评价时间', " +
+            "organization_rating INT COMMENT '活动组织评分(0-5)', " +
+            "content_rating INT COMMENT '活动内容评分(0-5)', " +
+            "experience_rating INT COMMENT '活动体验评分(0-5)', " +
+            "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+            "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+            "UNIQUE KEY uk_order_id (order_id), " +
+            "INDEX idx_reviewer_id (reviewer_id)" +
+            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动订单评价表'");
+        log.info("已创建review_orders表");
+    } catch (Exception e) {
+        log.error("迁移96 失败: " + e.getMessage());
+    }
+
+    // 迁移97: growth_task表扩展 — 支持AI_GENERATED类型 + 五维维度/来源会话字段
+    try {
+        jdbcTemplate.execute("ALTER TABLE growth_task MODIFY COLUMN type "
+                + "VARCHAR(16) NOT NULL COMMENT 'DAILY/NEWBIE/AI_GENERATED'");
+        log.info("已扩展growth_task.type为支持AI_GENERATED");
+    } catch (Exception e) {
+        log.warn("扩展growth_task.type失败(可能已经扩展): " + e.getMessage());
+    }
+    ensureColumn("growth_task", "dimension", "VARCHAR(20) NULL COMMENT '五维维度(body/mind/wisdom/action/wealth)'");
+    ensureColumn("growth_task", "source_conversation_id", "VARCHAR(100) NULL COMMENT '来源AI会话ID'");
+    log.info("迁移97: growth_task 表扩展完成");
+
+    // 迁移98: health_gut_flora 表扩展 level 字段长度(支持 CLASS/ORDER/FAMILY)
+    try {
+        jdbcTemplate.execute("ALTER TABLE health_gut_flora MODIFY COLUMN level VARCHAR(20) COMMENT '级别: CLASS/ORDER/FAMILY/GENUS/SPECIES'");
+        log.info("已扩展health_gut_flora.level字段长度");
+    } catch (Exception e) {
+        log.warn("扩展health_gut_flora.level失败: {}", e.getMessage());
+    }
+    log.info("迁移98: health_gut_flora 表扩展完成");
+}
+
     private void runMigration93() {
         // 迁移93: users表添加roles字段
         ensureColumn("users", "roles", "VARCHAR(100) COMMENT '角色列表'");

+ 5 - 1
cfc-backend/src/main/java/com/etotem/cfc/config/WebConfig.java

@@ -1,6 +1,7 @@
 package com.etotem.cfc.config;
 
 import javax.annotation.Resource;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.Ordered;
@@ -26,6 +27,9 @@ public class WebConfig implements WebMvcConfigurer {
     @Resource
     private OperationLogInterceptor operationLogInterceptor;
 
+    @Value("${upload.base-dir:/data/cfc-uploads}")
+    private String uploadBaseDir;
+
     @Override
     public void addCorsMappings(CorsRegistry registry) {
         registry.addMapping("/**")
@@ -113,6 +117,6 @@ public class WebConfig implements WebMvcConfigurer {
     @Override
     public void addResourceHandlers(ResourceHandlerRegistry registry) {
         registry.addResourceHandler("/uploads/**")
-                .addResourceLocations("file:" + System.getProperty("user.dir") + "/uploads/");
+                .addResourceLocations("file:" + uploadBaseDir + "/");
     }
 }

+ 20 - 83
cfc-backend/src/main/java/com/etotem/cfc/controller/DanAssessmentController.java

@@ -39,6 +39,9 @@ public class DanAssessmentController {
     @Resource
     private DimensionScoreService dimensionScoreService;
 
+    @Resource
+    private DanReportUploadService danReportUploadService;
+
     // ===== 测评材料 =====
 
 @Operation(summary = "获取当前测评材料")
@@ -288,102 +291,36 @@ public class DanAssessmentController {
 
     // ===== DAN 报告上传与解析 =====
 
-    @Operation(summary = "上传 DAN 报告并预览解析结果(Phase 1)")
+    @Operation(summary = "上传 DAN 报告并预览解析结果(Phase 1)— 已迁移到 dan_report_uploads 表")
     @PostMapping("/report/parse-preview")
     public Result<Map<String, Object>> parsePreview(
             @RequestParam("file") MultipartFile file,
             @RequestParam("dimension") String dimension,
             @RequestParam("memberId") Long memberId,
             @RequestAttribute("userId") Long userId) {
-        if (file.isEmpty()) {
-            return Result.error("请选择文件");
-        }
-        if (!"mind".equals(dimension) && !"wisdom".equals(dimension)) {
-            return Result.error("dimension 必须为 mind 或 wisdom");
-        }
-        try {
-            // 1. 解析 PDF
-            DanParsedReport parsed = danReportParseService.parse(file.getInputStream(), dimension);
-
-            // 2. 创建草稿记录(draft_status = pending)
-            DanAssessmentResult draft = new DanAssessmentResult();
-            draft.setChildName(""); // 前端预览后再填
-            draft.setAssessmentDate(new java.util.Date());
-            draft.setStructuredAnalysis(parsedToJson(parsed));
-            draft.setDimension(dimension);
-            draft.setReportFileId(file.getOriginalFilename());
-            draft.setDraftStatus("pending");
-            draft.setCreatedAt(new java.util.Date());
-            draft.setUpdatedAt(new java.util.Date());
-            danAssessmentResultMapper.insert(draft);
-
-            // 3. 返回预览数据
-            Map<String, Object> data = new java.util.LinkedHashMap<>();
-            data.put("draftId", draft.getId());
-            data.put("dimension", dimension);
-            data.put("summary", parsed.getSummary() != null ? parsed.getSummary()
-                    : (parsed.getItems() != null ? parsed.getItems().size() + " 项数据" : ""));
-            data.put("items", parsed.getItems() != null
-                    ? parsed.getItems().stream().map(item -> {
-                        Map<String, Object> m = new java.util.LinkedHashMap<>();
-                        m.put("code", item.getCode());
-                        m.put("name", item.getName());
-                        m.put("value", item.getValue());
-                        m.put("category", item.getCategory());
-                        return m;
-                    }).collect(java.util.stream.Collectors.toList())
-                    : java.util.Collections.emptyList());
-            data.put("suggestions", parsed.getSuggestions());
-            data.put("message", "解析完成,请确认数据准确性");
-            return Result.success(data);
-        } catch (Exception e) {
-            return Result.error("解析失败: " + e.getMessage());
-        }
+        Result<Map<String, Object>> r = danReportUploadService.uploadAndParse(userId, memberId, dimension, file);
+        if (r.getCode() == null || r.getCode() != 200 || r.getData() == null) return r;
+        // 兼容旧字段名 draftId → uploadId
+        Object uploadId = r.getData().get("uploadId");
+        r.getData().put("draftId", uploadId);
+        return r;
     }
 
-    @Operation(summary = "确认并保存 DAN 报告(Phase 2)")
+    @Operation(summary = "确认并保存 DAN 报告(Phase 2)— 已迁移到 dan_report_uploads 表")
     @PostMapping("/report/confirm")
-    public Result<String> confirmReport(@RequestBody Map<String, Object> body) {
+    public Result<String> confirmReport(@RequestBody Map<String, Object> body,
+                                         @RequestAttribute("userId") Long userId) {
         Long draftId = body.get("draftId") != null ? Long.valueOf(body.get("draftId").toString()) : null;
+        if (draftId == null) {
+            return Result.error("draftId 不能为空");
+        }
         String childName = (String) body.get("childName");
         String assessmentDateStr = (String) body.get("assessmentDate");
-        String dimension = (String) body.get("dimension");
-        String structuredAnalysis = (String) body.get("structuredAnalysis");
-        Long memberId = body.get("memberId") != null ? Long.valueOf(body.get("memberId").toString()) : null;
-
-        if (draftId == null || memberId == null) {
-            return Result.error("draftId 和 memberId 不能为空");
-        }
-
-        DanAssessmentResult draft = danAssessmentResultMapper.selectById(draftId);
-        if (draft == null) {
-            return Result.error("草稿不存在");
-        }
-
-        // 更新草稿信息
-        if (childName != null && !childName.isEmpty()) {
-            draft.setChildName(childName);
+        Result<?> r = danReportUploadService.confirmUpload(draftId, userId, childName, assessmentDateStr);
+        if (r.getCode() != null && r.getCode() == 200) {
+            return Result.success("报告已确认并保存");
         }
-        if (assessmentDateStr != null && !assessmentDateStr.isEmpty()) {
-            try {
-                draft.setAssessmentDate(new java.text.SimpleDateFormat("yyyy-MM-dd").parse(assessmentDateStr));
-            } catch (Exception ignored) {}
-        }
-        if (structuredAnalysis != null && !structuredAnalysis.isEmpty()) {
-            draft.setStructuredAnalysis(structuredAnalysis);
-        }
-        if (dimension != null) {
-            draft.setDimension(dimension);
-        }
-        draft.setDraftStatus("confirmed");
-        draft.setUpdatedAt(new java.util.Date());
-        danAssessmentResultMapper.updateById(draft);
-
-        // 更新维度分数
-        dimensionScoreService.refreshFromDanAssessment(memberId, draftId,
-                dimension != null ? dimension : draft.getDimension());
-
-        return Result.success("报告已确认并保存");
+        return Result.error(r.getCode() == null ? 500 : r.getCode(), r.getMessage());
     }
 
     @Operation(summary = "获取某孩子某维度的 DAN 报告列表")

+ 74 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/DanReportController.java

@@ -0,0 +1,74 @@
+package com.etotem.cfc.controller;
+
+import com.etotem.cfc.common.Result;
+import com.etotem.cfc.dto.DanReportEditDTO;
+import com.etotem.cfc.dto.DanReportUploadVO;
+import com.etotem.cfc.service.DanReportUploadService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@Tag(name = "DAN报告管理(独立化)", description = "DAN PDF报告上传/解析/确认独立流程")
+@RestController
+@RequestMapping("/api/dan-report")
+public class DanReportController {
+
+    @Resource
+    private DanReportUploadService uploadService;
+
+    // Phase 1: 上传并预览 PDF
+    @PostMapping("/upload")
+    public Result<Map<String, Object>> upload(
+            @RequestParam("file") MultipartFile file,
+            @RequestParam("dimension") String dimension,
+            @RequestParam("memberId") Long memberId,
+            @RequestAttribute("userId") Long userId) {
+        return uploadService.uploadAndParse(userId, memberId, dimension, file);
+    }
+
+    // 编辑草稿
+    @PostMapping("/{id}/edit")
+    public Result<DanReportUploadVO> edit(@PathVariable("id") Long id,
+                                           @RequestBody DanReportEditDTO edit,
+                                           @RequestAttribute("userId") Long userId) {
+        return uploadService.editDraft(id, userId, edit);
+    }
+
+    // Phase 2: 确认入库
+    @PostMapping("/{id}/confirm")
+    public Result<DanReportUploadVO> confirm(@PathVariable("id") Long id,
+                                              @RequestBody Map<String, Object> body,
+                                              @RequestAttribute("userId") Long userId) {
+        String childName = (String) body.get("childName");
+        String assessmentDate = (String) body.get("assessmentDate");
+        return uploadService.confirmUpload(id, userId, childName, assessmentDate);
+    }
+
+    @PostMapping("/{id}/discard")
+    public Result<Void> discard(@PathVariable("id") Long id,
+                                @RequestAttribute("userId") Long userId) {
+        return uploadService.discardUpload(id, userId);
+    }
+
+    @PostMapping("/{id}/complete-analysis")
+    public Result<Void> completeAnalysis(@PathVariable("id") Long id,
+                                         @RequestAttribute("userId") Long userId) {
+        return uploadService.completeAnalysis(id, userId);
+    }
+
+    @PostMapping("/{id}")
+    public Result<DanReportUploadVO> detail(@PathVariable("id") Long id) {
+        return uploadService.getDetail(id);
+    }
+
+    @PostMapping("/list")
+    public Result<List<DanReportUploadVO>> list(@RequestBody Map<String, Object> body) {
+        Long memberId = body.get("memberId") != null ? Long.valueOf(body.get("memberId").toString()) : null;
+        String dimension = (String) body.get("dimension");
+        return uploadService.listByMember(memberId, dimension);
+    }
+}

+ 43 - 18
cfc-backend/src/main/java/com/etotem/cfc/controller/GrowthTaskController.java

@@ -1,6 +1,8 @@
 package com.etotem.cfc.controller;
 
 import com.etotem.cfc.common.Result;
+import com.etotem.cfc.entity.GrowthTask;
+import com.etotem.cfc.mapper.GrowthTaskMapper;
 import com.etotem.cfc.service.GrowthTaskService;
 import org.springframework.web.bind.annotation.*;
 
@@ -12,27 +14,50 @@ import java.util.Map;
 @RequestMapping("/api/growth-task")
 public class GrowthTaskController {
 
-    @Resource
-    private GrowthTaskService growthTaskService;
+ @Resource
+ private GrowthTaskService growthTaskService;
+
+ @Resource
+ private GrowthTaskMapper growthTaskMapper;
 
     @PostMapping("/list")
     public Result<List<Map<String, Object>>> list(@RequestAttribute("userId") Long userId,
                                                    @RequestBody Map<String, String> params) {
-        String type = params.getOrDefault("type", "DAILY");
-        return Result.success(growthTaskService.getTaskList(userId, type));
+return Result.success(growthTaskService.getTaskList(userId, params));
     }
 
-    @PostMapping("/claim")
-    public Result<String> claim(@RequestAttribute("userId") Long userId,
-                                @RequestBody Map<String, Long> params) {
-        Long taskLogId = params.get("taskLogId");
-        if (taskLogId == null) {
-            return Result.error("taskLogId不能为空");
-        }
-        String msg = growthTaskService.claimReward(userId, taskLogId);
-        if ("领取成功".equals(msg)) {
-            return Result.success(msg);
-        }
-        return Result.error(msg);
-    }
-}
+ @PostMapping("/claim")
+ public Result<String> claim(@RequestAttribute("userId") Long userId,
+     @RequestBody Map<String, Long> params) {
+   Long taskLogId = params.get("taskLogId");
+   if (taskLogId == null) {
+     return Result.error("taskLogId不能为空");
+   }
+   String msg = growthTaskService.claimReward(userId, taskLogId);
+   if ("领取成功".equals(msg)) {
+     return Result.success(msg);
+   }
+   return Result.error(msg);
+ }
+
+ @PostMapping("/accept-dynamic")
+ public Result<Map<String, Object>> acceptDynamic(@RequestAttribute("userId") Long userId,
+     @RequestBody Map<String, Object> params) {
+   Object taskIdObj = params.get("taskId");
+   if (taskIdObj == null) {
+     return Result.error("taskId不能为空");
+   }
+   Long taskId = ((Number) taskIdObj).longValue();
+   GrowthTask growthTask = growthTaskMapper.selectById(taskId);
+   if (growthTask == null) {
+     return Result.error("任务不存在");
+   }
+   Map<String, Object> taskInfo = new java.util.HashMap<>();
+   taskInfo.put("id", growthTask.getId());
+   taskInfo.put("title", growthTask.getTitle());
+   taskInfo.put("description", growthTask.getDescription());
+   taskInfo.put("dimension", growthTask.getDimension());
+   taskInfo.put("rewardPoints", growthTask.getRewardPoints());
+   return Result.success(taskInfo);
+ }
+ }

+ 156 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthKnowledgeBaseController.java

@@ -0,0 +1,156 @@
+package com.etotem.cfc.controller;
+
+import com.etotem.cfc.common.Result;
+import com.etotem.cfc.entity.HealthKnowledgeBase;
+import com.etotem.cfc.service.HealthKnowledgeBaseService;
+import com.etotem.cfc.service.KnowledgeBaseDataImporter;
+import com.etotem.cfc.service.KnowledgeBaseV3Service;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+@Slf4j
+@Tag(name = "健康知识库")
+@RestController
+@RequestMapping("/api/health/knowledge")
+public class HealthKnowledgeBaseController {
+
+    @Resource
+    private HealthKnowledgeBaseService healthKnowledgeBaseService;
+
+    @Resource
+    private KnowledgeBaseDataImporter knowledgeBaseDataImporter;
+
+    @Resource
+    private KnowledgeBaseV3Service knowledgeBaseV3Service;
+
+    @Operation(summary = "查询知识库条目")
+    @PostMapping("/query")
+    public Result<HealthKnowledgeBase> query(@RequestBody Map<String, String> params) {
+        String itemType = params.get("itemType");
+        String itemName = params.get("itemName");
+        if (itemType == null || itemName == null) {
+            return Result.error("itemType和itemName不能为空");
+        }
+        HealthKnowledgeBase entry = healthKnowledgeBaseService.query(itemType, itemName);
+        return Result.success(entry);
+    }
+
+    @Operation(summary = "批量查询知识库")
+    @PostMapping("/batch-query")
+    public Result<Map<String, HealthKnowledgeBase>> batchQuery(@RequestBody Map<String, Object> params) {
+        @SuppressWarnings("unchecked")
+        List<Map<String, String>> queries = (List<Map<String, String>>) params.get("queries");
+        if (queries == null || queries.isEmpty()) {
+            return Result.error("queries不能为空");
+        }
+        Map<String, HealthKnowledgeBase> result = healthKnowledgeBaseService.batchQuery(queries);
+        return Result.success(result);
+    }
+
+    @Operation(summary = "列表查询知识库")
+    @PostMapping("/list")
+    public Result<List<HealthKnowledgeBase>> list() {
+        return Result.success(healthKnowledgeBaseService.listAll());
+    }
+
+    @Operation(summary = "新增知识库条目")
+    @PostMapping("/add")
+    public Result add(@RequestBody HealthKnowledgeBase entity) {
+        healthKnowledgeBaseService.save(entity);
+        return Result.success();
+    }
+
+    @Operation(summary = "更新知识库条目")
+    @PostMapping("/update")
+    public Result update(@RequestBody HealthKnowledgeBase entity) {
+        healthKnowledgeBaseService.updateById(entity);
+        return Result.success();
+    }
+
+    @Operation(summary = "删除知识库条目")
+    @PostMapping("/delete")
+    public Result delete(@RequestBody Map<String, Object> params) {
+        Long id = Long.valueOf(params.get("id").toString());
+        healthKnowledgeBaseService.removeById(id);
+        return Result.success();
+    }
+
+    @Operation(summary = "从参考JSON导入知识库数据")
+    @PostMapping("/import")
+    public Result<String> importKnowledgeBase() {
+        String msg = knowledgeBaseDataImporter.importAll();
+        return Result.success(msg);
+    }
+
+    // ==================== KB v3 端点 ====================
+
+    @Operation(summary = "查询KB v3菌属功能(支持属级回退)")
+    @PostMapping("/v3/bacteria/query")
+    public Result<Map<String, Object>> queryBacteria(@RequestBody Map<String, String> params) {
+        String name = params.get("name");
+        if (name == null || name.isEmpty()) {
+            return Result.error("name不能为空");
+        }
+        Map<String, Object> entry = knowledgeBaseV3Service.lookupBacteria(name);
+        return Result.success(entry);
+    }
+
+    @Operation(summary = "批量查询KB v3菌属功能")
+    @PostMapping("/v3/bacteria/batch-query")
+    public Result<Map<String, Map<String, Object>>> batchQueryBacteria(@RequestBody Map<String, Object> params) {
+        @SuppressWarnings("unchecked")
+        List<String> names = (List<String>) params.get("names");
+        if (names == null || names.isEmpty()) {
+            return Result.error("names不能为空");
+        }
+        Map<String, Map<String, Object>> result = knowledgeBaseV3Service.batchLookupBacteria(names);
+        return Result.success(result);
+    }
+
+    @Operation(summary = "查询KB v3指标调整建议")
+    @PostMapping("/v3/indicator/query")
+    public Result<Map<String, Object>> queryIndicator(@RequestBody Map<String, String> params) {
+        String name = params.get("name");
+        if (name == null || name.isEmpty()) {
+            return Result.error("name不能为空");
+        }
+        Map<String, Object> entry = knowledgeBaseV3Service.lookupIndicator(name);
+        return Result.success(entry);
+    }
+
+    @Operation(summary = "查询KB v3食物营养数据")
+    @PostMapping("/v3/food/query")
+    public Result<Map<String, Object>> queryFood(@RequestBody Map<String, String> params) {
+        String name = params.get("name");
+        if (name == null || name.isEmpty()) {
+            return Result.error("name不能为空");
+        }
+        Map<String, Object> entry = knowledgeBaseV3Service.lookupFood(name);
+        return Result.success(entry);
+    }
+
+    @Operation(summary = "获取KB v3完整原始数据(按章节)")
+    @PostMapping("/v3/section")
+    public Result<Object> getSection(@RequestBody Map<String, String> params) {
+        String section = params.get("section");
+        if (section == null || section.isEmpty()) {
+            // 返回章节列表
+            Set<String> sections = knowledgeBaseV3Service.getIndicatorSectionNames();
+            Map<String, Object> data = new LinkedHashMap<>();
+            data.put("sections", sections);
+            data.put("bacteriaGroups", knowledgeBaseV3Service.getBacteriaGroups());
+            data.put("foodCategories", knowledgeBaseV3Service.getFoodCategories());
+            return Result.success(data);
+        }
+        Object data = knowledgeBaseV3Service.getSection(section);
+        return Result.success(data);
+    }
+}

+ 51 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthReportController.java

@@ -275,6 +275,36 @@ public class HealthReportController {
         return Result.success(detail);
     }
 
+    /**
+     * 编辑已发布报告 — 修正 AI 解析错误的值
+     */
+    @Operation(summary = "编辑已发布报告数据")
+    @PostMapping("/report/edit")
+    public Result<String> editReport(
+            @RequestBody Map<String, Object> params,
+            @RequestAttribute("userId") Long userId) {
+
+        Long reportId = params.get("reportId") != null
+                ? Long.valueOf(params.get("reportId").toString()) : null;
+        if (reportId == null) {
+            return Result.error("reportId不能为空");
+        }
+        Long subjectId = params.get("subjectId") != null
+                ? Long.valueOf(params.get("subjectId").toString()) : null;
+        if (subjectId == null) {
+            return Result.error("subjectId不能为空");
+        }
+
+        @SuppressWarnings("unchecked")
+        Map<String, Object> payload = (Map<String, Object>) params.get("payload");
+        if (payload == null) {
+            return Result.error("payload不能为空");
+        }
+
+        healthReportService.updateReportFromPayload(reportId, payload, subjectId);
+        return Result.success("已保存");
+    }
+
     /**
      * 上传并解析肠道菌群报告PDF(向后兼容 — 内部自动执行两阶段:解析→确认)
      */
@@ -1216,6 +1246,27 @@ public class HealthReportController {
         return foods;
     }
 
+    /**
+     * 提交报告反馈(v1.1:日志记录,不入库)
+     */
+    @Operation(summary = "提交报告反馈")
+    @PostMapping("/feedback/submit")
+    public Result<String> submitFeedback(@RequestBody Map<String, Object> params) {
+        Object contentObj = params.get("content");
+        if (contentObj == null || contentObj.toString().trim().isEmpty()) {
+            return Result.error("反馈内容不能为空");
+        }
+        Long reportId = params.get("reportId") != null
+                ? Long.valueOf(params.get("reportId").toString()) : null;
+        String type = params.get("type") != null ? params.get("type").toString() : "其他";
+        String content = contentObj.toString().trim();
+        if (content.length() > 500) {
+            return Result.error("反馈内容不能超过500字");
+        }
+        log.info("用户报告反馈 - reportId: {}, type: {}, content: {}", reportId, type, content);
+        return Result.success("感谢您的反馈");
+    }
+
     /**
      * 保存上传文件到本地存储
      */

+ 8 - 4
cfc-backend/src/main/java/com/etotem/cfc/controller/MarketController.java

@@ -8,6 +8,7 @@ import com.etotem.cfc.entity.TaskPlanInstance;
 import com.etotem.cfc.entity.TaskPlanItem;
 import com.etotem.cfc.entity.TaskTemplatePackage;
 import com.etotem.cfc.entity.TaskTemplateItem;
+import com.etotem.cfc.service.MembershipService;
 import com.etotem.cfc.service.TaskPlanService;
 import com.etotem.cfc.service.TaskTemplatePackageService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -29,6 +30,9 @@ public class MarketController {
     @Resource
     private TaskPlanService planService;
 
+    @Resource
+    private MembershipService membershipService;
+
     /**
      * 获取公开任务模板列表 (市场)
      */
@@ -81,9 +85,8 @@ public class MarketController {
     public Result<TaskPlanInstance> purchasePackage(
             @PathVariable Long id,
             @RequestBody ApplyPackageDTO dto,
-            @RequestAttribute("userId") Long userId,
-            @RequestAttribute("familyId") Long familyId) {
-        
+            @RequestAttribute("userId") Long userId) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         dto.setPackageId(id);
         TaskPlanInstance instance = planService.applyPackage(dto, familyId);
         return Result.success(instance);
@@ -94,7 +97,8 @@ public class MarketController {
      */
     @Operation(summary = "获取我的任务计划")
     @PostMapping("/plans")
-    public Result<List<TaskPlanInstance>> getMyPlans(@RequestAttribute("familyId") Long familyId) {
+    public Result<List<TaskPlanInstance>> getMyPlans(@RequestAttribute("userId") Long userId) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         List<TaskPlanInstance> plans = planService.getFamilyPlans(familyId);
         return Result.success(plans);
     }

+ 5 - 1
cfc-backend/src/main/java/com/etotem/cfc/controller/PackagePaymentController.java

@@ -4,6 +4,7 @@ import javax.annotation.Resource;
 import com.etotem.cfc.common.Result;
 import com.etotem.cfc.entity.PackageOrder;
 import com.etotem.cfc.entity.TaskPlanInstance;
+import com.etotem.cfc.service.MembershipService;
 import com.etotem.cfc.service.PackagePaymentService;
 import com.etotem.cfc.service.TaskPlanService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -23,6 +24,9 @@ public class PackagePaymentController {
     @Resource
     private TaskPlanService planService;
 
+    @Resource
+    private MembershipService membershipService;
+
     /**
      * 创建支付订单
      */
@@ -30,8 +34,8 @@ public class PackagePaymentController {
     @PostMapping("/create")
     public Result<PackageOrder> createOrder(
             @RequestAttribute("userId") Long userId,
-            @RequestAttribute("familyId") Long familyId,
             @RequestBody Map<String, Object> params) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         Long packageId = Long.valueOf(params.get("packageId").toString());
         String payMethod = params.get("payMethod") != null ? params.get("payMethod").toString() : "wechat";
         Long couponId = params.get("couponId") != null ? Long.valueOf(params.get("couponId").toString()) : null;

+ 53 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/ReviewController.java

@@ -0,0 +1,53 @@
+package com.etotem.cfc.controller;
+
+import com.etotem.cfc.common.Result;
+import com.etotem.cfc.dto.ReviewOrderRequest;
+import com.etotem.cfc.dto.ReviewOrderResponse;
+import com.etotem.cfc.dto.ReviewStatusResponse;
+import com.etotem.cfc.service.ReviewOrderService;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestAttribute;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/api/review")
+public class ReviewController {
+
+    @Resource
+    private ReviewOrderService reviewOrderService;
+
+    @PostMapping("/order")
+    public Result<String> reviewOrder(@RequestBody ReviewOrderRequest request,
+                                      @RequestAttribute("userId") Long userId) {
+        String result = reviewOrderService.createReview(request, userId);
+        return Result.success(result);
+    }
+
+    @PostMapping("/order/detail")
+    public Result<ReviewOrderResponse> getReviewOrderDetail(@RequestBody java.util.Map<String, Object> params) {
+        Long orderId = params != null && params.get("orderId") != null
+                ? Long.valueOf(params.get("orderId").toString())
+                : null;
+        if (orderId == null) {
+            return Result.error("orderId is required");
+        }
+        ReviewOrderResponse response = reviewOrderService.findByOrder(orderId);
+        return Result.success(response);
+    }
+
+    @PostMapping("/order/status")
+    public Result<ReviewStatusResponse> getReviewStatus(@RequestBody java.util.Map<String, Object> params) {
+        Long orderId = params != null && params.get("orderId") != null
+                ? Long.valueOf(params.get("orderId").toString())
+                : null;
+        if (orderId == null) {
+            return Result.error("orderId is required");
+        }
+        ReviewStatusResponse response = reviewOrderService.getStats(orderId);
+        return Result.success(response);
+    }
+}

+ 27 - 18
cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminArticleController.java

@@ -5,16 +5,14 @@ import com.etotem.cfc.entity.Article;
 import com.etotem.cfc.entity.ArticleCategory;
 import com.etotem.cfc.service.ArticleCategoryService;
 import com.etotem.cfc.service.ArticleService;
+import com.etotem.cfc.service.FileStorageService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import javax.annotation.Resource;
-import java.io.File;
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.UUID;
 
 @RestController
 @RequestMapping("/api/admin/articles")
@@ -26,6 +24,9 @@ public class AdminArticleController {
     @Resource
     private ArticleCategoryService articleCategoryService;
 
+    @Resource
+    private FileStorageService fileStorageService;
+
     @PostMapping("/list")
     public Result<Page<Article>> list(@RequestBody Map<String, Object> body) {
         String status = (String) body.get("status");
@@ -70,9 +71,25 @@ public class AdminArticleController {
         } else if (rd instanceof String) {
             article.setRelatedDimensions((String) rd);
         }
-        article.setVisibility((String) body.get("visibility"));
-        article.setVisibleTo((String) body.get("visibleTo"));
-        article.setArticleType((String) body.get("articleType"));
+        // visibility, visibleTo, articleType may also come as array
+        Object visibility = body.get("visibility");
+        if (visibility instanceof List) {
+            article.setVisibility(String.join(",", (List<String>) visibility));
+        } else if (visibility instanceof String) {
+            article.setVisibility((String) visibility);
+        }
+        Object visibleTo = body.get("visibleTo");
+        if (visibleTo instanceof List) {
+            article.setVisibleTo(String.join(",", (List<String>) visibleTo));
+        } else if (visibleTo instanceof String) {
+            article.setVisibleTo((String) visibleTo);
+        }
+        Object articleType = body.get("articleType");
+        if (articleType instanceof List) {
+            article.setArticleType(String.join(",", (List<String>) articleType));
+        } else if (articleType instanceof String) {
+            article.setArticleType((String) articleType);
+        }
         if (body.get("status") != null) {
             article.setStatus((String) body.get("status"));
         }
@@ -234,19 +251,11 @@ public class AdminArticleController {
             return Result.error("文件为空");
         }
         try {
-            String uploadDir = System.getProperty("user.dir") + "/uploads/articles/";
-            File dir = new File(uploadDir);
-            if (!dir.exists()) dir.mkdirs();
-
-            String ext = file.getOriginalFilename();
-            ext = ext != null && ext.contains(".") ? ext.substring(ext.lastIndexOf(".")) : ".jpg";
-            String filename = UUID.randomUUID().toString() + ext;
-            File dest = new File(uploadDir + filename);
-            file.transferTo(dest);
-
-            String url = "/uploads/articles/" + filename;
+            String url = fileStorageService.store(file, "articles");
             return Result.success(url);
-        } catch (IOException e) {
+        } catch (IllegalArgumentException e) {
+            return Result.error(e.getMessage());
+        } catch (RuntimeException e) {
             return Result.error("上传失败: " + e.getMessage());
         }
     }

+ 2 - 2
cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminController.java

@@ -175,8 +175,8 @@ public class AdminController {
 
     @PostMapping("/users/{id}/delete")
     public Result<Boolean> deleteUser(@PathVariable Long id) {
-        userMapper.deleteById(id);
-        return Result.success(true);
+        boolean ok = userService.deleteUser(id);
+        return ok ? Result.success(true) : Result.error("用户不存在或删除失败");
     }
 
     // 孩子管理

+ 1 - 1
cfc-backend/src/main/java/com/etotem/cfc/controller/admin/ProductSkuController.java

@@ -27,7 +27,7 @@ public class ProductSkuController {
         Object productIdObj = params.get("productId");
         if (productIdObj == null) return Result.error("productId不能为空");
         Long productId = Long.parseLong(productIdObj.toString());
-        List<ProductSku> skus = skuService.listByProductId(productId);
+        List<ProductSku> skus = skuService.listByProductIdAll(productId);
         List<ProductSkuDTO> dtos = skus.stream()
             .map(ProductSkuDTO::from)
             .collect(Collectors.toList());

+ 66 - 10
cfc-backend/src/main/java/com/etotem/cfc/controller/ai/AIChatController.java

@@ -4,10 +4,12 @@ import com.etotem.cfc.common.Result;
 import com.etotem.cfc.dto.HealthAnalysisResult;
 import com.etotem.cfc.dto.RecommendationQuery;
 import com.etotem.cfc.dto.RecommendationResult;
+import com.etotem.cfc.dto.TaskParseResult;
 import com.etotem.cfc.service.AIService;
 import com.etotem.cfc.service.FamilyContextService;
 import com.etotem.cfc.service.HealthAnalysisService;
 import com.etotem.cfc.service.RecommendationService;
+import com.etotem.cfc.service.TaskParseService;
 import com.etotem.cfc.service.UserService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -44,6 +46,9 @@ public class AIChatController {
     @Resource
     private com.etotem.cfc.service.GrowthTaskService growthTaskService;
 
+    @Resource
+    private TaskParseService taskParseService;
+
     @Resource
     private UserService userService;
 
@@ -107,10 +112,37 @@ public class AIChatController {
                 query, String.valueOf(userId),
                 conversationId, inputs);
 
+        String answer = (String) difyResp.getOrDefault("answer", "");
         Map<String, Object> result = new LinkedHashMap<>();
-        result.put("answer", difyResp.getOrDefault("answer", ""));
+        result.put("answer", answer);
         result.put("conversationId", difyResp.getOrDefault("conversationId", ""));
 
+        // Parse [TASK] markers and create task records
+        List<Map<String, Object>> tasks = new ArrayList<>();
+        List<TaskParseResult> parsedTasks = taskParseService.parseTasks(answer);
+        String cleanAnswer = taskParseService.stripTaskMarkers(answer);
+        
+        for (TaskParseResult taskResult : parsedTasks) {
+            com.etotem.cfc.entity.GrowthTask task = growthTaskService.createDynamicTask(
+                userId,
+                taskResult.getTitle(),
+                taskResult.getDescription(),
+                taskResult.getDimension(),
+                taskResult.getRewardPoints(),
+                (String) difyResp.getOrDefault("conversationId", "")
+            );
+            Map<String, Object> taskInfo = new LinkedHashMap<>();
+            taskInfo.put("id", task.getId());
+            taskInfo.put("title", task.getTitle());
+            taskInfo.put("description", task.getDescription());
+            taskInfo.put("dimension", task.getDimension());
+            taskInfo.put("rewardPoints", task.getRewardPoints());
+            tasks.add(taskInfo);
+        }
+        
+        result.put("answer", cleanAnswer);
+        result.put("tasks", tasks);
+
         try { growthTaskService.updateProgress(userId, "DAILY_AI", 1); } catch (Exception e) { log.warn("成长任务AI对话进度更新失败: userId={}, error={}", userId, e.getMessage()); }
 
         return Result.success(result);
@@ -274,16 +306,40 @@ public class AIChatController {
             } catch (Exception e) {
                 log.warn("解析 [RECOMMEND] 标记失败, 忽略: {}", e.getMessage());
             }
-            // 从回答中移除标记
-            cleanAnswer = matcher.replaceAll("").trim();
-        }
+        // 从回答中移除标记
+        cleanAnswer = matcher.replaceAll("").trim();
+    }
 
-        // 5. 组装结果
-        Map<String, Object> result = new LinkedHashMap<>();
-        result.put("answer", cleanAnswer);
-        result.put("conversationId", difyResp.getOrDefault("conversationId", ""));
-        result.put("recommendations", recommendations != null ? recommendations : Collections.emptyList());
-        return Result.success(result);
+    // Parse [TASK] markers and create task records
+    List<Map<String, Object>> tasks = new ArrayList<>();
+    List<TaskParseResult> parsedTasks = taskParseService.parseTasks(answer);
+    cleanAnswer = taskParseService.stripTaskMarkers(cleanAnswer);
+    
+    for (TaskParseResult taskResult : parsedTasks) {
+        com.etotem.cfc.entity.GrowthTask task = growthTaskService.createDynamicTask(
+            userId,
+            taskResult.getTitle(),
+            taskResult.getDescription(),
+            taskResult.getDimension(),
+            taskResult.getRewardPoints(),
+            null
+        );
+        Map<String, Object> taskInfo = new LinkedHashMap<>();
+        taskInfo.put("id", task.getId());
+        taskInfo.put("title", task.getTitle());
+        taskInfo.put("description", task.getDescription());
+        taskInfo.put("dimension", task.getDimension());
+        taskInfo.put("rewardPoints", task.getRewardPoints());
+        tasks.add(taskInfo);
+    }
+
+    // 5. 组装结果
+    Map<String, Object> result = new LinkedHashMap<>();
+    result.put("answer", cleanAnswer);
+    result.put("conversationId", difyResp.getOrDefault("conversationId", ""));
+    result.put("recommendations", recommendations != null ? recommendations : Collections.emptyList());
+    result.put("tasks", tasks);
+    return Result.success(result);
     }
 
     /**

+ 1 - 1
cfc-backend/src/main/java/com/etotem/cfc/controller/assessment/AssessmentReportController.java

@@ -59,7 +59,7 @@ public class AssessmentReportController {
             return Result.error("文件不能为空");
         }
 
-        String filePath = fileStorageService.upload(file, "assessment-reports");
+        String filePath = fileStorageService.store(file, "assessment-reports");
         if (filePath == null) {
             return Result.error("文件上传失败");
         }

+ 9 - 4
cfc-backend/src/main/java/com/etotem/cfc/controller/family/BindController.java

@@ -5,6 +5,7 @@ import com.etotem.cfc.common.Result;
 import com.etotem.cfc.dto.BindGuideDTO;
 import com.etotem.cfc.entity.GuideFamily;
 import com.etotem.cfc.service.GuideFamilyService;
+import com.etotem.cfc.service.MembershipService;
 import com.etotem.cfc.service.TeacherMessageService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -26,15 +27,18 @@ public class BindController {
     @Resource
     private TeacherMessageService teacherMessageService;
 
+    @Resource
+    private MembershipService membershipService;
+
     /**
      * 家长确认绑定指导师
      */
     @Operation(summary = "确认绑定指导师")
     @PostMapping("/accept")
     public Result<Boolean> acceptBind(@RequestAttribute("userId") Long userId,
-                                        @RequestAttribute("familyId") Long familyId,
                                         @RequestBody BindGuideDTO dto) {
         try {
+            Long familyId = membershipService.getUserFamilyId(userId);
             boolean success = guideFamilyService.confirmBind(dto.getGuideId(), familyId,
                 dto.getServiceType(), dto.getServicePrice());
             return Result.success(success);
@@ -48,7 +52,8 @@ public class BindController {
      */
     @Operation(summary = "获取绑定的指导师列表")
     @PostMapping("/guides")
-    public Result<List<Map<String, Object>>> getBoundGuides(@RequestAttribute("familyId") Long familyId) {
+    public Result<List<Map<String, Object>>> getBoundGuides(@RequestAttribute("userId") Long userId) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         List<GuideFamily> bindings = guideFamilyService.getGuidesByFamily(familyId);
         
         List<Map<String, Object>> result = bindings.stream().map(binding -> {
@@ -71,8 +76,8 @@ public class BindController {
     @Operation(summary = "解除绑定规划师")
     @PostMapping("/unbind")
     public Result<Boolean> unbind(@RequestAttribute("userId") Long userId,
-                                   @RequestAttribute("familyId") Long familyId,
-                                   @RequestBody Map<String, Object> params) {
+                                    @RequestBody Map<String, Object> params) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         Long id = Long.valueOf(params.get("id").toString());
         try {
             GuideFamily gf = guideFamilyService.unbindAndGet(id, familyId);

+ 10 - 3
cfc-backend/src/main/java/com/etotem/cfc/controller/mind/MindFortuneController.java

@@ -4,6 +4,7 @@ import com.etotem.cfc.common.Result;
 import com.etotem.cfc.entity.FamilyFortune;
 import com.etotem.cfc.entity.FamilyFortuneReport;
 import com.etotem.cfc.service.FortuneService;
+import com.etotem.cfc.service.MembershipService;
 import com.etotem.cfc.service.PdfReportService;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestAttribute;
@@ -24,12 +25,16 @@ public class MindFortuneController {
     
     @Resource
     private PdfReportService pdfReportService;
+
+    @Resource
+    private MembershipService membershipService;
     
     /**
      * 获取今日家庭运势
      */
     @PostMapping("/fortune")
-    public Result<Map<String, Object>> getTodayFortune(@RequestAttribute("familyId") Long familyId) {
+    public Result<Map<String, Object>> getTodayFortune(@RequestAttribute("userId") Long userId) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         FamilyFortune fortune = fortuneService.getFamilyFortune(familyId, LocalDate.now());
         Map<String, Object> result = batchBuildFortuneResponse(fortune);
         return Result.success(result);
@@ -39,7 +44,8 @@ public class MindFortuneController {
      * 手动刷新运势(仅供测试)
      */
     @PostMapping("/fortune/refresh")
-    public Result<FamilyFortune> refreshFortune(@RequestAttribute("familyId") Long familyId) {
+    public Result<FamilyFortune> refreshFortune(@RequestAttribute("userId") Long userId) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         FamilyFortune fortune = fortuneService.getFamilyFortune(familyId, LocalDate.now());
         fortune.setLuckyDirection(fortuneService.calculateLuckyDirection(familyId, LocalDate.now()));
         fortuneService.saveFamilyFortune(fortune);
@@ -53,8 +59,9 @@ public class MindFortuneController {
      */
     @PostMapping("/fortune/export")
     public Result<Map<String, Object>> exportFortuneReport(
-            @RequestAttribute("familyId") Long familyId,
+            @RequestAttribute("userId") Long userId,
             @RequestBody ExportReportRequest request) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         try {
             // 文件大小校验
             if (request.imageBase64 == null || request.imageBase64.length() > 4 * 1024 * 1024) {

+ 52 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/product/ProductOrderController.java

@@ -5,8 +5,11 @@ import com.alibaba.fastjson.JSONObject;
 import com.etotem.cfc.common.Result;
 import com.etotem.cfc.dto.CreateProductOrderDTO;
 import com.etotem.cfc.dto.ProductOrderDTO;
+import com.etotem.cfc.entity.ActivityProvision;
+import com.etotem.cfc.service.ActivityProvisionService;
 import com.etotem.cfc.service.PaymentService;
 import com.etotem.cfc.service.ProductOrderService;
+import com.etotem.cfc.service.QrCodeService;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestAttribute;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -30,6 +33,12 @@ public class ProductOrderController {
     @Resource
     private PaymentService paymentService;
 
+@Resource
+private ActivityProvisionService activityProvisionService;
+
+@Resource
+private QrCodeService qrCodeService;
+
     @PostMapping("/create")
     public Result<ProductOrderDTO> create(@RequestBody CreateProductOrderDTO dto,
                                          @RequestAttribute("userId") Long userId) {
@@ -144,4 +153,47 @@ public class ProductOrderController {
             return err;
         }
     }
+
+    @PostMapping("/activity/audit")
+    public Result<String> activityAudit(@RequestBody Map<String, Object> params,
+                                        @RequestAttribute("userId") Long userId) {
+        Long orderId = Long.valueOf(params.get("orderId").toString());
+        String action = (String) params.get("action");
+        if ("approve".equals(action)) {
+            return activityProvisionService.provision(orderId, userId);
+        } else {
+            String reason = (String) params.get("reason");
+            return activityProvisionService.cancel(orderId, userId, reason);
+        }
+    }
+
+    @PostMapping("/activity/sign-in")
+    public Result<String> activitySignIn(@RequestBody Map<String, Object> params) {
+        Long orderId = Long.valueOf(params.get("orderId").toString());
+        Long childId = Long.valueOf(params.get("childId").toString());
+        return activityProvisionService.signIn(orderId, childId);
+    }
+
+    @PostMapping("/activity/complete")
+    public Result<String> activityComplete(@RequestBody Map<String, Object> params) {
+        Long orderId = Long.valueOf(params.get("orderId").toString());
+        return activityProvisionService.complete(orderId);
+    }
+
+@PostMapping("/activity/provision")
+public Result<ActivityProvision> activityProvision(@RequestBody Map<String, Object> params) {
+    Long orderId = Long.valueOf(params.get("orderId").toString());
+    return activityProvisionService.getByOrderId(orderId);
+}
+
+@PostMapping("/activity/qr-image")
+public Result<String> getActivityQrImage(@RequestBody Map<String, Object> params) {
+    Long orderId = Long.valueOf(params.get("orderId").toString());
+    ActivityProvision provision = activityProvisionService.getByOrderId(orderId).getData();
+    if (provision == null || provision.getQrCode() == null) {
+        return Result.error("QR code not available");
+    }
+    String base64Qr = qrCodeService.generateQrCodeBase64(provision.getQrCode());
+    return Result.success(base64Qr);
+}
 }

+ 11 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/DanReportEditDTO.java

@@ -0,0 +1,11 @@
+package com.etotem.cfc.dto;
+
+import lombok.Data;
+
+@Data
+public class DanReportEditDTO {
+    private String itemsJson;
+    private String extraJson;
+    private String summary;
+    private String suggestions;
+}

+ 59 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/DanReportUploadVO.java

@@ -0,0 +1,59 @@
+package com.etotem.cfc.dto;
+
+import com.etotem.cfc.entity.DanReportUpload;
+import lombok.Data;
+import java.util.Date;
+
+@Data
+public class DanReportUploadVO {
+    private Long id;
+    private Long familyId;
+    private Long familyMemberId;
+    private Long uploaderUserId;
+    private String dimension;
+    private String reportType;
+    private String fileUrl;
+    private String fileId;
+    private String fileName;
+    private Long fileSize;
+    private Date uploadedAt;
+    private String parserVersion;
+    private String parseStatus;
+    private String parseError;
+    private Date parsedAt;
+    private String draftStatus;
+    private Date confirmedAt;
+    private Long confirmedBy;
+    private Integer editCount;
+    private Long linkedResultId;
+    private Date createdAt;
+    private Date updatedAt;
+
+    public static DanReportUploadVO fromEntity(DanReportUpload e) {
+        if (e == null) return null;
+        DanReportUploadVO v = new DanReportUploadVO();
+        v.setId(e.getId());
+        v.setFamilyId(e.getFamilyId());
+        v.setFamilyMemberId(e.getFamilyMemberId());
+        v.setUploaderUserId(e.getUploaderUserId());
+        v.setDimension(e.getDimension());
+        v.setReportType(e.getReportType());
+        v.setFileUrl(e.getFileUrl());
+        v.setFileId(e.getFileId());
+        v.setFileName(e.getFileName());
+        v.setFileSize(e.getFileSize());
+        v.setUploadedAt(e.getUploadedAt());
+        v.setParserVersion(e.getParserVersion());
+        v.setParseStatus(e.getParseStatus());
+        v.setParseError(e.getParseError());
+        v.setParsedAt(e.getParsedAt());
+        v.setDraftStatus(e.getDraftStatus());
+        v.setConfirmedAt(e.getConfirmedAt());
+        v.setConfirmedBy(e.getConfirmedBy());
+        v.setEditCount(e.getEditCount());
+        v.setLinkedResultId(e.getLinkedResultId());
+        v.setCreatedAt(e.getCreatedAt());
+        v.setUpdatedAt(e.getUpdatedAt());
+        return v;
+    }
+}

+ 10 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/ExecutionCompleteRequest.java

@@ -0,0 +1,10 @@
+package com.etotem.cfc.dto;
+
+import lombok.Data;
+
+@Data
+public class ExecutionCompleteRequest {
+    private Long executionId;
+    private String role; // assessor / planner
+    private String notes;
+}

+ 9 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/ExecutionConfirmRequest.java

@@ -0,0 +1,9 @@
+package com.etotem.cfc.dto;
+
+import lombok.Data;
+
+@Data
+public class ExecutionConfirmRequest {
+    private Long executionId;
+    private Integer confirmed; // 1=confirm, 0=reject
+}

+ 34 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/ExecutionDetailResponse.java

@@ -0,0 +1,34 @@
+package com.etotem.cfc.dto;
+
+import com.etotem.cfc.entity.ServiceSettlement;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ExecutionDetailResponse {
+    private Long executionId;
+    private Long assessmentOrderId;
+    private Long childId;
+    private Long familyId;
+    private Long quotaId;
+
+    private Long assessorId;
+    private String assessorStatus;
+    private Date assessorCompletedAt;
+    private String assessorNotes;
+
+    private Long plannerId;
+    private String plannerStatus;
+    private Date plannerCompletedAt;
+    private String plannerNotes;
+
+    private Integer userConfirmed;
+    private Date userConfirmedAt;
+
+    private Date createdAt;
+    private Date updatedAt;
+
+    private ServiceSettlement assessorSettlement;
+    private ServiceSettlement plannerSettlement;
+}

+ 21 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/ParsedReportPayload.java

@@ -169,6 +169,13 @@ public class ParsedReportPayload {
         private List<Indicator> indicators;
         private List<Flora> gutFlora;
         private List<Flora> probioticSpecies;
+        private List<Flora> taxonomyClass;       // 菌纲构成
+        private List<Flora> taxonomyOrder;       // 菌目构成
+        private List<Flora> taxonomyFamily;      // 菌科构成
+        private List<Flora> taxonomyGenus;       // 菌属构成
+        private List<Flora> taxonomySpecies;     // 菌种构成
+        private List<Flora> pathogenGenus;       // 病原菌属
+        private List<Flora> pathogenDetection;   // 病原菌检出
         private List<FoodItem> foods;
         private List<DiseaseRisk> diseaseRisks;
 
@@ -180,6 +187,20 @@ public class ParsedReportPayload {
         public void setGutFlora(List<Flora> gutFlora) { this.gutFlora = gutFlora; }
         public List<Flora> getProbioticSpecies() { return probioticSpecies; }
         public void setProbioticSpecies(List<Flora> probioticSpecies) { this.probioticSpecies = probioticSpecies; }
+        public List<Flora> getTaxonomyClass() { return taxonomyClass; }
+        public void setTaxonomyClass(List<Flora> taxonomyClass) { this.taxonomyClass = taxonomyClass; }
+        public List<Flora> getTaxonomyOrder() { return taxonomyOrder; }
+        public void setTaxonomyOrder(List<Flora> taxonomyOrder) { this.taxonomyOrder = taxonomyOrder; }
+        public List<Flora> getTaxonomyFamily() { return taxonomyFamily; }
+        public void setTaxonomyFamily(List<Flora> taxonomyFamily) { this.taxonomyFamily = taxonomyFamily; }
+        public List<Flora> getTaxonomyGenus() { return taxonomyGenus; }
+        public void setTaxonomyGenus(List<Flora> taxonomyGenus) { this.taxonomyGenus = taxonomyGenus; }
+        public List<Flora> getTaxonomySpecies() { return taxonomySpecies; }
+        public void setTaxonomySpecies(List<Flora> taxonomySpecies) { this.taxonomySpecies = taxonomySpecies; }
+        public List<Flora> getPathogenGenus() { return pathogenGenus; }
+        public void setPathogenGenus(List<Flora> pathogenGenus) { this.pathogenGenus = pathogenGenus; }
+        public List<Flora> getPathogenDetection() { return pathogenDetection; }
+        public void setPathogenDetection(List<Flora> pathogenDetection) { this.pathogenDetection = pathogenDetection; }
         public List<FoodItem> getFoods() { return foods; }
         public void setFoods(List<FoodItem> foods) { this.foods = foods; }
         public List<DiseaseRisk> getDiseaseRisks() { return diseaseRisks; }

+ 11 - 6
cfc-backend/src/main/java/com/etotem/cfc/dto/ProductSkuDTO.java

@@ -5,7 +5,6 @@ import com.alibaba.fastjson.TypeReference;
 import com.etotem.cfc.entity.ProductSku;
 import lombok.Data;
 import java.math.BigDecimal;
-import java.util.List;
 import java.util.Map;
 
 @Data
@@ -13,7 +12,7 @@ public class ProductSkuDTO {
     private Long id;
     private Long productId;
     private String skuCode;
-    private List<Map<String, String>> specs;
+    private Map<String, String> specs;
     private BigDecimal price;
     private BigDecimal originalPrice;
     private Integer stock;
@@ -31,12 +30,18 @@ public class ProductSkuDTO {
         dto.setStock(sku.getStock());
         dto.setImage(sku.getImage());
         dto.setEnabled(sku.getEnabled() != null && sku.getEnabled() == 1);
-        // Parse specs JSON to List<Map>
+        // Parse specs JSON to Map (stored as JSON object in DB)
         if (sku.getSpecs() != null) {
             try {
-                List<Map<String, String>> specsList = JSON.parseObject(sku.getSpecs().toString(),
-                    new TypeReference<List<Map<String, String>>>() {});
-                dto.setSpecs(specsList);
+                String specsStr;
+                if (sku.getSpecs() instanceof String) {
+                    specsStr = (String) sku.getSpecs();
+                } else {
+                    specsStr = JSON.toJSONString(sku.getSpecs());
+                }
+                Map<String, String> specsMap = JSON.parseObject(specsStr,
+                    new TypeReference<Map<String, String>>() {});
+                dto.setSpecs(specsMap);
             } catch (Exception e) {
                 dto.setSpecs(null);
             }

+ 14 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/ReviewOrderRequest.java

@@ -0,0 +1,14 @@
+package com.etotem.cfc.dto;
+
+import lombok.Data;
+
+@Data
+public class ReviewOrderRequest {
+
+    private Long orderId;
+    private Integer rating;
+    private String reviewText;
+    private Integer organizationRating;
+    private Integer contentRating;
+    private Integer experienceRating;
+}

+ 16 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/ReviewOrderResponse.java

@@ -0,0 +1,16 @@
+package com.etotem.cfc.dto;
+
+import lombok.Data;
+
+@Data
+public class ReviewOrderResponse {
+
+    private Long orderId;
+    private Long reviewerId;
+    private Integer rating;
+    private String reviewText;
+    private String reviewAt;
+    private Integer organizationRating;
+    private Integer contentRating;
+    private Integer experienceRating;
+}

+ 20 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/ReviewStatusResponse.java

@@ -0,0 +1,20 @@
+package com.etotem.cfc.dto;
+
+import lombok.Data;
+
+@Data
+public class ReviewStatusResponse {
+
+    private Boolean reviewed;
+    private Integer rating;
+    private String reviewText;
+    private String reviewAt;
+    private Integer organizationRating;
+    private Integer contentRating;
+    private Integer experienceRating;
+    private Double organizationAvg;
+    private Double contentAvg;
+    private Double experienceAvg;
+    private Double overallAvg;
+    private Integer totalReviews;
+}

+ 15 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/ServiceRateRequest.java

@@ -0,0 +1,15 @@
+package com.etotem.cfc.dto;
+
+import lombok.Data;
+
+@Data
+public class ServiceRateRequest {
+    private Long executionId;
+    private Long userId;
+    private Long assessorId;
+    private Integer assessorRating;
+    private String assessorComment;
+    private Long plannerId;
+    private Integer plannerRating;
+    private String plannerComment;
+}

+ 12 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/SettlementCreateRequest.java

@@ -0,0 +1,12 @@
+package com.etotem.cfc.dto;
+
+import lombok.Data;
+
+@Data
+public class SettlementCreateRequest {
+    private Long executionId;
+    private Long assessmentOrderId;
+    private Long providerId;
+    private String providerType; // assessor / planner
+    private Long serviceFee;
+}

+ 24 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/TaskParseResult.java

@@ -0,0 +1,24 @@
+package com.etotem.cfc.dto;
+
+public class TaskParseResult {
+    private String title;
+    private String description;
+    private String deadline;
+    private String dimension;
+    private Integer rewardPoints;
+
+    public String getTitle() { return title; }
+    public void setTitle(String title) { this.title = title; }
+
+    public String getDescription() { return description; }
+    public void setDescription(String description) { this.description = description; }
+
+    public String getDeadline() { return deadline; }
+    public void setDeadline(String deadline) { this.deadline = deadline; }
+
+    public String getDimension() { return dimension; }
+    public void setDimension(String dimension) { this.dimension = dimension; }
+
+    public Integer getRewardPoints() { return rewardPoints; }
+    public void setRewardPoints(Integer rewardPoints) { this.rewardPoints = rewardPoints; }
+}

+ 33 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/ActivityProvision.java

@@ -0,0 +1,33 @@
+package com.etotem.cfc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("activity_provisions")
+public class ActivityProvision implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private Long orderId;
+    private String orderNo;
+    private Long productId;
+    private Long activityId;
+    private Long buyerId;
+    private Long familyId;
+    private Long childId;
+    private String status;
+    private String qrCode;
+    private Date checkedInAt;
+    private Date completedAt;
+    private Integer refundAmount;
+    private Date refundAt;
+    private Date createdAt;
+    private Date updatedAt;
+}

+ 39 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/DanAssessmentExecution.java

@@ -0,0 +1,39 @@
+package com.etotem.cfc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("dan_assessment_executions")
+public class DanAssessmentExecution implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private Long assessmentExecutionId;
+    private Long assessmentOrderId;
+    private Long childId;
+    private Long familyId;
+    private Long quotaId;
+
+    private Long assessorId;
+    private String assessorStatus;
+    private Date assessorCompletedAt;
+    private String assessorNotes;
+
+    private Long plannerId;
+    private String plannerStatus;
+    private Date plannerCompletedAt;
+    private String plannerNotes;
+
+    private Integer userConfirmed;
+    private Date userConfirmedAt;
+
+    private Date createdAt;
+    private Date updatedAt;
+}

+ 4 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/DanAssessmentResult.java

@@ -132,4 +132,8 @@ public class DanAssessmentResult implements Serializable {
     private String dimension; // mind(心-A2)/wisdom(智-B4)
     private String reportFileId; // 上传文件媒资ID
     private String draftStatus; // pending(待确认)/confirmed(已确认)
+
+    // === 独立化扩展字段(迁移93新增) ===
+    private Long sourceReportId; // 关联 dan_report_uploads.id
+    private String analysisStatus; // pending(待规划师确认)/confirmed(已确认)
 }

+ 87 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/DanReportUpload.java

@@ -0,0 +1,87 @@
+package com.etotem.cfc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("dan_report_uploads")
+public class DanReportUpload implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private Long familyId;
+    private Long familyMemberId;
+    private Long uploaderUserId;
+    private String dimension;
+    private String reportType;
+
+    private String fileUrl;
+    private String fileId;
+    private String fileName;
+    private Long fileSize;
+    private Date uploadedAt;
+
+    @TableField("parsed_items")
+    private String parsedItems;
+
+    @TableField("parsed_extra")
+    private String parsedExtra;
+
+    @TableField("parsed_summary")
+    private String parsedSummary;
+
+    @TableField("parsed_suggestions")
+    private String parsedSuggestions;
+
+    private String parserVersion;
+    private String parseStatus;
+    private String parseError;
+    private Date parsedAt;
+
+    private String draftStatus;
+    private Date confirmedAt;
+    private Long confirmedBy;
+
+    @TableField("edited_items")
+    private String editedItems;
+
+    @TableField("edited_extra")
+    private String editedExtra;
+
+    @TableField("edited_summary")
+    private String editedSummary;
+
+    @TableField("edited_suggestions")
+    private String editedSuggestions;
+
+    private Integer editCount;
+    private Long linkedResultId;
+
+    private Date createdAt;
+    private Date updatedAt;
+    private Date deletedAt;
+
+    public static final String DRAFT_PENDING = "pending";
+    public static final String DRAFT_CONFIRMED = "confirmed";
+    public static final String DRAFT_DISCARDED = "discarded";
+
+    public static final String PARSE_PENDING = "pending";
+    public static final String PARSE_SUCCESS = "success";
+    public static final String PARSE_FAILED = "failed";
+
+    public static final String DIM_MIND = "mind";
+    public static final String DIM_WISDOM = "wisdom";
+    public static final String DIM_COGNITION = "cognition";
+    public static final String DIM_LEARNING = "learning";
+    public static final String DIM_BEHAVIOR = "behavior";
+    public static final String DIM_CAREER = "career";
+    public static final String DIM_CAMPUS = "campus";
+    public static final String DIM_ADOLESCENT = "adolescent";
+}

+ 6 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/GrowthTask.java

@@ -34,4 +34,10 @@ public class GrowthTask implements Serializable {
     private Integer sortOrder;
 
     private Date createdAt;
+
+    /** 五维维度: body/mind/wisdom/action/wealth */
+    private String dimension;
+
+    /** 来源AI会话ID(AI_GENERATED类型任务使用) */
+    private String sourceConversationId;
 }

+ 16 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/HealthGutFlora.java

@@ -16,6 +16,22 @@ import java.util.Date;
 @TableName("health_gut_flora")
 public class HealthGutFlora implements Serializable {
 
+    // ===== Level 常量 =====
+    public static final String LEVEL_CLASS = "CLASS";      // 纲
+    public static final String LEVEL_ORDER = "ORDER";      // 目
+    public static final String LEVEL_FAMILY = "FAMILY";    // 科
+    public static final String LEVEL_GENUS = "GENUS";      // 属
+    public static final String LEVEL_SPECIES = "SPECIES";  // 种
+
+    // ===== Category 常量 =====
+    public static final String CATEGORY_CORE = "core";                 // 核心菌属
+    public static final String CATEGORY_PROBIOTIC = "probiotic";       // 益生菌
+    public static final String CATEGORY_HARMFUL = "harmful";           // 有害菌
+    public static final String CATEGORY_OTHER = "other";               // 其它重要菌属
+    public static final String CATEGORY_PATHOGEN_GENUS = "pathogen_genus";        // 病原菌属
+    public static final String CATEGORY_PATHOGEN_DETECTION = "pathogen_detection"; // 病原菌检出
+    public static final String CATEGORY_TAXONOMY = "taxonomy";         // 菌群层级
+
     @TableId(type = IdType.AUTO)
     private Long id;
 

+ 46 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/HealthKnowledgeBase.java

@@ -0,0 +1,46 @@
+package com.etotem.cfc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 健康知识库 — 菌属/营养素/指标标准说明
+ * 独立于报告数据存储,通过 itemType + itemName 精确匹配
+ */
+@Data
+@TableName("health_knowledge_base")
+public class HealthKnowledgeBase implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 类型: bacteria/nutrient/indicator/vitamin/amino_acid/disease */
+    private String itemType;
+
+    /** 项目名称(精确匹配,如 "双歧杆菌属 Bifidobacterium") */
+    private String itemName;
+
+    /** 分类(如 有益菌/有害菌) */
+    private String category;
+
+    /** 正常范围参考(如 "0.19-14.59") */
+    private String normalRange;
+
+    /** 详细说明文字 */
+    private String description;
+
+    /** 相关建议(如补充来源) */
+    private String suggestion;
+
+    /** 数据来源 */
+    private String source;
+
+    private Date createdAt;
+
+    private Date updatedAt;
+}

+ 10 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/ProductOrder.java

@@ -57,6 +57,12 @@ public class ProductOrder implements Serializable {
     // 购买信息采集
     private Long consigneeId;          // 收货人ID
     private String purchaseInfo;       // 购买信息快照(JSON)
+    // 活动核销字段
+    private Long activityId;
+    private String provisionStatus;
+    private Long auditorId;
+    private Date auditedAt;
+    private String auditReason;
 
     private Date createdAt;
     private Date updatedAt;
@@ -83,4 +89,8 @@ public class ProductOrder implements Serializable {
     public void setMoneyAmount(Integer moneyAmount) { this.moneyAmount = moneyAmount; }
     public void setConsigneeId(Long consigneeId) { this.consigneeId = consigneeId; }
     public void setPurchaseInfo(String purchaseInfo) { this.purchaseInfo = purchaseInfo; }
+    public void setProvisionStatus(String provisionStatus) { this.provisionStatus = provisionStatus; }
+    public void setAuditorId(Long auditorId) { this.auditorId = auditorId; }
+    public void setAuditedAt(Date auditedAt) { this.auditedAt = auditedAt; }
+    public void setAuditReason(String auditReason) { this.auditReason = auditReason; }
 }

+ 28 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/ReviewOrder.java

@@ -0,0 +1,28 @@
+package com.etotem.cfc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("review_orders")
+public class ReviewOrder implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private Long orderId;
+    private Long reviewerId;
+    private Integer rating;
+    private String reviewText;
+    private Date reviewAt;
+    private Integer organizationRating;
+    private Integer contentRating;
+    private Integer experienceRating;
+    private Date createdAt;
+    private Date updatedAt;
+}

+ 31 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/ServiceRating.java

@@ -0,0 +1,31 @@
+package com.etotem.cfc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("service_ratings")
+public class ServiceRating implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private Long executionId;
+    private Long assessmentOrderId;
+    private Long userId;
+
+    private Long assessorId;
+    private Integer assessorRating;
+    private String assessorComment;
+
+    private Long plannerId;
+    private Integer plannerRating;
+    private String plannerComment;
+
+    private Date createdAt;
+}

+ 33 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/ServiceSettlement.java

@@ -0,0 +1,33 @@
+package com.etotem.cfc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("service_settlements")
+public class ServiceSettlement implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private Long executionId;
+    private Long assessmentOrderId;
+    private Long providerId;
+    private String providerType;
+
+    private Long serviceFee;
+    private Integer commissionRate;
+    private Long commissionAmount;
+
+    private String status;
+    private Date settledAt;
+    private String transactionId;
+
+    private Date createdAt;
+    private Date updatedAt;
+}

+ 6 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/User.java

@@ -1,7 +1,9 @@
 package com.etotem.cfc.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
@@ -147,4 +149,8 @@ public class User implements Serializable {
     private Date createdAt;
 
     private Date updatedAt;
+
+    @TableLogic
+    @TableField("deleted")
+    private Integer deleted;
 }

+ 9 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/ActivityProvisionMapper.java

@@ -0,0 +1,9 @@
+package com.etotem.cfc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.etotem.cfc.entity.ActivityProvision;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ActivityProvisionMapper extends BaseMapper<ActivityProvision> {
+}

+ 9 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/DanAssessmentExecutionMapper.java

@@ -0,0 +1,9 @@
+package com.etotem.cfc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.etotem.cfc.entity.DanAssessmentExecution;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DanAssessmentExecutionMapper extends BaseMapper<DanAssessmentExecution> {
+}

+ 9 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/DanReportUploadMapper.java

@@ -0,0 +1,9 @@
+package com.etotem.cfc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.etotem.cfc.entity.DanReportUpload;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DanReportUploadMapper extends BaseMapper<DanReportUpload> {
+}

+ 7 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/HealthKnowledgeBaseMapper.java

@@ -0,0 +1,7 @@
+package com.etotem.cfc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.etotem.cfc.entity.HealthKnowledgeBase;
+
+public interface HealthKnowledgeBaseMapper extends BaseMapper<HealthKnowledgeBase> {
+}

+ 2 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/ProductSkuMapper.java

@@ -9,6 +9,8 @@ public interface ProductSkuMapper extends BaseMapper<ProductSku> {
 
     List<ProductSku> findByProductId(@Param("productId") Long productId);
 
+    List<ProductSku> findByProductIdAll(@Param("productId") Long productId);
+
     ProductSku findById(@Param("id") Long id);
 
     int updateStock(@Param("id") Long id, @Param("quantity") Integer quantity);

+ 16 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/ReviewOrderMapper.java

@@ -0,0 +1,16 @@
+package com.etotem.cfc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.etotem.cfc.entity.ReviewOrder;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Map;
+
+@Mapper
+public interface ReviewOrderMapper extends BaseMapper<ReviewOrder> {
+
+    ReviewOrder findByOrderId(@Param("orderId") Long orderId);
+
+    Map<String, Object> getStatsByOrderId(@Param("orderId") Long orderId);
+}

+ 9 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/ServiceRatingMapper.java

@@ -0,0 +1,9 @@
+package com.etotem.cfc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.etotem.cfc.entity.ServiceRating;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ServiceRatingMapper extends BaseMapper<ServiceRating> {
+}

+ 9 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/ServiceSettlementMapper.java

@@ -0,0 +1,9 @@
+package com.etotem.cfc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.etotem.cfc.entity.ServiceSettlement;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ServiceSettlementMapper extends BaseMapper<ServiceSettlement> {
+}

+ 155 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/ActivityProvisionService.java

@@ -0,0 +1,155 @@
+package com.etotem.cfc.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.etotem.cfc.common.Result;
+import com.etotem.cfc.entity.ActivityProvision;
+import com.etotem.cfc.entity.ProductOrder;
+import com.etotem.cfc.mapper.ActivityProvisionMapper;
+import com.etotem.cfc.mapper.ProductOrderMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.UUID;
+
+@Service
+public class ActivityProvisionService {
+
+    @Resource
+    private ActivityProvisionMapper activityProvisionMapper;
+
+    @Resource
+    private ProductOrderMapper productOrderMapper;
+
+    @Resource
+    private PaymentService paymentService;
+
+    public Result<String> provision(Long orderId, Long auditorId) {
+        ProductOrder order = productOrderMapper.selectById(orderId);
+        if (order == null) {
+            return Result.error("订单不存在");
+        }
+        if (!"unprovisioned".equals(order.getProvisionStatus())) {
+            return Result.error("当前状态不允许审核");
+        }
+        ActivityProvision provision = new ActivityProvision();
+        provision.setOrderId(orderId);
+        provision.setOrderNo(order.getOrderNo());
+        provision.setProductId(order.getProductId());
+        provision.setActivityId(order.getActivityId() != null ? order.getActivityId() : order.getProductId());
+        provision.setBuyerId(order.getBuyerId());
+        provision.setFamilyId(order.getFamilyId());
+        provision.setStatus("provisioned");
+        provision.setQrCode(generateQrCode(order.getOrderNo()));
+        provision.setCreatedAt(new Date());
+        provision.setUpdatedAt(new Date());
+        activityProvisionMapper.insert(provision);
+
+        order.setProvisionStatus("provisioned");
+        order.setAuditorId(auditorId);
+        order.setAuditedAt(new Date());
+        productOrderMapper.updateById(order);
+        return Result.success("审核通过,已生成签到码");
+    }
+
+    @Transactional
+    public Result<String> cancel(Long orderId, Long auditorId, String reason) {
+        ProductOrder order = productOrderMapper.selectById(orderId);
+        if (order == null) {
+            return Result.error("订单不存在");
+        }
+        if (!"unprovisioned".equals(order.getProvisionStatus())) {
+            return Result.error("当前状态不允许取消");
+        }
+        ActivityProvision provision = new ActivityProvision();
+        provision.setOrderId(orderId);
+        provision.setOrderNo(order.getOrderNo());
+        provision.setProductId(order.getProductId());
+        provision.setActivityId(order.getActivityId() != null ? order.getActivityId() : order.getProductId());
+        provision.setBuyerId(order.getBuyerId());
+        provision.setFamilyId(order.getFamilyId());
+        provision.setStatus("cancelled");
+        provision.setRefundAmount(order.getTotalAmount());
+        provision.setRefundAt(new Date());
+        provision.setCreatedAt(new Date());
+        provision.setUpdatedAt(new Date());
+        activityProvisionMapper.insert(provision);
+
+        order.setProvisionStatus("cancelled");
+        order.setStatus("cancelled");
+        order.setAuditorId(auditorId);
+        order.setAuditedAt(new Date());
+        order.setAuditReason(reason);
+        productOrderMapper.updateById(order);
+
+        paymentService.refund(order.getOrderNo(), order.getTotalAmount(), "活动审核不通过:" + reason);
+        return Result.success("已拒绝并退款");
+    }
+
+    @Transactional
+    public Result<String> signIn(Long orderId, Long childId) {
+        ActivityProvision provision = activityProvisionMapper.selectOne(
+            new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<ActivityProvision>()
+                .eq(ActivityProvision::getOrderId, orderId)
+        );
+        if (provision == null) {
+            return Result.error("未找到活动 provision 记录");
+        }
+        if (!"provisioned".equals(provision.getStatus())) {
+            return Result.error("当前状态不允许签到");
+        }
+        provision.setChildId(childId);
+        provision.setCheckedInAt(new Date());
+        provision.setStatus("signed_in");
+        provision.setUpdatedAt(new Date());
+        activityProvisionMapper.updateById(provision);
+
+        ProductOrder order = productOrderMapper.selectById(orderId);
+        if (order != null) {
+            order.setProvisionStatus("signed_in");
+            productOrderMapper.updateById(order);
+        }
+        return Result.success("签到成功");
+    }
+
+    @Transactional
+    public Result<String> complete(Long orderId) {
+        ActivityProvision provision = activityProvisionMapper.selectOne(
+            new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<ActivityProvision>()
+                .eq(ActivityProvision::getOrderId, orderId)
+        );
+        if (provision == null) {
+            return Result.error("未找到活动 provision 记录");
+        }
+        if (!"signed_in".equals(provision.getStatus())) {
+            return Result.error("当前状态不允许完成");
+        }
+        provision.setStatus("completed");
+        provision.setCompletedAt(new Date());
+        provision.setUpdatedAt(new Date());
+        activityProvisionMapper.updateById(provision);
+
+        ProductOrder order = productOrderMapper.selectById(orderId);
+        if (order != null) {
+            order.setProvisionStatus("completed");
+            productOrderMapper.updateById(order);
+        }
+        return Result.success("活动完成");
+    }
+
+    public Result<ActivityProvision> getByOrderId(Long orderId) {
+        ActivityProvision provision = activityProvisionMapper.selectOne(
+            new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<ActivityProvision>()
+                .eq(ActivityProvision::getOrderId, orderId)
+        );
+        if (provision == null) {
+            return Result.success(null);
+        }
+        return Result.success(provision);
+    }
+
+    private String generateQrCode(String orderNo) {
+        return "ACT-" + orderNo + "-" + UUID.randomUUID().toString().substring(0, 8).toUpperCase();
+    }
+}

+ 167 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/DanAssessmentExecutionService.java

@@ -0,0 +1,167 @@
+package com.etotem.cfc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.etotem.cfc.dto.*;
+import com.etotem.cfc.entity.*;
+import com.etotem.cfc.mapper.DanAssessmentExecutionMapper;
+import com.etotem.cfc.mapper.ServiceRatingMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class DanAssessmentExecutionService {
+
+    @Resource
+    private DanAssessmentExecutionMapper executionMapper;
+
+    @Resource
+    private ServiceRatingMapper ratingMapper;
+
+    @Resource
+    private DanSettlementService settlementService;
+
+    /**
+     * 创建评估执行记录
+     */
+    @Transactional
+    public DanAssessmentExecution createExecution(Long assessmentOrderId, Long childId, Long familyId,
+            Long quotaId, Long assessorId, Long plannerId) {
+        DanAssessmentExecution exec = new DanAssessmentExecution();
+        exec.setAssessmentOrderId(assessmentOrderId);
+        exec.setChildId(childId);
+        exec.setFamilyId(familyId);
+        exec.setQuotaId(quotaId);
+        exec.setAssessorId(assessorId);
+        exec.setAssessorStatus("pending");
+        exec.setPlannerId(plannerId);
+        exec.setPlannerStatus("pending");
+        exec.setUserConfirmed(0);
+        exec.setCreatedAt(new Date());
+        exec.setUpdatedAt(new Date());
+        executionMapper.insert(exec);
+        return exec;
+    }
+
+    /**
+     * 规划师/评估师完成服务
+     */
+    @Transactional
+    public void completeExecution(Long executionId, String role, String notes) {
+        DanAssessmentExecution exec = executionMapper.selectById(executionId);
+        if (exec == null) {
+            throw new RuntimeException("Execution not found: " + executionId);
+        }
+        Date now = new Date();
+        if ("assessor".equals(role)) {
+            exec.setAssessorStatus("completed");
+            exec.setAssessorCompletedAt(now);
+            exec.setAssessorNotes(notes);
+        } else if ("planner".equals(role)) {
+            exec.setPlannerStatus("completed");
+            exec.setPlannerCompletedAt(now);
+            exec.setPlannerNotes(notes);
+        }
+        exec.setUpdatedAt(now);
+        executionMapper.updateById(exec);
+    }
+
+    /**
+     * 用户确认服务
+     */
+    @Transactional
+    public void confirmExecution(Long executionId, Integer confirmed) {
+        DanAssessmentExecution exec = executionMapper.selectById(executionId);
+        if (exec == null) {
+            throw new RuntimeException("Execution not found: " + executionId);
+        }
+        exec.setUserConfirmed(confirmed);
+        exec.setUserConfirmedAt(new Date());
+        exec.setUpdatedAt(new Date());
+        executionMapper.updateById(exec);
+
+        // 用户确认后自动生成结算记录
+        if (confirmed == 1) {
+            settlementService.autoSettle(executionId);
+        }
+    }
+
+    /**
+     * 用户评价服务
+     */
+    @Transactional
+    public ServiceRating rateService(ServiceRateRequest req) {
+        ServiceRating rating = new ServiceRating();
+        rating.setExecutionId(req.getExecutionId());
+        rating.setUserId(req.getUserId());
+        rating.setAssessorId(req.getAssessorId());
+        rating.setAssessorRating(req.getAssessorRating());
+        rating.setAssessorComment(req.getAssessorComment());
+        rating.setPlannerId(req.getPlannerId());
+        rating.setPlannerRating(req.getPlannerRating());
+        rating.setPlannerComment(req.getPlannerComment());
+        rating.setCreatedAt(new Date());
+        ratingMapper.insert(rating);
+        return rating;
+    }
+
+    /**
+     * 获取执行详情(含结算信息)
+     */
+    public ExecutionDetailResponse getExecutionDetail(Long executionId) {
+        DanAssessmentExecution exec = executionMapper.selectById(executionId);
+        if (exec == null) {
+            return null;
+        }
+        ExecutionDetailResponse resp = new ExecutionDetailResponse();
+        resp.setExecutionId(exec.getId());
+        resp.setAssessmentOrderId(exec.getAssessmentOrderId());
+        resp.setChildId(exec.getChildId());
+        resp.setFamilyId(exec.getFamilyId());
+        resp.setQuotaId(exec.getQuotaId());
+        resp.setAssessorId(exec.getAssessorId());
+        resp.setAssessorStatus(exec.getAssessorStatus());
+        resp.setAssessorCompletedAt(exec.getAssessorCompletedAt());
+        resp.setAssessorNotes(exec.getAssessorNotes());
+        resp.setPlannerId(exec.getPlannerId());
+        resp.setPlannerStatus(exec.getPlannerStatus());
+        resp.setPlannerCompletedAt(exec.getPlannerCompletedAt());
+        resp.setPlannerNotes(exec.getPlannerNotes());
+        resp.setUserConfirmed(exec.getUserConfirmed());
+        resp.setUserConfirmedAt(exec.getUserConfirmedAt());
+        resp.setCreatedAt(exec.getCreatedAt());
+        resp.setUpdatedAt(exec.getUpdatedAt());
+        // 查询结算信息
+        resp.setAssessorSettlement(settlementService.getSettlement(executionId, exec.getAssessorId(), "assessor"));
+        resp.setPlannerSettlement(settlementService.getSettlement(executionId, exec.getPlannerId(), "planner"));
+        return resp;
+    }
+
+    /**
+     * 根据订单ID查询执行记录
+     */
+    public DanAssessmentExecution getByOrderId(Long orderId) {
+        return executionMapper.selectOne(new LambdaQueryWrapper<DanAssessmentExecution>()
+                .eq(DanAssessmentExecution::getAssessmentOrderId, orderId));
+    }
+
+    /**
+     * 根据评估预约ID查询执行记录
+     */
+    public DanAssessmentExecution getByAppointmentId(Long appointmentId) {
+        return executionMapper.selectOne(new LambdaQueryWrapper<DanAssessmentExecution>()
+                .eq(DanAssessmentExecution::getQuotaId, appointmentId));
+    }
+
+    /**
+     * 查询用户的执行记录列表
+     */
+    public List<DanAssessmentExecution> getByFamilyId(Long familyId) {
+        return executionMapper.selectList(new LambdaQueryWrapper<DanAssessmentExecution>()
+                .eq(DanAssessmentExecution::getFamilyId, familyId)
+                .orderByDesc(DanAssessmentExecution::getCreatedAt));
+    }
+}

+ 1099 - 2
cfc-backend/src/main/java/com/etotem/cfc/service/DanReportParseService.java

@@ -31,14 +31,26 @@ public class DanReportParseService {
             PDFTextStripper stripper = new PDFTextStripper();
             stripper.setSortByPosition(true);
             String fullText = stripper.getText(document);
-            return parseText(fullText, dimension);
+
+            if ("adolescent".equals(dimension)) {
+                java.awt.image.BufferedImage compassImage = extractB5CompassImage(document);
+                return parseText(fullText, dimension, compassImage);
+            }
+            return parseText(fullText, dimension, null);
         }
     }
 
     /**
-     * 从纯文本解析 DAN 报告
+     * 从纯文本解析 DAN 报告(无图像版本)
      */
     public DanParsedReport parseText(String fullText, String dimension) {
+        return parseText(fullText, dimension, null);
+    }
+
+    /**
+     * 从纯文本解析 DAN 报告(含可选图像用于B5指南针分析)
+     */
+    private DanParsedReport parseText(String fullText, String dimension, java.awt.image.BufferedImage compassImage) {
         String[] lines = fullText.split("\\r?\\n");
         List<String> lineList = new ArrayList<>();
         for (String line : lines) {
@@ -56,6 +68,18 @@ public class DanReportParseService {
             return parseA2Report(lineList, fullText);
         } else if ("wisdom".equals(dimension)) {
             return parseB4Report(lineList, fullText);
+        } else if ("cognition".equals(dimension)) {
+            return parseA1Report(lineList, fullText);
+        } else if ("learning".equals(dimension)) {
+            return parseB3Report(lineList, fullText);
+        } else if ("behavior".equals(dimension)) {
+            return parseB2Report(lineList, fullText);
+        } else if ("career".equals(dimension)) {
+            return parseB6Report(lineList, fullText);
+        } else if ("campus".equals(dimension)) {
+            return parseC1Report(lineList, fullText);
+        } else if ("adolescent".equals(dimension)) {
+            return parseB5Report(lineList, fullText, compassImage);
         }
         return DanParsedReport.empty();
     }
@@ -235,6 +259,908 @@ public class DanReportParseService {
         return new DanParsedReport("B4", "wisdom", items, extra, summary.toString(), suggestions.toString());
     }
 
+// ======================== A1 报告解析(认知/cognition) ========================
+
+    /**
+     * 解析 A1 儿童核心认知发展报告(6个认知维度)
+     * 维度:感知觉、注意力、记忆力、推理能力、空间能力、加工速度
+     * 提取总分/百分位 + 各维度百分位 + 各维度原始分
+     */
+    private DanParsedReport parseA1Report(List<String> lines, String fullText) {
+        List<DataItem> items = new ArrayList<>();
+        Map<String, Object> extra = new LinkedHashMap<>();
+        StringBuilder summary = new StringBuilder();
+        StringBuilder suggestions = new StringBuilder();
+
+        // 1. 基本信息和日期
+        String reportDate = findFieldValue(lines, "测评日期", "报告日期", "评估日期");
+        String name = findFieldValue(lines, "姓名", "学生姓名", "被评估人");
+        extra.put("name", name);
+        extra.put("reportDate", reportDate);
+
+        // 2. 总分和百分位(通用提取)
+        Map<String, String> scorePct = extractTotalScoreAndPercentile(fullText);
+        if (scorePct.get("总分") != null) {
+            items.add(new DataItem("total_score", "总分", scorePct.get("总分"), "overall"));
+            extra.put("totalScore", scorePct.get("总分"));
+        }
+        if (scorePct.get("百分位") != null) {
+            items.add(new DataItem("percentile", "百分位", scorePct.get("百分位"), "overall"));
+            extra.put("percentile", scorePct.get("百分位"));
+        }
+
+        // 3. 6个核心认知维度
+        String[] cognitiveDims = {"感知觉", "注意力", "记忆力", "推理能力", "空间能力", "加工速度"};
+        String[] dimCodes = {"perception", "attention", "memory", "reasoning", "spatial", "processingSpeed"};
+
+        // 方法1: 从summary页面提取百分位 (格式: "感知觉 |  Perception\n百分位(%)\n14")
+        for (int i = 0; i < cognitiveDims.length; i++) {
+            String dim = cognitiveDims[i];
+            String code = dimCodes[i];
+            Pattern p1 = Pattern.compile(
+                    Pattern.quote(dim) + "\\s*\\|[^\\n]*\\n\\s*百分位(%)\\s*\\n\\s*(\\d+)");
+            Matcher m1 = p1.matcher(fullText);
+            if (m1.find()) {
+                String val = m1.group(1);
+                items.add(new DataItem(code + "_pct", dim + "百分位", val, "cognitive"));
+                extra.put(code + "_pct", val);
+            }
+        }
+
+        // 方法2: 从detail页面提取原始分和百分位 (格式: "我的感知觉得分 41  | 14%")
+        for (int i = 0; i < cognitiveDims.length; i++) {
+            String dim = cognitiveDims[i];
+            String code = dimCodes[i];
+            Pattern p2 = Pattern.compile(
+                    "我的" + Pattern.quote(dim) + "得分\\s*(\\d+)\\s*\\|\\s*(\\d+)%");
+            Matcher m2 = p2.matcher(fullText);
+            if (m2.find()) {
+                String score = m2.group(1);
+                String pct = m2.group(2);
+                items.add(new DataItem(code + "_score", dim + "得分", score, "cognitive"));
+                extra.put(code + "_score", score);
+                if (!extra.containsKey(code + "_pct")) {
+                    items.add(new DataItem(code + "_pct", dim + "百分位", pct, "cognitive"));
+                    extra.put(code + "_pct", pct);
+                }
+            }
+        }
+
+        // 方法3: 后备 - 直接搜索 "维度名\n百分位(%)\n数字" (某些PDF格式)
+        int foundPct = 0;
+        for (String code : dimCodes) {
+            if (extra.containsKey(code + "_pct")) foundPct++;
+        }
+        if (foundPct < 6) {
+            for (int i = 0; i < cognitiveDims.length; i++) {
+                String dim = cognitiveDims[i];
+                String code = dimCodes[i];
+                if (!extra.containsKey(code + "_pct")) {
+                    Pattern p3 = Pattern.compile(
+                            Pattern.quote(dim) + ".*?百分位(%).*?(\\d+)", Pattern.DOTALL);
+                    Matcher m3 = p3.matcher(fullText);
+                    if (m3.find()) {
+                        String val = m3.group(1);
+                        items.add(new DataItem(code + "_pct", dim + "百分位", val, "cognitive"));
+                        extra.put(code + "_pct", val);
+                    }
+                }
+            }
+        }
+
+        // 4. 通用正则:提取所有 "维度名: 分数" 模式
+        Pattern scorePattern = Pattern.compile("([\\u4e00-\\u9fa5]{2,8})[::]\\s*(\\d+(\\.\\d+)?)");
+        Matcher matcher = scorePattern.matcher(fullText);
+        while (matcher.find()) {
+            String key = matcher.group(1).trim();
+            String val = matcher.group(2).trim();
+            boolean exists = false;
+            for (DataItem item : items) {
+                if (item.getName().equals(key)) {
+                    exists = true;
+                    break;
+                }
+            }
+            if (!exists && !key.contains("日期") && !key.contains("姓名")) {
+                items.add(new DataItem("score_" + key.hashCode(), key, val, "auto"));
+            }
+        }
+
+        // 总结和建议
+        summary.append(extractSection(fullText, "测评总结", "成长建议"));
+        suggestions.append(extractSection(fullText, "成长建议", null));
+
+        return new DanParsedReport("A1", "cognition", items, extra, summary.toString(), suggestions.toString());
+    }
+
+    // ======================== B3 报告解析(学习/learning) ========================
+
+    /**
+     * 解析 B3 核心学习能力报告
+     * - 执行功能3维:抑制控制、工作记忆、认知灵活性(百分位)
+     * - 学习动机3维:深层动机、表面动机、自我效能感(十分制)
+     * - 学习策略3维:深层方法与策略、表面方法与策略、学习自我调节(十分制)
+     */
+    private DanParsedReport parseB3Report(List<String> lines, String fullText) {
+        List<DataItem> items = new ArrayList<>();
+        Map<String, Object> extra = new LinkedHashMap<>();
+        StringBuilder summary = new StringBuilder();
+        StringBuilder suggestions = new StringBuilder();
+
+        // 1. 基本信息和日期
+        String reportDate = findFieldValue(lines, "测评日期", "报告日期", "评估日期");
+        String name = findFieldValue(lines, "姓名", "学生姓名", "被评估人");
+        extra.put("name", name);
+        extra.put("reportDate", reportDate);
+
+        // 2. 总分和百分位
+        Map<String, String> scorePct = extractTotalScoreAndPercentile(fullText);
+        if (scorePct.get("总分") != null) {
+            items.add(new DataItem("total_score", "总分", scorePct.get("总分"), "overall"));
+            extra.put("totalScore", scorePct.get("总分"));
+        }
+        if (scorePct.get("百分位") != null) {
+            items.add(new DataItem("percentile", "百分位", scorePct.get("百分位"), "overall"));
+            extra.put("percentile", scorePct.get("百分位"));
+        }
+
+        // 3. 执行功能 (3维度, 百分位) 格式: "抑制控制 94%  工作记忆 89%  认知灵活性 60%"
+        String[][] execDims = {
+            {"抑制控制", "inhibitoryControl"},
+            {"工作记忆", "workingMemory"},
+            {"认知灵活性", "cognitiveFlexibility"}
+        };
+        for (String[] dim : execDims) {
+            Pattern p = Pattern.compile(Pattern.quote(dim[0]) + "\\s*(\\d+)%");
+            Matcher m = p.matcher(fullText);
+            if (m.find()) {
+                String val = m.group(1);
+                items.add(new DataItem(dim[1], dim[0] + "百分位", val, "executiveFunction"));
+                extra.put(dim[1], val);
+            }
+        }
+
+        // 4. 学习动机 (3维度, 十分制) 格式: "深层动机\n我的得分:8分"
+        String[][] motivationDims = {
+            {"深层动机", "deepMotivation"},
+            {"表面动机", "surfaceMotivation"},
+            {"自我效能感", "selfEfficacy"}
+        };
+        for (String[] dim : motivationDims) {
+            String val = extractScoreAfterLabel(fullText, dim[0]);
+            if (val != null) {
+                items.add(new DataItem(dim[1], dim[0], val, "learningMotivation"));
+                extra.put(dim[1], val);
+            }
+        }
+
+        // 5. 学习策略 (3维度, 十分制) 格式: "深层方法与策略\n我的得分:6.8分"
+        String[][] strategyDims = {
+            {"深层方法与策略", "deepStrategy"},
+            {"表面方法与策略", "surfaceStrategy"},
+            {"学习自我调节", "selfRegulation"}
+        };
+        for (String[] dim : strategyDims) {
+            String val = extractScoreAfterLabel(fullText, dim[0]);
+            if (val != null) {
+                items.add(new DataItem(dim[1], dim[0], val, "learningStrategy"));
+                extra.put(dim[1], val);
+            }
+        }
+
+        // 6. 通用正则提取
+        Pattern scorePattern = Pattern.compile("([\\u4e00-\\u9fa5]{2,8})[::]\\s*(\\d+(\\.\\d+)?)");
+        Matcher matcher = scorePattern.matcher(fullText);
+        while (matcher.find()) {
+            String key = matcher.group(1).trim();
+            String val = matcher.group(2).trim();
+            boolean exists = false;
+            for (DataItem item : items) {
+                if (item.getName().equals(key)) {
+                    exists = true;
+                    break;
+                }
+            }
+            if (!exists && !key.contains("日期") && !key.contains("姓名")) {
+                items.add(new DataItem("score_" + key.hashCode(), key, val, "auto"));
+            }
+        }
+
+        summary.append(extractSection(fullText, "测评总结", "成长建议"));
+        suggestions.append(extractSection(fullText, "成长建议", null));
+
+        return new DanParsedReport("B3", "learning", items, extra, summary.toString(), suggestions.toString());
+    }
+
+    // ======================== B2 报告解析(行为/behavior) ========================
+
+    /**
+     * 解析 B2 儿童自我与家庭教养报告
+     * - 自我概念6维:行为表现、能力与学校表现、躯体外貌、情绪状态、合群、幸福与满足
+     * - 儿童行为8维:品行问题、情绪问题、学习问题、社交问题、生活习惯、多动倾向、刻板行为、拖延行为
+     * - 家庭环境10维:亲密、情感表达、和谐、独立性、成就向导、文化氛围、娱乐活动、道德观念、家务安排、家庭规则
+     */
+    private DanParsedReport parseB2Report(List<String> lines, String fullText) {
+        List<DataItem> items = new ArrayList<>();
+        Map<String, Object> extra = new LinkedHashMap<>();
+        StringBuilder summary = new StringBuilder();
+        StringBuilder suggestions = new StringBuilder();
+
+        String reportDate = findFieldValue(lines, "测评日期", "报告日期", "评估日期");
+        String name = findFieldValue(lines, "姓名", "学生姓名", "被评估人");
+        extra.put("name", name);
+        extra.put("reportDate", reportDate);
+
+        Map<String, String> scorePct = extractTotalScoreAndPercentile(fullText);
+        if (scorePct.get("总分") != null) {
+            items.add(new DataItem("total_score", "总分", scorePct.get("总分"), "overall"));
+            extra.put("totalScore", scorePct.get("总分"));
+        }
+        if (scorePct.get("百分位") != null) {
+            items.add(new DataItem("percentile", "百分位", scorePct.get("百分位"), "overall"));
+            extra.put("percentile", scorePct.get("百分位"));
+        }
+
+        // 1. 自我概念6维 (格式: "行为表现 9分")
+        String[][] selfConceptDims = {
+            {"行为表现", "selfConcept_behavior"},
+            {"能力与学校表现", "selfConcept_school"},
+            {"躯体外貌", "selfConcept_appearance"},
+            {"情绪状态", "selfConcept_emotion"},
+            {"合群", "selfConcept_sociability"},
+            {"幸福与满足", "selfConcept_happiness"},
+        };
+        for (String[] dim : selfConceptDims) {
+            String val = extractScoreWithLabel(fullText, dim[0]);
+            if (val != null) {
+                items.add(new DataItem(dim[1], "自我概念_" + dim[0], val, "selfConcept"));
+                extra.put(dim[1], val);
+            }
+        }
+
+        // 2. 儿童行为8维
+        String[][] behaviorDims = {
+            {"品行问题", "conduct"},
+            {"情绪问题", "emotional"},
+            {"学习问题", "learning"},
+            {"社交问题", "social"},
+            {"生活习惯", "habits"},
+            {"多动倾向", "hyperactivity"},
+            {"刻板行为", "stereotypic"},
+            {"拖延行为", "procrastination"},
+        };
+        for (String[] dim : behaviorDims) {
+            // 方法1: 中文匹配 "品行问题 1分"
+            Pattern p1 = Pattern.compile(Pattern.quote(dim[0]) + "\\s*(\\d+)\\s*分");
+            Matcher m1 = p1.matcher(fullText);
+            if (m1.find()) {
+                items.add(new DataItem(dim[1], "行为_" + dim[0], m1.group(1), "behavior"));
+                extra.put(dim[1], m1.group(1));
+            } else {
+                // 方法2: 英文关键词
+                String engPattern = getBehaviorEnglishPattern(dim[0]);
+                if (engPattern != null) {
+                    Pattern p2 = Pattern.compile(engPattern + "\\s+(\\d+)\\s*分");
+                    Matcher m2 = p2.matcher(fullText);
+                    if (m2.find()) {
+                        items.add(new DataItem(dim[1], "行为_" + dim[0], m2.group(1), "behavior"));
+                        extra.put(dim[1], m2.group(1));
+                    }
+                }
+            }
+        }
+
+        // 3. 家庭环境10维
+        String[][] familyDims = {
+            {"亲密", "family_intimacy"},
+            {"情感表达", "family_expression"},
+            {"和谐", "family_harmony"},
+            {"独立性", "family_independence"},
+            {"成就向导", "family_achievement"},
+            {"文化氛围", "family_culture"},
+            {"娱乐活动", "family_recreation"},
+            {"道德观念", "family_morality"},
+            {"家务安排", "family_chores"},
+            {"家庭规则", "family_rules"},
+        };
+        for (String[] dim : familyDims) {
+            String val = extractScoreWithLabel(fullText, dim[0]);
+            if (val != null) {
+                items.add(new DataItem(dim[1], "家庭_" + dim[0], val, "family"));
+                extra.put(dim[1], val);
+            }
+        }
+
+        // 通用正则提取
+        Pattern scorePattern = Pattern.compile("([\\u4e00-\\u9fa5]{2,8})[::]\\s*(\\d+(\\.\\d+)?)");
+        Matcher matcher = scorePattern.matcher(fullText);
+        while (matcher.find()) {
+            String key = matcher.group(1).trim();
+            String val = matcher.group(2).trim();
+            boolean exists = false;
+            for (DataItem item : items) {
+                if (item.getName().equals(key)) { exists = true; break; }
+            }
+            if (!exists && !key.contains("日期") && !key.contains("姓名")) {
+                items.add(new DataItem("score_" + key.hashCode(), key, val, "auto"));
+            }
+        }
+
+        summary.append(extractSection(fullText, "测评总结", "成长建议"));
+        suggestions.append(extractSection(fullText, "成长建议", null));
+        return new DanParsedReport("B2", "behavior", items, extra, summary.toString(), suggestions.toString());
+    }
+
+    // ======================== B6 报告解析(职业/career) ========================
+
+    /**
+     * 解析 B6 职业发展报告
+     * - Holland兴趣6型:艺术型、社会型、事业型、常规型、现实型、研究型
+     * - 多元智能8维:内省能力、空间能力、音乐能力、人际关系能力、自然能力、身体运动能力、语言能力、逻辑数学能力
+     * - 职业价值观:代表分数
+     */
+    private DanParsedReport parseB6Report(List<String> lines, String fullText) {
+        List<DataItem> items = new ArrayList<>();
+        Map<String, Object> extra = new LinkedHashMap<>();
+        StringBuilder summary = new StringBuilder();
+        StringBuilder suggestions = new StringBuilder();
+
+        String reportDate = findFieldValue(lines, "测评日期", "报告日期", "评估日期");
+        String name = findFieldValue(lines, "姓名", "学生姓名", "被评估人");
+        extra.put("name", name);
+        extra.put("reportDate", reportDate);
+
+        Map<String, String> scorePct = extractTotalScoreAndPercentile(fullText);
+        if (scorePct.get("总分") != null) {
+            items.add(new DataItem("total_score", "总分", scorePct.get("总分"), "overall"));
+            extra.put("totalScore", scorePct.get("总分"));
+        }
+        if (scorePct.get("百分位") != null) {
+            items.add(new DataItem("percentile", "百分位", scorePct.get("百分位"), "overall"));
+            extra.put("percentile", scorePct.get("百分位"));
+        }
+
+        // 1. Holland职业兴趣6型 (格式: "艺术型 Artistic 7分")
+        String[][] interestDims = {
+            {"艺术型", "interest_artistic"},
+            {"社会型", "interest_social"},
+            {"事业型", "interest_enterprising"},
+            {"常规型", "interest_conventional"},
+            {"现实型", "interest_realistic"},
+            {"研究型", "interest_investigative"},
+        };
+        for (String[] dim : interestDims) {
+            Pattern p = Pattern.compile(Pattern.quote(dim[0]) + "\\s+\\w+\\s+(\\d+)\\s*分");
+            Matcher m = p.matcher(fullText);
+            if (m.find()) {
+                items.add(new DataItem(dim[1], "兴趣_" + dim[0], m.group(1), "hollandInterest"));
+                extra.put(dim[1], m.group(1));
+            } else {
+                // fallback: "艺术型 7分"
+                String val = extractScoreWithLabel(fullText, dim[0]);
+                if (val != null) {
+                    items.add(new DataItem(dim[1], "兴趣_" + dim[0], val, "hollandInterest"));
+                    extra.put(dim[1], val);
+                }
+            }
+        }
+
+        // 2. 多元智能8维 (格式: "内省能力 INTRAPERSONAL 8分")
+        String[][] abilityDims = {
+            {"内省能力", "ability_intrapersonal"},
+            {"空间能力", "ability_spatial"},
+            {"音乐能力", "ability_musical"},
+            {"人际关系能力", "ability_interpersonal"},
+            {"自然能力", "ability_naturalist"},
+            {"身体运动能力", "ability_kinesthetic"},
+            {"语言能力", "ability_linguistic"},
+            {"逻辑数学能力", "ability_logical"},
+        };
+        for (String[] dim : abilityDims) {
+            Pattern p = Pattern.compile(Pattern.quote(dim[0]) + "\\s+\\w+\\s+(\\d+)\\s*分");
+            Matcher m = p.matcher(fullText);
+            if (m.find()) {
+                int val = Integer.parseInt(m.group(1));
+                if (val >= 1 && val <= 15) {
+                    items.add(new DataItem(dim[1], "能力_" + dim[0], m.group(1), "multipleIntelligence"));
+                    extra.put(dim[1], m.group(1));
+                    continue;
+                }
+            }
+            // fallback: "内省能力 8分"
+            Pattern p2 = Pattern.compile(Pattern.quote(dim[0]) + "\\s*(\\d+)\\s*分");
+            Matcher m2 = p2.matcher(fullText);
+            if (m2.find()) {
+                int val = Integer.parseInt(m2.group(1));
+                if (val >= 1 && val <= 15) {
+                    items.add(new DataItem(dim[1], "能力_" + dim[0], m2.group(1), "multipleIntelligence"));
+                    extra.put(dim[1], m2.group(1));
+                }
+            }
+        }
+
+        // 3. 职业价值观
+        if (fullText.contains("我的职业价值观")) {
+            Pattern p = Pattern.compile("我的职业价值观.*?(\\d+(?:\\.\\d+)?)", Pattern.DOTALL);
+            Matcher m = p.matcher(fullText);
+            if (m.find()) {
+                double val = Double.parseDouble(m.group(1));
+                if (val >= 1 && val <= 15) {
+                    items.add(new DataItem("career_value", "职业价值观", m.group(1), "careerValue"));
+                    extra.put("careerValue", m.group(1));
+                }
+            }
+        }
+        if (!extra.containsKey("careerValue") && fullText.contains("职业价值观")) {
+            Pattern p = Pattern.compile("职业价值观.*?最高分[^\\d]*(\\d+(?:\\.\\d+)?)", Pattern.DOTALL);
+            Matcher m = p.matcher(fullText);
+            if (m.find()) {
+                double val = Double.parseDouble(m.group(1));
+                if (val >= 1 && val <= 15) {
+                    items.add(new DataItem("career_value", "职业价值观", m.group(1), "careerValue"));
+                    extra.put("careerValue", m.group(1));
+                }
+            }
+        }
+
+        // 通用正则提取
+        Pattern scorePattern = Pattern.compile("([\\u4e00-\\u9fa5]{2,8})[::]\\s*(\\d+(\\.\\d+)?)");
+        Matcher matcher = scorePattern.matcher(fullText);
+        while (matcher.find()) {
+            String key = matcher.group(1).trim();
+            String val = matcher.group(2).trim();
+            boolean exists = false;
+            for (DataItem item : items) {
+                if (item.getName().equals(key)) { exists = true; break; }
+            }
+            if (!exists && !key.contains("日期") && !key.contains("姓名")) {
+                items.add(new DataItem("score_" + key.hashCode(), key, val, "auto"));
+            }
+        }
+
+        summary.append(extractSection(fullText, "测评总结", "成长建议"));
+        suggestions.append(extractSection(fullText, "成长建议", null));
+        return new DanParsedReport("B6", "career", items, extra, summary.toString(), suggestions.toString());
+    }
+
+    // ======================== C1 报告解析(校园/campus) ========================
+
+    /**
+     * 解析 C1 校园标准版报告
+     * - 核心认知6维(复用A1逻辑):感知觉、注意力、记忆力、推理能力、空间能力、加工速度
+     * - 大五人格5维(复用A2逻辑):开放性、宜人性、责任心、外倾性、神经质
+     * - 自驱力3维(复用B4逻辑):自主性、胜任感、归属感
+     * - 自我概念6维(复用B2逻辑):行为表现、能力与学校、躯体外貌、情绪状态、合群、幸福与满足
+     */
+    private DanParsedReport parseC1Report(List<String> lines, String fullText) {
+        List<DataItem> items = new ArrayList<>();
+        Map<String, Object> extra = new LinkedHashMap<>();
+        StringBuilder summary = new StringBuilder();
+        StringBuilder suggestions = new StringBuilder();
+
+        String reportDate = findFieldValue(lines, "测评日期", "报告日期", "评估日期");
+        String name = findFieldValue(lines, "姓名", "学生姓名", "被评估人");
+        extra.put("name", name);
+        extra.put("reportDate", reportDate);
+
+        Map<String, String> scorePct = extractTotalScoreAndPercentile(fullText);
+        if (scorePct.get("总分") != null) {
+            items.add(new DataItem("total_score", "总分", scorePct.get("总分"), "overall"));
+            extra.put("totalScore", scorePct.get("总分"));
+        }
+        if (scorePct.get("百分位") != null) {
+            items.add(new DataItem("percentile", "百分位", scorePct.get("百分位"), "overall"));
+            extra.put("percentile", scorePct.get("百分位"));
+        }
+
+        // 1. 核心认知6维 (复用A1逻辑: "我的感知觉得分 41  | 14%")
+        String[] cognitiveDims = {"感知觉", "注意力", "记忆力", "推理能力", "空间能力", "加工速度"};
+        String[] cogCodes = {"perception", "attention", "memory", "reasoning", "spatial", "processingSpeed"};
+        for (int i = 0; i < cognitiveDims.length; i++) {
+            String dim = cognitiveDims[i];
+            String code = cogCodes[i];
+            // 格式: "我的感知觉得分 41  | 14%"
+            Pattern p = Pattern.compile("我的" + Pattern.quote(dim) + "得分\\s*(\\d+)\\s*\\|\\s*(\\d+)%");
+            Matcher m = p.matcher(fullText);
+            if (m.find()) {
+                items.add(new DataItem(code + "_score", dim + "得分", m.group(1), "cognitive"));
+                extra.put(code + "_score", m.group(1));
+                items.add(new DataItem(code + "_pct", dim + "百分位", m.group(2), "cognitive"));
+                extra.put(code + "_pct", m.group(2));
+            } else {
+                // fallback: "感知觉 | Perception\n百分位(%)\n14"
+                Pattern p2 = Pattern.compile(Pattern.quote(dim) + "\\s*\\|[^\\n]*\\n\\s*百分位(%)\\s*\\n\\s*(\\d+)");
+                Matcher m2 = p2.matcher(fullText);
+                if (m2.find()) {
+                    items.add(new DataItem(code + "_pct", dim + "百分位", m2.group(1), "cognitive"));
+                    extra.put(code + "_pct", m2.group(1));
+                }
+            }
+        }
+
+        // 2. 大五人格5维 (复用A2逻辑)
+        String[] big5Names = {"开放性", "宜人性", "责任心", "外倾性", "神经质"};
+        for (String dim : big5Names) {
+            Pattern p = Pattern.compile("您在[\"\"「]" + Pattern.quote(dim) + "[\"\"」].*?得分是\\s*(\\d+(?:\\.\\d+)?)\\s*分");
+            Matcher m = p.matcher(fullText);
+            if (m.find()) {
+                items.add(new DataItem("big5_" + dim, dim, m.group(1), "bigFive"));
+                extra.put("big5_" + dim, m.group(1));
+            }
+        }
+
+        // 3. 自驱力3维 (使用"我的得分"模式)
+        Pattern drivingP = Pattern.compile("我的得分[::](\\d+\\.?\\d*)");
+        Matcher drivingM = drivingP.matcher(fullText);
+        List<String> drivingScores = new ArrayList<>();
+        while (drivingM.find()) {
+            drivingScores.add(drivingM.group(1));
+        }
+        String[] drivingNames = {"自主性", "胜任感", "归属感"};
+        String[] drivingCodes = {"autonomy", "competence", "belonging"};
+        for (int i = 0; i < drivingScores.size() && i < drivingNames.length; i++) {
+            items.add(new DataItem(drivingCodes[i], drivingNames[i], drivingScores.get(i), "selfDriving"));
+            extra.put(drivingCodes[i], drivingScores.get(i));
+        }
+
+        // 4. 自我概念6维 (在SELF-CONCEPT标记前找百分位)
+        int scStart = fullText.indexOf("SELF-CONCEPT");
+        if (scStart >= 0) {
+            String beforeSC = fullText.substring(0, scStart);
+            Pattern pctP = Pattern.compile("(\\d+)%");
+            Matcher pctM = pctP.matcher(beforeSC);
+            List<String> pcts = new ArrayList<>();
+            while (pctM.find()) {
+                pcts.add(pctM.group(1));
+            }
+            String[] scDims = {"行为表现", "能力与学校", "躯体外貌", "情绪状态", "合群", "幸福与满足"};
+            String[] scCodes = {"sc_behavior", "sc_school", "sc_appearance", "sc_emotion", "sc_sociability", "sc_happiness"};
+            int startIdx = Math.max(0, pcts.size() - 12);
+            for (int i = 0; i < scDims.length; i++) {
+                int idx = startIdx + i * 2 + 1;
+                if (idx < pcts.size()) {
+                    items.add(new DataItem(scCodes[i], "自我概念_" + scDims[i], pcts.get(idx), "selfConcept"));
+                    extra.put(scCodes[i], pcts.get(idx));
+                }
+            }
+        }
+
+        // 通用正则提取
+        Pattern scorePattern = Pattern.compile("([\\u4e00-\\u9fa5]{2,8})[::]\\s*(\\d+(\\.\\d+)?)");
+        Matcher matcher = scorePattern.matcher(fullText);
+        while (matcher.find()) {
+            String key = matcher.group(1).trim();
+            String val = matcher.group(2).trim();
+            boolean exists = false;
+            for (DataItem item : items) {
+                if (item.getName().equals(key)) { exists = true; break; }
+            }
+            if (!exists && !key.contains("日期") && !key.contains("姓名")) {
+                items.add(new DataItem("score_" + key.hashCode(), key, val, "auto"));
+            }
+        }
+
+        summary.append(extractSection(fullText, "测评总结", "成长建议"));
+        suggestions.append(extractSection(fullText, "成长建议", null));
+        return new DanParsedReport("C1", "campus", items, extra, summary.toString(), suggestions.toString());
+    }
+
+    // ======================== B5 报告解析(青春期/adolescent) ========================
+
+    /**
+     * 解析 B5 青春期挑战报告(文本部分,不含指南针图像分析)
+     * - 情绪调节策略2维:认知重评、表达抑制
+     * - 学业压力源5维:学业负担、家庭期望、师生关系、自我期望、同伴竞争
+     * - 人际关系问题4维:母亲关系、父亲关系、师生关系、同伴关系
+     * - 社交能力5维:主动交往、情感支持、情感表达、表达影响、冲突解决
+     * - 睡眠数据:时长、效率、入睡时间、主观质量、日间功能、催眠药物
+     * - 运动数据:时长、强度
+     * - 网络依赖数据
+     */
+    private DanParsedReport parseB5Report(List<String> lines, String fullText, java.awt.image.BufferedImage compassImage) {
+        List<DataItem> items = new ArrayList<>();
+        Map<String, Object> extra = new LinkedHashMap<>();
+        StringBuilder summary = new StringBuilder();
+        StringBuilder suggestions = new StringBuilder();
+
+        String reportDate = findFieldValue(lines, "测评日期", "报告日期", "评估日期");
+        String name = findFieldValue(lines, "姓名", "学生姓名", "被评估人");
+        extra.put("name", name);
+        extra.put("reportDate", reportDate);
+
+        Map<String, String> scorePct = extractTotalScoreAndPercentile(fullText);
+        if (scorePct.get("总分") != null) {
+            items.add(new DataItem("total_score", "总分", scorePct.get("总分"), "overall"));
+            extra.put("totalScore", scorePct.get("总分"));
+        }
+        if (scorePct.get("百分位") != null) {
+            items.add(new DataItem("percentile", "百分位", scorePct.get("百分位"), "overall"));
+            extra.put("percentile", scorePct.get("百分位"));
+        }
+
+        // 1. 情绪调节策略2维
+        String[] erLabels = {"认知重评", "表达抑制"};
+        String[] erCodes = {"er_reappraisal", "er_suppression"};
+        String[] erEng = {"Cognitive Reappraisal", "Expressive Suppression"};
+        for (int i = 0; i < erLabels.length; i++) {
+            Pattern p1 = Pattern.compile(
+                    Pattern.quote(erLabels[i]) + ".*?" + Pattern.quote(erEng[i]) + "\\s*(\\d+(?:\\.\\d+)?)\\s*分",
+                    Pattern.DOTALL);
+            Matcher m1 = p1.matcher(fullText);
+            if (m1.find()) {
+                items.add(new DataItem(erCodes[i], erLabels[i], m1.group(1), "emotionRegulation"));
+                extra.put(erCodes[i], m1.group(1));
+            } else {
+                String val = extractScoreWithLabel(fullText, erLabels[i]);
+                if (val != null) {
+                    items.add(new DataItem(erCodes[i], erLabels[i], val, "emotionRegulation"));
+                    extra.put(erCodes[i], val);
+                }
+            }
+        }
+
+        // 2. 学业压力源5维
+        String[] stressDims = {"学业负担", "家庭期望", "师生关系", "自我期望", "同伴竞争"};
+        String[] stressCodes = {"stress_burden", "stress_family", "stress_teacher", "stress_self", "stress_peer"};
+        String stressSection = extractRegion(fullText,
+                new String[]{"学业压力源", "学业压力"},
+                new String[]{"人际关系问题", "社交能力", "睡眠"});
+        for (int i = 0; i < stressDims.length; i++) {
+            String val = extractNamedScore(stressSection != null ? stressSection : fullText, stressDims[i]);
+            if (val != null) {
+                items.add(new DataItem(stressCodes[i], "学业压力_" + stressDims[i], val, "academicStress"));
+                extra.put(stressCodes[i], val);
+            }
+        }
+
+        // 3. 人际关系问题4维
+        String[] relationDims = {"母亲关系", "父亲关系", "师生关系", "同伴关系"};
+        String[] relationCodes = {"rel_mother", "rel_father", "rel_teacher", "rel_peer"};
+        String relSection = extractRegion(fullText,
+                new String[]{"人际关系问题"},
+                new String[]{"社交能力"});
+        for (int i = 0; i < relationDims.length; i++) {
+            Pattern p = Pattern.compile(
+                    Pattern.quote(relationDims[i]) + "\\n[^\\n]*。\\n(\\d+(?:\\.\\d+)?)",
+                    Pattern.DOTALL);
+            Matcher m = p.matcher(relSection != null ? relSection : fullText);
+            if (m.find()) {
+                items.add(new DataItem(relationCodes[i], "人际_" + relationDims[i], m.group(1), "interpersonal"));
+                extra.put(relationCodes[i], m.group(1));
+            }
+        }
+
+        // 4. 社交能力5维
+        String[] socialDims = {"主动交往", "情感支持", "情感表达", "表达影响", "冲突解决"};
+        String[] socialCodes = {"soc_initiative", "soc_support", "soc_expression", "soc_influence", "soc_conflict"};
+        String socSection = extractRegion(fullText,
+                new String[]{"社交能力"},
+                new String[]{"睡眠"});
+        Pattern socP = Pattern.compile(
+                "同龄人平均水平\\s*\\n\\s*(\\d+(?:\\.\\d+)?)\\s*\\n\\s*(\\d+(?:\\.\\d+)?)\\s*\\n\\s*(\\d+(?:\\.\\d+)?)\\s*\\n\\s*(\\d+(?:\\.\\d+)?)\\s*\\n\\s*(\\d+(?:\\.\\d+)?)",
+                Pattern.DOTALL);
+        Matcher socM = socP.matcher(socSection != null ? socSection : fullText);
+        if (socM.find()) {
+            for (int i = 0; i < socialDims.length && i + 1 <= socM.groupCount(); i++) {
+                items.add(new DataItem(socialCodes[i], "社交_" + socialDims[i], socM.group(i + 1), "socialAbility"));
+                extra.put(socialCodes[i], socM.group(i + 1));
+            }
+        }
+
+        // 5. 睡眠数据
+        Pattern sleepH = Pattern.compile("睡眠时长[^。]*?(\\d+(?:\\.\\d+)?)\\s*小时");
+        Matcher sleepHM = sleepH.matcher(fullText);
+        if (sleepHM.find()) {
+            items.add(new DataItem("sleep_hours", "睡眠时长", sleepHM.group(1), "sleep"));
+            extra.put("sleepHours", sleepHM.group(1));
+        }
+
+        Pattern sleepE = Pattern.compile("睡眠效率[^。]*?(\\d+(?:\\.\\d+)?)%");
+        Matcher sleepEM = sleepE.matcher(fullText);
+        if (sleepEM.find()) {
+            items.add(new DataItem("sleep_efficiency", "睡眠效率", sleepEM.group(1), "sleep"));
+            extra.put("sleepEfficiency", sleepEM.group(1));
+        }
+
+        Pattern sleepL = Pattern.compile("入睡时间[^。]*?(\\d+)-(\\d+)分钟");
+        Matcher sleepLM = sleepL.matcher(fullText);
+        if (sleepLM.find()) {
+            items.add(new DataItem("sleep_latency", "入睡时间", sleepLM.group(1), "sleep"));
+            extra.put("sleepLatency", sleepLM.group(1));
+        }
+
+        String[][] sleepQual = {
+            {"主观睡眠质量", "sleep_quality"},
+            {"日间功能障碍", "sleep_dysfunction"},
+            {"催眠药物", "sleep_medication"},
+        };
+        for (String[] dim : sleepQual) {
+            String val = extractNamedScore(fullText, dim[0]);
+            if (val != null) {
+                items.add(new DataItem(dim[1], "睡眠_" + dim[0], val, "sleep"));
+                extra.put(dim[1], val);
+            }
+        }
+
+        // 6. 运动/网络
+        Pattern exercise = Pattern.compile("运动时长[^。]*?(\\d+(?:\\.\\d+)?)\\s*(小时|分钟|h)");
+        Matcher exM = exercise.matcher(fullText);
+        if (exM.find()) {
+            items.add(new DataItem("exercise_duration", "运动时长", exM.group(1), "exercise"));
+            extra.put("exerciseDuration", exM.group(1));
+        }
+
+        Pattern internet = Pattern.compile("网络使用[^。]*?(\\d+(?:\\.\\d+)?)\\s*小时");
+        Matcher inM = internet.matcher(fullText);
+        if (inM.find()) {
+            items.add(new DataItem("internet_duration", "网络使用时长", inM.group(1), "internet"));
+            extra.put("internetDuration", inM.group(1));
+        }
+
+        // 7. 人际关系指南针图19个子维度分数(第9页图像分析)
+        if (compassImage != null) {
+            try {
+                Map<String, Double> compassScores = extractB5CompassScores(compassImage, fullText);
+                for (Map.Entry<String, Double> entry : compassScores.entrySet()) {
+                    items.add(new DataItem(
+                        entry.getKey().replace('_', '.'),
+                        "人际指南针_" + entry.getKey(),
+                        String.valueOf(entry.getValue()),
+                        "compass"));
+                    extra.put(entry.getKey(), entry.getValue());
+                }
+            } catch (Exception e) {
+                log.warn("B5指南针图像提取失败,跳过: {}", e.getMessage());
+            }
+        }
+
+        // 通用正则提取
+        Pattern scorePattern = Pattern.compile("([\\u4e00-\\u9fa5]{2,8})[::]\\s*(\\d+(\\.\\d+)?)");
+        Matcher matcher = scorePattern.matcher(fullText);
+        while (matcher.find()) {
+            String key = matcher.group(1).trim();
+            String val = matcher.group(2).trim();
+            boolean exists = false;
+            for (DataItem item : items) {
+                if (item.getName().equals(key)) { exists = true; break; }
+            }
+            if (!exists && !key.contains("日期") && !key.contains("姓名")) {
+                items.add(new DataItem("score_" + key.hashCode(), key, val, "auto"));
+            }
+        }
+
+        summary.append(extractSection(fullText, "测评总结", "成长建议"));
+        suggestions.append(extractSection(fullText, "成长建议", null));
+        return new DanParsedReport("B5", "adolescent", items, extra, summary.toString(), suggestions.toString());
+    }
+
+    /**
+     * 提取两个标记之间的文本区域
+     */
+    private String extractRegion(String fullText, String[] startMarkers, String[] endMarkers) {
+        int start = -1;
+        for (String marker : startMarkers) {
+            int idx = fullText.indexOf(marker);
+            if (idx >= 0) { start = idx; break; }
+        }
+        if (start < 0) return null;
+        int end = fullText.length();
+        for (String marker : endMarkers) {
+            int idx = fullText.indexOf(marker, start + 1);
+            if (idx >= 0 && idx < end) { end = idx; }
+        }
+        return end > start ? fullText.substring(start, end) : null;
+    }
+
+    /**
+     * 提取区域中维度名后的分数 (格式: "维度名\n分数")
+     */
+    private String extractNamedScore(String text, String label) {
+        if (text == null) return null;
+        Pattern p = Pattern.compile(Pattern.quote(label) + "\\s*\\n\\s*(\\d+(?:\\.\\d+)?)");
+        Matcher m = p.matcher(text);
+        if (m.find()) {
+            return m.group(1);
+        }
+        return null;
+    }
+
+    /**
+     * 从文本中提取标签后的分数 (格式: "行为表现 9分")
+     */
+    private String extractScoreWithLabel(String fullText, String label) {
+        Pattern p = Pattern.compile(Pattern.quote(label) + "\\s*(\\d+)\\s*分");
+        Matcher m = p.matcher(fullText);
+        if (m.find()) {
+            return m.group(1);
+        }
+        return null;
+    }
+
+    /**
+     * 儿童行为维度的英文关键词映射
+     */
+    private String getBehaviorEnglishPattern(String cnName) {
+        switch (cnName) {
+            case "品行问题": return "Conduct problems";
+            case "情绪问题": return "Emotional state";
+            case "学习问题": return "Learning situation";
+            case "社交问题": return "Social situation";
+            case "生活习惯": return "Habits.*?customs";
+            case "多动倾向": return "Hyperactivity";
+            case "刻板行为": return "Stereotypic";
+            case "拖延行为": return "Procrastination";
+            default: return null;
+        }
+    }
+
+    /**
+     * 提取总分和百分位(通用,所有报告类型共用)
+     * PDF格式: "112\n总得分\nTotal Score\n79\n百分位(%)"
+     */
+    private Map<String, String> extractTotalScoreAndPercentile(String fullText) {
+        Map<String, String> result = new LinkedHashMap<>();
+        if (fullText == null) return result;
+
+        // 主格式: 数字\n总得分
+        Pattern scoreP = Pattern.compile("(\\d+)\\s*\\n\\s*总得分");
+        Matcher scoreM = scoreP.matcher(fullText);
+        if (scoreM.find()) {
+            result.put("总分", scoreM.group(1));
+        }
+
+        // 百分位: 总得分...数字...百分位
+        Pattern pctP = Pattern.compile("总得分.*?(\\d+)\\s*百分位", Pattern.DOTALL);
+        Matcher pctM = pctP.matcher(fullText);
+        if (pctM.find()) {
+            result.put("百分位", pctM.group(1));
+        }
+
+        // 后备1: 旧版 "总分" 格式
+        if (!result.containsKey("总分")) {
+            Pattern fallbackP = Pattern.compile("总分[^\\d]*(\\d+)");
+            Matcher fallbackM = fallbackP.matcher(fullText);
+            if (fallbackM.find()) {
+                result.put("总分", fallbackM.group(1));
+            }
+        }
+
+        // 后备2: 旧版 "百分位" 格式
+        if (!result.containsKey("百分位")) {
+            Pattern fallbackP2 = Pattern.compile("百分位[^\\d]*(\\d+)");
+            Matcher fallbackM2 = fallbackP2.matcher(fullText);
+            if (fallbackM2.find()) {
+                result.put("百分位", fallbackM2.group(1));
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 提取标签后的分数值。支持格式:
+     * - "深层动机\n我的得分:8分"
+     * - "深层动机 8分"
+     */
+    private String extractScoreAfterLabel(String fullText, String label) {
+        // 方法1: "深层动机...我的得分:8分"
+        Pattern p1 = Pattern.compile(
+                Pattern.quote(label) + ".*?我的得分[::]\\s*(\\d+(?:\\.\\d+)?)",
+                Pattern.DOTALL);
+        Matcher m1 = p1.matcher(fullText);
+        if (m1.find()) {
+            return m1.group(1);
+        }
+        // 方法2: "深层动机 8分"
+        Pattern p2 = Pattern.compile(
+                Pattern.quote(label) + "\\s*(\\d+(?:\\.\\d+)?)\\s*分");
+        Matcher m2 = p2.matcher(fullText);
+        if (m2.find()) {
+            return m2.group(1);
+        }
+        return null;
+    }
+
     // ======================== 解析辅助方法 ========================
 
     /**
@@ -512,6 +1438,177 @@ public class DanReportParseService {
         return "";
     }
 
+    // ======================== B5 指南针图像分析常量 ========================
+
+    /** 象限角度范围 (图像坐标系: 0°=右, 90°=下, 180°=左, 270°=上) */
+    private static final Map<String, int[]> B5_QUAD_ANGLES = new LinkedHashMap<String, int[]>() {{
+        put("母亲关系", new int[]{185, 265});
+        put("父亲关系", new int[]{140, 178});
+        put("师生关系", new int[]{275, 350});
+        put("同伴关系", new int[]{2, 42});
+    }};
+
+    /** 每度fill到分数的线性映射系数 */
+    private static final Map<String, Double> B5_QUAD_FACTORS = new LinkedHashMap<String, Double>() {{
+        put("母亲关系", 0.006974);
+        put("父亲关系", 0.005834);
+        put("师生关系", 0.006820);
+        put("同伴关系", 0.005049);
+    }};
+
+    /** 指南针中心坐标 */
+    private static final int B5_CENTER_X = 857;
+    private static final int B5_CENTER_Y = 758;
+
+    /** 各象限的子维度名称 */
+    private static final Map<String, String[]> B5_SUB_DIMS = new LinkedHashMap<String, String[]>() {{
+        put("母亲关系", new String[]{"控制压迫", "情感疏离", "价值冲突", "双重标准", "过度期待"});
+        put("父亲关系", new String[]{"控制压迫", "情感疏离", "价值冲突", "双重标准", "过度期待"});
+        put("师生关系", new String[]{"回避型", "敌对型", "高控制型", "关系疏离型"});
+        put("同伴关系", new String[]{"回避型", "被排斥型", "攻击型", "边缘型", "特殊因素型"});
+    }};
+
+    // ======================== B5 指南针图像分析方法 ========================
+
+    /**
+     * 从B5 PDF文档第9页提取人际关系指南针图像
+     * 返回PNG图像解析出的BufferedImage,不含数据则表示未找到图像
+     */
+    private java.awt.image.BufferedImage extractB5CompassImage(PDDocument document) {
+        try {
+            if (document.getNumberOfPages() < 9) {
+                return null;
+            }
+            org.apache.pdfbox.pdmodel.PDPage page = document.getPage(8);
+            org.apache.pdfbox.pdmodel.PDResources resources = page.getResources();
+            if (resources == null) return null;
+
+            int imgIndex = 0;
+            for (org.apache.pdfbox.cos.COSName name : resources.getXObjectNames()) {
+                org.apache.pdfbox.pdmodel.graphics.PDXObject xobj = resources.getXObject(name);
+                if (xobj instanceof org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) {
+                    if (imgIndex == 3) {
+                        org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject img =
+                                (org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) xobj;
+                        return img.getImage();
+                    }
+                    imgIndex++;
+                }
+            }
+        } catch (Exception e) {
+            log.warn("B5指南针图像提取失败: {}", e.getMessage());
+        }
+        return null;
+    }
+
+    /**
+     * 沿指定角度测量填充范围(像素半径)
+     * 从r=150开始扫描跳过中心色块, 25px间隙容忍用于跨越填充分区内的环线
+     */
+    private Integer measureFillAtAngle(java.awt.image.BufferedImage img, int cx, int cy, double angleDeg) {
+        double angle = Math.toRadians(angleDeg);
+        double cosA = Math.cos(angle);
+        double sinA = Math.sin(angle);
+        int w = img.getWidth();
+        int h = img.getHeight();
+        int maxR = Math.min(Math.min(w - cx, cx), Math.min(cy, h - cy)) - 2;
+        Integer fillEnd = null;
+        int gap = 0;
+
+        for (int r = 150; r < maxR; r++) {
+            int x = cx + (int)(r * cosA);
+            int y = cy + (int)(r * sinA);
+            if (x < 0 || x >= w || y < 0 || y >= h) break;
+
+            int rgb = img.getRGB(x, y);
+            int red = (rgb >> 16) & 0xFF;
+            int green = (rgb >> 8) & 0xFF;
+            int blue = rgb & 0xFF;
+
+            boolean isWhite = red > 230 && green > 230 && blue > 230;
+            boolean isGray = red > 155 && red < 195 && green > 155 && green < 195 && blue > 155 && blue < 195;
+            boolean isBlack = red < 20 && green < 20 && blue < 20;
+            boolean isColored = !(isWhite || isGray || isBlack);
+
+            if (isColored) {
+                fillEnd = r;
+                gap = 0;
+            } else if (fillEnd != null) {
+                gap++;
+                if (gap > 25) break;
+            }
+        }
+        return fillEnd;
+    }
+
+    /**
+     * 从B5指南针图像提取19个子维度分数
+     * 返回 { "人际_母亲关系_控制压迫": score, ... }
+     */
+    private Map<String, Double> extractB5CompassScores(
+            java.awt.image.BufferedImage img, String fullText) {
+        Map<String, Double> result = new LinkedHashMap<>();
+        if (img == null) return result;
+
+        int cx = B5_CENTER_X;
+        int cy = B5_CENTER_Y;
+
+        // 计算每象限的per-student校准因子
+        Map<String, Double> quadFactors = new LinkedHashMap<>();
+        for (Map.Entry<String, int[]> entry : B5_QUAD_ANGLES.entrySet()) {
+            String qname = entry.getKey();
+            int a1 = entry.getValue()[0];
+            int a2 = entry.getValue()[1];
+
+            List<Integer> fills = new ArrayList<>();
+            for (int a = a1; a <= a2; a++) {
+                Integer fe = measureFillAtAngle(img, cx, cy, a);
+                if (fe != null) fills.add(fe);
+            }
+            double avg = fills.isEmpty() ? 1.0
+                    : fills.stream().mapToInt(Integer::intValue).average().orElse(1.0);
+
+            // 尝试从第9页文本提取关系维度的总分作为校准基准
+            double txtScore = 3.0;
+            Pattern p = Pattern.compile(Pattern.quote(qname) + "\\s*\\n\\s*(\\d+(?:\\.\\d+)?)");
+            Matcher m = p.matcher(fullText);
+            if (m.find()) {
+                try { txtScore = Double.parseDouble(m.group(1)); } catch (NumberFormatException ignored) {}
+            }
+
+            double factor = avg > 0 ? txtScore / avg : B5_QUAD_FACTORS.getOrDefault(qname, 0.005);
+            quadFactors.put(qname, factor);
+        }
+
+        // 提取各象限的子维度分数
+        for (Map.Entry<String, int[]> entry : B5_QUAD_ANGLES.entrySet()) {
+            String quadName = entry.getKey();
+            int a1 = entry.getValue()[0];
+            int a2 = entry.getValue()[1];
+            String[] dims = B5_SUB_DIMS.get(quadName);
+            if (dims == null) continue;
+
+            int n = dims.length;
+            double step = (a2 - a1) / (double)(n + 1);
+            double factor = quadFactors.getOrDefault(quadName,
+                    B5_QUAD_FACTORS.getOrDefault(quadName, 0.005));
+
+            for (int i = 0; i < n; i++) {
+                double angle = a1 + (i + 1) * step;
+                List<Integer> fills = new ArrayList<>();
+                for (int offset = -2; offset <= 2; offset += 2) {
+                    Integer fe = measureFillAtAngle(img, cx, cy, angle + offset);
+                    if (fe != null) fills.add(fe);
+                }
+                double avgFill = fills.isEmpty() ? 0
+                        : fills.stream().mapToInt(Integer::intValue).average().orElse(0);
+                double score = Math.min(5.0, Math.max(1.0, Math.round(avgFill * factor * 10.0) / 10.0));
+                result.put("人际_" + quadName + "_" + dims[i], score);
+            }
+        }
+        return result;
+    }
+
     // ======================== 内部数据类 ========================
 
     /**

+ 273 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/DanReportUploadService.java

@@ -0,0 +1,273 @@
+package com.etotem.cfc.service;
+
+import com.etotem.cfc.common.Result;
+import com.etotem.cfc.dto.DanReportEditDTO;
+import com.etotem.cfc.dto.DanReportUploadVO;
+import com.etotem.cfc.entity.DanAssessmentResult;
+import com.etotem.cfc.entity.DanReportUpload;
+import com.etotem.cfc.mapper.DanAssessmentResultMapper;
+import com.etotem.cfc.mapper.DanReportUploadMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class DanReportUploadService {
+
+    private static final Logger log = LoggerFactory.getLogger(DanReportUploadService.class);
+
+    @Resource
+    private DanAssessmentResultMapper resultMapper;
+
+    @Resource
+    private DanReportUploadMapper uploadMapper;
+
+    @Resource
+    private DanReportParseService danReportParseService;
+
+    @Resource
+    private FileStorageService fileStorageService;
+
+    @Resource
+    private DimensionScoreService dimensionScoreService;
+
+    private final ObjectMapper objectMapper = new ObjectMapper();
+
+    // Phase 1: 上传并预览 PDF
+    public Result<Map<String, Object>> uploadAndParse(Long userId, Long memberId,
+                                                       String dimension, MultipartFile file) {
+        if (file == null || file.isEmpty()) {
+            return Result.error("请选择文件");
+        }
+if (!DanReportUpload.DIM_MIND.equals(dimension) && !DanReportUpload.DIM_WISDOM.equals(dimension)
+                && !DanReportUpload.DIM_COGNITION.equals(dimension) && !DanReportUpload.DIM_LEARNING.equals(dimension)
+                && !DanReportUpload.DIM_BEHAVIOR.equals(dimension) && !DanReportUpload.DIM_CAREER.equals(dimension)
+                && !DanReportUpload.DIM_CAMPUS.equals(dimension) && !DanReportUpload.DIM_ADOLESCENT.equals(dimension)) {
+            return Result.error("dimension 必须为 mind/wisdom/cognition/learning/behavior/career/campus/adolescent");
+        }
+
+        // 1. 保存文件
+        String fileUrl = fileStorageService.store(file, "dan-reports");
+        if (fileUrl == null) {
+            return Result.error("文件保存失败");
+        }
+
+        // 2. 创建草稿记录
+        DanReportUpload upload = new DanReportUpload();
+        upload.setFamilyMemberId(memberId);
+        upload.setUploaderUserId(userId);
+        upload.setDimension(dimension);
+        upload.setFileUrl(fileUrl);
+        upload.setFileId(fileUrl);  // 同义
+        upload.setFileName(file.getOriginalFilename());
+        upload.setFileSize(file.getSize());
+        upload.setUploadedAt(new Date());
+        upload.setDraftStatus(DanReportUpload.DRAFT_PENDING);
+        upload.setParseStatus(DanReportUpload.PARSE_PENDING);
+        upload.setEditCount(0);
+        upload.setCreatedAt(new Date());
+        upload.setUpdatedAt(new Date());
+        uploadMapper.insert(upload);
+
+        // 3. 同步解析
+        try {
+            DanReportParseService.DanParsedReport parsed =
+                    danReportParseService.parse(file.getInputStream(), dimension);
+            upload.setParserVersion("v1");
+            upload.setParseStatus(DanReportUpload.PARSE_SUCCESS);
+            upload.setParsedItems(objectMapper.writeValueAsString(parsed.getItems()));
+            upload.setParsedExtra(objectMapper.writeValueAsString(parsed.getExtra()));
+            upload.setParsedSummary(parsed.getSummary());
+            upload.setParsedSuggestions(parsed.getSuggestions());
+            upload.setReportType(parsed.getReportType());
+            upload.setParsedAt(new Date());
+            uploadMapper.updateById(upload);
+        } catch (IOException e) {
+            log.error("DAN PDF 解析失败", e);
+            upload.setParseStatus(DanReportUpload.PARSE_FAILED);
+            upload.setParseError(e.getMessage());
+            uploadMapper.updateById(upload);
+            return Result.error("PDF解析失败: " + e.getMessage());
+        } catch (Exception e) {
+            log.error("DAN PDF 解析异常", e);
+            upload.setParseStatus(DanReportUpload.PARSE_FAILED);
+            upload.setParseError(e.getMessage());
+            uploadMapper.updateById(upload);
+            return Result.error("PDF解析异常: " + e.getMessage());
+        }
+
+        // 4. 返回预览
+        Map<String, Object> data = new LinkedHashMap<>();
+        data.put("uploadId", upload.getId());
+        data.put("dimension", dimension);
+        data.put("fileUrl", fileUrl);
+        data.put("itemsJson", upload.getParsedItems());
+        data.put("extraJson", upload.getParsedExtra());
+        data.put("summary", upload.getParsedSummary());
+        data.put("suggestions", upload.getParsedSuggestions());
+        data.put("message", "解析完成,请确认数据准确性");
+        return Result.success(data);
+    }
+
+    // 编辑草稿
+    public Result<DanReportUploadVO> editDraft(Long uploadId, Long userId, DanReportEditDTO edit) {
+        DanReportUpload upload = uploadMapper.selectById(uploadId);
+        if (upload == null || upload.getDeletedAt() != null) {
+            return Result.error("上传记录不存在");
+        }
+        if (!DanReportUpload.DRAFT_PENDING.equals(upload.getDraftStatus())) {
+            return Result.error("只有 pending 状态的记录可以编辑");
+        }
+        if (edit.getItemsJson() != null) upload.setEditedItems(edit.getItemsJson());
+        if (edit.getExtraJson() != null) upload.setEditedExtra(edit.getExtraJson());
+        if (edit.getSummary() != null) upload.setEditedSummary(edit.getSummary());
+        if (edit.getSuggestions() != null) upload.setEditedSuggestions(edit.getSuggestions());
+        upload.setEditCount(upload.getEditCount() == null ? 1 : upload.getEditCount() + 1);
+        upload.setUpdatedAt(new Date());
+        uploadMapper.updateById(upload);
+        return Result.success(DanReportUploadVO.fromEntity(upload));
+    }
+
+    // Phase 2: 确认入库(创建 dan_assessment_results 关联记录)
+    @Transactional(rollbackFor = Exception.class)
+    public Result<DanReportUploadVO> confirmUpload(Long uploadId, Long userId,
+                                                    String childName, String assessmentDateStr) {
+        DanReportUpload upload = uploadMapper.selectById(uploadId);
+        if (upload == null || upload.getDeletedAt() != null) {
+            return Result.error("上传记录不存在");
+        }
+        if (!DanReportUpload.DRAFT_PENDING.equals(upload.getDraftStatus())) {
+            return Result.error("此记录已" + upload.getDraftStatus());
+        }
+
+        // 创建数值结果记录
+        DanAssessmentResult result = new DanAssessmentResult();
+        result.setFamilyMemberId(upload.getFamilyMemberId());
+        result.setTeacherId(upload.getUploaderUserId());
+        result.setSource(DanAssessmentResult.SOURCE_PARENT_UPLOAD);
+        result.setSourceReportId(upload.getId());
+        result.setDimension(upload.getDimension());
+        result.setReportFileId(upload.getFileUrl());
+        result.setDraftStatus("confirmed");
+        result.setAnalysisStatus("pending");
+        result.setStatus("completed");
+        result.setAssessmentDate(new Date());
+        result.setChildName(childName);
+        if (assessmentDateStr != null && !assessmentDateStr.isEmpty()) {
+            try {
+                result.setAssessmentDate(new SimpleDateFormat("yyyy-MM-dd").parse(assessmentDateStr));
+            } catch (Exception ignored) {}
+        }
+        // 优先使用 edited_*,否则 parsed_*
+        result.setStructuredAnalysis(upload.getEditedItems() != null
+                ? upload.getEditedItems()
+                : upload.getParsedItems());
+        result.setAnalysisReport(upload.getEditedSummary() != null
+                ? upload.getEditedSummary()
+                : upload.getParsedSummary());
+        result.setGrowthSuggestions(upload.getEditedSuggestions() != null
+                ? upload.getEditedSuggestions()
+                : upload.getParsedSuggestions());
+        result.setCreatedAt(new Date());
+        result.setUpdatedAt(new Date());
+        resultMapper.insert(result);
+
+        // 更新上传记录
+        upload.setDraftStatus(DanReportUpload.DRAFT_CONFIRMED);
+        upload.setConfirmedAt(new Date());
+        upload.setConfirmedBy(userId);
+        upload.setLinkedResultId(result.getId());
+        upload.setUpdatedAt(new Date());
+        uploadMapper.updateById(upload);
+
+        // 刷新五维能量
+        try {
+            dimensionScoreService.refreshFromDanAssessment(
+                    upload.getFamilyMemberId(), result.getId(), upload.getDimension());
+        } catch (Exception ignored) {}
+
+        return Result.success(DanReportUploadVO.fromEntity(upload));
+    }
+
+    // 规划师完成分析
+    @Transactional(rollbackFor = Exception.class)
+    public Result<Void> completeAnalysis(Long uploadId, Long teacherId) {
+        DanReportUpload upload = uploadMapper.selectById(uploadId);
+        if (upload == null) {
+            return Result.error("记录不存在");
+        }
+        if (upload.getLinkedResultId() == null) {
+            return Result.error("未关联数值结果");
+        }
+        DanAssessmentResult result = resultMapper.selectById(upload.getLinkedResultId());
+        if (result == null) {
+            return Result.error("数值结果不存在");
+        }
+        if (!"pending".equals(result.getAnalysisStatus())) {
+            return Result.error("已经确认");
+        }
+        result.setAnalysisStatus("confirmed");
+        result.setUpdatedAt(new Date());
+        resultMapper.updateById(result);
+
+        // 二次刷新五维能量
+        try {
+            dimensionScoreService.refreshFromDanAssessment(
+                    upload.getFamilyMemberId(), result.getId(), upload.getDimension());
+        } catch (Exception ignored) {}
+
+        return Result.success();
+    }
+
+    // 列表查询
+    public Result<List<DanReportUploadVO>> listByMember(Long memberId, String dimension) {
+        LambdaQueryWrapper<DanReportUpload> q = new LambdaQueryWrapper<>();
+        q.eq(DanReportUpload::getFamilyMemberId, memberId)
+                .isNull(DanReportUpload::getDeletedAt)
+                .orderByDesc(DanReportUpload::getUploadedAt);
+        if (dimension != null && !dimension.isEmpty()) {
+            q.eq(DanReportUpload::getDimension, dimension);
+        }
+        List<DanReportUpload> list = uploadMapper.selectList(q);
+        java.util.List<DanReportUploadVO> result = new java.util.ArrayList<>();
+        for (DanReportUpload u : list) {
+            result.add(DanReportUploadVO.fromEntity(u));
+        }
+        return Result.success(result);
+    }
+
+    // 丢弃草稿
+    public Result<Void> discardUpload(Long uploadId, Long userId) {
+        DanReportUpload upload = uploadMapper.selectById(uploadId);
+        if (upload == null) {
+            return Result.error("记录不存在");
+        }
+        upload.setDraftStatus(DanReportUpload.DRAFT_DISCARDED);
+        upload.setUpdatedAt(new Date());
+        uploadMapper.updateById(upload);
+        return Result.success();
+    }
+
+    // 详情
+    public Result<DanReportUploadVO> getDetail(Long uploadId) {
+        DanReportUpload upload = uploadMapper.selectById(uploadId);
+        if (upload == null || upload.getDeletedAt() != null) {
+            return Result.error("记录不存在");
+        }
+        return Result.success(DanReportUploadVO.fromEntity(upload));
+    }
+}

+ 136 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/DanSettlementService.java

@@ -0,0 +1,136 @@
+package com.etotem.cfc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.etotem.cfc.entity.AssessmentOrder;
+import com.etotem.cfc.entity.ServiceSettlement;
+import com.etotem.cfc.entity.SystemConfig;
+import com.etotem.cfc.mapper.AssessmentOrderMapper;
+import com.etotem.cfc.mapper.ServiceSettlementMapper;
+import com.etotem.cfc.mapper.SystemConfigMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+@Service
+public class DanSettlementService {
+
+    private static final int DEFAULT_COMMISSION_RATE = 10; // 默认10%
+
+    @Resource
+    private ServiceSettlementMapper settlementMapper;
+
+    @Resource
+    private AssessmentOrderMapper orderMapper;
+
+    @Resource
+    private SystemConfigMapper systemConfigMapper;
+
+    @Resource
+    private com.etotem.cfc.mapper.DanAssessmentExecutionMapper executionMapper;
+
+    private int getCommissionRate(String providerType) {
+        String key = "dan_commission_rate_" + providerType;
+        SystemConfig cfg = systemConfigMapper.selectOne(
+                new LambdaQueryWrapper<SystemConfig>()
+                        .eq(SystemConfig::getConfigKey, key));
+        if (cfg != null && cfg.getConfigValue() != null) {
+            try {
+                return Integer.parseInt(cfg.getConfigValue());
+            } catch (NumberFormatException ignored) {
+            }
+        }
+        // 回退到通用费率
+        SystemConfig general = systemConfigMapper.selectOne(
+                new LambdaQueryWrapper<SystemConfig>()
+                        .eq(SystemConfig::getConfigKey, "dan_commission_rate"));
+        if (general != null && general.getConfigValue() != null) {
+            try {
+                return Integer.parseInt(general.getConfigValue());
+            } catch (NumberFormatException ignored) {
+            }
+        }
+        return DEFAULT_COMMISSION_RATE;
+    }
+
+    /**
+     * 自动生成结算记录(用户确认后调用)
+     */
+    @Transactional
+    public void autoSettle(Long executionId) {
+        // 根据 executionId 查询执行记录中的 assessorId/plannerId,再查订单价格
+        // 为简化:assessor 和 planner 各分配 50% 服务费,平台扣 commission
+        ServiceSettlement assessorSettlement = createSettlement(executionId, "assessor");
+        ServiceSettlement plannerSettlement = createSettlement(executionId, "planner");
+        if (assessorSettlement != null) {
+            settlementMapper.insert(assessorSettlement);
+        }
+        if (plannerSettlement != null) {
+            settlementMapper.insert(plannerSettlement);
+        }
+    }
+
+    private ServiceSettlement createSettlement(Long executionId, String providerType) {
+        com.etotem.cfc.entity.DanAssessmentExecution exec = executionMapper.selectById(executionId);
+        if (exec == null || exec.getAssessmentOrderId() == null) {
+            return null;
+        }
+        AssessmentOrder order = orderMapper.selectById(exec.getAssessmentOrderId());
+        if (order == null || order.getActualPrice() == null || order.getActualPrice() <= 0) {
+            return null;
+        }
+
+        Long providerId = "assessor".equals(providerType) ? exec.getAssessorId() : exec.getPlannerId();
+        if (providerId == null) {
+            return null;
+        }
+
+        // 50% 服务费给对应角色
+        Long serviceFee = order.getActualPrice() / 2;
+        int commissionRate = getCommissionRate(providerType);
+        Long commissionAmount = serviceFee * commissionRate / 100;
+
+        ServiceSettlement settlement = new ServiceSettlement();
+        settlement.setExecutionId(executionId);
+        settlement.setAssessmentOrderId(exec.getAssessmentOrderId());
+        settlement.setProviderId(providerId);
+        settlement.setProviderType(providerType);
+        settlement.setServiceFee(serviceFee);
+        settlement.setCommissionRate(commissionRate);
+        settlement.setCommissionAmount(commissionAmount);
+        settlement.setStatus("pending");
+        settlement.setCreatedAt(new Date());
+        settlement.setUpdatedAt(new Date());
+        return settlement;
+    }
+
+    /**
+     * 查询某执行记录某角色的结算信息
+     */
+    public ServiceSettlement getSettlement(Long executionId, Long providerId, String providerType) {
+        return settlementMapper.selectOne(new LambdaQueryWrapper<ServiceSettlement>()
+                .eq(ServiceSettlement::getExecutionId, executionId)
+                .eq(ServiceSettlement::getProviderId, providerId)
+                .eq(ServiceSettlement::getProviderType, providerType));
+    }
+
+    /**
+     * 更新结算状态(确认/打款)
+     */
+    @Transactional
+    public void updateSettlementStatus(Long settlementId, String status, String transactionId) {
+        ServiceSettlement s = settlementMapper.selectById(settlementId);
+        if (s != null) {
+            s.setStatus(status);
+            if (transactionId != null) {
+                s.setTransactionId(transactionId);
+            }
+            if ("settled".equals(status)) {
+                s.setSettledAt(new Date());
+            }
+            s.setUpdatedAt(new Date());
+            settlementMapper.updateById(s);
+        }
+    }
+}

+ 2 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/DimensionEnergySyncService.java

@@ -3,6 +3,7 @@ package com.etotem.cfc.service;
 import com.etotem.cfc.entity.HealthDimensionScore;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -34,6 +35,7 @@ public class DimensionEnergySyncService {
     private HealthDimensionScoreService scoreService;
 
     @Resource
+    @Lazy
     private EnergyService energyService;
 
     @Resource

+ 24 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/FamilyContextService.java

@@ -51,6 +51,9 @@ public class FamilyContextService {
     @Resource
     private ProductMapper productMapper;
 
+    @Resource
+    private GrowthTaskMapper growthTaskMapper;
+
     /**
      * 构建当前用户的家庭上下文
      *
@@ -116,6 +119,27 @@ public class FamilyContextService {
                     c.put("healthReport", reportInfo);
                 }
 
+                List<GrowthTask> aiTasks = growthTaskMapper.selectList(
+                        new LambdaQueryWrapper<GrowthTask>()
+                                .eq(GrowthTask::getType, "AI_GENERATED")
+                                .eq(GrowthTask::getEnabled, 1)
+                                .orderByDesc(GrowthTask::getCreatedAt)
+                                .last("LIMIT 10"));
+                if (aiTasks != null && !aiTasks.isEmpty()) {
+                    List<Map<String, Object>> taskList = new ArrayList<>();
+                    for (GrowthTask gt : aiTasks) {
+                        Map<String, Object> t = new LinkedHashMap<>();
+                        t.put("id", gt.getId());
+                        t.put("title", gt.getTitle());
+                        t.put("description", gt.getDescription());
+                        t.put("dimension", gt.getDimension());
+                        t.put("rewardPoints", gt.getRewardPoints());
+                        t.put("sourceConversationId", gt.getSourceConversationId());
+                        taskList.add(t);
+                    }
+                    c.put("aiGeneratedTasks", taskList);
+                }
+
                 childList.add(c);
             }
         }

+ 54 - 21
cfc-backend/src/main/java/com/etotem/cfc/service/FileStorageService.java

@@ -12,6 +12,8 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.List;
 import java.util.UUID;
 
 @Service
@@ -19,45 +21,76 @@ public class FileStorageService {
 
     private static final Logger log = LoggerFactory.getLogger(FileStorageService.class);
 
-    @Value("${file.upload-dir:./uploads}")
-    private String uploadDir;
+    @Value("${upload.base-dir:/data/cfc-uploads}")
+    private String baseDir;
 
+    @Value("${upload.allowed-types:image/jpeg,image/png,image/gif,image/webp}")
+    private String allowedTypesStr;
+
+    private List<String> allowedTypes;
     private Path uploadPath;
 
     @PostConstruct
     public void init() {
-        uploadPath = Paths.get(uploadDir).toAbsolutePath().normalize();
+        allowedTypes = Arrays.asList(allowedTypesStr.split(","));
+        uploadPath = Paths.get(baseDir).toAbsolutePath().normalize();
         try {
             Files.createDirectories(uploadPath);
         } catch (IOException e) {
             log.error("初始化上传目录失败: {}", uploadPath, e);
         }
+        log.info("FileStorageService init: baseDir={}, allowedTypes={}", uploadPath, allowedTypes);
     }
 
-    public String upload(MultipartFile file, String subDir) {
+    public String store(MultipartFile file, String subDir) {
         if (file == null || file.isEmpty()) {
-            return null;
+            throw new IllegalArgumentException("文件为空");
         }
-        try {
-            String originalName = file.getOriginalFilename();
-            String ext = "";
-            if (originalName != null && originalName.contains(".")) {
-                ext = originalName.substring(originalName.lastIndexOf("."));
-            }
-            String filename = UUID.randomUUID().toString().replace("-", "") + ext;
+        String contentType = file.getContentType();
+        if (contentType == null || !allowedTypes.contains(contentType)) {
+            throw new IllegalArgumentException("不支持的文件类型,仅支持: " + allowedTypes);
+        }
+        String originalName = file.getOriginalFilename();
+        String ext = "";
+        if (originalName != null && originalName.contains(".")) {
+            ext = originalName.substring(originalName.lastIndexOf("."));
+        }
+        String filename = UUID.randomUUID().toString().replace("-", "") + ext;
 
-            Path targetDir = uploadPath.resolve(subDir != null ? subDir : "general");
+        Path targetDir = uploadPath.resolve(subDir != null ? subDir : "general");
+        try {
             Files.createDirectories(targetDir);
+        } catch (IOException e) {
+            throw new RuntimeException("创建上传目录失败: " + targetDir, e);
+        }
 
-            Path targetPath = targetDir.resolve(filename);
+        Path targetPath = targetDir.resolve(filename);
+        try {
             file.transferTo(targetPath.toFile());
-
-            String relativePath = (subDir != null ? "/" + subDir : "") + "/" + filename;
-            log.info("文件已保存: {}", relativePath);
-            return relativePath;
         } catch (IOException e) {
-            log.error("文件上传失败", e);
-            return null;
+            throw new RuntimeException("文件保存失败", e);
+        }
+
+        String url = "/uploads/" + (subDir != null ? subDir + "/" : "") + filename;
+        log.info("文件已保存: original={}, url={}", originalName, url);
+        return url;
+    }
+
+    public boolean delete(String url) {
+        if (url == null || url.isEmpty() || !url.startsWith("/uploads/")) {
+            return false;
+        }
+        String relativePath = url.replace("/uploads/", "");
+        Path filePath = uploadPath.resolve(relativePath);
+        if (Files.exists(filePath)) {
+            try {
+                Files.delete(filePath);
+                log.info("文件已删除: {}", url);
+                return true;
+            } catch (IOException e) {
+                log.error("文件删除失败: {}", url, e);
+            }
         }
+        return false;
     }
-}
+}

+ 37 - 14
cfc-backend/src/main/java/com/etotem/cfc/service/GrowthTaskService.java

@@ -38,17 +38,24 @@ public class GrowthTaskService {
     /**
      * Get task list with user's progress for today (daily) or all-time (newbie).
      */
-    public List<Map<String, Object>> getTaskList(Long userId, String type) {
-        if (type == null || type.isEmpty()) {
-            type = "DAILY";
-        }
+public List<Map<String, Object>> getTaskList(Long userId, Map<String, String> params) {
+	String type = params != null ? params.getOrDefault("type", "DAILY") : "DAILY";
+	String dimension = params != null ? params.get("dimension") : null;
 
-        List<GrowthTask> tasks = growthTaskMapper.selectList(
-                new LambdaQueryWrapper<GrowthTask>()
-                        .eq(GrowthTask::getType, type)
-                        .eq(GrowthTask::getEnabled, 1)
-                        .orderByAsc(GrowthTask::getSortOrder)
-        );
+	if (type == null || type.isEmpty()) {
+		type = "DAILY";
+	}
+
+	LambdaQueryWrapper<GrowthTask> queryWrapper = new LambdaQueryWrapper<GrowthTask>()
+		.eq(GrowthTask::getType, type)
+		.eq(GrowthTask::getEnabled, 1)
+		.orderByAsc(GrowthTask::getSortOrder);
+
+	if (dimension != null && !dimension.isEmpty()) {
+		queryWrapper.eq(GrowthTask::getDimension, dimension);
+	}
+
+	List<GrowthTask> tasks = growthTaskMapper.selectList(queryWrapper);
 
         String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
 
@@ -62,9 +69,10 @@ public class GrowthTaskService {
             item.put("rewardPoints", task.getRewardPoints());
             item.put("rewardEnergy", task.getRewardEnergy());
             item.put("targetValue", task.getTargetValue());
-            item.put("taskKey", task.getTaskKey());
+item.put("taskKey", task.getTaskKey());
+item.put("dimension", task.getDimension());
 
-            // Find user's log for this task
+// Find user's log for this task
             LambdaQueryWrapper<GrowthTaskLog> logWrapper = new LambdaQueryWrapper<GrowthTaskLog>()
                     .eq(GrowthTaskLog::getUserId, userId)
                     .eq(GrowthTaskLog::getTaskId, task.getId());
@@ -250,7 +258,22 @@ public class GrowthTaskService {
             taskLog.setClaimed(0);
             taskLog.setDate(null); // NEWBIE tasks are all-time, no date
             taskLog.setCreatedAt(new Date());
-            growthTaskLogMapper.insert(taskLog);
+        growthTaskLogMapper.insert(taskLog);
+        }
+        }
+
+        @Transactional
+        public GrowthTask createDynamicTask(Long userId, String title, String description, String dimension, Integer rewardPoints, String sourceConversationId) {
+            GrowthTask task = new GrowthTask();
+            task.setType("AI_GENERATED");
+            task.setTitle(title);
+            task.setDescription(description);
+            task.setDimension(dimension != null ? dimension : "body");
+            task.setRewardPoints(rewardPoints != null ? rewardPoints : 10);
+            task.setEnabled(1);
+            task.setSourceConversationId(sourceConversationId);
+            growthTaskMapper.insert(task);
+            log.info("创建AI动态任务: userId={}, taskId={}, title={}", userId, task.getId(), title);
+            return task;
         }
-    }
 }

+ 79 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/HealthKnowledgeBaseService.java

@@ -0,0 +1,79 @@
+package com.etotem.cfc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.etotem.cfc.entity.HealthKnowledgeBase;
+import com.etotem.cfc.mapper.HealthKnowledgeBaseMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class HealthKnowledgeBaseService {
+
+    @Resource
+    private HealthKnowledgeBaseMapper healthKnowledgeBaseMapper;
+
+    /**
+     * 单条查询
+     */
+    public HealthKnowledgeBase query(String itemType, String itemName) {
+        return healthKnowledgeBaseMapper.selectOne(
+                new LambdaQueryWrapper<HealthKnowledgeBase>()
+                        .eq(HealthKnowledgeBase::getItemType, itemType)
+                        .eq(HealthKnowledgeBase::getItemName, itemName)
+        );
+    }
+
+    /**
+     * 批量查询 — queries 为 [{itemType, itemName}, ...]
+     * 返回 Map.key = "itemType:itemName"
+     */
+    public Map<String, HealthKnowledgeBase> batchQuery(List<Map<String, String>> queries) {
+        Map<String, HealthKnowledgeBase> result = new HashMap<>();
+        for (Map<String, String> q : queries) {
+            String itemType = q.get("itemType");
+            String itemName = q.get("itemName");
+            if (itemType == null || itemName == null) {
+                continue;
+            }
+            String key = itemType + ":" + itemName;
+            HealthKnowledgeBase entry = query(itemType, itemName);
+            if (entry != null) {
+                result.put(key, entry);
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 插入单条(用于数据导入)
+     */
+    public void insert(HealthKnowledgeBase entry) {
+        healthKnowledgeBaseMapper.insert(entry);
+    }
+
+    public List<HealthKnowledgeBase> listAll() {
+        return healthKnowledgeBaseMapper.selectList(null);
+    }
+
+    public void save(HealthKnowledgeBase entry) {
+        if (entry.getId() != null) {
+            healthKnowledgeBaseMapper.updateById(entry);
+        } else {
+            healthKnowledgeBaseMapper.insert(entry);
+        }
+    }
+
+    public void updateById(HealthKnowledgeBase entry) {
+        healthKnowledgeBaseMapper.updateById(entry);
+    }
+
+    public void removeById(Long id) {
+        healthKnowledgeBaseMapper.deleteById(id);
+    }
+}

+ 140 - 9
cfc-backend/src/main/java/com/etotem/cfc/service/HealthReportService.java

@@ -13,6 +13,7 @@ import com.etotem.cfc.mapper.HealthReportDraftMapper;
 import com.etotem.cfc.mapper.HealthReportMapper;
 import com.etotem.cfc.mapper.HealthReportPermissionMapper;
 import com.etotem.cfc.mapper.UserMapper;
+import com.etotem.cfc.mapper.FoodMapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.dao.DuplicateKeyException;
@@ -63,6 +64,9 @@ public class HealthReportService {
     @Resource
     private ObjectMapper objectMapper;
 
+    @Resource
+    private DimensionScoreService dimensionScoreService;
+
     /**
      * 创建健康报告(含指标列表)
      */
@@ -1044,17 +1048,28 @@ public class HealthReportService {
 
     List<HealthGutFlora> buildGutFloraFromPayload(ParsedReportPayload.Payload payload) {
         List<HealthGutFlora> result = new ArrayList<>();
-        if (payload.getGutFlora() != null) {
-            for (ParsedReportPayload.Flora pf : payload.getGutFlora()) {
-                result.add(convertToGutFlora(pf));
-            }
-        }
-        if (payload.getProbioticSpecies() != null) {
-            for (ParsedReportPayload.Flora pf : payload.getProbioticSpecies()) {
-                result.add(convertToGutFlora(pf));
+        // 核心菌属 + 有害菌属等
+        addFloraList(result, payload.getGutFlora());
+        // 益生菌种
+        addFloraList(result, payload.getProbioticSpecies());
+        // Taxonomy 层级
+        addFloraList(result, payload.getTaxonomyClass());
+        addFloraList(result, payload.getTaxonomyOrder());
+        addFloraList(result, payload.getTaxonomyFamily());
+        addFloraList(result, payload.getTaxonomyGenus());
+        addFloraList(result, payload.getTaxonomySpecies());
+        // 病原菌
+        addFloraList(result, payload.getPathogenGenus());
+        addFloraList(result, payload.getPathogenDetection());
+        return result;
+    }
+
+    private void addFloraList(List<HealthGutFlora> target, List<ParsedReportPayload.Flora> source) {
+        if (source != null) {
+            for (ParsedReportPayload.Flora pf : source) {
+                target.add(convertToGutFlora(pf));
             }
         }
-        return result;
     }
 
     private HealthGutFlora convertToGutFlora(ParsedReportPayload.Flora pf) {
@@ -1084,4 +1099,120 @@ public class HealthReportService {
         }
         return risks;
     }
+
+    /**
+     * 更新已发布报告的编辑数据
+     * 逻辑: 只更新已有字段的值,不增删条目(全量替换)
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void updateReportFromPayload(Long reportId, Map<String, Object> payload, Long subjectId) {
+        // 1. 更新 health_report 评分数值
+        HealthReport report = healthReportMapper.selectById(reportId);
+        if (report == null) {
+            throw new RuntimeException("报告不存在: " + reportId);
+        }
+        if (payload.get("overallScore") != null) {
+            report.setOverallScore(Integer.valueOf(payload.get("overallScore").toString()));
+        }
+        if (payload.get("gutHealthScore") != null) {
+            report.setGutHealthScore(Integer.valueOf(payload.get("gutHealthScore").toString()));
+        }
+        if (payload.get("chronicDiseaseScore") != null) {
+            report.setChronicDiseaseScore(Integer.valueOf(payload.get("chronicDiseaseScore").toString()));
+        }
+        if (payload.get("nutritionScore") != null) {
+            report.setNutritionScore(Integer.valueOf(payload.get("nutritionScore").toString()));
+        }
+        if (payload.get("gutBalanceScore") != null) {
+            report.setGutBalanceScore(Integer.valueOf(payload.get("gutBalanceScore").toString()));
+        }
+        if (payload.get("gutDiversityScore") != null) {
+            report.setGutDiversityScore(Integer.valueOf(payload.get("gutDiversityScore").toString()));
+        }
+        if (payload.get("beneficialBacteriaScore") != null) {
+            report.setBeneficialBacteriaScore(Integer.valueOf(payload.get("beneficialBacteriaScore").toString()));
+        }
+        if (payload.get("harmfulBacteriaScore") != null) {
+            report.setHarmfulBacteriaScore(Integer.valueOf(payload.get("harmfulBacteriaScore").toString()));
+        }
+        if (payload.get("coreSpeciesScore") != null) {
+            report.setCoreSpeciesScore(Integer.valueOf(payload.get("coreSpeciesScore").toString()));
+        }
+        healthReportMapper.updateById(report);
+
+        // 2. 更新 indicators(删除旧→插入新)
+        Object indicatorsRaw = payload.get("indicators");
+        if (indicatorsRaw instanceof List) {
+            @SuppressWarnings("unchecked")
+            List<Map<String, Object>> indicators = (List<Map<String, Object>>) indicatorsRaw;
+            healthIndicatorMapper.delete(new LambdaQueryWrapper<HealthIndicator>()
+                    .eq(HealthIndicator::getReportId, reportId));
+            for (int i = 0; i < indicators.size(); i++) {
+                Map<String, Object> item = indicators.get(i);
+                HealthIndicator ind = new HealthIndicator();
+                ind.setReportId(reportId);
+                ind.setCategory((String) item.get("category"));
+                ind.setIndicatorName((String) item.get("indicatorName"));
+                ind.setIndicatorValue(item.get("indicatorValue") != null
+                        ? item.get("indicatorValue").toString() : null);
+                ind.setUnit((String) item.get("unit"));
+                ind.setRefRange((String) item.get("refRange"));
+                ind.setStatus((String) item.get("status"));
+                ind.setSymptoms((String) item.get("symptoms"));
+                ind.setSortOrder(i);
+                healthIndicatorMapper.insert(ind);
+            }
+        }
+
+        // 3. 更新 gutFlora
+        Object gutFloraRaw = payload.get("gutFlora");
+        if (gutFloraRaw instanceof List) {
+            @SuppressWarnings("unchecked")
+            List<Map<String, Object>> gutFlora = (List<Map<String, Object>>) gutFloraRaw;
+            healthGutFloraMapper.delete(new LambdaQueryWrapper<HealthGutFlora>()
+                    .eq(HealthGutFlora::getReportId, reportId));
+            for (int i = 0; i < gutFlora.size(); i++) {
+                Map<String, Object> item = gutFlora.get(i);
+                HealthGutFlora flora = new HealthGutFlora();
+                flora.setReportId(reportId);
+                flora.setBacteriaName((String) item.get("bacteriaName"));
+                flora.setBacteriaValue(item.get("bacteriaValue") != null
+                        ? item.get("bacteriaValue").toString() : null);
+                flora.setNormalRange((String) item.get("normalRange"));
+                flora.setStatus((String) item.get("status"));
+                flora.setCategory((String) item.get("category"));
+                flora.setPopulationLevel((String) item.get("populationLevel"));
+                flora.setDetectionRate((String) item.get("detectionRate"));
+                flora.setLevel((String) item.get("level"));
+                flora.setSortOrder(i);
+                healthGutFloraMapper.insert(flora);
+            }
+        }
+
+        // 4. 更新 diseaseRisks
+        Object risksRaw = payload.get("diseaseRisks");
+        if (risksRaw instanceof List) {
+            @SuppressWarnings("unchecked")
+            List<Map<String, Object>> diseaseRisks = (List<Map<String, Object>>) risksRaw;
+            healthDiseaseRiskMapper.delete(new LambdaQueryWrapper<HealthDiseaseRisk>()
+                    .eq(HealthDiseaseRisk::getReportId, reportId));
+            for (Map<String, Object> item : diseaseRisks) {
+                HealthDiseaseRisk risk = new HealthDiseaseRisk();
+                risk.setReportId(reportId);
+                risk.setDiseaseName((String) item.get("diseaseName"));
+                risk.setRiskValue(item.get("riskValue") != null
+                        ? item.get("riskValue").toString() : null);
+                risk.setRiskLevel((String) item.get("riskLevel"));
+                healthDiseaseRiskMapper.insert(risk);
+            }
+        }
+
+        // 5. 刷新 7 维健康评分
+        try {
+            dimensionScoreService.refreshFromGutReport(subjectId, reportId);
+            log.info("编辑后已刷新成员{}的7维健康评分", subjectId);
+        } catch (Exception e) {
+            log.warn("刷新7维健康评分失败: {}", e.getMessage());
+        }
+    }
 }

+ 138 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/KnowledgeBaseDataImporter.java

@@ -0,0 +1,138 @@
+package com.etotem.cfc.service;
+
+import com.etotem.cfc.entity.HealthKnowledgeBase;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.InputStream;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 知识库数据导入器 — 从参考 JSON 导入菌属/指标说明
+ */
+@Slf4j
+@Service
+public class KnowledgeBaseDataImporter {
+
+    @Resource
+    private HealthKnowledgeBaseService knowledgeBaseService;
+
+    @Resource
+    private ObjectMapper objectMapper;
+
+    private static final String[] REF_JSON_FILES = {
+        "/data/refs/501999942-某人.json",
+        "/data/refs/530010234-侯.json",
+        "/data/refs/儿童示例.json"
+    };
+
+    /**
+     * 导入所有参考 JSON 的知识库数据
+     * 幂等: 已存在的条目不再重复插入
+     */
+    public String importAll() {
+        Set<String> dedupSet = new HashSet<>();
+        int totalInserted = 0;
+
+        for (String jsonFile : REF_JSON_FILES) {
+            totalInserted += importFromRef(jsonFile, dedupSet);
+        }
+
+        String msg = "知识库数据导入完成,共插入" + totalInserted + "条";
+        log.info(msg);
+        return msg;
+    }
+
+    private int importFromRef(String classpathFile, Set<String> dedupSet) {
+        int count = 0;
+        try (InputStream is = getClass().getResourceAsStream(classpathFile)) {
+            if (is == null) {
+                log.warn("参考JSON文件不存在: {}", classpathFile);
+                return 0;
+            }
+            Map<String, Object> root = objectMapper.readValue(is, new TypeReference<Map<String, Object>>() {});
+            count += importGutFloraDescriptions(root, dedupSet);
+            count += importIndicatorDescriptions(root, dedupSet);
+        } catch (Exception e) {
+            log.error("读取参考JSON失败: {}", classpathFile, e);
+        }
+        return count;
+    }
+
+    private int importGutFloraDescriptions(Map<String, Object> root, Set<String> dedupSet) {
+        int count = 0;
+        Object raw = root.get("gutFlora");
+        if (raw instanceof List) {
+            for (Object item : (List) raw) {
+                if (item instanceof Map) {
+                    Map<String, Object> flora = (Map<String, Object>) item;
+                    String name = (String) flora.get("bacteriaName");
+                    String desc = (String) flora.get("description");
+                    if (name != null && desc != null && !desc.isEmpty()) {
+                        String key = "bacteria:" + name;
+                        if (dedupSet.add(key)) {
+                            HealthKnowledgeBase entry = new HealthKnowledgeBase();
+                            entry.setItemType("bacteria");
+                            entry.setItemName(name);
+                            entry.setDescription(desc);
+                            entry.setCategory((String) flora.get("category"));
+                            entry.setNormalRange((String) flora.get("normalRange"));
+                            knowledgeBaseService.insert(entry);
+                            count++;
+                        }
+                    }
+                }
+            }
+        }
+        return count;
+    }
+
+    private int importIndicatorDescriptions(Map<String, Object> root, Set<String> dedupSet) {
+        int count = 0;
+        Object raw = root.get("indicators");
+        if (raw instanceof List) {
+            for (Object item : (List) raw) {
+                if (item instanceof Map) {
+                    Map<String, Object> ind = (Map<String, Object>) item;
+                    String name = (String) ind.get("indicatorName");
+                    String category = (String) ind.get("category");
+                    if (name == null) continue;
+
+                    String itemType = mapIndicatorCategory(category);
+                    String key = itemType + ":" + name;
+                    if (dedupSet.add(key)) {
+                        HealthKnowledgeBase entry = new HealthKnowledgeBase();
+                        entry.setItemType(itemType);
+                        entry.setItemName(name);
+                        entry.setCategory(category);
+                        entry.setNormalRange((String) ind.get("refRange"));
+                        entry.setDescription((String) ind.get("symptoms"));
+                        knowledgeBaseService.insert(entry);
+                        count++;
+                    }
+                }
+            }
+        }
+        return count;
+    }
+
+    private String mapIndicatorCategory(String category) {
+        if (category == null) return "nutrient";
+        switch (category) {
+            case "维生素": return "vitamin";
+            case "氨基酸": return "amino_acid";
+            case "微量元素": return "indicator";
+            case "肠道屏障与代谢物": return "indicator";
+            case "短链脂肪酸": return "indicator";
+            case "神经递质与激素": return "indicator";
+            case "抗生素风险评估": return "indicator";
+            default: return "nutrient";
+        }
+    }
+}

+ 280 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/KnowledgeBaseV3Service.java

@@ -0,0 +1,280 @@
+package com.etotem.cfc.service;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.io.InputStream;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+/**
+ * KB v3 知识库服务 — 从 classpath 加载 报告指标知识库.json
+ * 提供菌属功能、指标调整建议、食物营养数据的快速查找
+ *
+ * 数据源:knowledge-base/报告指标知识库.json
+ * 匹配策略:精确匹配 → 属级回退(学名首词)
+ */
+@Slf4j
+@Service
+public class KnowledgeBaseV3Service {
+
+    @Resource
+    private ObjectMapper objectMapper;
+
+    /** 原始 KB JSON 根 */
+    private Map<String, Object> kbRoot;
+
+    /** 菌属索引: 学名 → 条目 */
+    private Map<String, Map<String, Object>> bacteriaIndex;
+
+    /** 指标索引: section名称 → (指标名称 → 条目) */
+    private Map<String, Map<String, Map<String, Object>>> indicatorIndex;
+
+    /** 食物索引: 食物名称 → 条目 */
+    private Map<String, Map<String, Object>> foodIndex;
+
+    /** 食物分类列表 */
+    private Map<String, List<Map<String, Object>>> foodByCategory;
+
+    @PostConstruct
+    public void init() {
+        try (InputStream is = getClass().getResourceAsStream("/knowledge-base/报告指标知识库.json")) {
+            if (is == null) {
+                log.warn("KB v3 JSON not found at classpath:knowledge-base/报告指标知识库.json");
+                kbRoot = Collections.emptyMap();
+                bacteriaIndex = Collections.emptyMap();
+                indicatorIndex = Collections.emptyMap();
+                foodIndex = Collections.emptyMap();
+                foodByCategory = Collections.emptyMap();
+                return;
+            }
+            kbRoot = objectMapper.readValue(is, new TypeReference<Map<String, Object>>() {});
+            buildIndexes();
+            log.info("KB v3 loaded: {} kbRoot keys, {} bacteria, {} indicators, {} foods",
+                    kbRoot.size(), bacteriaIndex.size(), indicatorIndex.size(), foodIndex.size());
+        } catch (Exception e) {
+            log.error("Failed to load KB v3 JSON", e);
+            kbRoot = Collections.emptyMap();
+            bacteriaIndex = Collections.emptyMap();
+            indicatorIndex = Collections.emptyMap();
+            foodIndex = Collections.emptyMap();
+            foodByCategory = Collections.emptyMap();
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private void buildIndexes() {
+        // --- 菌属索引 ---
+        bacteriaIndex = new ConcurrentHashMap<>();
+        Object floraRaw = kbRoot.get("菌属功能库");
+        if (floraRaw instanceof Map) {
+            Object generaRaw = ((Map<String, Object>) floraRaw).get("菌属");
+            if (generaRaw instanceof List) {
+                for (Object item : (List<Object>) generaRaw) {
+                    if (item instanceof Map) {
+                        Map<String, Object> entry = (Map<String, Object>) item;
+                        String latinName = (String) entry.get("学名");
+                        if (latinName != null && !latinName.isEmpty()) {
+                            bacteriaIndex.put(latinName, entry);
+                        }
+                    }
+                }
+            }
+        }
+
+        // --- 指标索引 ---
+        indicatorIndex = new ConcurrentHashMap<>();
+        List<String> indicatorSections = Arrays.asList(
+                "疾病风险评估", "主要营养评估", "氨基酸评估", "维生素评估",
+                "微量元素评估", "抗生素风险评估", "肠道屏障及代谢物",
+                "短链脂肪酸", "神经递质及激素", "健康总分评估"
+        );
+        for (String section : indicatorSections) {
+            Object secRaw = kbRoot.get(section);
+            if (secRaw instanceof Map) {
+                Object indicatorsRaw = ((Map<String, Object>) secRaw).get("指标");
+                if (indicatorsRaw instanceof List) {
+                    Map<String, Map<String, Object>> sectionIndex = new ConcurrentHashMap<>();
+                    for (Object item : (List<Object>) indicatorsRaw) {
+                        if (item instanceof Map) {
+                            Map<String, Object> entry = (Map<String, Object>) item;
+                            String name = (String) entry.get("名称");
+                            if (name != null && !name.isEmpty()) {
+                                sectionIndex.put(name, entry);
+                            }
+                        }
+                    }
+                    if (!sectionIndex.isEmpty()) {
+                        indicatorIndex.put(section, sectionIndex);
+                    }
+                }
+            }
+        }
+
+        // --- 食物索引 ---
+        foodIndex = new ConcurrentHashMap<>();
+        foodByCategory = new ConcurrentHashMap<>();
+        Object foodRaw = kbRoot.get("食物库");
+        if (foodRaw instanceof Map) {
+            Object itemsRaw = ((Map<String, Object>) foodRaw).get("数据");
+            if (itemsRaw instanceof List) {
+                for (Object item : (List<Object>) itemsRaw) {
+                    if (item instanceof Map) {
+                        Map<String, Object> entry = (Map<String, Object>) item;
+                        String name = (String) entry.get("名称");
+                        if (name != null && !name.isEmpty()) {
+                            foodIndex.put(name, entry);
+                            String category = (String) entry.getOrDefault("分类", "其他");
+                            foodByCategory.computeIfAbsent(category, k -> new ArrayList<>()).add(entry);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    // ==================== 菌属查询 ====================
+
+    /**
+     * 按学名查找菌属功能
+     * 匹配策略: 精确匹配 → 属级回退(取首词)
+     */
+    public Map<String, Object> lookupBacteria(String scientificName) {
+        if (scientificName == null || scientificName.isEmpty()) return null;
+
+        // 1. 精确匹配
+        Map<String, Object> result = bacteriaIndex.get(scientificName);
+        if (result != null) return result;
+
+        // 2. 属级回退: 对种名取首词
+        String genus = scientificName.split("\\s+")[0];
+        if (!genus.equals(scientificName)) {
+            result = bacteriaIndex.get(genus);
+        }
+
+        return result;
+    }
+
+    /**
+     * 批量查询菌属
+     */
+    public Map<String, Map<String, Object>> batchLookupBacteria(List<String> names) {
+        Map<String, Map<String, Object>> results = new LinkedHashMap<>();
+        for (String name : names) {
+            Map<String, Object> entry = lookupBacteria(name);
+            if (entry != null) {
+                results.put(name, entry);
+            }
+        }
+        return results;
+    }
+
+    /**
+     * 按分组获取菌属列表
+     */
+    public List<Map<String, Object>> getBacteriaByGroup(String group) {
+        if (group == null) return new ArrayList<>();
+        return bacteriaIndex.values().stream()
+                .filter(e -> group.equals(e.get("分组")))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 获取所有菌属分组名称
+     */
+    public Set<String> getBacteriaGroups() {
+        return bacteriaIndex.values().stream()
+                .map(e -> (String) e.get("分组"))
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+    }
+
+    // ==================== 指标查询 ====================
+
+    /**
+     * 按指标名查找(自动遍历所有章节)
+     */
+    public Map<String, Object> lookupIndicator(String indicatorName) {
+        if (indicatorName == null || indicatorName.isEmpty()) return null;
+        for (Map<String, Map<String, Object>> section : indicatorIndex.values()) {
+            Map<String, Object> result = section.get(indicatorName);
+            if (result != null) return result;
+        }
+        return null;
+    }
+
+    /**
+     * 在指定章节查找指标
+     */
+    public Map<String, Object> lookupIndicatorInSection(String sectionName, String indicatorName) {
+        Map<String, Map<String, Object>> section = indicatorIndex.get(sectionName);
+        if (section == null) return null;
+        return section.get(indicatorName);
+    }
+
+    /**
+     * 获取某章节所有指标
+     */
+    public Map<String, Map<String, Object>> getIndicatorSection(String sectionName) {
+        return indicatorIndex.get(sectionName);
+    }
+
+    /**
+     * 获取所有章节名
+     */
+    public Set<String> getIndicatorSectionNames() {
+        return indicatorIndex.keySet();
+    }
+
+    // ==================== 食物查询 ====================
+
+    /**
+     * 按名称查找食物
+     */
+    public Map<String, Object> lookupFood(String foodName) {
+        if (foodName == null || foodName.isEmpty()) return null;
+        return foodIndex.get(foodName);
+    }
+
+    /**
+     * 按分类获取食物列表
+     */
+    public List<Map<String, Object>> getFoodByCategory(String category) {
+        return foodByCategory.getOrDefault(category, Collections.emptyList());
+    }
+
+    /**
+     * 获取所有食物分类
+     */
+    public Set<String> getFoodCategories() {
+        return foodByCategory.keySet();
+    }
+
+    /**
+     * 获取全部食物(简化格式)
+     */
+    public List<Map<String, Object>> getAllFoods() {
+        return new ArrayList<>(foodIndex.values());
+    }
+
+    // ==================== 原始数据 ====================
+
+    /**
+     * 获取完整 KB JSON 根
+     */
+    public Map<String, Object> getKbRoot() {
+        return kbRoot;
+    }
+
+    /**
+     * 获取指定章节的原始数据
+     */
+    public Object getSection(String sectionName) {
+        return kbRoot.get(sectionName);
+    }
+}

+ 4 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/ProductSkuService.java

@@ -22,6 +22,10 @@ public class ProductSkuService {
         return skuMapper.findByProductId(productId);
     }
 
+    public List<ProductSku> listByProductIdAll(Long productId) {
+        return skuMapper.findByProductIdAll(productId);
+    }
+
     public ProductSku getById(Long id) {
         return skuMapper.findById(id);
     }

+ 16 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/ReviewOrderService.java

@@ -0,0 +1,16 @@
+package com.etotem.cfc.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.etotem.cfc.dto.ReviewOrderRequest;
+import com.etotem.cfc.dto.ReviewOrderResponse;
+import com.etotem.cfc.dto.ReviewStatusResponse;
+import com.etotem.cfc.entity.ReviewOrder;
+
+public interface ReviewOrderService extends IService<ReviewOrder> {
+
+    String createReview(ReviewOrderRequest request, Long reviewerId);
+
+    ReviewOrderResponse findByOrder(Long orderId);
+
+    ReviewStatusResponse getStats(Long orderId);
+}

+ 114 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/ReviewOrderServiceImpl.java

@@ -0,0 +1,114 @@
+package com.etotem.cfc.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.etotem.cfc.dto.ReviewOrderRequest;
+import com.etotem.cfc.dto.ReviewOrderResponse;
+import com.etotem.cfc.dto.ReviewStatusResponse;
+import com.etotem.cfc.entity.ProductOrder;
+import com.etotem.cfc.entity.ReviewOrder;
+import com.etotem.cfc.mapper.ProductOrderMapper;
+import com.etotem.cfc.mapper.ReviewOrderMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class ReviewOrderServiceImpl extends ServiceImpl<ReviewOrderMapper, ReviewOrder> implements ReviewOrderService {
+
+    @Resource
+    private ReviewOrderMapper reviewOrderMapper;
+
+    @Resource
+    private ProductOrderMapper productOrderMapper;
+
+    @Override
+    @Transactional
+    public String createReview(ReviewOrderRequest request, Long reviewerId) {
+        Long orderId = request.getOrderId();
+        ProductOrder order = productOrderMapper.selectById(orderId);
+        if (order == null) {
+            throw new RuntimeException("Order not found");
+        }
+        if (!"activity".equals(order.getProductType())) {
+            throw new RuntimeException("Only activity orders are reviewable");
+        }
+        boolean completed = "completed".equals(order.getStatus());
+        boolean signedIn = "signed_in".equals(order.getProvisionStatus());
+        if (!completed && !signedIn) {
+            throw new RuntimeException("Order is not eligible for review");
+        }
+
+        ReviewOrder existing = reviewOrderMapper.findByOrderId(orderId);
+        if (existing != null) {
+            throw new RuntimeException("Review already exists");
+        }
+
+        ReviewOrder review = new ReviewOrder();
+        review.setOrderId(orderId);
+        review.setReviewerId(reviewerId);
+        review.setRating(request.getRating());
+        review.setReviewText(request.getReviewText());
+        review.setReviewAt(new Date());
+        review.setOrganizationRating(request.getOrganizationRating());
+        review.setContentRating(request.getContentRating());
+        review.setExperienceRating(request.getExperienceRating());
+        review.setCreatedAt(new Date());
+        review.setUpdatedAt(new Date());
+        reviewOrderMapper.insert(review);
+        return "评价提交成功";
+    }
+
+    @Override
+    public ReviewOrderResponse findByOrder(Long orderId) {
+        ReviewOrder review = reviewOrderMapper.findByOrderId(orderId);
+        if (review == null) {
+            return null;
+        }
+        ReviewOrderResponse response = new ReviewOrderResponse();
+        response.setOrderId(review.getOrderId());
+        response.setReviewerId(review.getReviewerId());
+        response.setRating(review.getRating());
+        response.setReviewText(review.getReviewText());
+        response.setReviewAt(review.getReviewAt() != null ? review.getReviewAt().toString() : null);
+        response.setOrganizationRating(review.getOrganizationRating());
+        response.setContentRating(review.getContentRating());
+        response.setExperienceRating(review.getExperienceRating());
+        return response;
+    }
+
+    @Override
+    public ReviewStatusResponse getStats(Long orderId) {
+        ReviewOrder review = reviewOrderMapper.findByOrderId(orderId);
+        Map<String, Object> stats = reviewOrderMapper.getStatsByOrderId(orderId);
+
+        ReviewStatusResponse response = new ReviewStatusResponse();
+        response.setReviewed(review != null);
+        if (review != null) {
+            response.setRating(review.getRating());
+            response.setReviewText(review.getReviewText());
+            response.setReviewAt(review.getReviewAt() != null ? review.getReviewAt().toString() : null);
+            response.setOrganizationRating(review.getOrganizationRating());
+            response.setContentRating(review.getContentRating());
+            response.setExperienceRating(review.getExperienceRating());
+        }
+
+        if (stats != null && !stats.isEmpty()) {
+            Object overallAvgObj = stats.get("overallAvg");
+            Object organizationAvgObj = stats.get("organizationAvg");
+            Object contentAvgObj = stats.get("contentAvg");
+            Object experienceAvgObj = stats.get("experienceAvg");
+            Object totalReviewsObj = stats.get("totalReviews");
+
+            response.setOverallAvg(overallAvgObj != null ? ((Number) overallAvgObj).doubleValue() : null);
+            response.setOrganizationAvg(organizationAvgObj != null ? ((Number) organizationAvgObj).doubleValue() : null);
+            response.setContentAvg(contentAvgObj != null ? ((Number) contentAvgObj).doubleValue() : null);
+            response.setExperienceAvg(experienceAvgObj != null ? ((Number) experienceAvgObj).doubleValue() : null);
+            response.setTotalReviews(totalReviewsObj != null ? ((Number) totalReviewsObj).intValue() : 0);
+        }
+        return response;
+    }
+}

+ 73 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/TaskParseService.java

@@ -0,0 +1,73 @@
+package com.etotem.cfc.service;
+
+import com.etotem.cfc.dto.TaskParseResult;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 解析 Dify 返回的 [TASK] 标记,提取任务参数
+ */
+@Service
+public class TaskParseService {
+
+    private static final Logger log = LoggerFactory.getLogger(TaskParseService.class);
+
+    private static final Pattern TASK_PATTERN =
+            Pattern.compile("\\[TASK:\\s*(\\{.*?\\})\\]", Pattern.DOTALL);
+
+    private final ObjectMapper objectMapper = new ObjectMapper();
+
+    /**
+     * 从 Dify answer 中解析所有 [TASK] 标记
+     * @param answer Dify 原始回复
+     * @return 解析后的任务参数列表(title 必填,不满足校验的跳过)
+     */
+    public List<TaskParseResult> parseTasks(String answer) {
+        List<TaskParseResult> results = new ArrayList<>();
+        if (answer == null || answer.isEmpty()) return results;
+
+        Matcher matcher = TASK_PATTERN.matcher(answer);
+        while (matcher.find()) {
+            String json = matcher.group(1);
+            try {
+                @SuppressWarnings("unchecked")
+                Map<String, Object> map = objectMapper.readValue(json, Map.class);
+                TaskParseResult task = new TaskParseResult();
+                task.setTitle(map.containsKey("title") ? map.get("title").toString() : null);
+                task.setDescription(map.containsKey("description") ? map.get("description").toString() : null);
+                task.setDeadline(map.containsKey("deadline") ? map.get("deadline").toString() : null);
+                task.setDimension(map.containsKey("dimension") ? map.get("dimension").toString() : null);
+                if (map.containsKey("rewardPoints")) {
+                    Object rp = map.get("rewardPoints");
+                    task.setRewardPoints(rp instanceof Number ? ((Number) rp).intValue() : null);
+                }
+                if (task.getTitle() == null || task.getTitle().isEmpty()) {
+                    log.warn("跳过无标题的 TASK 标记: {}", json);
+                    continue;
+                }
+                results.add(task);
+            } catch (Exception e) {
+                log.warn("解析 TASK 标记失败, 跳过: json={}, error={}", json, e.getMessage());
+            }
+        }
+        return results;
+    }
+
+    /**
+     * 从 Dify answer 中移除所有 [TASK] 标记
+     * @param answer Dify 原始回复
+     * @return 清洗后的回复
+     */
+    public String stripTaskMarkers(String answer) {
+        if (answer == null) return null;
+        return TASK_PATTERN.matcher(answer).replaceAll("").trim();
+    }
+}

+ 8 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/UserService.java

@@ -1481,4 +1481,12 @@ private FamilyInvitationService familyInvitationService;
         return ids;
     }
 
+    public boolean deleteUser(Long userId) {
+        User user = userMapper.selectById(userId);
+        if (user == null) {
+            return false;
+        }
+        return userMapper.deleteById(userId) > 0;
+    }
+
 }

+ 2 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/impl/DimensionScoreServiceImpl.java

@@ -20,6 +20,7 @@ import com.etotem.cfc.service.HealthDataSourceRecordService;
 import com.etotem.cfc.entity.DanAssessmentResult;
 import com.etotem.cfc.mapper.DanAssessmentResultMapper;
 import com.etotem.cfc.service.DimensionEnergySyncService;
+import org.springframework.context.annotation.Lazy;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -57,6 +58,7 @@ public class DimensionScoreServiceImpl implements DimensionScoreService {
     private DanAssessmentResultMapper danAssessmentResultMapper;
 
     @Resource
+    @Lazy
     private HealthReportService healthReportService;
 
     @Resource

+ 4 - 0
cfc-backend/src/main/resources/application.yml

@@ -93,6 +93,10 @@ math:
   verify-mode: dify  # dify | eval; dify=走Dify工作流, eval=服务端计算(兜底)
   workflow-id: ""    # Dify 数学判题工作流 ID(留空则使用 eval 兜底)
 
+upload:
+  base-dir: /data/cfc-uploads
+  allowed-types: image/jpeg,image/png,image/gif,image/webp
+
 shop:
   order:
     payment-timeout-minutes: 30  # 订单超时时间(分钟)

+ 4007 - 0
cfc-backend/src/main/resources/data/refs/501999942-某人.json

@@ -0,0 +1,4007 @@
+{
+  "文件名": "501999942-某人",
+  "格式": "triplet",
+  "总页数": 157,
+  "报告概述": {
+    "姓名": "某人",
+    "编号": "501999942",
+    "年龄": "53岁",
+    "性别": "男",
+    "肠道预测年龄": "55.52岁",
+    "肠型": "普雷沃⽒菌型",
+    "肠道菌群平衡": "38",
+    "菌群多样性": "50",
+    "有益菌": "22",
+    "有害菌": "26",
+    "核心菌属": "85",
+    "健康总分": "57",
+    "菌群健康": "76",
+    "慢病控制": "64",
+    "营养均衡": "30"
+  },
+  "疾病风险评估": [
+    {
+      "名称": "炎症性肠炎",
+      "数值": "0.24",
+      "状态": "低⻛险"
+    },
+    {
+      "名称": "结直肠癌",
+      "数值": "0.26",
+      "状态": "低⻛险"
+    },
+    {
+      "名称": "肠易激综合征",
+      "数值": "0.18",
+      "状态": "低⻛险"
+    },
+    {
+      "名称": "感染性腹泻",
+      "数值": "0.16",
+      "状态": "低⻛险"
+    },
+    {
+      "名称": "胃病",
+      "数值": "0.20",
+      "状态": "低⻛险"
+    },
+    {
+      "名称": "肝病",
+      "数值": "0.21",
+      "状态": "低⻛险"
+    },
+    {
+      "名称": "胆病",
+      "数值": "0.14",
+      "状态": "低⻛险"
+    },
+    {
+      "名称": "肾病",
+      "数值": "0.05",
+      "状态": "低⻛险"
+    },
+    {
+      "名称": "II型糖尿病",
+      "数值": "0.21",
+      "状态": "低⻛险"
+    },
+    {
+      "名称": "抑郁症",
+      "数值": "0.27",
+      "状态": "低⻛险"
+    },
+    {
+      "名称": "甲状腺疾病",
+      "数值": "0.33",
+      "状态": "注意"
+    },
+    {
+      "名称": "肺部感染或疾病",
+      "数值": "0.12",
+      "状态": "低⻛险"
+    }
+  ],
+  "主要营养评估": [
+    {
+      "名称": "碳水化合物",
+      "数值": "96",
+      "状态": "正常"
+    },
+    {
+      "名称": "蛋白质",
+      "数值": "44",
+      "状态": "正常"
+    },
+    {
+      "名称": "脂肪",
+      "数值": "71",
+      "状态": "正常"
+    },
+    {
+      "名称": "纤维素",
+      "数值": "96",
+      "状态": "正常"
+    },
+    {
+      "名称": "乳制品",
+      "数值": "36",
+      "状态": "正常"
+    }
+  ],
+  "氨基酸评估": [
+    {
+      "名称": "胱氨酸",
+      "数值": "86",
+      "状态": "正常"
+    },
+    {
+      "名称": "苯丙氨酸",
+      "数值": "1",
+      "状态": "缺乏"
+    },
+    {
+      "名称": "酪氨酸",
+      "数值": "47",
+      "状态": "正常"
+    },
+    {
+      "名称": "缬氨酸",
+      "数值": "2",
+      "状态": "缺乏"
+    },
+    {
+      "名称": "组氨酸",
+      "数值": "40",
+      "状态": "正常"
+    },
+    {
+      "名称": "丙氨酸",
+      "数值": "1",
+      "状态": "缺乏"
+    },
+    {
+      "名称": "谷氨酸",
+      "数值": "7",
+      "状态": "偏低"
+    },
+    {
+      "名称": "甘氨酸",
+      "数值": "5",
+      "状态": "缺乏"
+    },
+    {
+      "名称": "脯氨酸",
+      "数值": "1",
+      "状态": "缺乏"
+    },
+    {
+      "名称": "丝氨酸",
+      "数值": "9",
+      "状态": "偏低"
+    }
+  ],
+  "维生素评估": [
+    {
+      "名称": "维生素A",
+      "数值": "84",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素B1",
+      "数值": "2",
+      "状态": "缺乏"
+    },
+    {
+      "名称": "维生素B2",
+      "数值": "77",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素B5",
+      "数值": "64",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素B6",
+      "数值": "38",
+      "状态": "正常"
+    },
+    {
+      "名称": "叶酸",
+      "数值": "35",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素B12",
+      "数值": "25",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素C",
+      "数值": "31",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素D",
+      "数值": "93",
+      "状态": "正常"
+    }
+  ],
+  "微量元素评估": [
+    {
+      "名称": "铁",
+      "数值": "2",
+      "状态": "缺乏"
+    },
+    {
+      "名称": "锌",
+      "数值": "52",
+      "状态": "正常"
+    }
+  ],
+  "主要消化道致病菌": [
+    {
+      "致病菌": "幽⻔螺杆菌",
+      "丰度": "0%",
+      "评估": "未检出"
+    },
+    {
+      "致病菌": "艰难梭菌",
+      "丰度": "0%",
+      "评估": "未检出"
+    },
+    {
+      "致病菌": "沙⻔⽒菌",
+      "丰度": "0%",
+      "评估": "未检出"
+    },
+    {
+      "致病菌": "志贺⽒菌",
+      "丰度": "0%",
+      "评估": "未检出"
+    },
+    {
+      "致病菌": "弯曲杆菌",
+      "丰度": "0%",
+      "评估": "未检出"
+    }
+  ],
+  "抗生素风险评估": [
+    {
+      "名称": "β-内酰胺酶类",
+      "数值": "20",
+      "状态": "正常"
+    },
+    {
+      "名称": "氨基糖苷类",
+      "数值": "5",
+      "状态": "正常"
+    },
+    {
+      "名称": "大环内酯类",
+      "数值": "39",
+      "状态": "正常"
+    },
+    {
+      "名称": "呋喃类",
+      "数值": "82",
+      "状态": "正常"
+    },
+    {
+      "名称": "喹诺酮类",
+      "数值": "30",
+      "状态": "正常"
+    },
+    {
+      "名称": "磺胺类",
+      "数值": "61",
+      "状态": "正常"
+    },
+    {
+      "名称": "甲氧苄啶类",
+      "数值": "55",
+      "状态": "正常"
+    },
+    {
+      "名称": "氯霉素类",
+      "数值": "8",
+      "状态": "正常"
+    },
+    {
+      "名称": "四环素类",
+      "数值": "48",
+      "状态": "正常"
+    },
+    {
+      "名称": "β-内酰胺酶类",
+      "数值": "20",
+      "状态": "正常"
+    },
+    {
+      "名称": "氨基糖苷类",
+      "数值": "5",
+      "状态": "正常"
+    },
+    {
+      "名称": "大环内酯类",
+      "数值": "39",
+      "状态": "正常"
+    },
+    {
+      "名称": "呋喃类",
+      "数值": "82",
+      "状态": "正常"
+    },
+    {
+      "名称": "喹诺酮类",
+      "数值": "30",
+      "状态": "正常"
+    },
+    {
+      "名称": "磺胺类",
+      "数值": "61",
+      "状态": "正常"
+    },
+    {
+      "名称": "甲氧苄啶类",
+      "数值": "55",
+      "状态": "正常"
+    },
+    {
+      "名称": "氯霉素类",
+      "数值": "8",
+      "状态": "正常"
+    },
+    {
+      "名称": "四环素类",
+      "数值": "48",
+      "状态": "正常"
+    }
+  ],
+  "肠道屏障及代谢物": [
+    {
+      "名称": "肠道炎症水平",
+      "评估值": "16",
+      "健康状况": "正常",
+      "正常范围": "0-80"
+    },
+    {
+      "名称": "肠道屏障",
+      "评估值": "65",
+      "健康状况": "正常",
+      "正常范围": "15-100"
+    },
+    {
+      "名称": "脂多糖LPS",
+      "评估值": "58",
+      "健康状况": "正常",
+      "正常范围": "0-85"
+    },
+    {
+      "名称": "次级胆汁酸",
+      "评估值": "9",
+      "健康状况": "不⾜",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "对甲酚(p-Cresol)",
+      "评估值": "54",
+      "健康状况": "正常",
+      "正常范围": "0-85"
+    },
+    {
+      "名称": "吲哚",
+      "评估值": "9",
+      "健康状况": "不⾜",
+      "正常范围": "15-90"
+    },
+    {
+      "名称": "苯酚",
+      "评估值": "7",
+      "健康状况": "正常",
+      "正常范围": "0-85"
+    },
+    {
+      "名称": "腐胺",
+      "评估值": "4",
+      "健康状况": "缺乏",
+      "正常范围": "5-85"
+    },
+    {
+      "名称": "硫化氢",
+      "评估值": "8",
+      "健康状况": "正常",
+      "正常范围": "5-85"
+    }
+  ],
+  "短链脂肪酸": [
+    {
+      "名称": "丁酸盐(Butyrate)",
+      "评估值": "14",
+      "健康状况": "不⾜",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "丙酸盐(Propionate)",
+      "评估值": "71",
+      "健康状况": "正常",
+      "正常范围": "15-90"
+    },
+    {
+      "名称": "异戊酸盐(Isovaleric)",
+      "评估值": "6",
+      "健康状况": "正常",
+      "正常范围": "5-85"
+    }
+  ],
+  "神经递质及激素": [
+    {
+      "名称": "γ-氨基丁酸(GABA)",
+      "评估值": "8",
+      "健康状况": "不⾜",
+      "正常范围": "15-85"
+    },
+    {
+      "名称": "谷氨酸(Glutamate)",
+      "评估值": "7",
+      "健康状况": "不⾜",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "DOPAC",
+      "评估值": "19",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "多巴胺",
+      "评估值": "94",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "组胺(Histamine)",
+      "评估值": "67",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "喹啉(Quinolinic)",
+      "评估值": "5",
+      "健康状况": "正常",
+      "正常范围": "0-95"
+    },
+    {
+      "名称": "维生素K2",
+      "评估值": "75",
+      "健康状况": "正常",
+      "正常范围": "15-99"
+    },
+    {
+      "名称": "肌醇(Inositol)",
+      "评估值": "31",
+      "健康状况": "正常",
+      "正常范围": "15-99"
+    }
+  ],
+  "个体化食物推荐表": {
+    "格式": "vertical",
+    "条目数": 224,
+    "数据": [
+      {
+        "名称": "大麦",
+        "分类": "主食",
+        "推荐指数": "17",
+        "能量KJ": "1481",
+        "蛋白g": "12",
+        "脂肪g": "2",
+        "碳水化合物g": "73",
+        "淀粉g": "0",
+        "总膳食纤维g": "17",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小米",
+        "分类": "主食",
+        "推荐指数": "5",
+        "能量KJ": "1582",
+        "蛋白g": "11",
+        "脂肪g": "4",
+        "碳水化合物g": "72",
+        "淀粉g": "0",
+        "总膳食纤维g": "8",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小麦",
+        "分类": "主食",
+        "推荐指数": "10",
+        "能量KJ": "1423",
+        "蛋白g": "10",
+        "脂肪g": "1",
+        "碳水化合物g": "75",
+        "淀粉g": "0",
+        "总膳食纤维g": "12",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小麦面包",
+        "分类": "主食",
+        "推荐指数": "-14",
+        "能量KJ": "1116",
+        "蛋白g": "10",
+        "脂肪g": "3",
+        "碳水化合物g": "48",
+        "淀粉g": "36",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "意大利面",
+        "分类": "主食",
+        "推荐指数": "-4",
+        "能量KJ": "386",
+        "蛋白g": "1",
+        "脂肪g": "3",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "燕麦",
+        "分类": "主食",
+        "推荐指数": "35",
+        "能量KJ": "297",
+        "蛋白g": "17",
+        "脂肪g": "6",
+        "碳水化合物g": "66",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "玉米粒",
+        "分类": "主食",
+        "推荐指数": "38",
+        "能量KJ": "298",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "14",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "米饭",
+        "分类": "主食",
+        "推荐指数": "-12",
+        "能量KJ": "1527",
+        "蛋白g": "7",
+        "脂肪g": "0",
+        "碳水化合物g": "79",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "玉米饼",
+        "分类": "主食",
+        "推荐指数": "7",
+        "能量KJ": "912",
+        "蛋白g": "5",
+        "脂肪g": "2",
+        "碳水化合物g": "44",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "荞麦面粉",
+        "分类": "主食",
+        "推荐指数": "0",
+        "能量KJ": "1402",
+        "蛋白g": "12",
+        "脂肪g": "3",
+        "碳水化合物g": "70",
+        "淀粉g": "0",
+        "总膳食纤维g": "10",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葡萄干浆即食谷物",
+        "分类": "主食",
+        "推荐指数": "0",
+        "能量KJ": "1354",
+        "蛋白g": "7",
+        "脂肪g": "1",
+        "碳水化合物g": "78",
+        "淀粉g": "0",
+        "总膳食纤维g": "13",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "面条",
+        "分类": "主食",
+        "推荐指数": "-10",
+        "能量KJ": "1609",
+        "蛋白g": "14",
+        "脂肪g": "4",
+        "碳水化合物g": "71",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "84"
+      },
+      {
+        "名称": "鸡蛋面包",
+        "分类": "主食",
+        "推荐指数": "-11",
+        "能量KJ": "1201",
+        "蛋白g": "9",
+        "脂肪g": "6",
+        "碳水化合物g": "47",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "51"
+      },
+      {
+        "名称": "黑麦面包",
+        "分类": "主食",
+        "推荐指数": "-6",
+        "能量KJ": "1188",
+        "蛋白g": "9",
+        "脂肪g": "3",
+        "碳水化合物g": "53",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "冰淇淋",
+        "分类": "乳制品",
+        "推荐指数": "-11",
+        "能量KJ": "690",
+        "蛋白g": "1",
+        "脂肪g": "3",
+        "碳水化合物g": "32",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "8"
+      },
+      {
+        "名称": "奶油",
+        "分类": "乳制品",
+        "推荐指数": "-20",
+        "能量KJ": "515",
+        "蛋白g": "3",
+        "脂肪g": "10",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "35"
+      },
+      {
+        "名称": "奶酪",
+        "分类": "乳制品",
+        "推荐指数": "-8",
+        "能量KJ": "1552",
+        "蛋白g": "23",
+        "脂肪g": "29",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "94"
+      },
+      {
+        "名称": "牛奶",
+        "分类": "乳制品",
+        "推荐指数": "9",
+        "能量KJ": "268",
+        "蛋白g": "3",
+        "脂肪g": "3",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "14"
+      },
+      {
+        "名称": "脱脂牛奶",
+        "分类": "乳制品",
+        "推荐指数": "15",
+        "能量KJ": "142",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "2"
+      },
+      {
+        "名称": "黄油",
+        "分类": "乳制品",
+        "推荐指数": "-48",
+        "能量KJ": "2999",
+        "蛋白g": "0",
+        "脂肪g": "81",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "215"
+      },
+      {
+        "名称": "山核桃",
+        "分类": "干果",
+        "推荐指数": "-15",
+        "能量KJ": "2889",
+        "蛋白g": "9",
+        "脂肪g": "71",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "9",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "山核桃干",
+        "分类": "干果",
+        "推荐指数": "-5",
+        "能量KJ": "2749",
+        "蛋白g": "12",
+        "脂肪g": "64",
+        "碳水化合物g": "18",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "杏仁",
+        "分类": "干果",
+        "推荐指数": "-3",
+        "能量KJ": "2423",
+        "蛋白g": "21",
+        "脂肪g": "49",
+        "碳水化合物g": "21",
+        "淀粉g": "0",
+        "总膳食纤维g": "12",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "开心果",
+        "分类": "干果",
+        "推荐指数": "-13",
+        "能量KJ": "2392",
+        "蛋白g": "21",
+        "脂肪g": "45",
+        "碳水化合物g": "28",
+        "淀粉g": "1",
+        "总膳食纤维g": "10",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "松子",
+        "分类": "干果",
+        "推荐指数": "-17",
+        "能量KJ": "2816",
+        "蛋白g": "13",
+        "脂肪g": "68",
+        "碳水化合物g": "13",
+        "淀粉g": "1",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "栗子",
+        "分类": "干果",
+        "推荐指数": "37",
+        "能量KJ": "1519",
+        "蛋白g": "6",
+        "脂肪g": "1",
+        "碳水化合物g": "79",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "核桃",
+        "分类": "干果",
+        "推荐指数": "-10",
+        "能量KJ": "2738",
+        "蛋白g": "15",
+        "脂肪g": "65",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "椰肉",
+        "分类": "干果",
+        "推荐指数": "0",
+        "能量KJ": "1481",
+        "蛋白g": "3",
+        "脂肪g": "33",
+        "碳水化合物g": "15",
+        "淀粉g": "0",
+        "总膳食纤维g": "9",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "榛子",
+        "分类": "干果",
+        "推荐指数": "40",
+        "能量KJ": "2629",
+        "蛋白g": "14",
+        "脂肪g": "60",
+        "碳水化合物g": "16",
+        "淀粉g": "0",
+        "总膳食纤维g": "9",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橡子",
+        "分类": "干果",
+        "推荐指数": "36",
+        "能量KJ": "1619",
+        "蛋白g": "6",
+        "脂肪g": "23",
+        "碳水化合物g": "40",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "腰果",
+        "分类": "干果",
+        "推荐指数": "-9",
+        "能量KJ": "2402",
+        "蛋白g": "15",
+        "脂肪g": "46",
+        "碳水化合物g": "32",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芝麻酱",
+        "分类": "干果",
+        "推荐指数": "3",
+        "能量KJ": "2454",
+        "蛋白g": "18",
+        "脂肪g": "50",
+        "碳水化合物g": "24",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "莲子",
+        "分类": "干果",
+        "推荐指数": "53",
+        "能量KJ": "372",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葵花子",
+        "分类": "干果",
+        "推荐指数": "-1",
+        "能量KJ": "2445",
+        "蛋白g": "20",
+        "脂肪g": "51",
+        "碳水化合物g": "20",
+        "淀粉g": "0",
+        "总膳食纤维g": "8",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "银杏坚果",
+        "分类": "干果",
+        "推荐指数": "-8",
+        "能量KJ": "1456",
+        "蛋白g": "10",
+        "脂肪g": "2",
+        "碳水化合物g": "72",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "氏萨",
+        "分类": "快餐",
+        "推荐指数": "-12",
+        "能量KJ": "1121",
+        "蛋白g": "10",
+        "脂肪g": "12",
+        "碳水化合物g": "29",
+        "淀粉g": "18",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "14"
+      },
+      {
+        "名称": "热狗",
+        "分类": "快餐",
+        "推荐指数": "-17",
+        "能量KJ": "1167",
+        "蛋白g": "9",
+        "脂肪g": "3",
+        "碳水化合物g": "50",
+        "淀粉g": "36",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "鸡米花",
+        "分类": "快餐",
+        "推荐指数": "-20",
+        "能量KJ": "1469",
+        "蛋白g": "17",
+        "脂肪g": "21",
+        "碳水化合物g": "21",
+        "淀粉g": "18",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "40"
+      },
+      {
+        "名称": "三文鱼",
+        "分类": "水产品",
+        "推荐指数": "16",
+        "能量KJ": "594",
+        "蛋白g": "19",
+        "脂肪g": "6",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "55"
+      },
+      {
+        "名称": "凤尾鱼",
+        "分类": "水产品",
+        "推荐指数": "15",
+        "能量KJ": "548",
+        "蛋白g": "20",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "60"
+      },
+      {
+        "名称": "墨鱼",
+        "分类": "水产品",
+        "推荐指数": "8",
+        "能量KJ": "331",
+        "蛋白g": "16",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "112"
+      },
+      {
+        "名称": "大氏目鱼",
+        "分类": "水产品",
+        "推荐指数": "15",
+        "能量KJ": "382",
+        "蛋白g": "18",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "49"
+      },
+      {
+        "名称": "大西洋鳕鱼",
+        "分类": "水产品",
+        "推荐指数": "0",
+        "能量KJ": "343",
+        "蛋白g": "17",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "43"
+      },
+      {
+        "名称": "小龙虾",
+        "分类": "水产品",
+        "推荐指数": "13",
+        "能量KJ": "322",
+        "蛋白g": "15",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "114"
+      },
+      {
+        "名称": "扇贝",
+        "分类": "水产品",
+        "推荐指数": "0",
+        "能量KJ": "289",
+        "蛋白g": "12",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "2",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "24"
+      },
+      {
+        "名称": "条纹鲈鱼",
+        "分类": "水产品",
+        "推荐指数": "18",
+        "能量KJ": "406",
+        "蛋白g": "17",
+        "脂肪g": "2",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "80"
+      },
+      {
+        "名称": "海鲈鱼",
+        "分类": "水产品",
+        "推荐指数": "5",
+        "能量KJ": "332",
+        "蛋白g": "15",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "52"
+      },
+      {
+        "名称": "牡蛎",
+        "分类": "水产品",
+        "推荐指数": "14",
+        "能量KJ": "339",
+        "蛋白g": "9",
+        "脂肪g": "2",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "50"
+      },
+      {
+        "名称": "白鲑",
+        "分类": "水产品",
+        "推荐指数": "10",
+        "能量KJ": "611",
+        "蛋白g": "17",
+        "脂肪g": "8",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "65"
+      },
+      {
+        "名称": "石斑鱼",
+        "分类": "水产品",
+        "推荐指数": "23",
+        "能量KJ": "385",
+        "蛋白g": "19",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "37"
+      },
+      {
+        "名称": "章鱼",
+        "分类": "水产品",
+        "推荐指数": "11",
+        "能量KJ": "343",
+        "蛋白g": "14",
+        "脂肪g": "1",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "48"
+      },
+      {
+        "名称": "虾",
+        "分类": "水产品",
+        "推荐指数": "-2",
+        "能量KJ": "297",
+        "蛋白g": "13",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "126"
+      },
+      {
+        "名称": "蛤蜊",
+        "分类": "水产品",
+        "推荐指数": "0",
+        "能量KJ": "360",
+        "蛋白g": "14",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "1",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "30"
+      },
+      {
+        "名称": "蟹",
+        "分类": "水产品",
+        "推荐指数": "13",
+        "能量KJ": "364",
+        "蛋白g": "18",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "78"
+      },
+      {
+        "名称": "贻贝",
+        "分类": "水产品",
+        "推荐指数": "4",
+        "能量KJ": "360",
+        "蛋白g": "11",
+        "脂肪g": "2",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "28"
+      },
+      {
+        "名称": "金枪鱼",
+        "分类": "水产品",
+        "推荐指数": "15",
+        "能量KJ": "602",
+        "蛋白g": "23",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "38"
+      },
+      {
+        "名称": "鱼子酱",
+        "分类": "水产品",
+        "推荐指数": "-19",
+        "能量KJ": "1105",
+        "蛋白g": "24",
+        "脂肪g": "17",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "588"
+      },
+      {
+        "名称": "鱿鱼",
+        "分类": "水产品",
+        "推荐指数": "9",
+        "能量KJ": "385",
+        "蛋白g": "15",
+        "脂肪g": "1",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "233"
+      },
+      {
+        "名称": "鲈鱼",
+        "分类": "水产品",
+        "推荐指数": "16",
+        "能量KJ": "381",
+        "蛋白g": "19",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "90"
+      },
+      {
+        "名称": "鲍鱼",
+        "分类": "水产品",
+        "推荐指数": "5",
+        "能量KJ": "439",
+        "蛋白g": "17",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "85"
+      },
+      {
+        "名称": "鲟鱼",
+        "分类": "水产品",
+        "推荐指数": "12",
+        "能量KJ": "439",
+        "蛋白g": "16",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "60"
+      },
+      {
+        "名称": "鲤鱼",
+        "分类": "水产品",
+        "推荐指数": "11",
+        "能量KJ": "531",
+        "蛋白g": "17",
+        "脂肪g": "5",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "66"
+      },
+      {
+        "名称": "鲭鱼",
+        "分类": "水产品",
+        "推荐指数": "4",
+        "能量KJ": "858",
+        "蛋白g": "18",
+        "脂肪g": "13",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "70"
+      },
+      {
+        "名称": "鲱鱼",
+        "分类": "水产品",
+        "推荐指数": "2",
+        "能量KJ": "661",
+        "蛋白g": "17",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "60"
+      },
+      {
+        "名称": "鲶鱼",
+        "分类": "水产品",
+        "推荐指数": "17",
+        "能量KJ": "519",
+        "蛋白g": "20",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "59"
+      },
+      {
+        "名称": "鲷鱼",
+        "分类": "水产品",
+        "推荐指数": "17",
+        "能量KJ": "418",
+        "蛋白g": "20",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "37"
+      },
+      {
+        "名称": "鲽鱼",
+        "分类": "水产品",
+        "推荐指数": "3",
+        "能量KJ": "294",
+        "蛋白g": "12",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "45"
+      },
+      {
+        "名称": "鳕鱼",
+        "分类": "水产品",
+        "推荐指数": "16",
+        "能量KJ": "364",
+        "蛋白g": "18",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "41"
+      },
+      {
+        "名称": "鳗鱼",
+        "分类": "水产品",
+        "推荐指数": "5",
+        "能量KJ": "770",
+        "蛋白g": "18",
+        "脂肪g": "11",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "126"
+      },
+      {
+        "名称": "鳟鱼",
+        "分类": "水产品",
+        "推荐指数": "11",
+        "能量KJ": "619",
+        "蛋白g": "20",
+        "脂肪g": "6",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "58"
+      },
+      {
+        "名称": "沙丁鱼",
+        "分类": "水产品",
+        "推荐指数": "19",
+        "能量KJ": "347",
+        "蛋白g": "0",
+        "脂肪g": "1",
+        "碳水化合物g": "19",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "黄尾",
+        "分类": "水产品",
+        "推荐指数": "17",
+        "能量KJ": "611",
+        "蛋白g": "23",
+        "脂肪g": "5",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "55"
+      },
+      {
+        "名称": "龙虾",
+        "分类": "水产品",
+        "推荐指数": "3",
+        "能量KJ": "324",
+        "蛋白g": "16",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "127"
+      },
+      {
+        "名称": "无花果",
+        "分类": "水果",
+        "推荐指数": "15",
+        "能量KJ": "310",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "19",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "李子",
+        "分类": "水果",
+        "推荐指数": "13",
+        "能量KJ": "192",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "杏",
+        "分类": "水果",
+        "推荐指数": "2",
+        "能量KJ": "201",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "杨桃",
+        "分类": "水果",
+        "推荐指数": "57",
+        "能量KJ": "128",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "枣",
+        "分类": "水果",
+        "推荐指数": "-6",
+        "能量KJ": "1176",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "72",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "柠檬",
+        "分类": "水果",
+        "推荐指数": "58",
+        "能量KJ": "121",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "柿子",
+        "分类": "水果",
+        "推荐指数": "16",
+        "能量KJ": "293",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "18",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "桃",
+        "分类": "水果",
+        "推荐指数": "3",
+        "能量KJ": "165",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "桑葚",
+        "分类": "水果",
+        "推荐指数": "50",
+        "能量KJ": "180",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "梨",
+        "分类": "水果",
+        "推荐指数": "55",
+        "能量KJ": "239",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "15",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "榴莲",
+        "分类": "水果",
+        "推荐指数": "43",
+        "能量KJ": "615",
+        "蛋白g": "1",
+        "脂肪g": "5",
+        "碳水化合物g": "27",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "樱桃",
+        "分类": "水果",
+        "推荐指数": "20",
+        "能量KJ": "1395",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "80",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "哈密瓜",
+        "分类": "水果",
+        "推荐指数": "6",
+        "能量KJ": "141",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "8",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橘子",
+        "分类": "水果",
+        "推荐指数": "1",
+        "能量KJ": "197",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橙汁",
+        "分类": "水果",
+        "推荐指数": "47",
+        "能量KJ": "188",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "10",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橙皮",
+        "分类": "水果",
+        "推荐指数": "38",
+        "能量KJ": "405",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "25",
+        "淀粉g": "0",
+        "总膳食纤维g": "10",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橙菠萝汁",
+        "分类": "水果",
+        "推荐指数": "14",
+        "能量KJ": "214",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "12",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "油桃",
+        "分类": "水果",
+        "推荐指数": "3",
+        "能量KJ": "185",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "10",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "猕猴桃",
+        "分类": "水果",
+        "推荐指数": "32",
+        "能量KJ": "255",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜瓜",
+        "分类": "水果",
+        "推荐指数": "-4",
+        "能量KJ": "150",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "番木瓜",
+        "分类": "水果",
+        "推荐指数": "32",
+        "能量KJ": "179",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "10",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "石榴",
+        "分类": "水果",
+        "推荐指数": "46",
+        "能量KJ": "346",
+        "蛋白g": "1",
+        "脂肪g": "1",
+        "碳水化合物g": "18",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "红苹果",
+        "分类": "水果",
+        "推荐指数": "13",
+        "能量KJ": "247",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芒果",
+        "分类": "水果",
+        "推荐指数": "-11",
+        "能量KJ": "250",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "苹果",
+        "分类": "水果",
+        "推荐指数": "14",
+        "能量KJ": "218",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "苹果汁",
+        "分类": "水果",
+        "推荐指数": "-19",
+        "能量KJ": "191",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "草莓",
+        "分类": "水果",
+        "推荐指数": "37",
+        "能量KJ": "136",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "荔枝",
+        "分类": "水果",
+        "推荐指数": "25",
+        "能量KJ": "276",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "16",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菠萝",
+        "分类": "水果",
+        "推荐指数": "1",
+        "能量KJ": "209",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菠萝蜜",
+        "分类": "水果",
+        "推荐指数": "14",
+        "能量KJ": "397",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "23",
+        "淀粉g": "1",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葡萄",
+        "分类": "水果",
+        "推荐指数": "40",
+        "能量KJ": "280",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葡萄干",
+        "分类": "水果",
+        "推荐指数": "-38",
+        "能量KJ": "264",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "15",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葡萄柚",
+        "分类": "水果",
+        "推荐指数": "54",
+        "能量KJ": "134",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "8",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蓝莓",
+        "分类": "水果",
+        "推荐指数": "40",
+        "能量KJ": "240",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蔓越莓",
+        "分类": "水果",
+        "推荐指数": "33",
+        "能量KJ": "191",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "西瓜",
+        "分类": "水果",
+        "推荐指数": "19",
+        "能量KJ": "127",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "覆盆子",
+        "分类": "水果",
+        "推荐指数": "42",
+        "能量KJ": "220",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "面包果酱",
+        "分类": "水果",
+        "推荐指数": "15",
+        "能量KJ": "431",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "27",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "香蕉",
+        "分类": "水果",
+        "推荐指数": "10",
+        "能量KJ": "371",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "22",
+        "淀粉g": "5",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "鳄梨",
+        "分类": "水果",
+        "推荐指数": "37",
+        "能量KJ": "670",
+        "蛋白g": "2",
+        "脂肪g": "14",
+        "碳水化合物g": "8",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "黑莓",
+        "分类": "水果",
+        "推荐指数": "61",
+        "能量KJ": "181",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "龙眼",
+        "分类": "水果",
+        "推荐指数": "55",
+        "能量KJ": "251",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "15",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "番茄汤",
+        "分类": "汤",
+        "推荐指数": "8",
+        "能量KJ": "165",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "土豆蔬菜汤",
+        "分类": "汤",
+        "推荐指数": "-5",
+        "能量KJ": "126",
+        "蛋白g": "1",
+        "脂肪g": "1",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "1"
+      },
+      {
+        "名称": "素食蔬菜汤",
+        "分类": "汤",
+        "推荐指数": "-5",
+        "能量KJ": "119",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "火腿",
+        "分类": "肉类",
+        "推荐指数": "-11",
+        "能量KJ": "683",
+        "蛋白g": "16",
+        "脂肪g": "8",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "57"
+      },
+      {
+        "名称": "火鸡",
+        "分类": "肉类",
+        "推荐指数": "4",
+        "能量KJ": "790",
+        "蛋白g": "28",
+        "脂肪g": "7",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "109"
+      },
+      {
+        "名称": "烟熏火腿",
+        "分类": "肉类",
+        "推荐指数": "-14",
+        "能量KJ": "591",
+        "蛋白g": "18",
+        "脂肪g": "2",
+        "碳水化合物g": "10",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "50"
+      },
+      {
+        "名称": "烤肉",
+        "分类": "肉类",
+        "推荐指数": "-11",
+        "能量KJ": "1512",
+        "蛋白g": "20",
+        "脂肪g": "30",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "105"
+      },
+      {
+        "名称": "烤鸭",
+        "分类": "肉类",
+        "推荐指数": "-6",
+        "能量KJ": "1410",
+        "蛋白g": "18",
+        "脂肪g": "28",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "84"
+      },
+      {
+        "名称": "烧鹅",
+        "分类": "肉类",
+        "推荐指数": "0",
+        "能量KJ": "1276",
+        "蛋白g": "25",
+        "脂肪g": "21",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "91"
+      },
+      {
+        "名称": "牛肉汤",
+        "分类": "肉类",
+        "推荐指数": "-2",
+        "能量KJ": "25",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "牛肉瘦",
+        "分类": "肉类",
+        "推荐指数": "7",
+        "能量KJ": "488",
+        "蛋白g": "23",
+        "脂肪g": "2",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "55"
+      },
+      {
+        "名称": "牛肉肥",
+        "分类": "肉类",
+        "推荐指数": "-29",
+        "能量KJ": "2845",
+        "蛋白g": "10",
+        "脂肪g": "70",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "95"
+      },
+      {
+        "名称": "牛蛙",
+        "分类": "肉类",
+        "推荐指数": "12",
+        "能量KJ": "305",
+        "蛋白g": "16",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "50"
+      },
+      {
+        "名称": "猪培根",
+        "分类": "肉类",
+        "推荐指数": "-28",
+        "能量KJ": "1744",
+        "蛋白g": "12",
+        "脂肪g": "39",
+        "碳水化合物g": "1",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "66"
+      },
+      {
+        "名称": "猪头肉",
+        "分类": "肉类",
+        "推荐指数": "-18",
+        "能量KJ": "658",
+        "蛋白g": "13",
+        "脂肪g": "10",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "69"
+      },
+      {
+        "名称": "猪瘦肉",
+        "分类": "肉类",
+        "推荐指数": "11",
+        "能量KJ": "562",
+        "蛋白g": "21",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "64"
+      },
+      {
+        "名称": "猪耳朵",
+        "分类": "肉类",
+        "推荐指数": "1",
+        "能量KJ": "695",
+        "蛋白g": "15",
+        "脂肪g": "10",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "90"
+      },
+      {
+        "名称": "猪肝",
+        "分类": "肉类",
+        "推荐指数": "14",
+        "能量KJ": "690",
+        "蛋白g": "26",
+        "脂肪g": "4",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "355"
+      },
+      {
+        "名称": "猪脑",
+        "分类": "肉类",
+        "推荐指数": "-21",
+        "能量KJ": "577",
+        "蛋白g": "12",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "2552"
+      },
+      {
+        "名称": "猪蹄",
+        "分类": "肉类",
+        "推荐指数": "1",
+        "能量KJ": "889",
+        "蛋白g": "23",
+        "脂肪g": "12",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "88"
+      },
+      {
+        "名称": "瘦羊肉",
+        "分类": "肉类",
+        "推荐指数": "12",
+        "能量KJ": "862",
+        "蛋白g": "28",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "92"
+      },
+      {
+        "名称": "肉丸",
+        "分类": "肉类",
+        "推荐指数": "-25",
+        "能量KJ": "1196",
+        "蛋白g": "14",
+        "脂肪g": "22",
+        "碳水化合物g": "8",
+        "淀粉g": "2",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "66"
+      },
+      {
+        "名称": "肥猪肉",
+        "分类": "肉类",
+        "推荐指数": "-34",
+        "能量KJ": "2449",
+        "蛋白g": "10",
+        "脂肪g": "60",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "81"
+      },
+      {
+        "名称": "肥羊肉",
+        "分类": "肉类",
+        "推荐指数": "-32",
+        "能量KJ": "2782",
+        "蛋白g": "6",
+        "脂肪g": "70",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "90"
+      },
+      {
+        "名称": "鸡心",
+        "分类": "肉类",
+        "推荐指数": "9",
+        "能量KJ": "640",
+        "蛋白g": "15",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "136"
+      },
+      {
+        "名称": "鸡汤",
+        "分类": "肉类",
+        "推荐指数": "-8",
+        "能量KJ": "26",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "2"
+      },
+      {
+        "名称": "鸡肉",
+        "分类": "肉类",
+        "推荐指数": "-2",
+        "能量KJ": "604",
+        "蛋白g": "28",
+        "脂肪g": "3",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "86"
+      },
+      {
+        "名称": "鸡肝",
+        "分类": "肉类",
+        "推荐指数": "2",
+        "能量KJ": "496",
+        "蛋白g": "16",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "345"
+      },
+      {
+        "名称": "鹅肝",
+        "分类": "肉类",
+        "推荐指数": "9",
+        "能量KJ": "556",
+        "蛋白g": "16",
+        "脂肪g": "4",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "515"
+      },
+      {
+        "名称": "鹌鹑",
+        "分类": "肉类",
+        "推荐指数": "8",
+        "能量KJ": "803",
+        "蛋白g": "19",
+        "脂肪g": "12",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "76"
+      },
+      {
+        "名称": "南瓜",
+        "分类": "蔬菜",
+        "推荐指数": "66",
+        "能量KJ": "109",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "卷心菜",
+        "分类": "蔬菜",
+        "推荐指数": "51",
+        "能量KJ": "103",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "四季豆",
+        "分类": "蔬菜",
+        "推荐指数": "68",
+        "能量KJ": "131",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "土豆",
+        "分类": "蔬菜",
+        "推荐指数": "57",
+        "能量KJ": "322",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "淀粉g": "15",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "土豆面粉",
+        "分类": "蔬菜",
+        "推荐指数": "48",
+        "能量KJ": "1493",
+        "蛋白g": "6",
+        "脂肪g": "0",
+        "碳水化合物g": "83",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "大白菜",
+        "分类": "蔬菜",
+        "推荐指数": "75",
+        "能量KJ": "55",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "大蒜",
+        "分类": "蔬菜",
+        "推荐指数": "47",
+        "能量KJ": "623",
+        "蛋白g": "6",
+        "脂肪g": "0",
+        "碳水化合物g": "33",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "大豆",
+        "分类": "蔬菜",
+        "推荐指数": "72",
+        "能量KJ": "614",
+        "蛋白g": "12",
+        "脂肪g": "6",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小南瓜",
+        "分类": "蔬菜",
+        "推荐指数": "0",
+        "能量KJ": "69",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小萝卜",
+        "分类": "蔬菜",
+        "推荐指数": "74",
+        "能量KJ": "76",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "山药",
+        "分类": "蔬菜",
+        "推荐指数": "56",
+        "能量KJ": "343",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "20",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "扁豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "55",
+        "能量KJ": "1473",
+        "蛋白g": "24",
+        "脂肪g": "1",
+        "碳水化合物g": "63",
+        "淀粉g": "49",
+        "总膳食纤维g": "10",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "木薯",
+        "分类": "蔬菜",
+        "推荐指数": "36",
+        "能量KJ": "667",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "38",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "洋葱",
+        "分类": "蔬菜",
+        "推荐指数": "45",
+        "能量KJ": "166",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "炒蘑菇",
+        "分类": "蔬菜",
+        "推荐指数": "24",
+        "能量KJ": "110",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "炒香菇",
+        "分类": "蔬菜",
+        "推荐指数": "17",
+        "能量KJ": "162",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "牛蒡根",
+        "分类": "蔬菜",
+        "推荐指数": "78",
+        "能量KJ": "302",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甘薯",
+        "分类": "蔬菜",
+        "推荐指数": "35",
+        "能量KJ": "359",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "20",
+        "淀粉g": "12",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜椒",
+        "分类": "蔬菜",
+        "推荐指数": "65",
+        "能量KJ": "84",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜玉米",
+        "分类": "蔬菜",
+        "推荐指数": "42",
+        "能量KJ": "360",
+        "蛋白g": "3",
+        "脂肪g": "1",
+        "碳水化合物g": "18",
+        "淀粉g": "5",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜菜",
+        "分类": "蔬菜",
+        "推荐指数": "67",
+        "能量KJ": "180",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜菜叶",
+        "分类": "蔬菜",
+        "推荐指数": "68",
+        "能量KJ": "92",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "生姜",
+        "分类": "蔬菜",
+        "推荐指数": "86",
+        "能量KJ": "75",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "生菜",
+        "分类": "蔬菜",
+        "推荐指数": "68",
+        "能量KJ": "62",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "番茄汁",
+        "分类": "蔬菜",
+        "推荐指数": "0",
+        "能量KJ": "72",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "白菜",
+        "分类": "蔬菜",
+        "推荐指数": "59",
+        "能量KJ": "48",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "1",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "白萝卜",
+        "分类": "蔬菜",
+        "推荐指数": "81",
+        "能量KJ": "59",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "白蘑菇",
+        "分类": "蔬菜",
+        "推荐指数": "63",
+        "能量KJ": "93",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "秋葵",
+        "分类": "蔬菜",
+        "推荐指数": "62",
+        "能量KJ": "138",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "竹笋",
+        "分类": "蔬菜",
+        "推荐指数": "81",
+        "能量KJ": "115",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "红心萝卜",
+        "分类": "蔬菜",
+        "推荐指数": "76",
+        "能量KJ": "132",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "红豆",
+        "分类": "蔬菜",
+        "推荐指数": "38",
+        "能量KJ": "121",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "绿豆",
+        "分类": "蔬菜",
+        "推荐指数": "35",
+        "能量KJ": "126",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "羽衣甘蓝",
+        "分类": "蔬菜",
+        "推荐指数": "80",
+        "能量KJ": "207",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "8",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "胡萝卜",
+        "分类": "蔬菜",
+        "推荐指数": "33",
+        "能量KJ": "173",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "1",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芋头",
+        "分类": "蔬菜",
+        "推荐指数": "62",
+        "能量KJ": "469",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "26",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芝麻",
+        "分类": "蔬菜",
+        "推荐指数": "57",
+        "能量KJ": "2397",
+        "蛋白g": "17",
+        "脂肪g": "49",
+        "碳水化合物g": "23",
+        "淀粉g": "0",
+        "总膳食纤维g": "11",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芥末",
+        "分类": "蔬菜",
+        "推荐指数": "83",
+        "能量KJ": "114",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芦笋",
+        "分类": "蔬菜",
+        "推荐指数": "71",
+        "能量KJ": "85",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "花椒",
+        "分类": "蔬菜",
+        "推荐指数": "77",
+        "能量KJ": "80",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "花椰菜",
+        "分类": "蔬菜",
+        "推荐指数": "63",
+        "能量KJ": "104",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芹菜",
+        "分类": "蔬菜",
+        "推荐指数": "60",
+        "能量KJ": "67",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "苦瓜",
+        "分类": "蔬菜",
+        "推荐指数": "72",
+        "能量KJ": "126",
+        "蛋白g": "5",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "茄子",
+        "分类": "蔬菜",
+        "推荐指数": "59",
+        "能量KJ": "104",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "苋菜叶",
+        "分类": "蔬菜",
+        "推荐指数": "50",
+        "能量KJ": "97",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菊苣",
+        "分类": "蔬菜",
+        "推荐指数": "83",
+        "能量KJ": "71",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菜豆",
+        "分类": "蔬菜",
+        "推荐指数": "70",
+        "能量KJ": "280",
+        "蛋白g": "6",
+        "脂肪g": "0",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菠菜",
+        "分类": "蔬菜",
+        "推荐指数": "68",
+        "能量KJ": "97",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蕨类",
+        "分类": "蔬菜",
+        "推荐指数": "80",
+        "能量KJ": "143",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "藜",
+        "分类": "蔬菜",
+        "推荐指数": "83",
+        "能量KJ": "180",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蘑菇",
+        "分类": "蔬菜",
+        "推荐指数": "64",
+        "能量KJ": "141",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "西兰花",
+        "分类": "蔬菜",
+        "推荐指数": "74",
+        "能量KJ": "141",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "西红柿",
+        "分类": "蔬菜",
+        "推荐指数": "74",
+        "能量KJ": "74",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "豆芽",
+        "分类": "蔬菜",
+        "推荐指数": "69",
+        "能量KJ": "510",
+        "蛋白g": "13",
+        "脂肪g": "6",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "豇豆",
+        "分类": "蔬菜",
+        "推荐指数": "73",
+        "能量KJ": "376",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "18",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "豌豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "72",
+        "能量KJ": "1435",
+        "蛋白g": "21",
+        "脂肪g": "1",
+        "碳水化合物g": "62",
+        "淀粉g": "0",
+        "总膳食纤维g": "15",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "辣椒",
+        "分类": "蔬菜",
+        "推荐指数": "35",
+        "能量KJ": "88",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "韭菜",
+        "分类": "蔬菜",
+        "推荐指数": "47",
+        "能量KJ": "126",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "香菇",
+        "分类": "蔬菜",
+        "推荐指数": "63",
+        "能量KJ": "160",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "黄瓜",
+        "分类": "蔬菜",
+        "推荐指数": "61",
+        "能量KJ": "65",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "水煮蛋",
+        "分类": "蛋类",
+        "推荐指数": "-13",
+        "能量KJ": "597",
+        "蛋白g": "12",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "370"
+      },
+      {
+        "名称": "炒蛋",
+        "分类": "蛋类",
+        "推荐指数": "-22",
+        "能量KJ": "621",
+        "蛋白g": "9",
+        "脂肪g": "10",
+        "碳水化合物g": "1",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "277"
+      },
+      {
+        "名称": "煎蛋",
+        "分类": "蛋类",
+        "推荐指数": "-24",
+        "能量KJ": "643",
+        "蛋白g": "10",
+        "脂肪g": "11",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "313"
+      },
+      {
+        "名称": "鸡蛋",
+        "分类": "蛋类",
+        "推荐指数": "-12",
+        "能量KJ": "599",
+        "蛋白g": "12",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "372"
+      },
+      {
+        "名称": "鸡蛋白",
+        "分类": "蛋类",
+        "推荐指数": "10",
+        "能量KJ": "216",
+        "蛋白g": "10",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "鸡蛋黄",
+        "分类": "蛋类",
+        "推荐指数": "-26",
+        "能量KJ": "1346",
+        "蛋白g": "15",
+        "脂肪g": "26",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "1085"
+      },
+      {
+        "名称": "鹌鹑蛋",
+        "分类": "蛋类",
+        "推荐指数": "-14",
+        "能量KJ": "663",
+        "蛋白g": "13",
+        "脂肪g": "11",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "844"
+      },
+      {
+        "名称": "利马豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "21",
+        "能量KJ": "1414",
+        "蛋白g": "21",
+        "脂肪g": "0",
+        "碳水化合物g": "63",
+        "淀粉g": "0",
+        "总膳食纤维g": "19",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "大豆面粉",
+        "分类": "豆类及豆制品",
+        "推荐指数": "11",
+        "能量KJ": "1816",
+        "蛋白g": "37",
+        "脂肪g": "20",
+        "碳水化合物g": "31",
+        "淀粉g": "0",
+        "总膳食纤维g": "9",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "嫩豆腐",
+        "分类": "豆类及豆制品",
+        "推荐指数": "18",
+        "能量KJ": "253",
+        "蛋白g": "7",
+        "脂肪g": "3",
+        "碳水化合物g": "1",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "纳豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "16",
+        "能量KJ": "883",
+        "蛋白g": "19",
+        "脂肪g": "11",
+        "碳水化合物g": "12",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "羽扇豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "26",
+        "能量KJ": "1554",
+        "蛋白g": "36",
+        "脂肪g": "9",
+        "碳水化合物g": "40",
+        "淀粉g": "0",
+        "总膳食纤维g": "18",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "老豆腐",
+        "分类": "豆类及豆制品",
+        "推荐指数": "19",
+        "能量KJ": "326",
+        "蛋白g": "9",
+        "脂肪g": "4",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "花生",
+        "分类": "豆类及豆制品",
+        "推荐指数": "4",
+        "能量KJ": "2374",
+        "蛋白g": "25",
+        "脂肪g": "49",
+        "碳水化合物g": "16",
+        "淀粉g": "0",
+        "总膳食纤维g": "8",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "花生酱",
+        "分类": "豆类及豆制品",
+        "推荐指数": "-14",
+        "能量KJ": "2464",
+        "蛋白g": "24",
+        "脂肪g": "49",
+        "碳水化合物g": "21",
+        "淀粉g": "4",
+        "总膳食纤维g": "8",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蚕豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "25",
+        "能量KJ": "1425",
+        "蛋白g": "26",
+        "脂肪g": "1",
+        "碳水化合物g": "58",
+        "淀粉g": "0",
+        "总膳食纤维g": "25",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "豆浆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "19",
+        "能量KJ": "226",
+        "蛋白g": "3",
+        "脂肪g": "1",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "鹰嘴豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "12",
+        "能量KJ": "1581",
+        "蛋白g": "20",
+        "脂肪g": "6",
+        "碳水化合物g": "62",
+        "淀粉g": "0",
+        "总膳食纤维g": "12",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "黄豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "27",
+        "能量KJ": "1443",
+        "蛋白g": "22",
+        "脂肪g": "2",
+        "碳水化合物g": "60",
+        "淀粉g": "0",
+        "总膳食纤维g": "25",
+        "胆固醇mg": "0"
+      }
+    ]
+  },
+  "菌群检出详细列表": {
+    "核心菌属": [
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.2787",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "23%",
+        "检出率%": "99.52%",
+        "说明": "说明:多导致⼈体炎症;致病;导致菌群失衡;产丁酸;肥胖⼈群丰度较⾼;参与胆汁酸代谢;对抗艰难梭菌;"
+      },
+      {
+        "名称": "普雷沃⽒菌属 Prevotella",
+        "丰度%": "60.0857",
+        "正常范围%": "0.3652-81.2736",
+        "人群水平%": "96%",
+        "检出率%": "99.52%",
+        "说明": "说明:核心菌,健康的植物性饮食相关菌,在⾃闭症、多发性硬化中减少;丰度⾼促炎,加剧过敏、"
+      },
+      {
+        "名称": "瘤胃球菌属 Ruminococcus",
+        "丰度%": "1.6504",
+        "正常范围%": "0.266-33.2664",
+        "人群水平%": "66%",
+        "检出率%": "99.52%",
+        "说明": "说明:消化抗性淀粉、纤维素,丰度⾼促进肠炎和过敏相关疾病,"
+      },
+      {
+        "名称": "拟杆菌属 Bacteroides",
+        "丰度%": "13.2781",
+        "正常范围%": "1.0292-55.9251",
+        "人群水平%": "35%",
+        "检出率%": "99.04%",
+        "说明": "说明:基石菌,消化蔬菜和谷食,蛋白,降解复杂多糖,交叉喂养关键菌,维持免疫和肠道稳态,"
+      },
+      {
+        "名称": "优杆菌属 Eubacterium",
+        "丰度%": "0.1712",
+        "正常范围%": "0.0574-5.8432",
+        "人群水平%": "35%",
+        "检出率%": "98.56%",
+        "说明": "说明:基石菌,产短链脂肪酸尤其丁酸,有助于肠道健康,降解胆固醇、调节餐后⾎糖、"
+      },
+      {
+        "名称": "Lachnoclostridium",
+        "丰度%": "0.2093",
+        "正常范围%": "0.117-6.2036",
+        "人群水平%": "27%",
+        "检出率%": "98.56%",
+        "说明": "说明:丁酸,与内脏脂肪积累相关,与肥胖、⾼⾎压、糖尿病正相关,与肠道炎症、肠癌和阿尔茨海默病进展有关,"
+      },
+      {
+        "名称": "粪杆菌属 Faecalibacterium",
+        "丰度%": "3.2406"
+      },
+      {
+        "名称": "5.1543-18.1656",
+        "丰度%": "59%",
+        "检出率%": "98.08%",
+        "说明": "说明:基石菌,丁酸生产菌,下⼀代"
+      },
+      {
+        "名称": "经黏液真杆菌属 Blautia",
+        "丰度%": "0.1206"
+      },
+      {
+        "名称": "0.3366-3.237",
+        "丰度%": "21%",
+        "检出率%": "97.60%",
+        "说明": "说明:消化复合碳水化合物,健康菌,偏低与炎症肠病,营养不良相关,减肥有效菌,缓解炎症性疾病和代谢疾病,"
+      },
+      {
+        "名称": "⽑螺菌属 Lachnospira",
+        "丰度%": "0.1943",
+        "正常范围%": "0-4.805",
+        "人群水平%": "60%",
+        "检出率%": "88.94%",
+        "说明": "说明:基石菌,发酵代谢膳食纤维,利用果蔬果㬵产生⼄酸,丁酸,与睡眠质量呈负相关,过少与多种疾病相关,"
+      },
+      {
+        "名称": "考拉杆菌属 Phascolarctobacterium",
+        "丰度%": "0.0101",
+        "正常范围%": "0-8.8711",
+        "人群水平%": "19%",
+        "检出率%": "88.94%",
+        "说明": "说明:东⽅⼈肠道的核心菌属,⾼易减肥,与水果蔬菜摄⼊相关,随年龄增加,在重度抑郁、阿尔茨海默病(AD)、⾃闭症⼉童富集,"
+      },
+      {
+        "名称": "巨单胞菌属 Megamonas",
+        "丰度%": "ND",
+        "正常范围%": "0-21.672",
+        "人群水平%": "29%",
+        "检出率%": "87.50%",
+        "说明": "说明:发酵各种碳水化合物、产⼄酸、丙酸、乳酸,⾃闭症谱系障碍、注意缺陷、多动障碍 (ADHD)急性脑卒中(AIS)"
+      },
+      {
+        "名称": "粪球菌属 Coprococcus",
+        "丰度%": "1.8668",
+        "正常范围%": "0-3.618",
+        "人群水平%": "94%",
+        "检出率%": "86.06%",
+        "说明": "说明:可产丁酸,抑制免疫反应,降低过敏,抑郁、帕金森、认知障碍、便秘,慢性肾病、虚弱者减少,过多导致菌群紊乱,"
+      },
+      {
+        "名称": "双歧杆菌属 Bifidobacterium",
+        "丰度%": "0.2396",
+        "正常范围%": "0.1914-14.598",
+        "人群水平%": "50%",
+        "检出率%": "97.12%",
+        "说明": "说明:最重要的"
+      }
+    ],
+    "益生菌": [
+      {
+        "名称": "拟杆菌⻔ Bacteroidetes",
+        "丰度%": "76.721%",
+        "人群水平%": "95%",
+        "检出率%": "98.03%"
+      },
+      {
+        "名称": "厚壁菌⻔ Firmicutes",
+        "丰度%": "21.168%",
+        "人群水平%": "28%",
+        "检出率%": "98.95%"
+      },
+      {
+        "名称": "变形菌⻔ Proteobacteria",
+        "丰度%": "1.129%",
+        "人群水平%": "8%",
+        "检出率%": "93.53%"
+      },
+      {
+        "名称": "放线菌⻔ Actinobacteria",
+        "丰度%": "0.533%",
+        "人群水平%": "50%",
+        "检出率%": "94.62%"
+      },
+      {
+        "名称": "黏㬵球形菌⻔ Lentisphaerae",
+        "丰度%": "0.037%",
+        "人群水平%": "94%",
+        "检出率%": "18.42%"
+      },
+      {
+        "名称": "疣微菌⻔ Verrucomicrobia",
+        "丰度%": "0.013%",
+        "人群水平%": "56%",
+        "检出率%": "56.29%"
+      },
+      {
+        "名称": "螺旋体 Spirochaetes",
+        "丰度%": "0.007%",
+        "人群水平%": "97%",
+        "检出率%": "4.04%"
+      },
+      {
+        "名称": "厚壁菌/拟杆菌21.6%",
+        "丰度%": "78.4%"
+      },
+      {
+        "名称": "您的厚壁菌氏拟杆菌氏值为:",
+        "丰度%": "0.28"
+      },
+      {
+        "名称": "核心菌属",
+        "丰度%": "85"
+      }
+    ],
+    "有害菌属": [
+      {
+        "名称": "埃希⽒菌属 Escherichia",
+        "丰度%": "0.0202",
+        "正常范围%": "0-9.3023",
+        "人群水平%": "9%",
+        "检出率%": "99.52%",
+        "说明": "说明:正常菌属,条件致病菌,过多致病,导致菌群失衡"
+      },
+      {
+        "名称": "Streptococcus",
+        "丰度%": "0.0100",
+        "正常范围%": "0-1.3257",
+        "人群水平%": "7%",
+        "检出率%": "99.52%",
+        "说明": "说明:可引起化脓性炎症,个别菌为"
+      },
+      {
+        "名称": "脱硫弧菌属 Desulfovibrio",
+        "丰度%": "0.4734"
+      },
+      {
+        "名称": "0-0.0999",
+        "丰度%": "95%",
+        "检出率%": "33.65%",
+        "说明": "说明:属于变形菌⻔,产生硫化氢,导致炎症、腹泻,对肠道上皮具有毒性,导致胃肠道疾病,约50%⼈群的⼝腔和肠道会携带,"
+      },
+      {
+        "名称": "螺杆菌属 Helicobacter",
+        "丰度%": "ND",
+        "正常范围%": "0-0.036",
+        "人群水平%": "86%",
+        "检出率%": "22.12%",
+        "说明": "说明:⾰兰⽒阴性菌,微需氧菌,该菌属下的⼀些菌种被发现在⼈类上消化道内壁,部分种为致病菌,"
+      },
+      {
+        "名称": "⼸形菌属 Arcobacter",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0066",
+        "人群水平%": "96%",
+        "检出率%": "7.69%",
+        "说明": "说明:好氧菌,腹泻致病菌,与河流海洋污染相关的潜在"
+      }
+    ],
+    "其它重要菌属": [
+      {
+        "名称": "柯林斯⽒菌属 Collinsella",
+        "丰度%": "0.2801",
+        "正常范围%": "0-5.7436",
+        "人群水平%": "77%",
+        "检出率%": "90.38%",
+        "说明": "说明:产⽓菌,与脂质代谢及心脑⾎管相关,过多可导致菌群紊乱,部分"
+      }
+    ],
+    "病原菌属": [],
+    "病原菌检出": [],
+    "便秘相关菌": [
+      {
+        "名称": "史⽒甲烷短杆菌 Methanobrevibacter smithii",
+        "丰度%": "ND",
+        "正常范围%": "0-1.1952",
+        "人群水平%": "85%"
+      },
+      {
+        "名称": "粪球菌属 Coprococcus",
+        "丰度%": "1.8668",
+        "正常范围%": "0-3.618",
+        "人群水平%": "94%"
+      },
+      {
+        "名称": "埃希⽒菌属 Escherichia",
+        "丰度%": "0.0202",
+        "正常范围%": "0-9.3023",
+        "人群水平%": "9%"
+      },
+      {
+        "名称": "⽑螺菌属 Lachnospira",
+        "丰度%": "0.1943",
+        "正常范围%": "0-4.805",
+        "人群水平%": "60%"
+      },
+      {
+        "名称": "厌氧棍状菌属 Anaerotruncus",
+        "丰度%": "0.0100",
+        "正常范围%": "0-0.1328",
+        "人群水平%": "77%"
+      },
+      {
+        "名称": "葡萄球菌属 Staphylococcus",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0105",
+        "人群水平%": "78%"
+      },
+      {
+        "名称": "Streptococcus",
+        "丰度%": "0.0100",
+        "正常范围%": "0-1.3257",
+        "人群水平%": "7%"
+      },
+      {
+        "名称": "脆弱拟杆菌 Bacteroides fragilis",
+        "丰度%": "0.0202",
+        "正常范围%": "0-0.4212",
+        "人群水平%": "23%"
+      },
+      {
+        "名称": "卵形拟杆菌 Bacteroides ovatus",
+        "丰度%": "0.0200",
+        "正常范围%": "0.0005-1.4154",
+        "人群水平%": "42%"
+      },
+      {
+        "名称": "下水道菌属 Cloacibacillus",
+        "丰度%": "0.0033",
+        "正常范围%": "0-0.0468",
+        "人群水平%": "79%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.2787",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "23%"
+      },
+      {
+        "名称": "肠杆菌属 Enterobacter",
+        "丰度%": "0.0067",
+        "正常范围%": "0-0.083",
+        "人群水平%": "60%"
+      },
+      {
+        "名称": "Erysipelatoclostridium",
+        "丰度%": "0.0574",
+        "正常范围%": "0-1.0458",
+        "人群水平%": "53%"
+      },
+      {
+        "名称": "粪杆菌属 Faecalibacterium",
+        "丰度%": "3.2406",
+        "正常范围%": "5.1543-18.1656",
+        "人群水平%": "59%"
+      },
+      {
+        "名称": "梭杆菌属 Fusobacterium",
+        "丰度%": "ND",
+        "正常范围%": "0-1.21",
+        "人群水平%": "37%"
+      },
+      {
+        "名称": "霍尔德曼穆尔菌属 Holdemanella",
+        "丰度%": "0.1318",
+        "正常范围%": "0-0.2904",
+        "人群水平%": "91%"
+      },
+      {
+        "名称": "霍尔德曼⽒菌属 Holdemania",
+        "丰度%": "0.0100",
+        "正常范围%": "0-0.0378",
+        "人群水平%": "74%"
+      },
+      {
+        "名称": "巨球形菌属 Megasphaera",
+        "丰度%": "0.0101",
+        "正常范围%": "0-0.1971",
+        "人群水平%": "51%"
+      },
+      {
+        "名称": "臭⽓杆菌属 Odoribacter",
+        "丰度%": "0.1894",
+        "正常范围%": "0-1.1786",
+        "人群水平%": "81%"
+      },
+      {
+        "名称": "副拟杆菌属 Parabacteroides",
+        "丰度%": "0.7216",
+        "正常范围%": "0-5.433",
+        "人群水平%": "45%"
+      },
+      {
+        "名称": "瘤胃球菌属 Ruminococcus",
+        "丰度%": "1.6504",
+        "正常范围%": "0.266-33.2664",
+        "人群水平%": "66%"
+      },
+      {
+        "名称": "双歧杆菌属 Bifidobacterium",
+        "丰度%": "0.2396",
+        "正常范围%": "0.1914-12.598",
+        "人群水平%": "50%"
+      },
+      {
+        "名称": "乳杆菌属 Lactobacillus",
+        "丰度%": "0.7434",
+        "正常范围%": "0.166-6.5835",
+        "人群水平%": "73%"
+      },
+      {
+        "名称": "阿克曼⽒菌属 Akkermansia",
+        "丰度%": "0.0135",
+        "正常范围%": "0.0018-7.8352",
+        "人群水平%": "49%"
+      },
+      {
+        "名称": "经黏液真杆菌属 Blautia",
+        "丰度%": "0.1206"
+      },
+      {
+        "名称": "0.3366-3.237",
+        "丰度%": "21%"
+      },
+      {
+        "名称": "普雷沃⽒菌属 Prevotella",
+        "丰度%": "60.0857",
+        "正常范围%": "0.3652-81.2736",
+        "人群水平%": "96%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.2787",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "23%"
+      },
+      {
+        "名称": "瘤胃球菌属 Ruminococcus",
+        "丰度%": "1.6504",
+        "正常范围%": "0.266-33.2664",
+        "人群水平%": "66%"
+      }
+    ],
+    "抑郁相关菌": [
+      {
+        "名称": "脱硫弧菌属 Desulfovibrio",
+        "丰度%": "0.4734"
+      },
+      {
+        "名称": "0-0.0999",
+        "丰度%": "95%"
+      },
+      {
+        "名称": "另枝菌属 Alistipes",
+        "丰度%": "1.0104",
+        "正常范围%": "0-20.1524",
+        "人群水平%": "71%"
+      },
+      {
+        "名称": "拟杆菌属 Bacteroides",
+        "丰度%": "13.2781",
+        "正常范围%": "1.0292-55.9251",
+        "人群水平%": "35%"
+      },
+      {
+        "名称": "埃希⽒菌属 Escherichia",
+        "丰度%": "0.0202",
+        "正常范围%": "0-9.3023",
+        "人群水平%": "9%"
+      },
+      {
+        "名称": "解黄酮菌属 Flavonifractor",
+        "丰度%": "0.0033",
+        "正常范围%": "0-0.415",
+        "人群水平%": "20%"
+      },
+      {
+        "名称": "震颤杆菌属 Oscillibacter",
+        "丰度%": "0.0368",
+        "正常范围%": "0-0.0738",
+        "人群水平%": "89%"
+      },
+      {
+        "名称": "副拟杆菌属 Parabacteroides",
+        "丰度%": "0.7216",
+        "正常范围%": "0-5.433",
+        "人群水平%": "45%"
+      },
+      {
+        "名称": "放线菌属 Actinomyces",
+        "丰度%": "0.0033",
+        "正常范围%": "0-0.0756",
+        "人群水平%": "34%"
+      },
+      {
+        "名称": "经黏液真杆菌属 Blautia",
+        "丰度%": "0.1206"
+      },
+      {
+        "名称": "0.3366-3.237",
+        "丰度%": "21%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.2787",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "23%"
+      },
+      {
+        "名称": "爱格⼠⽒菌属 Eggerthella",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0166",
+        "人群水平%": "55%"
+      },
+      {
+        "名称": "嗜⾎杆菌属 Haemophilus",
+        "丰度%": "ND",
+        "正常范围%": "0-0.7752",
+        "人群水平%": "22%"
+      },
+      {
+        "名称": "霍尔德曼⽒菌属 Holdemania",
+        "丰度%": "0.0100",
+        "正常范围%": "0-0.0378",
+        "人群水平%": "74%"
+      },
+      {
+        "名称": "克雷伯⽒菌属 Klebsiella",
+        "丰度%": "0.0132",
+        "正常范围%": "0-15.81",
+        "人群水平%": "24%"
+      },
+      {
+        "名称": "副普雷沃⽒菌属 Paraprevotella",
+        "丰度%": "0.1857",
+        "正常范围%": "0-1.998",
+        "人群水平%": "79%"
+      },
+      {
+        "名称": "副萨特⽒菌属 Parasutterella",
+        "丰度%": "0.2165",
+        "正常范围%": "0-2.4003",
+        "人群水平%": "66%"
+      },
+      {
+        "名称": "普雷沃⽒菌属 Prevotella",
+        "丰度%": "60.0857",
+        "正常范围%": "0.3652-81.2736",
+        "人群水平%": "96%"
+      },
+      {
+        "名称": "⻙荣菌属 Veillonella",
+        "丰度%": "ND",
+        "正常范围%": "0-8.9142",
+        "人群水平%": "7%"
+      },
+      {
+        "名称": "单形拟杆菌 Bacteroides uniformis",
+        "丰度%": "0.0402",
+        "正常范围%": "0.0332-8.3187",
+        "人群水平%": "13%"
+      },
+      {
+        "名称": "普⽒栖粪杆菌 Faecalibacterium prausnitzii",
+        "丰度%": "3.0465",
+        "正常范围%": "5.1543-18.1656",
+        "人群水平%": "58%"
+      },
+      {
+        "名称": "食葡糖罗斯拜瑞⽒菌 Roseburia inulinivorans",
+        "丰度%": "0.6958",
+        "正常范围%": "0.0165-4.9966",
+        "人群水平%": "76%"
+      }
+    ],
+    "过敏相关菌": [
+      {
+        "名称": "脆弱拟杆菌 Bacteroides fragilis",
+        "丰度%": "0.0202",
+        "正常范围%": "0-0.4212",
+        "人群水平%": "23%"
+      },
+      {
+        "名称": "枸橼酸杆菌属 Citrobacter",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0668",
+        "人群水平%": "37%"
+      },
+      {
+        "名称": "克雷伯⽒菌属 Klebsiella",
+        "丰度%": "0.0132",
+        "正常范围%": "0-15.81",
+        "人群水平%": "24%"
+      },
+      {
+        "名称": "莫拉⽒菌属 Moraxella",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0096",
+        "人群水平%": "80%"
+      },
+      {
+        "名称": "变形菌⻔ Proteobacteria",
+        "丰度%": "1.1285",
+        "正常范围%": "0-21.089",
+        "人群水平%": "8%"
+      },
+      {
+        "名称": "肠杆菌科 Enterobacteriaceae",
+        "丰度%": "0.0637",
+        "正常范围%": "0-64.256",
+        "人群水平%": "11%"
+      },
+      {
+        "名称": "活泼瘤胃球菌 Ruminococcus gnavus",
+        "丰度%": "0.0033",
+        "正常范围%": "0-2.583",
+        "人群水平%": "20%"
+      },
+      {
+        "名称": "⽓单胞菌属 Aeromonas",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0334",
+        "人群水平%": "80%"
+      },
+      {
+        "名称": "经黏液真杆菌属 Blautia",
+        "丰度%": "0.1206"
+      },
+      {
+        "名称": "0.3366-3.237",
+        "丰度%": "21%"
+      },
+      {
+        "名称": "肠球菌属 Enterococcus",
+        "丰度%": "ND",
+        "正常范围%": "0-1.1362",
+        "人群水平%": "41%"
+      },
+      {
+        "名称": "粪杆菌属 Faecalibacterium",
+        "丰度%": "3.2406",
+        "正常范围%": "5.1543-18.1656",
+        "人群水平%": "59%"
+      },
+      {
+        "名称": "丙酸杆菌属 Propionibacterium",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0162",
+        "人群水平%": "91%"
+      }
+    ],
+    "腹胀相关菌": [
+      {
+        "名称": "史⽒甲烷短杆菌 Methanobrevibacter smithii",
+        "丰度%": "ND",
+        "正常范围%": "0-1.1952",
+        "人群水平%": "85%"
+      },
+      {
+        "名称": "拟杆菌属 Bacteroides",
+        "丰度%": "13.2781",
+        "正常范围%": "1.0292-55.9251",
+        "人群水平%": "35%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.2787",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "23%"
+      },
+      {
+        "名称": "瘤胃球菌属 Ruminococcus",
+        "丰度%": "1.6504",
+        "正常范围%": "0.266-33.2664",
+        "人群水平%": "66%"
+      },
+      {
+        "名称": "变形菌⻔ Proteobacteria",
+        "丰度%": "1.1285",
+        "正常范围%": "0-21.08931741",
+        "人群水平%": "8%"
+      },
+      {
+        "名称": "艰难梭菌 Clostridium difficile",
+        "丰度%": "ND"
+      },
+      {
+        "名称": "肠球菌属 Enterococcus",
+        "丰度%": "ND",
+        "正常范围%": "0-1.1362",
+        "人群水平%": "41%"
+      },
+      {
+        "名称": "普雷沃⽒菌属 Prevotella",
+        "丰度%": "60.0857",
+        "正常范围%": "0.3652-81.2736",
+        "人群水平%": "96%"
+      },
+      {
+        "名称": "Streptococcus",
+        "丰度%": "0.0100",
+        "正常范围%": "0-1.3257",
+        "人群水平%": "7%"
+      },
+      {
+        "名称": "蓝藻⻔ Cyanobacteria",
+        "丰度%": "ND",
+        "正常范围%": "0-0.052432984",
+        "人群水平%": "70%"
+      },
+      {
+        "名称": "产⽓荚膜梭菌 Clostridium perfringens",
+        "丰度%": "ND"
+      },
+      {
+        "名称": "乳杆菌属 Lactobacillus",
+        "丰度%": "0.7434",
+        "正常范围%": "0.166-6.5835",
+        "人群水平%": "73%"
+      },
+      {
+        "名称": "⽑螺旋菌科 Lachnospiraceae",
+        "丰度%": "4.0683",
+        "正常范围%": "0.8403-66.733",
+        "人群水平%": "28%"
+      },
+      {
+        "名称": "双歧杆菌属 Bifidobacterium",
+        "丰度%": "0.2396",
+        "正常范围%": "0.1914-12.598",
+        "人群水平%": "50%"
+      }
+    ],
+    "失眠相关菌": [
+      {
+        "名称": "阿克曼⽒菌属 Akkermansia",
+        "丰度%": "0.0135",
+        "正常范围%": "0.0018-7.8352",
+        "人群水平%": "49%"
+      },
+      {
+        "名称": "拟杆菌属 Bacteroides",
+        "丰度%": "13.2781",
+        "正常范围%": "1.0292-55.9251",
+        "人群水平%": "35%"
+      },
+      {
+        "名称": "梭菌目 Clostridiales",
+        "丰度%": "11.4727",
+        "正常范围%": "5.2999-89.2167",
+        "人群水平%": "20%"
+      },
+      {
+        "名称": "⻓双歧杆菌 Bifidobacterium longum",
+        "丰度%": "0.0270",
+        "正常范围%": "0-0.0996",
+        "人群水平%": "91%"
+      },
+      {
+        "名称": "经黏液真杆菌属 Blautia",
+        "丰度%": "0.1206"
+      },
+      {
+        "名称": "0.3366-3.237",
+        "丰度%": "21%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.2787",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "23%"
+      },
+      {
+        "名称": "粪杆菌属 Faecalibacterium",
+        "丰度%": "3.2406",
+        "正常范围%": "5.1543-18.1656",
+        "人群水平%": "59%"
+      },
+      {
+        "名称": "Lachnoclostridium",
+        "丰度%": "0.2093",
+        "正常范围%": "0.117-6.2036",
+        "人群水平%": "27%"
+      },
+      {
+        "名称": "普雷沃⽒菌属 Prevotella",
+        "丰度%": "60.0857",
+        "正常范围%": "0.3652-81.2736",
+        "人群水平%": "96%"
+      },
+      {
+        "名称": "龙包茨⽒菌属 Romboutsia",
+        "丰度%": "0.0202"
+      },
+      {
+        "名称": "0-0.0189",
+        "丰度%": "94%"
+      },
+      {
+        "名称": "Streptococcus",
+        "丰度%": "0.0100",
+        "正常范围%": "0-1.3257",
+        "人群水平%": "7%"
+      },
+      {
+        "名称": "炎症性肠炎",
+        "丰度%": "0.24"
+      },
+      {
+        "名称": "colitogenicbacteria in inflammatory bowel disease. \"Cell 158.5(2014): 1000-",
+        "丰度%": "1010"
+      },
+      {
+        "名称": "结直肠癌",
+        "丰度%": "0.26"
+      },
+      {
+        "名称": "PeppelenboschNature Reviews Gastroenterology Hepatology 10.12 (2013): 741-",
+        "丰度%": "745."
+      },
+      {
+        "名称": "肠易激综合征",
+        "丰度%": "0.18"
+      },
+      {
+        "名称": "根据您的肠道菌群中肠易激综合征患者与健康⼈之间的差异菌群,分析了您的肠易激综合征⻛险,显⽰分值为",
+        "丰度%": "0.18"
+      },
+      {
+        "名称": "感染性腹泻",
+        "丰度%": "0.16"
+      },
+      {
+        "名称": "胃病",
+        "丰度%": "0.20"
+      },
+      {
+        "名称": "肝病",
+        "丰度%": "0.21"
+      },
+      {
+        "名称": "肾病",
+        "丰度%": "0.05"
+      },
+      {
+        "名称": "心脑⾎管疾病",
+        "丰度%": "0.37"
+      },
+      {
+        "名称": "II型糖尿病",
+        "丰度%": "0.21"
+      },
+      {
+        "名称": "抑郁症",
+        "丰度%": "0.27"
+      },
+      {
+        "名称": "甲状腺疾病",
+        "丰度%": "0.33"
+      },
+      {
+        "名称": "胆病",
+        "丰度%": "0.14"
+      },
+      {
+        "名称": "肺部疾病",
+        "丰度%": "0.12"
+      },
+      {
+        "名称": "⾃体免疫疾病",
+        "丰度%": "0.08"
+      },
+      {
+        "名称": "碳水化合物",
+        "丰度%": "96"
+      },
+      {
+        "名称": "蛋白质",
+        "丰度%": "44"
+      },
+      {
+        "名称": "脂肪",
+        "丰度%": "71"
+      },
+      {
+        "名称": "纤维素",
+        "丰度%": "96"
+      },
+      {
+        "名称": "乳制品",
+        "丰度%": "36"
+      }
+    ]
+  }
+}

+ 4034 - 0
cfc-backend/src/main/resources/data/refs/530010234-侯.json

@@ -0,0 +1,4034 @@
+{
+  "文件名": "530010234-侯",
+  "格式": "triplet",
+  "总页数": 143,
+  "报告概述": {
+    "姓名": "530010234-侯",
+    "编号": "530010234",
+    "年龄": "12岁",
+    "性别": "男",
+    "肠道预测年龄": "10.68岁",
+    "肠型": "拟杆菌型",
+    "肠道菌群平衡": "31",
+    "菌群多样性": "37",
+    "有益菌": "34",
+    "有害菌": "78",
+    "核心菌属": "77",
+    "健康总分": "68",
+    "菌群健康": "53",
+    "慢病控制": "76",
+    "营养均衡": "68"
+  },
+  "疾病风险评估": [
+    {
+      "名称": "炎症性肠炎",
+      "数值": "0.28",
+      "状态": "低风险"
+    },
+    {
+      "名称": "肠易激综合征",
+      "数值": "0.13",
+      "状态": "低风险"
+    },
+    {
+      "名称": "感染性腹泻",
+      "数值": "0.41",
+      "状态": "注意"
+    },
+    {
+      "名称": "自闭症",
+      "数值": "0.10",
+      "状态": "低风险"
+    },
+    {
+      "名称": "抑郁症",
+      "数值": "0.36",
+      "状态": "注意"
+    },
+    {
+      "名称": "甲状腺疾病",
+      "数值": "0.12",
+      "状态": "低风险"
+    },
+    {
+      "名称": "肺部疾病",
+      "数值": "0.13",
+      "状态": "低风险"
+    },
+    {
+      "名称": "自体免疫病",
+      "数值": "0.29",
+      "状态": "低风险"
+    }
+  ],
+  "主要营养评估": [
+    {
+      "名称": "碳水化合物",
+      "数值": "44",
+      "状态": "正常"
+    },
+    {
+      "名称": "蛋白质",
+      "数值": "93",
+      "状态": "正常"
+    },
+    {
+      "名称": "脂肪",
+      "数值": "59",
+      "状态": "正常"
+    },
+    {
+      "名称": "纤维素",
+      "数值": "58",
+      "状态": "正常"
+    },
+    {
+      "名称": "乳制品",
+      "数值": "66",
+      "状态": "正常"
+    }
+  ],
+  "氨基酸评估": [
+    {
+      "名称": "胱氨酸",
+      "数值": "97",
+      "状态": "正常"
+    },
+    {
+      "名称": "苯丙氨酸",
+      "数值": "38",
+      "状态": "正常"
+    },
+    {
+      "名称": "酪氨酸",
+      "数值": "83",
+      "状态": "正常"
+    },
+    {
+      "名称": "缬氨酸",
+      "数值": "75",
+      "状态": "正常"
+    },
+    {
+      "名称": "组氨酸",
+      "数值": "74",
+      "状态": "正常"
+    },
+    {
+      "名称": "丙氨酸",
+      "数值": "9",
+      "状态": "偏低"
+    },
+    {
+      "名称": "谷氨酸",
+      "数值": "27",
+      "状态": "正常"
+    },
+    {
+      "名称": "甘氨酸",
+      "数值": "38",
+      "状态": "正常"
+    },
+    {
+      "名称": "脯氨酸",
+      "数值": "47",
+      "状态": "正常"
+    },
+    {
+      "名称": "丝氨酸",
+      "数值": "88",
+      "状态": "正常"
+    }
+  ],
+  "维生素评估": [
+    {
+      "名称": "维生素A",
+      "数值": "74",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素B1",
+      "数值": "38",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素B2",
+      "数值": "32",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素B5",
+      "数值": "26",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素B6",
+      "数值": "62",
+      "状态": "正常"
+    },
+    {
+      "名称": "叶酸",
+      "数值": "90",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素B12",
+      "数值": "14",
+      "状态": "偏低"
+    },
+    {
+      "名称": "维生素C",
+      "数值": "22",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素D",
+      "数值": "16",
+      "状态": "正常"
+    }
+  ],
+  "微量元素评估": [
+    {
+      "名称": "铁",
+      "数值": "81",
+      "状态": "正常"
+    },
+    {
+      "名称": "锌",
+      "数值": "73",
+      "状态": "正常"
+    }
+  ],
+  "主要消化道致病菌": [
+    {
+      "致病菌": "幽门螺杆菌",
+      "丰度": "0%",
+      "评估": "未检出"
+    },
+    {
+      "致病菌": "艰难梭菌",
+      "丰度": "0%",
+      "评估": "未检出"
+    },
+    {
+      "致病菌": "沙门氏菌",
+      "丰度": "0%",
+      "评估": "未检出"
+    },
+    {
+      "致病菌": "志贺氏菌",
+      "丰度": "0%",
+      "评估": "未检出"
+    },
+    {
+      "致病菌": "弯曲杆菌",
+      "丰度": "0%",
+      "评估": "未检出"
+    }
+  ],
+  "抗生素风险评估": [
+    {
+      "名称": "β-内酰胺酶类",
+      "数值": "67",
+      "状态": "正常"
+    },
+    {
+      "名称": "氨基糖苷类",
+      "数值": "68",
+      "状态": "正常"
+    },
+    {
+      "名称": "大环内酯类",
+      "数值": "62",
+      "状态": "正常"
+    },
+    {
+      "名称": "呋喃类",
+      "数值": "82",
+      "状态": "正常"
+    },
+    {
+      "名称": "喹诺酮类",
+      "数值": "51",
+      "状态": "正常"
+    },
+    {
+      "名称": "磺胺类",
+      "数值": "51",
+      "状态": "正常"
+    },
+    {
+      "名称": "甲氧苄啶类",
+      "数值": "48",
+      "状态": "正常"
+    },
+    {
+      "名称": "氯霉素类",
+      "数值": "63",
+      "状态": "正常"
+    },
+    {
+      "名称": "四环素类",
+      "数值": "58",
+      "状态": "正常"
+    }
+  ],
+  "肠道屏障及代谢物": [
+    {
+      "名称": "肠道炎症水平",
+      "评估值": "36",
+      "健康状况": "正常",
+      "正常范围": "0-80"
+    },
+    {
+      "名称": "肠道产气",
+      "评估值": "58",
+      "健康状况": "轻度产气",
+      "正常范围": "0-50"
+    },
+    {
+      "名称": "肠道屏障",
+      "评估值": "49",
+      "健康状况": "正常",
+      "正常范围": "15-100"
+    },
+    {
+      "名称": "脂多糖LPS",
+      "评估值": "53",
+      "健康状况": "正常",
+      "正常范围": "0-85"
+    },
+    {
+      "名称": "次级胆汁酸",
+      "评估值": "48",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "对甲酚(p-Cresol)",
+      "评估值": "89",
+      "健康状况": "过多",
+      "正常范围": "0-85"
+    },
+    {
+      "名称": "吲哚",
+      "评估值": "56",
+      "健康状况": "正常",
+      "正常范围": "15-90"
+    },
+    {
+      "名称": "苯酚",
+      "评估值": "51",
+      "健康状况": "正常",
+      "正常范围": "0-85"
+    },
+    {
+      "名称": "腐胺",
+      "评估值": "59",
+      "健康状况": "正常",
+      "正常范围": "5-85"
+    },
+    {
+      "名称": "硫化氢",
+      "评估值": "34",
+      "健康状况": "正常",
+      "正常范围": "5-85"
+    },
+    {
+      "名称": "尸胺",
+      "评估值": "38",
+      "健康状况": "正常",
+      "正常范围": "5-85"
+    }
+  ],
+  "短链脂肪酸": [
+    {
+      "名称": "丁酸盐(Butyrate)",
+      "评估值": "31",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "丙酸盐(Propionate)",
+      "评估值": "79",
+      "健康状况": "正常",
+      "正常范围": "15-90"
+    },
+    {
+      "名称": "乙酸盐(Acetate)",
+      "评估值": "17",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "异戊酸盐(Isovaleric)",
+      "评估值": "12",
+      "健康状况": "正常",
+      "正常范围": "5-85"
+    }
+  ],
+  "神经递质及激素": [
+    {
+      "名称": "血清素(5-HT)",
+      "评估值": "24",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "γ-氨基丁酸(GABA)",
+      "评估值": "26",
+      "健康状况": "正常",
+      "正常范围": "15-85"
+    },
+    {
+      "名称": "谷氨酸(Glutamate)",
+      "评估值": "27",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "色氨酸(Tryptophan)",
+      "评估值": "48",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "DOPAC",
+      "评估值": "41",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "多巴胺",
+      "评估值": "98",
+      "健康状况": "过多",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "组胺(Histamine)",
+      "评估值": "91",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "一氧化氮",
+      "评估值": "44",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "喹啉(Quinolinic)",
+      "评估值": "77",
+      "健康状况": "正常",
+      "正常范围": "0-95"
+    },
+    {
+      "名称": "维生素K2",
+      "评估值": "58",
+      "健康状况": "正常",
+      "正常范围": "15-99"
+    },
+    {
+      "名称": "肌醇(Inositol)",
+      "评估值": "53",
+      "健康状况": "正常",
+      "正常范围": "15-99"
+    }
+  ],
+  "个体化食物推荐表": {
+    "格式": "vertical",
+    "条目数": 224,
+    "数据": [
+      {
+        "名称": "大麦",
+        "分类": "主食",
+        "推荐指数": "10",
+        "能量KJ": "1481",
+        "蛋白g": "12",
+        "脂肪g": "2",
+        "碳水化合物g": "73",
+        "淀粉g": "0",
+        "总膳食纤维g": "17",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小米",
+        "分类": "主食",
+        "推荐指数": "5",
+        "能量KJ": "1582",
+        "蛋白g": "11",
+        "脂肪g": "4",
+        "碳水化合物g": "72",
+        "淀粉g": "0",
+        "总膳食纤维g": "8",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小麦",
+        "分类": "主食",
+        "推荐指数": "3",
+        "能量KJ": "1423",
+        "蛋白g": "10",
+        "脂肪g": "1",
+        "碳水化合物g": "75",
+        "淀粉g": "0",
+        "总膳食纤维g": "12",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小麦面包",
+        "分类": "主食",
+        "推荐指数": "-7",
+        "能量KJ": "1116",
+        "蛋白g": "10",
+        "脂肪g": "3",
+        "碳水化合物g": "48",
+        "淀粉g": "36",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "意大利面",
+        "分类": "主食",
+        "推荐指数": "0",
+        "能量KJ": "386",
+        "蛋白g": "1",
+        "脂肪g": "3",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "燕麦",
+        "分类": "主食",
+        "推荐指数": "31",
+        "能量KJ": "297",
+        "蛋白g": "17",
+        "脂肪g": "6",
+        "碳水化合物g": "66",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "玉米粒",
+        "分类": "主食",
+        "推荐指数": "39",
+        "能量KJ": "298",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "14",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "米饭",
+        "分类": "主食",
+        "推荐指数": "-1",
+        "能量KJ": "1527",
+        "蛋白g": "7",
+        "脂肪g": "0",
+        "碳水化合物g": "79",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "玉米饼",
+        "分类": "主食",
+        "推荐指数": "4",
+        "能量KJ": "912",
+        "蛋白g": "5",
+        "脂肪g": "2",
+        "碳水化合物g": "44",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "荞麦面粉",
+        "分类": "主食",
+        "推荐指数": "1",
+        "能量KJ": "1402",
+        "蛋白g": "12",
+        "脂肪g": "3",
+        "碳水化合物g": "70",
+        "淀粉g": "0",
+        "总膳食纤维g": "10",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葡萄干浆即食谷物",
+        "分类": "主食",
+        "推荐指数": "0",
+        "能量KJ": "1354",
+        "蛋白g": "7",
+        "脂肪g": "1",
+        "碳水化合物g": "78",
+        "淀粉g": "0",
+        "总膳食纤维g": "13",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "面条",
+        "分类": "主食",
+        "推荐指数": "-1",
+        "能量KJ": "1609",
+        "蛋白g": "14",
+        "脂肪g": "4",
+        "碳水化合物g": "71",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "84"
+      },
+      {
+        "名称": "鸡蛋面包",
+        "分类": "主食",
+        "推荐指数": "-1",
+        "能量KJ": "1201",
+        "蛋白g": "9",
+        "脂肪g": "6",
+        "碳水化合物g": "47",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "51"
+      },
+      {
+        "名称": "黑麦面包",
+        "分类": "主食",
+        "推荐指数": "1",
+        "能量KJ": "1188",
+        "蛋白g": "9",
+        "脂肪g": "3",
+        "碳水化合物g": "53",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "冰淇淋",
+        "分类": "乳制品",
+        "推荐指数": "-4",
+        "能量KJ": "690",
+        "蛋白g": "1",
+        "脂肪g": "3",
+        "碳水化合物g": "32",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "8"
+      },
+      {
+        "名称": "奶油",
+        "分类": "乳制品",
+        "推荐指数": "-5",
+        "能量KJ": "515",
+        "蛋白g": "3",
+        "脂肪g": "10",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "35"
+      },
+      {
+        "名称": "奶酪",
+        "分类": "乳制品",
+        "推荐指数": "-1",
+        "能量KJ": "1552",
+        "蛋白g": "23",
+        "脂肪g": "29",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "94"
+      },
+      {
+        "名称": "牛奶",
+        "分类": "乳制品",
+        "推荐指数": "3",
+        "能量KJ": "268",
+        "蛋白g": "3",
+        "脂肪g": "3",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "14"
+      },
+      {
+        "名称": "脱脂牛奶",
+        "分类": "乳制品",
+        "推荐指数": "6",
+        "能量KJ": "142",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "2"
+      },
+      {
+        "名称": "黄油",
+        "分类": "乳制品",
+        "推荐指数": "-20",
+        "能量KJ": "2999",
+        "蛋白g": "0",
+        "脂肪g": "81",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "215"
+      },
+      {
+        "名称": "山核桃",
+        "分类": "干果",
+        "推荐指数": "-7",
+        "能量KJ": "2889",
+        "蛋白g": "9",
+        "脂肪g": "71",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "9",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "山核桃干",
+        "分类": "干果",
+        "推荐指数": "-3",
+        "能量KJ": "2749",
+        "蛋白g": "12",
+        "脂肪g": "64",
+        "碳水化合物g": "18",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "杏仁",
+        "分类": "干果",
+        "推荐指数": "-2",
+        "能量KJ": "2423",
+        "蛋白g": "21",
+        "脂肪g": "49",
+        "碳水化合物g": "21",
+        "淀粉g": "0",
+        "总膳食纤维g": "12",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "开心果",
+        "分类": "干果",
+        "推荐指数": "-6",
+        "能量KJ": "2392",
+        "蛋白g": "21",
+        "脂肪g": "45",
+        "碳水化合物g": "28",
+        "淀粉g": "1",
+        "总膳食纤维g": "10",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "松子",
+        "分类": "干果",
+        "推荐指数": "-7",
+        "能量KJ": "2816",
+        "蛋白g": "13",
+        "脂肪g": "68",
+        "碳水化合物g": "13",
+        "淀粉g": "1",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "栗子",
+        "分类": "干果",
+        "推荐指数": "50",
+        "能量KJ": "1519",
+        "蛋白g": "6",
+        "脂肪g": "1",
+        "碳水化合物g": "79",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "核桃",
+        "分类": "干果",
+        "推荐指数": "-5",
+        "能量KJ": "2738",
+        "蛋白g": "15",
+        "脂肪g": "65",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "椰肉",
+        "分类": "干果",
+        "推荐指数": "0",
+        "能量KJ": "1481",
+        "蛋白g": "3",
+        "脂肪g": "33",
+        "碳水化合物g": "15",
+        "淀粉g": "0",
+        "总膳食纤维g": "9",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "榛子",
+        "分类": "干果",
+        "推荐指数": "45",
+        "能量KJ": "2629",
+        "蛋白g": "14",
+        "脂肪g": "60",
+        "碳水化合物g": "16",
+        "淀粉g": "0",
+        "总膳食纤维g": "9",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橡子",
+        "分类": "干果",
+        "推荐指数": "44",
+        "能量KJ": "1619",
+        "蛋白g": "6",
+        "脂肪g": "23",
+        "碳水化合物g": "40",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "腰果",
+        "分类": "干果",
+        "推荐指数": "-3",
+        "能量KJ": "2402",
+        "蛋白g": "15",
+        "脂肪g": "46",
+        "碳水化合物g": "32",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芝麻酱",
+        "分类": "干果",
+        "推荐指数": "1",
+        "能量KJ": "2454",
+        "蛋白g": "18",
+        "脂肪g": "50",
+        "碳水化合物g": "24",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "莲子",
+        "分类": "干果",
+        "推荐指数": "45",
+        "能量KJ": "372",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葵花子",
+        "分类": "干果",
+        "推荐指数": "-1",
+        "能量KJ": "2445",
+        "蛋白g": "20",
+        "脂肪g": "51",
+        "碳水化合物g": "20",
+        "淀粉g": "0",
+        "总膳食纤维g": "8",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "银杏坚果",
+        "分类": "干果",
+        "推荐指数": "0",
+        "能量KJ": "1456",
+        "蛋白g": "10",
+        "脂肪g": "2",
+        "碳水化合物g": "72",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "比萨",
+        "分类": "快餐",
+        "推荐指数": "-4",
+        "能量KJ": "1121",
+        "蛋白g": "10",
+        "脂肪g": "12",
+        "碳水化合物g": "29",
+        "淀粉g": "18",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "14"
+      },
+      {
+        "名称": "热狗",
+        "分类": "快餐",
+        "推荐指数": "-5",
+        "能量KJ": "1167",
+        "蛋白g": "9",
+        "脂肪g": "3",
+        "碳水化合物g": "50",
+        "淀粉g": "36",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "鸡米花",
+        "分类": "快餐",
+        "推荐指数": "-7",
+        "能量KJ": "1469",
+        "蛋白g": "17",
+        "脂肪g": "21",
+        "碳水化合物g": "21",
+        "淀粉g": "18",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "40"
+      },
+      {
+        "名称": "三文鱼",
+        "分类": "水产品",
+        "推荐指数": "6",
+        "能量KJ": "594",
+        "蛋白g": "19",
+        "脂肪g": "6",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "55"
+      },
+      {
+        "名称": "凤尾鱼",
+        "分类": "水产品",
+        "推荐指数": "6",
+        "能量KJ": "548",
+        "蛋白g": "20",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "60"
+      },
+      {
+        "名称": "墨鱼",
+        "分类": "水产品",
+        "推荐指数": "6",
+        "能量KJ": "331",
+        "蛋白g": "16",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "112"
+      },
+      {
+        "名称": "大比目鱼",
+        "分类": "水产品",
+        "推荐指数": "7",
+        "能量KJ": "382",
+        "蛋白g": "18",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "49"
+      },
+      {
+        "名称": "大西洋鳕鱼",
+        "分类": "水产品",
+        "推荐指数": "0",
+        "能量KJ": "343",
+        "蛋白g": "17",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "43"
+      },
+      {
+        "名称": "小龙虾",
+        "分类": "水产品",
+        "推荐指数": "7",
+        "能量KJ": "322",
+        "蛋白g": "15",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "114"
+      },
+      {
+        "名称": "扇贝",
+        "分类": "水产品",
+        "推荐指数": "2",
+        "能量KJ": "289",
+        "蛋白g": "12",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "2",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "24"
+      },
+      {
+        "名称": "条纹鲈鱼",
+        "分类": "水产品",
+        "推荐指数": "8",
+        "能量KJ": "406",
+        "蛋白g": "17",
+        "脂肪g": "2",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "80"
+      },
+      {
+        "名称": "海鲈鱼",
+        "分类": "水产品",
+        "推荐指数": "4",
+        "能量KJ": "332",
+        "蛋白g": "15",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "52"
+      },
+      {
+        "名称": "牡蛎",
+        "分类": "水产品",
+        "推荐指数": "9",
+        "能量KJ": "339",
+        "蛋白g": "9",
+        "脂肪g": "2",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "50"
+      },
+      {
+        "名称": "白鲑",
+        "分类": "水产品",
+        "推荐指数": "4",
+        "能量KJ": "611",
+        "蛋白g": "17",
+        "脂肪g": "8",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "65"
+      },
+      {
+        "名称": "石斑鱼",
+        "分类": "水产品",
+        "推荐指数": "9",
+        "能量KJ": "385",
+        "蛋白g": "19",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "37"
+      },
+      {
+        "名称": "章鱼",
+        "分类": "水产品",
+        "推荐指数": "9",
+        "能量KJ": "343",
+        "蛋白g": "14",
+        "脂肪g": "1",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "48"
+      },
+      {
+        "名称": "虾",
+        "分类": "水产品",
+        "推荐指数": "2",
+        "能量KJ": "297",
+        "蛋白g": "13",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "126"
+      },
+      {
+        "名称": "蛤蜊",
+        "分类": "水产品",
+        "推荐指数": "4",
+        "能量KJ": "360",
+        "蛋白g": "14",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "1",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "30"
+      },
+      {
+        "名称": "蟹",
+        "分类": "水产品",
+        "推荐指数": "9",
+        "能量KJ": "364",
+        "蛋白g": "18",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "78"
+      },
+      {
+        "名称": "贻贝",
+        "分类": "水产品",
+        "推荐指数": "5",
+        "能量KJ": "360",
+        "蛋白g": "11",
+        "脂肪g": "2",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "28"
+      },
+      {
+        "名称": "金枪鱼",
+        "分类": "水产品",
+        "推荐指数": "7",
+        "能量KJ": "602",
+        "蛋白g": "23",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "38"
+      },
+      {
+        "名称": "鱼子酱",
+        "分类": "水产品",
+        "推荐指数": "-2",
+        "能量KJ": "1105",
+        "蛋白g": "24",
+        "脂肪g": "17",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "588"
+      },
+      {
+        "名称": "鱿鱼",
+        "分类": "水产品",
+        "推荐指数": "5",
+        "能量KJ": "385",
+        "蛋白g": "15",
+        "脂肪g": "1",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "233"
+      },
+      {
+        "名称": "鲈鱼",
+        "分类": "水产品",
+        "推荐指数": "8",
+        "能量KJ": "381",
+        "蛋白g": "19",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "90"
+      },
+      {
+        "名称": "鲍鱼",
+        "分类": "水产品",
+        "推荐指数": "5",
+        "能量KJ": "439",
+        "蛋白g": "17",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "85"
+      },
+      {
+        "名称": "鲟鱼",
+        "分类": "水产品",
+        "推荐指数": "5",
+        "能量KJ": "439",
+        "蛋白g": "16",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "60"
+      },
+      {
+        "名称": "鲤鱼",
+        "分类": "水产品",
+        "推荐指数": "4",
+        "能量KJ": "531",
+        "蛋白g": "17",
+        "脂肪g": "5",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "66"
+      },
+      {
+        "名称": "鲭鱼",
+        "分类": "水产品",
+        "推荐指数": "3",
+        "能量KJ": "858",
+        "蛋白g": "18",
+        "脂肪g": "13",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "70"
+      },
+      {
+        "名称": "鲱鱼",
+        "分类": "水产品",
+        "推荐指数": "0",
+        "能量KJ": "661",
+        "蛋白g": "17",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "60"
+      },
+      {
+        "名称": "鲶鱼",
+        "分类": "水产品",
+        "推荐指数": "7",
+        "能量KJ": "519",
+        "蛋白g": "20",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "59"
+      },
+      {
+        "名称": "鲷鱼",
+        "分类": "水产品",
+        "推荐指数": "8",
+        "能量KJ": "418",
+        "蛋白g": "20",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "37"
+      },
+      {
+        "名称": "鲽鱼",
+        "分类": "水产品",
+        "推荐指数": "2",
+        "能量KJ": "294",
+        "蛋白g": "12",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "45"
+      },
+      {
+        "名称": "鳕鱼",
+        "分类": "水产品",
+        "推荐指数": "8",
+        "能量KJ": "364",
+        "蛋白g": "18",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "41"
+      },
+      {
+        "名称": "鳗鱼",
+        "分类": "水产品",
+        "推荐指数": "2",
+        "能量KJ": "770",
+        "蛋白g": "18",
+        "脂肪g": "11",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "126"
+      },
+      {
+        "名称": "鳟鱼",
+        "分类": "水产品",
+        "推荐指数": "5",
+        "能量KJ": "619",
+        "蛋白g": "20",
+        "脂肪g": "6",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "58"
+      },
+      {
+        "名称": "沙丁鱼",
+        "分类": "水产品",
+        "推荐指数": "8",
+        "能量KJ": "347",
+        "蛋白g": "0",
+        "脂肪g": "1",
+        "碳水化合物g": "19",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "黄尾",
+        "分类": "水产品",
+        "推荐指数": "6",
+        "能量KJ": "611",
+        "蛋白g": "23",
+        "脂肪g": "5",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "55"
+      },
+      {
+        "名称": "龙虾",
+        "分类": "水产品",
+        "推荐指数": "5",
+        "能量KJ": "324",
+        "蛋白g": "16",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "127"
+      },
+      {
+        "名称": "无花果",
+        "分类": "水果",
+        "推荐指数": "7",
+        "能量KJ": "310",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "19",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "李子",
+        "分类": "水果",
+        "推荐指数": "21",
+        "能量KJ": "192",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "杏",
+        "分类": "水果",
+        "推荐指数": "17",
+        "能量KJ": "201",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "杨桃",
+        "分类": "水果",
+        "推荐指数": "41",
+        "能量KJ": "128",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "枣",
+        "分类": "水果",
+        "推荐指数": "15",
+        "能量KJ": "1176",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "72",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "柠檬",
+        "分类": "水果",
+        "推荐指数": "41",
+        "能量KJ": "121",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "柿子",
+        "分类": "水果",
+        "推荐指数": "23",
+        "能量KJ": "293",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "18",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "桃",
+        "分类": "水果",
+        "推荐指数": "17",
+        "能量KJ": "165",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "桑葚",
+        "分类": "水果",
+        "推荐指数": "37",
+        "能量KJ": "180",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "梨",
+        "分类": "水果",
+        "推荐指数": "39",
+        "能量KJ": "239",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "15",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "榴莲",
+        "分类": "水果",
+        "推荐指数": "39",
+        "能量KJ": "615",
+        "蛋白g": "1",
+        "脂肪g": "5",
+        "碳水化合物g": "27",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "樱桃",
+        "分类": "水果",
+        "推荐指数": "24",
+        "能量KJ": "1395",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "80",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "哈密瓜",
+        "分类": "水果",
+        "推荐指数": "19",
+        "能量KJ": "141",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "8",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橘子",
+        "分类": "水果",
+        "推荐指数": "17",
+        "能量KJ": "197",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橙汁",
+        "分类": "水果",
+        "推荐指数": "37",
+        "能量KJ": "188",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "10",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橙皮",
+        "分类": "水果",
+        "推荐指数": "21",
+        "能量KJ": "405",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "25",
+        "淀粉g": "0",
+        "总膳食纤维g": "10",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橙菠萝汁",
+        "分类": "水果",
+        "推荐指数": "5",
+        "能量KJ": "214",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "12",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "油桃",
+        "分类": "水果",
+        "推荐指数": "16",
+        "能量KJ": "185",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "10",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "猕猴桃",
+        "分类": "水果",
+        "推荐指数": "31",
+        "能量KJ": "255",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜瓜",
+        "分类": "水果",
+        "推荐指数": "5",
+        "能量KJ": "150",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "番木瓜",
+        "分类": "水果",
+        "推荐指数": "31",
+        "能量KJ": "179",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "10",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "石榴",
+        "分类": "水果",
+        "推荐指数": "36",
+        "能量KJ": "346",
+        "蛋白g": "1",
+        "脂肪g": "1",
+        "碳水化合物g": "18",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "红苹果",
+        "分类": "水果",
+        "推荐指数": "21",
+        "能量KJ": "247",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芒果",
+        "分类": "水果",
+        "推荐指数": "6",
+        "能量KJ": "250",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "苹果",
+        "分类": "水果",
+        "推荐指数": "21",
+        "能量KJ": "218",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "苹果汁",
+        "分类": "水果",
+        "推荐指数": "-12",
+        "能量KJ": "191",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "草莓",
+        "分类": "水果",
+        "推荐指数": "34",
+        "能量KJ": "136",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "荔枝",
+        "分类": "水果",
+        "推荐指数": "16",
+        "能量KJ": "276",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "16",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菠萝",
+        "分类": "水果",
+        "推荐指数": "18",
+        "能量KJ": "209",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菠萝蜜",
+        "分类": "水果",
+        "推荐指数": "23",
+        "能量KJ": "397",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "23",
+        "淀粉g": "1",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葡萄",
+        "分类": "水果",
+        "推荐指数": "34",
+        "能量KJ": "280",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葡萄干",
+        "分类": "水果",
+        "推荐指数": "-15",
+        "能量KJ": "264",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "15",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葡萄柚",
+        "分类": "水果",
+        "推荐指数": "40",
+        "能量KJ": "134",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "8",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蓝莓",
+        "分类": "水果",
+        "推荐指数": "41",
+        "能量KJ": "240",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蔓越莓",
+        "分类": "水果",
+        "推荐指数": "30",
+        "能量KJ": "191",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "西瓜",
+        "分类": "水果",
+        "推荐指数": "23",
+        "能量KJ": "127",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "覆盆子",
+        "分类": "水果",
+        "推荐指数": "33",
+        "能量KJ": "220",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "面包果酱",
+        "分类": "水果",
+        "推荐指数": "7",
+        "能量KJ": "431",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "27",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "香蕉",
+        "分类": "水果",
+        "推荐指数": "21",
+        "能量KJ": "371",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "22",
+        "淀粉g": "5",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "鳄梨",
+        "分类": "水果",
+        "推荐指数": "32",
+        "能量KJ": "670",
+        "蛋白g": "2",
+        "脂肪g": "14",
+        "碳水化合物g": "8",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "黑莓",
+        "分类": "水果",
+        "推荐指数": "53",
+        "能量KJ": "181",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "龙眼",
+        "分类": "水果",
+        "推荐指数": "43",
+        "能量KJ": "251",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "15",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "番茄汤",
+        "分类": "汤",
+        "推荐指数": "3",
+        "能量KJ": "165",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "土豆蔬菜汤",
+        "分类": "汤",
+        "推荐指数": "-1",
+        "能量KJ": "126",
+        "蛋白g": "1",
+        "脂肪g": "1",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "1"
+      },
+      {
+        "名称": "素食蔬菜汤",
+        "分类": "汤",
+        "推荐指数": "-4",
+        "能量KJ": "119",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "火腿",
+        "分类": "肉类",
+        "推荐指数": "-2",
+        "能量KJ": "683",
+        "蛋白g": "16",
+        "脂肪g": "8",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "57"
+      },
+      {
+        "名称": "火鸡",
+        "分类": "肉类",
+        "推荐指数": "3",
+        "能量KJ": "790",
+        "蛋白g": "28",
+        "脂肪g": "7",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "109"
+      },
+      {
+        "名称": "烟熏火腿",
+        "分类": "肉类",
+        "推荐指数": "-4",
+        "能量KJ": "591",
+        "蛋白g": "18",
+        "脂肪g": "2",
+        "碳水化合物g": "10",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "50"
+      },
+      {
+        "名称": "烤肉",
+        "分类": "肉类",
+        "推荐指数": "-3",
+        "能量KJ": "1512",
+        "蛋白g": "20",
+        "脂肪g": "30",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "105"
+      },
+      {
+        "名称": "烤鸭",
+        "分类": "肉类",
+        "推荐指数": "-3",
+        "能量KJ": "1410",
+        "蛋白g": "18",
+        "脂肪g": "28",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "84"
+      },
+      {
+        "名称": "烧鹅",
+        "分类": "肉类",
+        "推荐指数": "-1",
+        "能量KJ": "1276",
+        "蛋白g": "25",
+        "脂肪g": "21",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "91"
+      },
+      {
+        "名称": "牛肉汤",
+        "分类": "肉类",
+        "推荐指数": "-4",
+        "能量KJ": "25",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "牛肉瘦",
+        "分类": "肉类",
+        "推荐指数": "1",
+        "能量KJ": "488",
+        "蛋白g": "23",
+        "脂肪g": "2",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "55"
+      },
+      {
+        "名称": "牛肉肥",
+        "分类": "肉类",
+        "推荐指数": "-12",
+        "能量KJ": "2845",
+        "蛋白g": "10",
+        "脂肪g": "70",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "95"
+      },
+      {
+        "名称": "牛蛙",
+        "分类": "肉类",
+        "推荐指数": "1",
+        "能量KJ": "305",
+        "蛋白g": "16",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "50"
+      },
+      {
+        "名称": "猪培根",
+        "分类": "肉类",
+        "推荐指数": "-12",
+        "能量KJ": "1744",
+        "蛋白g": "12",
+        "脂肪g": "39",
+        "碳水化合物g": "1",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "66"
+      },
+      {
+        "名称": "猪头肉",
+        "分类": "肉类",
+        "推荐指数": "-10",
+        "能量KJ": "658",
+        "蛋白g": "13",
+        "脂肪g": "10",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "69"
+      },
+      {
+        "名称": "猪瘦肉",
+        "分类": "肉类",
+        "推荐指数": "5",
+        "能量KJ": "562",
+        "蛋白g": "21",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "64"
+      },
+      {
+        "名称": "猪耳朵",
+        "分类": "肉类",
+        "推荐指数": "0",
+        "能量KJ": "695",
+        "蛋白g": "15",
+        "脂肪g": "10",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "90"
+      },
+      {
+        "名称": "猪肝",
+        "分类": "肉类",
+        "推荐指数": "9",
+        "能量KJ": "690",
+        "蛋白g": "26",
+        "脂肪g": "4",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "355"
+      },
+      {
+        "名称": "猪脑",
+        "分类": "肉类",
+        "推荐指数": "-6",
+        "能量KJ": "577",
+        "蛋白g": "12",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "2552"
+      },
+      {
+        "名称": "猪蹄",
+        "分类": "肉类",
+        "推荐指数": "-5",
+        "能量KJ": "889",
+        "蛋白g": "23",
+        "脂肪g": "12",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "88"
+      },
+      {
+        "名称": "瘦羊肉",
+        "分类": "肉类",
+        "推荐指数": "5",
+        "能量KJ": "862",
+        "蛋白g": "28",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "92"
+      },
+      {
+        "名称": "肉丸",
+        "分类": "肉类",
+        "推荐指数": "-12",
+        "能量KJ": "1196",
+        "蛋白g": "14",
+        "脂肪g": "22",
+        "碳水化合物g": "8",
+        "淀粉g": "2",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "66"
+      },
+      {
+        "名称": "肥猪肉",
+        "分类": "肉类",
+        "推荐指数": "-13",
+        "能量KJ": "2449",
+        "蛋白g": "10",
+        "脂肪g": "60",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "81"
+      },
+      {
+        "名称": "肥羊肉",
+        "分类": "肉类",
+        "推荐指数": "-13",
+        "能量KJ": "2782",
+        "蛋白g": "6",
+        "脂肪g": "70",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "90"
+      },
+      {
+        "名称": "鸡心",
+        "分类": "肉类",
+        "推荐指数": "5",
+        "能量KJ": "640",
+        "蛋白g": "15",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "136"
+      },
+      {
+        "名称": "鸡汤",
+        "分类": "肉类",
+        "推荐指数": "-6",
+        "能量KJ": "26",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "2"
+      },
+      {
+        "名称": "鸡肉",
+        "分类": "肉类",
+        "推荐指数": "-1",
+        "能量KJ": "604",
+        "蛋白g": "28",
+        "脂肪g": "3",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "86"
+      },
+      {
+        "名称": "鸡肝",
+        "分类": "肉类",
+        "推荐指数": "6",
+        "能量KJ": "496",
+        "蛋白g": "16",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "345"
+      },
+      {
+        "名称": "鹅肝",
+        "分类": "肉类",
+        "推荐指数": "10",
+        "能量KJ": "556",
+        "蛋白g": "16",
+        "脂肪g": "4",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "515"
+      },
+      {
+        "名称": "鹌鹑",
+        "分类": "肉类",
+        "推荐指数": "2",
+        "能量KJ": "803",
+        "蛋白g": "19",
+        "脂肪g": "12",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "76"
+      },
+      {
+        "名称": "南瓜",
+        "分类": "蔬菜",
+        "推荐指数": "55",
+        "能量KJ": "109",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "卷心菜",
+        "分类": "蔬菜",
+        "推荐指数": "43",
+        "能量KJ": "103",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "四季豆",
+        "分类": "蔬菜",
+        "推荐指数": "62",
+        "能量KJ": "131",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "土豆",
+        "分类": "蔬菜",
+        "推荐指数": "52",
+        "能量KJ": "322",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "淀粉g": "15",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "土豆面粉",
+        "分类": "蔬菜",
+        "推荐指数": "54",
+        "能量KJ": "1493",
+        "蛋白g": "6",
+        "脂肪g": "0",
+        "碳水化合物g": "83",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "大白菜",
+        "分类": "蔬菜",
+        "推荐指数": "61",
+        "能量KJ": "55",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "大蒜",
+        "分类": "蔬菜",
+        "推荐指数": "42",
+        "能量KJ": "623",
+        "蛋白g": "6",
+        "脂肪g": "0",
+        "碳水化合物g": "33",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "大豆",
+        "分类": "蔬菜",
+        "推荐指数": "59",
+        "能量KJ": "614",
+        "蛋白g": "12",
+        "脂肪g": "6",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小南瓜",
+        "分类": "蔬菜",
+        "推荐指数": "0",
+        "能量KJ": "69",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小萝卜",
+        "分类": "蔬菜",
+        "推荐指数": "59",
+        "能量KJ": "76",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "山药",
+        "分类": "蔬菜",
+        "推荐指数": "52",
+        "能量KJ": "343",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "20",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "扁豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "54",
+        "能量KJ": "1473",
+        "蛋白g": "24",
+        "脂肪g": "1",
+        "碳水化合物g": "63",
+        "淀粉g": "49",
+        "总膳食纤维g": "10",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "木薯",
+        "分类": "蔬菜",
+        "推荐指数": "38",
+        "能量KJ": "667",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "38",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "洋葱",
+        "分类": "蔬菜",
+        "推荐指数": "46",
+        "能量KJ": "166",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "炒蘑菇",
+        "分类": "蔬菜",
+        "推荐指数": "9",
+        "能量KJ": "110",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "炒香菇",
+        "分类": "蔬菜",
+        "推荐指数": "7",
+        "能量KJ": "162",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "牛蒡根",
+        "分类": "蔬菜",
+        "推荐指数": "68",
+        "能量KJ": "302",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甘薯",
+        "分类": "蔬菜",
+        "推荐指数": "43",
+        "能量KJ": "359",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "20",
+        "淀粉g": "12",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜椒",
+        "分类": "蔬菜",
+        "推荐指数": "55",
+        "能量KJ": "84",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜玉米",
+        "分类": "蔬菜",
+        "推荐指数": "46",
+        "能量KJ": "360",
+        "蛋白g": "3",
+        "脂肪g": "1",
+        "碳水化合物g": "18",
+        "淀粉g": "5",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜菜",
+        "分类": "蔬菜",
+        "推荐指数": "58",
+        "能量KJ": "180",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜菜叶",
+        "分类": "蔬菜",
+        "推荐指数": "60",
+        "能量KJ": "92",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "生姜",
+        "分类": "蔬菜",
+        "推荐指数": "66",
+        "能量KJ": "75",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "生菜",
+        "分类": "蔬菜",
+        "推荐指数": "56",
+        "能量KJ": "62",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "番茄汁",
+        "分类": "蔬菜",
+        "推荐指数": "0",
+        "能量KJ": "72",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "白菜",
+        "分类": "蔬菜",
+        "推荐指数": "55",
+        "能量KJ": "48",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "1",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "白萝卜",
+        "分类": "蔬菜",
+        "推荐指数": "61",
+        "能量KJ": "59",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "白蘑菇",
+        "分类": "蔬菜",
+        "推荐指数": "53",
+        "能量KJ": "93",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "秋葵",
+        "分类": "蔬菜",
+        "推荐指数": "54",
+        "能量KJ": "138",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "竹笋",
+        "分类": "蔬菜",
+        "推荐指数": "61",
+        "能量KJ": "115",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "红心萝卜",
+        "分类": "蔬菜",
+        "推荐指数": "62",
+        "能量KJ": "132",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "红豆",
+        "分类": "蔬菜",
+        "推荐指数": "20",
+        "能量KJ": "121",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "绿豆",
+        "分类": "蔬菜",
+        "推荐指数": "20",
+        "能量KJ": "126",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "羽衣甘蓝",
+        "分类": "蔬菜",
+        "推荐指数": "63",
+        "能量KJ": "207",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "8",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "胡萝卜",
+        "分类": "蔬菜",
+        "推荐指数": "41",
+        "能量KJ": "173",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "1",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芋头",
+        "分类": "蔬菜",
+        "推荐指数": "56",
+        "能量KJ": "469",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "26",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芝麻",
+        "分类": "蔬菜",
+        "推荐指数": "53",
+        "能量KJ": "2397",
+        "蛋白g": "17",
+        "脂肪g": "49",
+        "碳水化合物g": "23",
+        "淀粉g": "0",
+        "总膳食纤维g": "11",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芥末",
+        "分类": "蔬菜",
+        "推荐指数": "63",
+        "能量KJ": "114",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芦笋",
+        "分类": "蔬菜",
+        "推荐指数": "61",
+        "能量KJ": "85",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "花椒",
+        "分类": "蔬菜",
+        "推荐指数": "61",
+        "能量KJ": "80",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "花椰菜",
+        "分类": "蔬菜",
+        "推荐指数": "56",
+        "能量KJ": "104",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芹菜",
+        "分类": "蔬菜",
+        "推荐指数": "52",
+        "能量KJ": "67",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "苦瓜",
+        "分类": "蔬菜",
+        "推荐指数": "53",
+        "能量KJ": "126",
+        "蛋白g": "5",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "茄子",
+        "分类": "蔬菜",
+        "推荐指数": "52",
+        "能量KJ": "104",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "苋菜叶",
+        "分类": "蔬菜",
+        "推荐指数": "33",
+        "能量KJ": "97",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菊苣",
+        "分类": "蔬菜",
+        "推荐指数": "61",
+        "能量KJ": "71",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菜豆",
+        "分类": "蔬菜",
+        "推荐指数": "59",
+        "能量KJ": "280",
+        "蛋白g": "6",
+        "脂肪g": "0",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菠菜",
+        "分类": "蔬菜",
+        "推荐指数": "59",
+        "能量KJ": "97",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蕨类",
+        "分类": "蔬菜",
+        "推荐指数": "61",
+        "能量KJ": "143",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "藜",
+        "分类": "蔬菜",
+        "推荐指数": "65",
+        "能量KJ": "180",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蘑菇",
+        "分类": "蔬菜",
+        "推荐指数": "54",
+        "能量KJ": "141",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "西兰花",
+        "分类": "蔬菜",
+        "推荐指数": "60",
+        "能量KJ": "141",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "西红柿",
+        "分类": "蔬菜",
+        "推荐指数": "63",
+        "能量KJ": "74",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "豆芽",
+        "分类": "蔬菜",
+        "推荐指数": "57",
+        "能量KJ": "510",
+        "蛋白g": "13",
+        "脂肪g": "6",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "豇豆",
+        "分类": "蔬菜",
+        "推荐指数": "60",
+        "能量KJ": "376",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "18",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "豌豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "62",
+        "能量KJ": "1435",
+        "蛋白g": "21",
+        "脂肪g": "1",
+        "碳水化合物g": "62",
+        "淀粉g": "0",
+        "总膳食纤维g": "15",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "辣椒",
+        "分类": "蔬菜",
+        "推荐指数": "48",
+        "能量KJ": "88",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "韭菜",
+        "分类": "蔬菜",
+        "推荐指数": "38",
+        "能量KJ": "126",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "香菇",
+        "分类": "蔬菜",
+        "推荐指数": "56",
+        "能量KJ": "160",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "黄瓜",
+        "分类": "蔬菜",
+        "推荐指数": "52",
+        "能量KJ": "65",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "水煮蛋",
+        "分类": "蛋类",
+        "推荐指数": "-4",
+        "能量KJ": "597",
+        "蛋白g": "12",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "370"
+      },
+      {
+        "名称": "炒蛋",
+        "分类": "蛋类",
+        "推荐指数": "-6",
+        "能量KJ": "621",
+        "蛋白g": "9",
+        "脂肪g": "10",
+        "碳水化合物g": "1",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "277"
+      },
+      {
+        "名称": "煎蛋",
+        "分类": "蛋类",
+        "推荐指数": "-7",
+        "能量KJ": "643",
+        "蛋白g": "10",
+        "脂肪g": "11",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "313"
+      },
+      {
+        "名称": "鸡蛋",
+        "分类": "蛋类",
+        "推荐指数": "-3",
+        "能量KJ": "599",
+        "蛋白g": "12",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "372"
+      },
+      {
+        "名称": "鸡蛋白",
+        "分类": "蛋类",
+        "推荐指数": "4",
+        "能量KJ": "216",
+        "蛋白g": "10",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "鸡蛋黄",
+        "分类": "蛋类",
+        "推荐指数": "-8",
+        "能量KJ": "1346",
+        "蛋白g": "15",
+        "脂肪g": "26",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "1085"
+      },
+      {
+        "名称": "鹌鹑蛋",
+        "分类": "蛋类",
+        "推荐指数": "-3",
+        "能量KJ": "663",
+        "蛋白g": "13",
+        "脂肪g": "11",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "844"
+      },
+      {
+        "名称": "利马豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "13",
+        "能量KJ": "1414",
+        "蛋白g": "21",
+        "脂肪g": "0",
+        "碳水化合物g": "63",
+        "淀粉g": "0",
+        "总膳食纤维g": "19",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "大豆面粉",
+        "分类": "豆类及豆制品",
+        "推荐指数": "6",
+        "能量KJ": "1816",
+        "蛋白g": "37",
+        "脂肪g": "20",
+        "碳水化合物g": "31",
+        "淀粉g": "0",
+        "总膳食纤维g": "9",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "嫩豆腐",
+        "分类": "豆类及豆制品",
+        "推荐指数": "6",
+        "能量KJ": "253",
+        "蛋白g": "7",
+        "脂肪g": "3",
+        "碳水化合物g": "1",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "纳豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "7",
+        "能量KJ": "883",
+        "蛋白g": "19",
+        "脂肪g": "11",
+        "碳水化合物g": "12",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "羽扇豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "12",
+        "能量KJ": "1554",
+        "蛋白g": "36",
+        "脂肪g": "9",
+        "碳水化合物g": "40",
+        "淀粉g": "0",
+        "总膳食纤维g": "18",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "老豆腐",
+        "分类": "豆类及豆制品",
+        "推荐指数": "7",
+        "能量KJ": "326",
+        "蛋白g": "9",
+        "脂肪g": "4",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "花生",
+        "分类": "豆类及豆制品",
+        "推荐指数": "1",
+        "能量KJ": "2374",
+        "蛋白g": "25",
+        "脂肪g": "49",
+        "碳水化合物g": "16",
+        "淀粉g": "0",
+        "总膳食纤维g": "8",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "花生酱",
+        "分类": "豆类及豆制品",
+        "推荐指数": "-6",
+        "能量KJ": "2464",
+        "蛋白g": "24",
+        "脂肪g": "49",
+        "碳水化合物g": "21",
+        "淀粉g": "4",
+        "总膳食纤维g": "8",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蚕豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "14",
+        "能量KJ": "1425",
+        "蛋白g": "26",
+        "脂肪g": "1",
+        "碳水化合物g": "58",
+        "淀粉g": "0",
+        "总膳食纤维g": "25",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "豆浆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "5",
+        "能量KJ": "226",
+        "蛋白g": "3",
+        "脂肪g": "1",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "鹰嘴豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "8",
+        "能量KJ": "1581",
+        "蛋白g": "20",
+        "脂肪g": "6",
+        "碳水化合物g": "62",
+        "淀粉g": "0",
+        "总膳食纤维g": "12",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "黄豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "14",
+        "能量KJ": "1443",
+        "蛋白g": "22",
+        "脂肪g": "2",
+        "碳水化合物g": "60",
+        "淀粉g": "0",
+        "总膳食纤维g": "25",
+        "胆固醇mg": "0"
+      }
+    ]
+  },
+  "菌群检出详细列表": {
+    "核心菌属": [
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.1303",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "11%",
+        "检出率%": "99.52%",
+        "说明": "说明:多导致人体炎症;致病;导致菌群失衡;产丁酸;肥胖人群丰度较高;参与胆汁酸代谢;对抗艰难梭菌;"
+      },
+      {
+        "名称": "普雷沃氏菌属 Prevotella",
+        "丰度%": "0.4876",
+        "正常范围%": "0.3652-81.2736",
+        "人群水平%": "25%",
+        "检出率%": "99.52%",
+        "说明": "说明:核心菌,健康的植物性饮食相关菌,在自闭症、多发性硬化中减少;丰度高促炎,加剧过敏、"
+      },
+      {
+        "名称": "瘤胃球菌属 Ruminococcus",
+        "丰度%": "0.5747",
+        "正常范围%": "0.266-33.2664",
+        "人群水平%": "34%",
+        "检出率%": "99.52%",
+        "说明": "说明:消化抗性淀粉、纤维素,丰度高促进肠炎和过敏相关疾病,"
+      },
+      {
+        "名称": "拟杆菌属 Bacteroides",
+        "丰度%": "58.0864"
+      },
+      {
+        "名称": "1.0292-55.9251",
+        "丰度%": "92%",
+        "检出率%": "99.04%",
+        "说明": "说明:基石菌,消化蔬菜和谷食,蛋白,降解复杂多糖,交叉喂养关键菌,维持免疫和肠道稳态,"
+      },
+      {
+        "名称": "优杆菌属 Eubacterium",
+        "丰度%": "0.2606",
+        "正常范围%": "0.0574-5.8432",
+        "人群水平%": "45%",
+        "检出率%": "98.56%",
+        "说明": "说明:基石菌,产短链脂肪酸尤其丁酸,有助于肠道健康,降解胆固醇、调节餐后血糖、"
+      },
+      {
+        "名称": "Lachnoclostridium",
+        "丰度%": "1.7121",
+        "正常范围%": "0.117-6.2036",
+        "人群水平%": "79%",
+        "检出率%": "98.56%",
+        "说明": "说明:丁酸,与内脏脂肪积累相关,与肥胖、高血压、糖尿病正相关,与肠道炎症、肠癌和阿尔茨海默病进展有关,"
+      },
+      {
+        "名称": "粪杆菌属 Faecalibacterium",
+        "丰度%": "1.8959"
+      },
+      {
+        "名称": "5.1543-18.1656",
+        "丰度%": "45%",
+        "检出率%": "98.08%",
+        "说明": "说明:基石菌,丁酸生产菌,下一代"
+      },
+      {
+        "名称": "经黏液真杆菌属 Blautia",
+        "丰度%": "0.1869"
+      },
+      {
+        "名称": "0.3366-3.237",
+        "丰度%": "31%",
+        "检出率%": "97.60%",
+        "说明": "说明:消化复合碳水化合物,健康菌,偏低与炎症肠病,营养不良相关,减肥有效菌,缓解炎症性疾病和代谢疾病,"
+      },
+      {
+        "名称": "毛螺菌属 Lachnospira",
+        "丰度%": "0.2574",
+        "正常范围%": "0-4.805",
+        "人群水平%": "65%",
+        "检出率%": "88.94%",
+        "说明": "说明:基石菌,发酵代谢膳食纤维,利用果蔬果胶产生乙酸,丁酸,与睡眠质量呈负相关,过少与多种疾病相关,"
+      },
+      {
+        "名称": "考拉杆菌属 Phascolarctobacterium",
+        "丰度%": "0.0167",
+        "正常范围%": "0-8.8711",
+        "人群水平%": "21%",
+        "检出率%": "88.94%",
+        "说明": "说明:东方人肠道的核心菌属,高易减肥,与水果蔬菜摄入相关,随年龄增加,在重度抑郁、阿尔茨海默病(AD)、自闭症儿童富集,"
+      },
+      {
+        "名称": "巨单胞菌属 Megamonas",
+        "丰度%": "0.1404",
+        "正常范围%": "0-21.672",
+        "人群水平%": "65%",
+        "检出率%": "87.50%",
+        "说明": "说明:发酵各种碳水化合物、产乙酸、丙酸、乳酸,自闭症谱系障碍、注意缺陷、多动障碍 (ADHD)急性脑卒中(AIS)"
+      },
+      {
+        "名称": "粪球菌属 Coprococcus",
+        "丰度%": "0.0501",
+        "正常范围%": "0-3.618",
+        "人群水平%": "40%",
+        "检出率%": "86.06%",
+        "说明": "说明:可产丁酸,抑制免疫反应,降低过敏,抑郁、帕金森、认知障碍、便秘,慢性肾病、虚弱者减少,过多导致菌群紊乱,"
+      },
+      {
+        "名称": "双歧杆菌属 Bifidobacterium",
+        "丰度%": "0.2973",
+        "正常范围%": "0.1914-14.598",
+        "人群水平%": "53%",
+        "检出率%": "97.12%",
+        "说明": "说明:最重要的"
+      }
+    ],
+    "益生菌": [
+      {
+        "名称": "拟杆菌门 Bacteroidetes",
+        "丰度%": "59.687%",
+        "人群水平%": "82%",
+        "检出率%": "98.03%"
+      },
+      {
+        "名称": "厚壁菌门 Firmicutes",
+        "丰度%": "28.886%",
+        "人群水平%": "38%",
+        "检出率%": "98.95%"
+      },
+      {
+        "名称": "变形菌门 Proteobacteria",
+        "丰度%": "10.499%",
+        "人群水平%": "57%",
+        "检出率%": "93.53%"
+      },
+      {
+        "名称": "放线菌门 Actinobacteria",
+        "丰度%": "0.454%",
+        "人群水平%": "47%",
+        "检出率%": "94.62%"
+      },
+      {
+        "名称": "螺旋体 Spirochaetes",
+        "丰度%": "0.211%",
+        "人群水平%": "99%",
+        "检出率%": "4.04%"
+      },
+      {
+        "名称": "厚壁菌/拟杆菌32.6%",
+        "丰度%": "67.4%"
+      },
+      {
+        "名称": "您的厚壁菌比拟杆菌比值为:",
+        "丰度%": "0.48"
+      },
+      {
+        "名称": "核心菌属",
+        "丰度%": "77"
+      }
+    ],
+    "有害菌属": [
+      {
+        "名称": "埃希氏菌属 Escherichia",
+        "丰度%": "0.2039",
+        "正常范围%": "0-9.3023",
+        "人群水平%": "28%",
+        "检出率%": "99.52%",
+        "说明": "说明:正常菌属,条件致病菌,过多致病,导致菌群失衡"
+      },
+      {
+        "名称": "Streptococcus",
+        "丰度%": "0.9629",
+        "正常范围%": "0-1.3257",
+        "人群水平%": "84%",
+        "检出率%": "99.52%",
+        "说明": "说明:可引起化脓性炎症,个别菌为"
+      },
+      {
+        "名称": "脱硫弧菌属 Desulfovibrio",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0999",
+        "人群水平%": "51%",
+        "检出率%": "33.65%",
+        "说明": "说明:属于变形菌门,产生硫化氢,导致炎症、腹泻,对肠道上皮具有毒性,导致胃肠道疾病,约50%人群的口腔和肠道会携带,"
+      },
+      {
+        "名称": "螺杆菌属 Helicobacter",
+        "丰度%": "ND",
+        "正常范围%": "0-0.036",
+        "人群水平%": "86%",
+        "检出率%": "22.12%",
+        "说明": "说明:革兰氏阴性菌,微需氧菌,该菌属下的一些菌种被发现在人类上消化道内壁,部分种为致病菌,"
+      },
+      {
+        "名称": "弓形菌属 Arcobacter",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0066",
+        "人群水平%": "96%",
+        "检出率%": "7.69%",
+        "说明": "说明:好氧菌,腹泻致病菌,与河流海洋污染相关的潜在"
+      }
+    ],
+    "其它重要菌属": [
+      {
+        "名称": "柯林斯氏菌属 Collinsella",
+        "丰度%": "ND",
+        "正常范围%": "0-5.7436",
+        "人群水平%": "15%",
+        "检出率%": "90.38%",
+        "说明": "说明:产气菌,与脂质代谢及心脑血管相关,过多可导致菌群紊乱,部分"
+      }
+    ],
+    "病原菌属": [],
+    "病原菌检出": [],
+    "肥胖相关菌": [
+      {
+        "名称": "厚壁菌门 Firmicutes",
+        "丰度%": "28.8863",
+        "正常范围%": "19.3377-90.0565",
+        "人群水平%": "38%"
+      },
+      {
+        "名称": "阿德勒氏菌属 Adlercreutzia",
+        "丰度%": "ND",
+        "正常范围%": "0-0.004",
+        "人群水平%": "90%"
+      },
+      {
+        "名称": "双歧杆菌属 Bifidobacterium",
+        "丰度%": "0.2973",
+        "正常范围%": "0.1914-12.598",
+        "人群水平%": "53%"
+      },
+      {
+        "名称": "嗜胆菌属 Bilophila",
+        "丰度%": "0.2474",
+        "正常范围%": "0-0.3348",
+        "人群水平%": "82%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.1303",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "11%"
+      },
+      {
+        "名称": "埃希氏菌属 Escherichia",
+        "丰度%": "0.2039",
+        "正常范围%": "0-9.3023",
+        "人群水平%": "28%"
+      },
+      {
+        "名称": "霍尔德曼氏菌属 Holdemania",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0378",
+        "人群水平%": "50%"
+      },
+      {
+        "名称": "巨单胞菌属 Megamonas",
+        "丰度%": "0.1404",
+        "正常范围%": "0-21.672",
+        "人群水平%": "65%"
+      },
+      {
+        "名称": "震颤杆菌属 Oscillibacter",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0738",
+        "人群水平%": "51%"
+      },
+      {
+        "名称": "丹毒丝菌科 Erysipelotrichaceae",
+        "丰度%": "0.2606",
+        "正常范围%": "0-1.644365119",
+        "人群水平%": "63%"
+      },
+      {
+        "名称": "红蝽菌科 Coriobacteriaceae",
+        "丰度%": "ND",
+        "正常范围%": "0-5.852020025",
+        "人群水平%": "17%"
+      },
+      {
+        "名称": "脆弱拟杆菌 Bacteroides fragilis",
+        "丰度%": "0.5985"
+      },
+      {
+        "名称": "0-0.4212",
+        "丰度%": "70%"
+      },
+      {
+        "名称": "牙龈卟啉单胞菌 Porphyromonas gingivalis",
+        "丰度%": "ND"
+      }
+    ],
+    "便秘相关菌": [
+      {
+        "名称": "史氏甲烷短杆菌 Methanobrevibacter smithii",
+        "丰度%": "ND",
+        "正常范围%": "0-1.1952",
+        "人群水平%": "85%"
+      },
+      {
+        "名称": "粪球菌属 Coprococcus",
+        "丰度%": "0.0501",
+        "正常范围%": "0-3.618",
+        "人群水平%": "40%"
+      },
+      {
+        "名称": "埃希氏菌属 Escherichia",
+        "丰度%": "0.2039",
+        "正常范围%": "0-9.3023",
+        "人群水平%": "28%"
+      },
+      {
+        "名称": "毛螺菌属 Lachnospira",
+        "丰度%": "0.2574",
+        "正常范围%": "0-4.805",
+        "人群水平%": "65%"
+      },
+      {
+        "名称": "厌氧棍状菌属 Anaerotruncus",
+        "丰度%": "ND",
+        "正常范围%": "0-0.1328",
+        "人群水平%": "53%"
+      },
+      {
+        "名称": "葡萄球菌属 Staphylococcus",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0105",
+        "人群水平%": "78%"
+      },
+      {
+        "名称": "Streptococcus",
+        "丰度%": "0.9629",
+        "正常范围%": "0-1.3257",
+        "人群水平%": "84%"
+      },
+      {
+        "名称": "脆弱拟杆菌 Bacteroides fragilis",
+        "丰度%": "0.5985"
+      },
+      {
+        "名称": "0-0.4212",
+        "丰度%": "70%"
+      },
+      {
+        "名称": "卵形拟杆菌 Bacteroides ovatus",
+        "丰度%": "6.5138"
+      },
+      {
+        "名称": "0.0005-1.4154",
+        "丰度%": "99%"
+      },
+      {
+        "名称": "下水道菌属 Cloacibacillus",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0468",
+        "人群水平%": "72%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.1303",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "11%"
+      },
+      {
+        "名称": "肠杆菌属 Enterobacter",
+        "丰度%": "ND",
+        "正常范围%": "0-0.083",
+        "人群水平%": "42%"
+      },
+      {
+        "名称": "Erysipelatoclostridium",
+        "丰度%": "0.3812",
+        "正常范围%": "0-1.0458",
+        "人群水平%": "86%"
+      },
+      {
+        "名称": "粪杆菌属 Faecalibacterium",
+        "丰度%": "1.8959",
+        "正常范围%": "5.1543-18.1656",
+        "人群水平%": "45%"
+      },
+      {
+        "名称": "梭杆菌属 Fusobacterium",
+        "丰度%": "ND",
+        "正常范围%": "0-1.21",
+        "人群水平%": "37%"
+      },
+      {
+        "名称": "霍尔德曼穆尔菌属 Holdemanella",
+        "丰度%": "1.9496"
+      },
+      {
+        "名称": "0-0.2904",
+        "丰度%": "99%"
+      },
+      {
+        "名称": "霍尔德曼氏菌属 Holdemania",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0378",
+        "人群水平%": "50%"
+      },
+      {
+        "名称": "巨球形菌属 Megasphaera",
+        "丰度%": "ND",
+        "正常范围%": "0-0.1971",
+        "人群水平%": "28%"
+      },
+      {
+        "名称": "臭气杆菌属 Odoribacter",
+        "丰度%": "0.0501",
+        "正常范围%": "0-1.1786",
+        "人群水平%": "61%"
+      },
+      {
+        "名称": "副拟杆菌属 Parabacteroides",
+        "丰度%": "0.9561",
+        "正常范围%": "0-5.433",
+        "人群水平%": "52%"
+      },
+      {
+        "名称": "瘤胃球菌属 Ruminococcus",
+        "丰度%": "0.5747",
+        "正常范围%": "0.266-33.2664",
+        "人群水平%": "34%"
+      },
+      {
+        "名称": "双歧杆菌属 Bifidobacterium",
+        "丰度%": "0.2973",
+        "正常范围%": "0.1914-12.598",
+        "人群水平%": "53%"
+      },
+      {
+        "名称": "乳杆菌属 Lactobacillus",
+        "丰度%": "1.7054",
+        "正常范围%": "0.166-6.5835",
+        "人群水平%": "85%"
+      },
+      {
+        "名称": "阿克曼氏菌属 Akkermansia",
+        "丰度%": "ND"
+      },
+      {
+        "名称": "0.0018-7.8352",
+        "丰度%": "35%"
+      },
+      {
+        "名称": "经黏液真杆菌属 Blautia",
+        "丰度%": "0.1869"
+      },
+      {
+        "名称": "0.3366-3.237",
+        "丰度%": "31%"
+      },
+      {
+        "名称": "普雷沃氏菌属 Prevotella",
+        "丰度%": "0.4876",
+        "正常范围%": "0.3652-81.2736",
+        "人群水平%": "25%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.1303",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "11%"
+      },
+      {
+        "名称": "瘤胃球菌属 Ruminococcus",
+        "丰度%": "0.5747",
+        "正常范围%": "0.266-33.2664",
+        "人群水平%": "34%"
+      }
+    ],
+    "抑郁相关菌": [
+      {
+        "名称": "脱硫弧菌属 Desulfovibrio",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0999",
+        "人群水平%": "51%"
+      },
+      {
+        "名称": "另枝菌属 Alistipes",
+        "丰度%": "0.0133",
+        "正常范围%": "0-20.1524",
+        "人群水平%": "16%"
+      },
+      {
+        "名称": "拟杆菌属 Bacteroides",
+        "丰度%": "58.0864"
+      },
+      {
+        "名称": "1.0292-55.9251",
+        "丰度%": "92%"
+      },
+      {
+        "名称": "埃希氏菌属 Escherichia",
+        "丰度%": "0.2039",
+        "正常范围%": "0-9.3023",
+        "人群水平%": "28%"
+      },
+      {
+        "名称": "解黄酮菌属 Flavonifractor",
+        "丰度%": "0.2039",
+        "正常范围%": "0-0.415",
+        "人群水平%": "80%"
+      },
+      {
+        "名称": "震颤杆菌属 Oscillibacter",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0738",
+        "人群水平%": "51%"
+      },
+      {
+        "名称": "副拟杆菌属 Parabacteroides",
+        "丰度%": "0.9561",
+        "正常范围%": "0-5.433",
+        "人群水平%": "52%"
+      },
+      {
+        "名称": "放线菌属 Actinomyces",
+        "丰度%": "0.0868"
+      },
+      {
+        "名称": "0-0.0756",
+        "丰度%": "90%"
+      },
+      {
+        "名称": "经黏液真杆菌属 Blautia",
+        "丰度%": "0.1869"
+      },
+      {
+        "名称": "0.3366-3.237",
+        "丰度%": "31%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.1303",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "11%"
+      },
+      {
+        "名称": "爱格士氏菌属 Eggerthella",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0166",
+        "人群水平%": "55%"
+      },
+      {
+        "名称": "嗜血杆菌属 Haemophilus",
+        "丰度%": "0.1035",
+        "正常范围%": "0-0.7752",
+        "人群水平%": "74%"
+      },
+      {
+        "名称": "霍尔德曼氏菌属 Holdemania",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0378",
+        "人群水平%": "50%"
+      },
+      {
+        "名称": "克雷伯氏菌属 Klebsiella",
+        "丰度%": "0.0066",
+        "正常范围%": "0-15.81",
+        "人群水平%": "20%"
+      },
+      {
+        "名称": "副普雷沃氏菌属 Paraprevotella",
+        "丰度%": "ND",
+        "正常范围%": "0-1.998",
+        "人群水平%": "43%"
+      },
+      {
+        "名称": "副萨特氏菌属 Parasutterella",
+        "丰度%": "0.0735",
+        "正常范围%": "0-2.4003",
+        "人群水平%": "55%"
+      },
+      {
+        "名称": "普雷沃氏菌属 Prevotella",
+        "丰度%": "0.4876",
+        "正常范围%": "0.3652-81.2736",
+        "人群水平%": "25%"
+      },
+      {
+        "名称": "韦荣菌属 Veillonella",
+        "丰度%": "0.6183",
+        "正常范围%": "0-8.9142",
+        "人群水平%": "76%"
+      },
+      {
+        "名称": "单形拟杆菌 Bacteroides uniformis",
+        "丰度%": "4.1630",
+        "正常范围%": "0.0332-8.3187",
+        "人群水平%": "87%"
+      },
+      {
+        "名称": "普氏栖粪杆菌 Faecalibacterium prausnitzii",
+        "丰度%": "1.8959",
+        "正常范围%": "5.1543-18.1656",
+        "人群水平%": "46%"
+      },
+      {
+        "名称": "食葡糖罗斯拜瑞氏菌 Roseburia inulinivorans",
+        "丰度%": "0.3778",
+        "正常范围%": "0.0165-4.9966",
+        "人群水平%": "66%"
+      }
+    ],
+    "过敏相关菌": [
+      {
+        "名称": "脆弱拟杆菌 Bacteroides fragilis",
+        "丰度%": "0.5985"
+      },
+      {
+        "名称": "0-0.4212",
+        "丰度%": "70%"
+      },
+      {
+        "名称": "枸橼酸杆菌属 Citrobacter",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0668",
+        "人群水平%": "37%"
+      },
+      {
+        "名称": "克雷伯氏菌属 Klebsiella",
+        "丰度%": "0.0066",
+        "正常范围%": "0-15.81",
+        "人群水平%": "20%"
+      },
+      {
+        "名称": "莫拉氏菌属 Moraxella",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0096",
+        "人群水平%": "80%"
+      },
+      {
+        "名称": "变形菌门 Proteobacteria",
+        "丰度%": "10.4993",
+        "正常范围%": "0-21.089",
+        "人群水平%": "57%"
+      },
+      {
+        "名称": "肠杆菌科 Enterobacteriaceae",
+        "丰度%": "0.2105",
+        "正常范围%": "0-64.256",
+        "人群水平%": "18%"
+      },
+      {
+        "名称": "活泼瘤胃球菌 Ruminococcus gnavus",
+        "丰度%": "0.0468",
+        "正常范围%": "0-2.583",
+        "人群水平%": "48%"
+      },
+      {
+        "名称": "气单胞菌属 Aeromonas",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0334",
+        "人群水平%": "80%"
+      },
+      {
+        "名称": "经黏液真杆菌属 Blautia",
+        "丰度%": "0.1869"
+      },
+      {
+        "名称": "0.3366-3.237",
+        "丰度%": "31%"
+      },
+      {
+        "名称": "肠球菌属 Enterococcus",
+        "丰度%": "0.0033",
+        "正常范围%": "0-1.1362",
+        "人群水平%": "51%"
+      },
+      {
+        "名称": "粪杆菌属 Faecalibacterium",
+        "丰度%": "1.8959",
+        "正常范围%": "5.1543-18.1656",
+        "人群水平%": "45%"
+      },
+      {
+        "名称": "丙酸杆菌属 Propionibacterium",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0162",
+        "人群水平%": "91%"
+      }
+    ],
+    "腹胀相关菌": [
+      {
+        "名称": "史氏甲烷短杆菌 Methanobrevibacter smithii",
+        "丰度%": "ND",
+        "正常范围%": "0-1.1952",
+        "人群水平%": "85%"
+      },
+      {
+        "名称": "拟杆菌属 Bacteroides",
+        "丰度%": "58.0864"
+      },
+      {
+        "名称": "1.0292-55.9251",
+        "丰度%": "92%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.1303",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "11%"
+      },
+      {
+        "名称": "瘤胃球菌属 Ruminococcus",
+        "丰度%": "0.5747",
+        "正常范围%": "0.266-33.2664",
+        "人群水平%": "34%"
+      },
+      {
+        "名称": "变形菌门 Proteobacteria",
+        "丰度%": "10.4993",
+        "正常范围%": "0-21.08931741",
+        "人群水平%": "57%"
+      },
+      {
+        "名称": "艰难梭菌 Clostridium difficile",
+        "丰度%": "ND"
+      },
+      {
+        "名称": "肠球菌属 Enterococcus",
+        "丰度%": "0.0033",
+        "正常范围%": "0-1.1362",
+        "人群水平%": "51%"
+      },
+      {
+        "名称": "普雷沃氏菌属 Prevotella",
+        "丰度%": "0.4876",
+        "正常范围%": "0.3652-81.2736",
+        "人群水平%": "25%"
+      },
+      {
+        "名称": "Streptococcus",
+        "丰度%": "0.9629",
+        "正常范围%": "0-1.3257",
+        "人群水平%": "84%"
+      },
+      {
+        "名称": "蓝藻门 Cyanobacteria",
+        "丰度%": "ND",
+        "正常范围%": "0-0.052432984",
+        "人群水平%": "70%"
+      },
+      {
+        "名称": "产气荚膜梭菌 Clostridium perfringens",
+        "丰度%": "ND"
+      },
+      {
+        "名称": "乳杆菌属 Lactobacillus",
+        "丰度%": "1.7054",
+        "正常范围%": "0.166-6.5835",
+        "人群水平%": "85%"
+      },
+      {
+        "名称": "毛螺旋菌科 Lachnospiraceae",
+        "丰度%": "7.5760",
+        "正常范围%": "0.8403-66.733",
+        "人群水平%": "44%"
+      },
+      {
+        "名称": "双歧杆菌属 Bifidobacterium",
+        "丰度%": "0.2973",
+        "正常范围%": "0.1914-12.598",
+        "人群水平%": "53%"
+      }
+    ],
+    "失眠相关菌": [
+      {
+        "名称": "阿克曼氏菌属 Akkermansia",
+        "丰度%": "ND"
+      },
+      {
+        "名称": "0.0018-7.8352",
+        "丰度%": "35%"
+      },
+      {
+        "名称": "拟杆菌属 Bacteroides",
+        "丰度%": "58.0864"
+      },
+      {
+        "名称": "1.0292-55.9251",
+        "丰度%": "92%"
+      },
+      {
+        "名称": "梭菌目 Clostridiales",
+        "丰度%": "13.5329",
+        "正常范围%": "5.2999-89.2167",
+        "人群水平%": "22%"
+      },
+      {
+        "名称": "长双歧杆菌 Bifidobacterium longum",
+        "丰度%": "0.0668",
+        "正常范围%": "0-0.0996",
+        "人群水平%": "96%"
+      },
+      {
+        "名称": "经黏液真杆菌属 Blautia",
+        "丰度%": "0.1869"
+      },
+      {
+        "名称": "0.3366-3.237",
+        "丰度%": "31%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.1303",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "11%"
+      },
+      {
+        "名称": "粪杆菌属 Faecalibacterium",
+        "丰度%": "1.8959",
+        "正常范围%": "5.1543-18.1656",
+        "人群水平%": "45%"
+      },
+      {
+        "名称": "Lachnoclostridium",
+        "丰度%": "1.7121",
+        "正常范围%": "0.117-6.2036",
+        "人群水平%": "79%"
+      },
+      {
+        "名称": "普雷沃氏菌属 Prevotella",
+        "丰度%": "0.4876",
+        "正常范围%": "0.3652-81.2736",
+        "人群水平%": "25%"
+      },
+      {
+        "名称": "龙包茨氏菌属 Romboutsia",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0189",
+        "人群水平%": "73%"
+      },
+      {
+        "名称": "Streptococcus",
+        "丰度%": "0.9629",
+        "正常范围%": "0-1.3257",
+        "人群水平%": "84%"
+      },
+      {
+        "名称": "炎症性肠炎",
+        "丰度%": "0.28"
+      },
+      {
+        "名称": "colitogenicbacteria in inflammatory bowel disease. \"Cell 158.5(2014): 1000-",
+        "丰度%": "1010"
+      },
+      {
+        "名称": "肠易激综合征",
+        "丰度%": "0.13"
+      },
+      {
+        "名称": "根据您的肠道菌群中肠易激综合征患者与健康人之间的差异菌群,分析了您的肠易激综合征风险,显示分值为",
+        "丰度%": "0.13"
+      },
+      {
+        "名称": "感染性腹泻",
+        "丰度%": "0.41"
+      },
+      {
+        "名称": "抑郁症",
+        "丰度%": "0.36"
+      },
+      {
+        "名称": "甲状腺疾病",
+        "丰度%": "0.12"
+      },
+      {
+        "名称": "肺部疾病",
+        "丰度%": "0.13"
+      },
+      {
+        "名称": "自体免疫疾病",
+        "丰度%": "0.29"
+      },
+      {
+        "名称": "自闭症",
+        "丰度%": "0.10"
+      },
+      {
+        "名称": "碳水化合物",
+        "丰度%": "44"
+      },
+      {
+        "名称": "蛋白质",
+        "丰度%": "93"
+      },
+      {
+        "名称": "脂肪",
+        "丰度%": "59"
+      },
+      {
+        "名称": "纤维素",
+        "丰度%": "58"
+      },
+      {
+        "名称": "乳制品",
+        "丰度%": "66"
+      }
+    ]
+  }
+}

+ 3928 - 0
cfc-backend/src/main/resources/data/refs/儿童示例.json

@@ -0,0 +1,3928 @@
+{
+  "文件名": "儿童示例",
+  "格式": "triplet",
+  "总页数": 142,
+  "报告概述": {
+    "姓名": "儿童示例",
+    "年龄": "8岁",
+    "性别": "男",
+    "肠道预测年龄": "9.12岁",
+    "肠型": "拟杆菌型",
+    "肠道菌群平衡": "38",
+    "菌群多样性": "72",
+    "有益菌": "23",
+    "有害菌": "37",
+    "核心菌属": "65",
+    "健康总分": "70",
+    "菌群健康": "74",
+    "慢病控制": "60",
+    "营养均衡": "83"
+  },
+  "疾病风险评估": [
+    {
+      "名称": "炎症性肠炎",
+      "数值": "0.37",
+      "状态": "注意"
+    },
+    {
+      "名称": "肠易激综合征",
+      "数值": "0.17",
+      "状态": "低风险"
+    },
+    {
+      "名称": "感染性腹泻",
+      "数值": "0.41",
+      "状态": "注意"
+    },
+    {
+      "名称": "自闭症",
+      "数值": "0.45",
+      "状态": "注意"
+    },
+    {
+      "名称": "抑郁症",
+      "数值": "0.22",
+      "状态": "低风险"
+    },
+    {
+      "名称": "甲状腺疾病",
+      "数值": "0.39",
+      "状态": "注意"
+    },
+    {
+      "名称": "肺部感染或疾病",
+      "数值": "0.38",
+      "状态": "注意"
+    },
+    {
+      "名称": "自体免疫病",
+      "数值": "0.29",
+      "状态": "低风险"
+    }
+  ],
+  "主要营养评估": [
+    {
+      "名称": "碳水化合物",
+      "数值": "85",
+      "状态": "正常"
+    },
+    {
+      "名称": "蛋白质",
+      "数值": "52",
+      "状态": "正常"
+    },
+    {
+      "名称": "脂肪",
+      "数值": "62",
+      "状态": "正常"
+    },
+    {
+      "名称": "纤维素",
+      "数值": "60",
+      "状态": "正常"
+    },
+    {
+      "名称": "乳制品",
+      "数值": "28",
+      "状态": "正常"
+    }
+  ],
+  "氨基酸评估": [
+    {
+      "名称": "胱氨酸",
+      "数值": "92",
+      "状态": "正常"
+    },
+    {
+      "名称": "苯丙氨酸",
+      "数值": "87",
+      "状态": "正常"
+    },
+    {
+      "名称": "酪氨酸",
+      "数值": "60",
+      "状态": "正常"
+    },
+    {
+      "名称": "缬氨酸",
+      "数值": "91",
+      "状态": "正常"
+    },
+    {
+      "名称": "组氨酸",
+      "数值": "73",
+      "状态": "正常"
+    },
+    {
+      "名称": "丙氨酸",
+      "数值": "73",
+      "状态": "正常"
+    },
+    {
+      "名称": "谷氨酸",
+      "数值": "94",
+      "状态": "正常"
+    },
+    {
+      "名称": "甘氨酸",
+      "数值": "43",
+      "状态": "正常"
+    },
+    {
+      "名称": "脯氨酸",
+      "数值": "82",
+      "状态": "正常"
+    },
+    {
+      "名称": "丝氨酸",
+      "数值": "99",
+      "状态": "正常"
+    }
+  ],
+  "维生素评估": [
+    {
+      "名称": "维生素A",
+      "数值": "26",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素B1",
+      "数值": "77",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素B2",
+      "数值": "77",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素B5",
+      "数值": "78",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素B6",
+      "数值": "79",
+      "状态": "正常"
+    },
+    {
+      "名称": "叶酸",
+      "数值": "13",
+      "状态": "偏低"
+    },
+    {
+      "名称": "维生素B12",
+      "数值": "77",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素C",
+      "数值": "60",
+      "状态": "正常"
+    },
+    {
+      "名称": "维生素D",
+      "数值": "16",
+      "状态": "正常"
+    }
+  ],
+  "微量元素评估": [
+    {
+      "名称": "铁",
+      "数值": "3",
+      "状态": "缺乏"
+    },
+    {
+      "名称": "锌",
+      "数值": "9",
+      "状态": "偏低"
+    }
+  ],
+  "主要消化道致病菌": [],
+  "抗生素风险评估": [
+    {
+      "名称": "β-内酰胺酶类",
+      "数值": "81",
+      "状态": "正常"
+    },
+    {
+      "名称": "氨基糖苷类",
+      "数值": "94",
+      "状态": "注意"
+    },
+    {
+      "名称": "大环内酯类",
+      "数值": "97",
+      "状态": "注意"
+    },
+    {
+      "名称": "呋喃类",
+      "数值": "86",
+      "状态": "正常"
+    },
+    {
+      "名称": "喹诺酮类",
+      "数值": "61",
+      "状态": "正常"
+    },
+    {
+      "名称": "磺胺类",
+      "数值": "36",
+      "状态": "正常"
+    },
+    {
+      "名称": "甲氧苄啶类",
+      "数值": "95",
+      "状态": "注意"
+    },
+    {
+      "名称": "氯霉素类",
+      "数值": "57",
+      "状态": "正常"
+    },
+    {
+      "名称": "四环素类",
+      "数值": "96",
+      "状态": "注意"
+    },
+    {
+      "名称": "β-内酰胺酶类",
+      "数值": "81",
+      "状态": "正常"
+    },
+    {
+      "名称": "氨基糖苷类",
+      "数值": "94",
+      "状态": "注意"
+    },
+    {
+      "名称": "大环内酯类",
+      "数值": "97",
+      "状态": "注意"
+    },
+    {
+      "名称": "呋喃类",
+      "数值": "86",
+      "状态": "正常"
+    },
+    {
+      "名称": "喹诺酮类",
+      "数值": "61",
+      "状态": "正常"
+    },
+    {
+      "名称": "磺胺类",
+      "数值": "36",
+      "状态": "正常"
+    },
+    {
+      "名称": "甲氧苄啶类",
+      "数值": "95",
+      "状态": "注意"
+    },
+    {
+      "名称": "氯霉素类",
+      "数值": "57",
+      "状态": "正常"
+    },
+    {
+      "名称": "四环素类",
+      "数值": "96",
+      "状态": "注意"
+    }
+  ],
+  "肠道屏障及代谢物": [
+    {
+      "名称": "肠道炎症水平",
+      "评估值": "8",
+      "健康状况": "正常",
+      "正常范围": "0-80"
+    },
+    {
+      "名称": "肠道产气",
+      "评估值": "89",
+      "健康状况": "",
+      "正常范围": "0-50"
+    },
+    {
+      "名称": "肠道屏障",
+      "评估值": "43",
+      "健康状况": "正常",
+      "正常范围": "15-100"
+    },
+    {
+      "名称": "脂多糖LPS",
+      "评估值": "2",
+      "健康状况": "正常",
+      "正常范围": "0-85"
+    },
+    {
+      "名称": "次级胆汁酸",
+      "评估值": "83",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "对甲酚(p-Cresol)",
+      "评估值": "98",
+      "健康状况": "过多",
+      "正常范围": "0-85"
+    },
+    {
+      "名称": "吲哚",
+      "评估值": "49",
+      "健康状况": "正常",
+      "正常范围": "15-90"
+    },
+    {
+      "名称": "苯酚",
+      "评估值": "44",
+      "健康状况": "正常",
+      "正常范围": "0-85"
+    },
+    {
+      "名称": "腐胺",
+      "评估值": "64",
+      "健康状况": "正常",
+      "正常范围": "5-85"
+    },
+    {
+      "名称": "硫化氢",
+      "评估值": "46",
+      "健康状况": "正常",
+      "正常范围": "5-85"
+    },
+    {
+      "名称": "尸胺",
+      "评估值": "43",
+      "健康状况": "正常",
+      "正常范围": "5-85"
+    }
+  ],
+  "短链脂肪酸": [
+    {
+      "名称": "丁酸盐(Butyrate)",
+      "评估值": "84",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "丙酸盐(Propionate)",
+      "评估值": "33",
+      "健康状况": "正常",
+      "正常范围": "15-90"
+    },
+    {
+      "名称": "乙酸盐(Acetate)",
+      "评估值": "41",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "异戊酸盐(Isovaleric)",
+      "评估值": "42",
+      "健康状况": "正常",
+      "正常范围": "5-85"
+    }
+  ],
+  "神经递质及激素": [
+    {
+      "名称": "血清素(5-HT)",
+      "评估值": "10",
+      "健康状况": "不足",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "γ-氨基丁酸(GABA)",
+      "评估值": "15",
+      "健康状况": "不足",
+      "正常范围": "15-85"
+    },
+    {
+      "名称": "谷氨酸(Glutamate)",
+      "评估值": "94",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "色氨酸(Tryptophan)",
+      "评估值": "87",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "DOPAC",
+      "评估值": "82",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "多巴胺",
+      "评估值": "72",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "组胺(Histamine)",
+      "评估值": "80",
+      "健康状况": "正常",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "一氧化氮",
+      "评估值": "97",
+      "健康状况": "过多",
+      "正常范围": "15-95"
+    },
+    {
+      "名称": "喹啉(Quinolinic)",
+      "评估值": "71",
+      "健康状况": "正常",
+      "正常范围": "0-95"
+    },
+    {
+      "名称": "维生素K2",
+      "评估值": "13",
+      "健康状况": "不足",
+      "正常范围": "15-99"
+    },
+    {
+      "名称": "肌醇(Inositol)",
+      "评估值": "14",
+      "健康状况": "不足",
+      "正常范围": "15-99"
+    }
+  ],
+  "个体化食物推荐表": {
+    "格式": "vertical",
+    "条目数": 224,
+    "数据": [
+      {
+        "名称": "大麦",
+        "分类": "主食",
+        "推荐指数": "20",
+        "能量KJ": "1481",
+        "蛋白g": "12",
+        "脂肪g": "2",
+        "碳水化合物g": "73",
+        "淀粉g": "0",
+        "总膳食纤维g": "17",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小米",
+        "分类": "主食",
+        "推荐指数": "9",
+        "能量KJ": "1582",
+        "蛋白g": "11",
+        "脂肪g": "4",
+        "碳水化合物g": "72",
+        "淀粉g": "0",
+        "总膳食纤维g": "8",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小麦",
+        "分类": "主食",
+        "推荐指数": "1",
+        "能量KJ": "1423",
+        "蛋白g": "10",
+        "脂肪g": "1",
+        "碳水化合物g": "75",
+        "淀粉g": "0",
+        "总膳食纤维g": "12",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小麦面包",
+        "分类": "主食",
+        "推荐指数": "-17",
+        "能量KJ": "1116",
+        "蛋白g": "10",
+        "脂肪g": "3",
+        "碳水化合物g": "48",
+        "淀粉g": "36",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "意大利面",
+        "分类": "主食",
+        "推荐指数": "-5",
+        "能量KJ": "386",
+        "蛋白g": "1",
+        "脂肪g": "3",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "燕麦",
+        "分类": "主食",
+        "推荐指数": "38",
+        "能量KJ": "297",
+        "蛋白g": "17",
+        "脂肪g": "6",
+        "碳水化合物g": "66",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "玉米粒",
+        "分类": "主食",
+        "推荐指数": "42",
+        "能量KJ": "298",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "14",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "米饭",
+        "分类": "主食",
+        "推荐指数": "-4",
+        "能量KJ": "1527",
+        "蛋白g": "7",
+        "脂肪g": "0",
+        "碳水化合物g": "79",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "玉米饼",
+        "分类": "主食",
+        "推荐指数": "6",
+        "能量KJ": "912",
+        "蛋白g": "5",
+        "脂肪g": "2",
+        "碳水化合物g": "44",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "荞麦面粉",
+        "分类": "主食",
+        "推荐指数": "0",
+        "能量KJ": "1402",
+        "蛋白g": "12",
+        "脂肪g": "3",
+        "碳水化合物g": "70",
+        "淀粉g": "0",
+        "总膳食纤维g": "10",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葡萄干浆即食谷物",
+        "分类": "主食",
+        "推荐指数": "0",
+        "能量KJ": "1354",
+        "蛋白g": "7",
+        "脂肪g": "1",
+        "碳水化合物g": "78",
+        "淀粉g": "0",
+        "总膳食纤维g": "13",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "面条",
+        "分类": "主食",
+        "推荐指数": "-1",
+        "能量KJ": "1609",
+        "蛋白g": "14",
+        "脂肪g": "4",
+        "碳水化合物g": "71",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "84"
+      },
+      {
+        "名称": "鸡蛋面包",
+        "分类": "主食",
+        "推荐指数": "-2",
+        "能量KJ": "1201",
+        "蛋白g": "9",
+        "脂肪g": "6",
+        "碳水化合物g": "47",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "51"
+      },
+      {
+        "名称": "黑麦面包",
+        "分类": "主食",
+        "推荐指数": "3",
+        "能量KJ": "1188",
+        "蛋白g": "9",
+        "脂肪g": "3",
+        "碳水化合物g": "53",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "冰淇淋",
+        "分类": "乳制品",
+        "推荐指数": "-15",
+        "能量KJ": "690",
+        "蛋白g": "1",
+        "脂肪g": "3",
+        "碳水化合物g": "32",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "8"
+      },
+      {
+        "名称": "奶油",
+        "分类": "乳制品",
+        "推荐指数": "-10",
+        "能量KJ": "515",
+        "蛋白g": "3",
+        "脂肪g": "10",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "35"
+      },
+      {
+        "名称": "奶酪",
+        "分类": "乳制品",
+        "推荐指数": "8",
+        "能量KJ": "1552",
+        "蛋白g": "23",
+        "脂肪g": "29",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "94"
+      },
+      {
+        "名称": "牛奶",
+        "分类": "乳制品",
+        "推荐指数": "10",
+        "能量KJ": "268",
+        "蛋白g": "3",
+        "脂肪g": "3",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "14"
+      },
+      {
+        "名称": "脱脂牛奶",
+        "分类": "乳制品",
+        "推荐指数": "15",
+        "能量KJ": "142",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "2"
+      },
+      {
+        "名称": "黄油",
+        "分类": "乳制品",
+        "推荐指数": "-50",
+        "能量KJ": "2999",
+        "蛋白g": "0",
+        "脂肪g": "81",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "215"
+      },
+      {
+        "名称": "山核桃",
+        "分类": "干果",
+        "推荐指数": "-22",
+        "能量KJ": "2889",
+        "蛋白g": "9",
+        "脂肪g": "71",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "9",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "山核桃干",
+        "分类": "干果",
+        "推荐指数": "-9",
+        "能量KJ": "2749",
+        "蛋白g": "12",
+        "脂肪g": "64",
+        "碳水化合物g": "18",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "杏仁",
+        "分类": "干果",
+        "推荐指数": "-5",
+        "能量KJ": "2423",
+        "蛋白g": "21",
+        "脂肪g": "49",
+        "碳水化合物g": "21",
+        "淀粉g": "0",
+        "总膳食纤维g": "12",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "开心果",
+        "分类": "干果",
+        "推荐指数": "-15",
+        "能量KJ": "2392",
+        "蛋白g": "21",
+        "脂肪g": "45",
+        "碳水化合物g": "28",
+        "淀粉g": "1",
+        "总膳食纤维g": "10",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "松子",
+        "分类": "干果",
+        "推荐指数": "-20",
+        "能量KJ": "2816",
+        "蛋白g": "13",
+        "脂肪g": "68",
+        "碳水化合物g": "13",
+        "淀粉g": "1",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "栗子",
+        "分类": "干果",
+        "推荐指数": "54",
+        "能量KJ": "1519",
+        "蛋白g": "6",
+        "脂肪g": "1",
+        "碳水化合物g": "79",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "核桃",
+        "分类": "干果",
+        "推荐指数": "-15",
+        "能量KJ": "2738",
+        "蛋白g": "15",
+        "脂肪g": "65",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "椰肉",
+        "分类": "干果",
+        "推荐指数": "0",
+        "能量KJ": "1481",
+        "蛋白g": "3",
+        "脂肪g": "33",
+        "碳水化合物g": "15",
+        "淀粉g": "0",
+        "总膳食纤维g": "9",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "榛子",
+        "分类": "干果",
+        "推荐指数": "38",
+        "能量KJ": "2629",
+        "蛋白g": "14",
+        "脂肪g": "60",
+        "碳水化合物g": "16",
+        "淀粉g": "0",
+        "总膳食纤维g": "9",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橡子",
+        "分类": "干果",
+        "推荐指数": "36",
+        "能量KJ": "1619",
+        "蛋白g": "6",
+        "脂肪g": "23",
+        "碳水化合物g": "40",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "腰果",
+        "分类": "干果",
+        "推荐指数": "-5",
+        "能量KJ": "2402",
+        "蛋白g": "15",
+        "脂肪g": "46",
+        "碳水化合物g": "32",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芝麻酱",
+        "分类": "干果",
+        "推荐指数": "4",
+        "能量KJ": "2454",
+        "蛋白g": "18",
+        "脂肪g": "50",
+        "碳水化合物g": "24",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "莲子",
+        "分类": "干果",
+        "推荐指数": "52",
+        "能量KJ": "372",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葵花子",
+        "分类": "干果",
+        "推荐指数": "-2",
+        "能量KJ": "2445",
+        "蛋白g": "20",
+        "脂肪g": "51",
+        "碳水化合物g": "20",
+        "淀粉g": "0",
+        "总膳食纤维g": "8",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "银杏坚果",
+        "分类": "干果",
+        "推荐指数": "2",
+        "能量KJ": "1456",
+        "蛋白g": "10",
+        "脂肪g": "2",
+        "碳水化合物g": "72",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "比萨",
+        "分类": "快餐",
+        "推荐指数": "-6",
+        "能量KJ": "1121",
+        "蛋白g": "10",
+        "脂肪g": "12",
+        "碳水化合物g": "29",
+        "淀粉g": "18",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "14"
+      },
+      {
+        "名称": "热狗",
+        "分类": "快餐",
+        "推荐指数": "-7",
+        "能量KJ": "1167",
+        "蛋白g": "9",
+        "脂肪g": "3",
+        "碳水化合物g": "50",
+        "淀粉g": "36",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "鸡米花",
+        "分类": "快餐",
+        "推荐指数": "-12",
+        "能量KJ": "1469",
+        "蛋白g": "17",
+        "脂肪g": "21",
+        "碳水化合物g": "21",
+        "淀粉g": "18",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "40"
+      },
+      {
+        "名称": "三文鱼",
+        "分类": "水产品",
+        "推荐指数": "22",
+        "能量KJ": "594",
+        "蛋白g": "19",
+        "脂肪g": "6",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "55"
+      },
+      {
+        "名称": "凤尾鱼",
+        "分类": "水产品",
+        "推荐指数": "26",
+        "能量KJ": "548",
+        "蛋白g": "20",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "60"
+      },
+      {
+        "名称": "墨鱼",
+        "分类": "水产品",
+        "推荐指数": "27",
+        "能量KJ": "331",
+        "蛋白g": "16",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "112"
+      },
+      {
+        "名称": "大比目鱼",
+        "分类": "水产品",
+        "推荐指数": "25",
+        "能量KJ": "382",
+        "蛋白g": "18",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "49"
+      },
+      {
+        "名称": "大西洋鳕鱼",
+        "分类": "水产品",
+        "推荐指数": "0",
+        "能量KJ": "343",
+        "蛋白g": "17",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "43"
+      },
+      {
+        "名称": "小龙虾",
+        "分类": "水产品",
+        "推荐指数": "24",
+        "能量KJ": "322",
+        "蛋白g": "15",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "114"
+      },
+      {
+        "名称": "扇贝",
+        "分类": "水产品",
+        "推荐指数": "14",
+        "能量KJ": "289",
+        "蛋白g": "12",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "2",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "24"
+      },
+      {
+        "名称": "条纹鲈鱼",
+        "分类": "水产品",
+        "推荐指数": "28",
+        "能量KJ": "406",
+        "蛋白g": "17",
+        "脂肪g": "2",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "80"
+      },
+      {
+        "名称": "海鲈鱼",
+        "分类": "水产品",
+        "推荐指数": "18",
+        "能量KJ": "332",
+        "蛋白g": "15",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "52"
+      },
+      {
+        "名称": "牡蛎",
+        "分类": "水产品",
+        "推荐指数": "28",
+        "能量KJ": "339",
+        "蛋白g": "9",
+        "脂肪g": "2",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "50"
+      },
+      {
+        "名称": "白鲑",
+        "分类": "水产品",
+        "推荐指数": "16",
+        "能量KJ": "611",
+        "蛋白g": "17",
+        "脂肪g": "8",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "65"
+      },
+      {
+        "名称": "石斑鱼",
+        "分类": "水产品",
+        "推荐指数": "30",
+        "能量KJ": "385",
+        "蛋白g": "19",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "37"
+      },
+      {
+        "名称": "章鱼",
+        "分类": "水产品",
+        "推荐指数": "29",
+        "能量KJ": "343",
+        "蛋白g": "14",
+        "脂肪g": "1",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "48"
+      },
+      {
+        "名称": "虾",
+        "分类": "水产品",
+        "推荐指数": "14",
+        "能量KJ": "297",
+        "蛋白g": "13",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "126"
+      },
+      {
+        "名称": "蛤蜊",
+        "分类": "水产品",
+        "推荐指数": "20",
+        "能量KJ": "360",
+        "蛋白g": "14",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "1",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "30"
+      },
+      {
+        "名称": "蟹",
+        "分类": "水产品",
+        "推荐指数": "30",
+        "能量KJ": "364",
+        "蛋白g": "18",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "78"
+      },
+      {
+        "名称": "贻贝",
+        "分类": "水产品",
+        "推荐指数": "21",
+        "能量KJ": "360",
+        "蛋白g": "11",
+        "脂肪g": "2",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "28"
+      },
+      {
+        "名称": "金枪鱼",
+        "分类": "水产品",
+        "推荐指数": "26",
+        "能量KJ": "602",
+        "蛋白g": "23",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "38"
+      },
+      {
+        "名称": "鱼子酱",
+        "分类": "水产品",
+        "推荐指数": "1",
+        "能量KJ": "1105",
+        "蛋白g": "24",
+        "脂肪g": "17",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "588"
+      },
+      {
+        "名称": "鱿鱼",
+        "分类": "水产品",
+        "推荐指数": "19",
+        "能量KJ": "385",
+        "蛋白g": "15",
+        "脂肪g": "1",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "233"
+      },
+      {
+        "名称": "鲈鱼",
+        "分类": "水产品",
+        "推荐指数": "27",
+        "能量KJ": "381",
+        "蛋白g": "19",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "90"
+      },
+      {
+        "名称": "鲍鱼",
+        "分类": "水产品",
+        "推荐指数": "21",
+        "能量KJ": "439",
+        "蛋白g": "17",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "85"
+      },
+      {
+        "名称": "鲟鱼",
+        "分类": "水产品",
+        "推荐指数": "20",
+        "能量KJ": "439",
+        "蛋白g": "16",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "60"
+      },
+      {
+        "名称": "鲤鱼",
+        "分类": "水产品",
+        "推荐指数": "16",
+        "能量KJ": "531",
+        "蛋白g": "17",
+        "脂肪g": "5",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "66"
+      },
+      {
+        "名称": "鲭鱼",
+        "分类": "水产品",
+        "推荐指数": "14",
+        "能量KJ": "858",
+        "蛋白g": "18",
+        "脂肪g": "13",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "70"
+      },
+      {
+        "名称": "鲱鱼",
+        "分类": "水产品",
+        "推荐指数": "5",
+        "能量KJ": "661",
+        "蛋白g": "17",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "60"
+      },
+      {
+        "名称": "鲶鱼",
+        "分类": "水产品",
+        "推荐指数": "27",
+        "能量KJ": "519",
+        "蛋白g": "20",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "59"
+      },
+      {
+        "名称": "鲷鱼",
+        "分类": "水产品",
+        "推荐指数": "27",
+        "能量KJ": "418",
+        "蛋白g": "20",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "37"
+      },
+      {
+        "名称": "鲽鱼",
+        "分类": "水产品",
+        "推荐指数": "14",
+        "能量KJ": "294",
+        "蛋白g": "12",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "45"
+      },
+      {
+        "名称": "鳕鱼",
+        "分类": "水产品",
+        "推荐指数": "27",
+        "能量KJ": "364",
+        "蛋白g": "18",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "41"
+      },
+      {
+        "名称": "鳗鱼",
+        "分类": "水产品",
+        "推荐指数": "11",
+        "能量KJ": "770",
+        "蛋白g": "18",
+        "脂肪g": "11",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "126"
+      },
+      {
+        "名称": "鳟鱼",
+        "分类": "水产品",
+        "推荐指数": "20",
+        "能量KJ": "619",
+        "蛋白g": "20",
+        "脂肪g": "6",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "58"
+      },
+      {
+        "名称": "沙丁鱼",
+        "分类": "水产品",
+        "推荐指数": "13",
+        "能量KJ": "347",
+        "蛋白g": "0",
+        "脂肪g": "1",
+        "碳水化合物g": "19",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "黄尾",
+        "分类": "水产品",
+        "推荐指数": "24",
+        "能量KJ": "611",
+        "蛋白g": "23",
+        "脂肪g": "5",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "55"
+      },
+      {
+        "名称": "龙虾",
+        "分类": "水产品",
+        "推荐指数": "22",
+        "能量KJ": "324",
+        "蛋白g": "16",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "127"
+      },
+      {
+        "名称": "无花果",
+        "分类": "水果",
+        "推荐指数": "8",
+        "能量KJ": "310",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "19",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "李子",
+        "分类": "水果",
+        "推荐指数": "2",
+        "能量KJ": "192",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "杏",
+        "分类": "水果",
+        "推荐指数": "-7",
+        "能量KJ": "201",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "杨桃",
+        "分类": "水果",
+        "推荐指数": "56",
+        "能量KJ": "128",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "枣",
+        "分类": "水果",
+        "推荐指数": "-3",
+        "能量KJ": "1176",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "72",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "柠檬",
+        "分类": "水果",
+        "推荐指数": "56",
+        "能量KJ": "121",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "柿子",
+        "分类": "水果",
+        "推荐指数": "5",
+        "能量KJ": "293",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "18",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "桃",
+        "分类": "水果",
+        "推荐指数": "-8",
+        "能量KJ": "165",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "桑葚",
+        "分类": "水果",
+        "推荐指数": "46",
+        "能量KJ": "180",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "梨",
+        "分类": "水果",
+        "推荐指数": "43",
+        "能量KJ": "239",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "15",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "榴莲",
+        "分类": "水果",
+        "推荐指数": "47",
+        "能量KJ": "615",
+        "蛋白g": "1",
+        "脂肪g": "5",
+        "碳水化合物g": "27",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "樱桃",
+        "分类": "水果",
+        "推荐指数": "10",
+        "能量KJ": "1395",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "80",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "哈密瓜",
+        "分类": "水果",
+        "推荐指数": "2",
+        "能量KJ": "141",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "8",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橘子",
+        "分类": "水果",
+        "推荐指数": "-5",
+        "能量KJ": "197",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橙汁",
+        "分类": "水果",
+        "推荐指数": "48",
+        "能量KJ": "188",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "10",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橙皮",
+        "分类": "水果",
+        "推荐指数": "37",
+        "能量KJ": "405",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "25",
+        "淀粉g": "0",
+        "总膳食纤维g": "10",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "橙菠萝汁",
+        "分类": "水果",
+        "推荐指数": "12",
+        "能量KJ": "214",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "12",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "油桃",
+        "分类": "水果",
+        "推荐指数": "-9",
+        "能量KJ": "185",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "10",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "猕猴桃",
+        "分类": "水果",
+        "推荐指数": "34",
+        "能量KJ": "255",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜瓜",
+        "分类": "水果",
+        "推荐指数": "-11",
+        "能量KJ": "150",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "番木瓜",
+        "分类": "水果",
+        "推荐指数": "33",
+        "能量KJ": "179",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "10",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "石榴",
+        "分类": "水果",
+        "推荐指数": "37",
+        "能量KJ": "346",
+        "蛋白g": "1",
+        "脂肪g": "1",
+        "碳水化合物g": "18",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "红苹果",
+        "分类": "水果",
+        "推荐指数": "-1",
+        "能量KJ": "247",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芒果",
+        "分类": "水果",
+        "推荐指数": "-15",
+        "能量KJ": "250",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "苹果",
+        "分类": "水果",
+        "推荐指数": "1",
+        "能量KJ": "218",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "苹果汁",
+        "分类": "水果",
+        "推荐指数": "-40",
+        "能量KJ": "191",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "草莓",
+        "分类": "水果",
+        "推荐指数": "36",
+        "能量KJ": "136",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "荔枝",
+        "分类": "水果",
+        "推荐指数": "26",
+        "能量KJ": "276",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "16",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菠萝",
+        "分类": "水果",
+        "推荐指数": "-1",
+        "能量KJ": "209",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菠萝蜜",
+        "分类": "水果",
+        "推荐指数": "10",
+        "能量KJ": "397",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "23",
+        "淀粉g": "1",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葡萄",
+        "分类": "水果",
+        "推荐指数": "33",
+        "能量KJ": "280",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葡萄干",
+        "分类": "水果",
+        "推荐指数": "-43",
+        "能量KJ": "264",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "15",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "葡萄柚",
+        "分类": "水果",
+        "推荐指数": "52",
+        "能量KJ": "134",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "8",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蓝莓",
+        "分类": "水果",
+        "推荐指数": "31",
+        "能量KJ": "240",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蔓越莓",
+        "分类": "水果",
+        "推荐指数": "25",
+        "能量KJ": "191",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "西瓜",
+        "分类": "水果",
+        "推荐指数": "9",
+        "能量KJ": "127",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "覆盆子",
+        "分类": "水果",
+        "推荐指数": "33",
+        "能量KJ": "220",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "面包果酱",
+        "分类": "水果",
+        "推荐指数": "11",
+        "能量KJ": "431",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "27",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "香蕉",
+        "分类": "水果",
+        "推荐指数": "3",
+        "能量KJ": "371",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "22",
+        "淀粉g": "5",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "鳄梨",
+        "分类": "水果",
+        "推荐指数": "31",
+        "能量KJ": "670",
+        "蛋白g": "2",
+        "脂肪g": "14",
+        "碳水化合物g": "8",
+        "淀粉g": "0",
+        "总膳食纤维g": "6",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "黑莓",
+        "分类": "水果",
+        "推荐指数": "53",
+        "能量KJ": "181",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "龙眼",
+        "分类": "水果",
+        "推荐指数": "60",
+        "能量KJ": "251",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "15",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "番茄汤",
+        "分类": "汤",
+        "推荐指数": "5",
+        "能量KJ": "165",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "土豆蔬菜汤",
+        "分类": "汤",
+        "推荐指数": "-3",
+        "能量KJ": "126",
+        "蛋白g": "1",
+        "脂肪g": "1",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "1"
+      },
+      {
+        "名称": "素食蔬菜汤",
+        "分类": "汤",
+        "推荐指数": "-11",
+        "能量KJ": "119",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "火腿",
+        "分类": "肉类",
+        "推荐指数": "3",
+        "能量KJ": "683",
+        "蛋白g": "16",
+        "脂肪g": "8",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "57"
+      },
+      {
+        "名称": "火鸡",
+        "分类": "肉类",
+        "推荐指数": "16",
+        "能量KJ": "790",
+        "蛋白g": "28",
+        "脂肪g": "7",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "109"
+      },
+      {
+        "名称": "烟熏火腿",
+        "分类": "肉类",
+        "推荐指数": "-1",
+        "能量KJ": "591",
+        "蛋白g": "18",
+        "脂肪g": "2",
+        "碳水化合物g": "10",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "50"
+      },
+      {
+        "名称": "烤肉",
+        "分类": "肉类",
+        "推荐指数": "-1",
+        "能量KJ": "1512",
+        "蛋白g": "20",
+        "脂肪g": "30",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "105"
+      },
+      {
+        "名称": "烤鸭",
+        "分类": "肉类",
+        "推荐指数": "-1",
+        "能量KJ": "1410",
+        "蛋白g": "18",
+        "脂肪g": "28",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "84"
+      },
+      {
+        "名称": "烧鹅",
+        "分类": "肉类",
+        "推荐指数": "5",
+        "能量KJ": "1276",
+        "蛋白g": "25",
+        "脂肪g": "21",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "91"
+      },
+      {
+        "名称": "牛肉汤",
+        "分类": "肉类",
+        "推荐指数": "-9",
+        "能量KJ": "25",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "牛肉瘦",
+        "分类": "肉类",
+        "推荐指数": "11",
+        "能量KJ": "488",
+        "蛋白g": "23",
+        "脂肪g": "2",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "55"
+      },
+      {
+        "名称": "牛肉肥",
+        "分类": "肉类",
+        "推荐指数": "-24",
+        "能量KJ": "2845",
+        "蛋白g": "10",
+        "脂肪g": "70",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "95"
+      },
+      {
+        "名称": "牛蛙",
+        "分类": "肉类",
+        "推荐指数": "9",
+        "能量KJ": "305",
+        "蛋白g": "16",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "50"
+      },
+      {
+        "名称": "猪培根",
+        "分类": "肉类",
+        "推荐指数": "-25",
+        "能量KJ": "1744",
+        "蛋白g": "12",
+        "脂肪g": "39",
+        "碳水化合物g": "1",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "66"
+      },
+      {
+        "名称": "猪头肉",
+        "分类": "肉类",
+        "推荐指数": "-18",
+        "能量KJ": "658",
+        "蛋白g": "13",
+        "脂肪g": "10",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "69"
+      },
+      {
+        "名称": "猪瘦肉",
+        "分类": "肉类",
+        "推荐指数": "21",
+        "能量KJ": "562",
+        "蛋白g": "21",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "64"
+      },
+      {
+        "名称": "猪耳朵",
+        "分类": "肉类",
+        "推荐指数": "10",
+        "能量KJ": "695",
+        "蛋白g": "15",
+        "脂肪g": "10",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "90"
+      },
+      {
+        "名称": "猪肝",
+        "分类": "肉类",
+        "推荐指数": "30",
+        "能量KJ": "690",
+        "蛋白g": "26",
+        "脂肪g": "4",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "355"
+      },
+      {
+        "名称": "猪脑",
+        "分类": "肉类",
+        "推荐指数": "-12",
+        "能量KJ": "577",
+        "蛋白g": "12",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "2552"
+      },
+      {
+        "名称": "猪蹄",
+        "分类": "肉类",
+        "推荐指数": "-6",
+        "能量KJ": "889",
+        "蛋白g": "23",
+        "脂肪g": "12",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "88"
+      },
+      {
+        "名称": "瘦羊肉",
+        "分类": "肉类",
+        "推荐指数": "24",
+        "能量KJ": "862",
+        "蛋白g": "28",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "92"
+      },
+      {
+        "名称": "肉丸",
+        "分类": "肉类",
+        "推荐指数": "-26",
+        "能量KJ": "1196",
+        "蛋白g": "14",
+        "脂肪g": "22",
+        "碳水化合物g": "8",
+        "淀粉g": "2",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "66"
+      },
+      {
+        "名称": "肥猪肉",
+        "分类": "肉类",
+        "推荐指数": "-28",
+        "能量KJ": "2449",
+        "蛋白g": "10",
+        "脂肪g": "60",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "81"
+      },
+      {
+        "名称": "肥羊肉",
+        "分类": "肉类",
+        "推荐指数": "-29",
+        "能量KJ": "2782",
+        "蛋白g": "6",
+        "脂肪g": "70",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "90"
+      },
+      {
+        "名称": "鸡心",
+        "分类": "肉类",
+        "推荐指数": "20",
+        "能量KJ": "640",
+        "蛋白g": "15",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "136"
+      },
+      {
+        "名称": "鸡汤",
+        "分类": "肉类",
+        "推荐指数": "-17",
+        "能量KJ": "26",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "2"
+      },
+      {
+        "名称": "鸡肉",
+        "分类": "肉类",
+        "推荐指数": "4",
+        "能量KJ": "604",
+        "蛋白g": "28",
+        "脂肪g": "3",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "86"
+      },
+      {
+        "名称": "鸡肝",
+        "分类": "肉类",
+        "推荐指数": "22",
+        "能量KJ": "496",
+        "蛋白g": "16",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "345"
+      },
+      {
+        "名称": "鹅肝",
+        "分类": "肉类",
+        "推荐指数": "31",
+        "能量KJ": "556",
+        "蛋白g": "16",
+        "脂肪g": "4",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "515"
+      },
+      {
+        "名称": "鹌鹑",
+        "分类": "肉类",
+        "推荐指数": "14",
+        "能量KJ": "803",
+        "蛋白g": "19",
+        "脂肪g": "12",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "76"
+      },
+      {
+        "名称": "南瓜",
+        "分类": "蔬菜",
+        "推荐指数": "61",
+        "能量KJ": "109",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "卷心菜",
+        "分类": "蔬菜",
+        "推荐指数": "49",
+        "能量KJ": "103",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "四季豆",
+        "分类": "蔬菜",
+        "推荐指数": "63",
+        "能量KJ": "131",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "土豆",
+        "分类": "蔬菜",
+        "推荐指数": "53",
+        "能量KJ": "322",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "淀粉g": "15",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "土豆面粉",
+        "分类": "蔬菜",
+        "推荐指数": "56",
+        "能量KJ": "1493",
+        "蛋白g": "6",
+        "脂肪g": "0",
+        "碳水化合物g": "83",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "大白菜",
+        "分类": "蔬菜",
+        "推荐指数": "79",
+        "能量KJ": "55",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "大蒜",
+        "分类": "蔬菜",
+        "推荐指数": "51",
+        "能量KJ": "623",
+        "蛋白g": "6",
+        "脂肪g": "0",
+        "碳水化合物g": "33",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "大豆",
+        "分类": "蔬菜",
+        "推荐指数": "75",
+        "能量KJ": "614",
+        "蛋白g": "12",
+        "脂肪g": "6",
+        "碳水化合物g": "11",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小南瓜",
+        "分类": "蔬菜",
+        "推荐指数": "0",
+        "能量KJ": "69",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "小萝卜",
+        "分类": "蔬菜",
+        "推荐指数": "72",
+        "能量KJ": "76",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "山药",
+        "分类": "蔬菜",
+        "推荐指数": "49",
+        "能量KJ": "343",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "20",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "扁豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "60",
+        "能量KJ": "1473",
+        "蛋白g": "24",
+        "脂肪g": "1",
+        "碳水化合物g": "63",
+        "淀粉g": "49",
+        "总膳食纤维g": "10",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "木薯",
+        "分类": "蔬菜",
+        "推荐指数": "37",
+        "能量KJ": "667",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "38",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "洋葱",
+        "分类": "蔬菜",
+        "推荐指数": "35",
+        "能量KJ": "166",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "炒蘑菇",
+        "分类": "蔬菜",
+        "推荐指数": "21",
+        "能量KJ": "110",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "炒香菇",
+        "分类": "蔬菜",
+        "推荐指数": "13",
+        "能量KJ": "162",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "牛蒡根",
+        "分类": "蔬菜",
+        "推荐指数": "72",
+        "能量KJ": "302",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甘薯",
+        "分类": "蔬菜",
+        "推荐指数": "27",
+        "能量KJ": "359",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "20",
+        "淀粉g": "12",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜椒",
+        "分类": "蔬菜",
+        "推荐指数": "67",
+        "能量KJ": "84",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜玉米",
+        "分类": "蔬菜",
+        "推荐指数": "37",
+        "能量KJ": "360",
+        "蛋白g": "3",
+        "脂肪g": "1",
+        "碳水化合物g": "18",
+        "淀粉g": "5",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜菜",
+        "分类": "蔬菜",
+        "推荐指数": "65",
+        "能量KJ": "180",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "甜菜叶",
+        "分类": "蔬菜",
+        "推荐指数": "78",
+        "能量KJ": "92",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "生姜",
+        "分类": "蔬菜",
+        "推荐指数": "83",
+        "能量KJ": "75",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "生菜",
+        "分类": "蔬菜",
+        "推荐指数": "65",
+        "能量KJ": "62",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "番茄汁",
+        "分类": "蔬菜",
+        "推荐指数": "6",
+        "能量KJ": "72",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "白菜",
+        "分类": "蔬菜",
+        "推荐指数": "70",
+        "能量KJ": "48",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "1",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "白萝卜",
+        "分类": "蔬菜",
+        "推荐指数": "78",
+        "能量KJ": "59",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "白蘑菇",
+        "分类": "蔬菜",
+        "推荐指数": "57",
+        "能量KJ": "93",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "秋葵",
+        "分类": "蔬菜",
+        "推荐指数": "59",
+        "能量KJ": "138",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "竹笋",
+        "分类": "蔬菜",
+        "推荐指数": "76",
+        "能量KJ": "115",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "红心萝卜",
+        "分类": "蔬菜",
+        "推荐指数": "79",
+        "能量KJ": "132",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "红豆",
+        "分类": "蔬菜",
+        "推荐指数": "38",
+        "能量KJ": "121",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "绿豆",
+        "分类": "蔬菜",
+        "推荐指数": "33",
+        "能量KJ": "126",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "羽衣甘蓝",
+        "分类": "蔬菜",
+        "推荐指数": "82",
+        "能量KJ": "207",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "8",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "胡萝卜",
+        "分类": "蔬菜",
+        "推荐指数": "24",
+        "能量KJ": "173",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "淀粉g": "1",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芋头",
+        "分类": "蔬菜",
+        "推荐指数": "59",
+        "能量KJ": "469",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "26",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芝麻",
+        "分类": "蔬菜",
+        "推荐指数": "56",
+        "能量KJ": "2397",
+        "蛋白g": "17",
+        "脂肪g": "49",
+        "碳水化合物g": "23",
+        "淀粉g": "0",
+        "总膳食纤维g": "11",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芥末",
+        "分类": "蔬菜",
+        "推荐指数": "81",
+        "能量KJ": "114",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芦笋",
+        "分类": "蔬菜",
+        "推荐指数": "66",
+        "能量KJ": "85",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "花椒",
+        "分类": "蔬菜",
+        "推荐指数": "72",
+        "能量KJ": "80",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "花椰菜",
+        "分类": "蔬菜",
+        "推荐指数": "66",
+        "能量KJ": "104",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "芹菜",
+        "分类": "蔬菜",
+        "推荐指数": "54",
+        "能量KJ": "67",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "苦瓜",
+        "分类": "蔬菜",
+        "推荐指数": "74",
+        "能量KJ": "126",
+        "蛋白g": "5",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "茄子",
+        "分类": "蔬菜",
+        "推荐指数": "49",
+        "能量KJ": "104",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "苋菜叶",
+        "分类": "蔬菜",
+        "推荐指数": "52",
+        "能量KJ": "97",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菊苣",
+        "分类": "蔬菜",
+        "推荐指数": "72",
+        "能量KJ": "71",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菜豆",
+        "分类": "蔬菜",
+        "推荐指数": "76",
+        "能量KJ": "280",
+        "蛋白g": "6",
+        "脂肪g": "0",
+        "碳水化合物g": "13",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "菠菜",
+        "分类": "蔬菜",
+        "推荐指数": "75",
+        "能量KJ": "97",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蕨类",
+        "分类": "蔬菜",
+        "推荐指数": "78",
+        "能量KJ": "143",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "藜",
+        "分类": "蔬菜",
+        "推荐指数": "84",
+        "能量KJ": "180",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "淀粉g": "0",
+        "总膳食纤维g": "4",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蘑菇",
+        "分类": "蔬菜",
+        "推荐指数": "56",
+        "能量KJ": "141",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "西兰花",
+        "分类": "蔬菜",
+        "推荐指数": "72",
+        "能量KJ": "141",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "西红柿",
+        "分类": "蔬菜",
+        "推荐指数": "67",
+        "能量KJ": "74",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "豆芽",
+        "分类": "蔬菜",
+        "推荐指数": "72",
+        "能量KJ": "510",
+        "蛋白g": "13",
+        "脂肪g": "6",
+        "碳水化合物g": "9",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "豇豆",
+        "分类": "蔬菜",
+        "推荐指数": "68",
+        "能量KJ": "376",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "18",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "豌豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "78",
+        "能量KJ": "1435",
+        "蛋白g": "21",
+        "脂肪g": "1",
+        "碳水化合物g": "62",
+        "淀粉g": "0",
+        "总膳食纤维g": "15",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "辣椒",
+        "分类": "蔬菜",
+        "推荐指数": "57",
+        "能量KJ": "88",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "淀粉g": "0",
+        "总膳食纤维g": "1",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "韭菜",
+        "分类": "蔬菜",
+        "推荐指数": "46",
+        "能量KJ": "126",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "淀粉g": "0",
+        "总膳食纤维g": "2",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "香菇",
+        "分类": "蔬菜",
+        "推荐指数": "59",
+        "能量KJ": "160",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "3",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "黄瓜",
+        "分类": "蔬菜",
+        "推荐指数": "51",
+        "能量KJ": "65",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "水煮蛋",
+        "分类": "蛋类",
+        "推荐指数": "-7",
+        "能量KJ": "597",
+        "蛋白g": "12",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "370"
+      },
+      {
+        "名称": "炒蛋",
+        "分类": "蛋类",
+        "推荐指数": "-12",
+        "能量KJ": "621",
+        "蛋白g": "9",
+        "脂肪g": "10",
+        "碳水化合物g": "1",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "277"
+      },
+      {
+        "名称": "煎蛋",
+        "分类": "蛋类",
+        "推荐指数": "-13",
+        "能量KJ": "643",
+        "蛋白g": "10",
+        "脂肪g": "11",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "313"
+      },
+      {
+        "名称": "鸡蛋",
+        "分类": "蛋类",
+        "推荐指数": "-6",
+        "能量KJ": "599",
+        "蛋白g": "12",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "372"
+      },
+      {
+        "名称": "鸡蛋白",
+        "分类": "蛋类",
+        "推荐指数": "19",
+        "能量KJ": "216",
+        "蛋白g": "10",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "鸡蛋黄",
+        "分类": "蛋类",
+        "推荐指数": "-20",
+        "能量KJ": "1346",
+        "蛋白g": "15",
+        "脂肪g": "26",
+        "碳水化合物g": "3",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "1085"
+      },
+      {
+        "名称": "鹌鹑蛋",
+        "分类": "蛋类",
+        "推荐指数": "-5",
+        "能量KJ": "663",
+        "蛋白g": "13",
+        "脂肪g": "11",
+        "碳水化合物g": "0",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "844"
+      },
+      {
+        "名称": "利马豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "29",
+        "能量KJ": "1414",
+        "蛋白g": "21",
+        "脂肪g": "0",
+        "碳水化合物g": "63",
+        "淀粉g": "0",
+        "总膳食纤维g": "19",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "大豆面粉",
+        "分类": "豆类及豆制品",
+        "推荐指数": "19",
+        "能量KJ": "1816",
+        "蛋白g": "37",
+        "脂肪g": "20",
+        "碳水化合物g": "31",
+        "淀粉g": "0",
+        "总膳食纤维g": "9",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "嫩豆腐",
+        "分类": "豆类及豆制品",
+        "推荐指数": "18",
+        "能量KJ": "253",
+        "蛋白g": "7",
+        "脂肪g": "3",
+        "碳水化合物g": "1",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "纳豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "19",
+        "能量KJ": "883",
+        "蛋白g": "19",
+        "脂肪g": "11",
+        "碳水化合物g": "12",
+        "淀粉g": "0",
+        "总膳食纤维g": "5",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "羽扇豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "29",
+        "能量KJ": "1554",
+        "蛋白g": "36",
+        "脂肪g": "9",
+        "碳水化合物g": "40",
+        "淀粉g": "0",
+        "总膳食纤维g": "18",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "老豆腐",
+        "分类": "豆类及豆制品",
+        "推荐指数": "22",
+        "能量KJ": "326",
+        "蛋白g": "9",
+        "脂肪g": "4",
+        "碳水化合物g": "2",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "花生",
+        "分类": "豆类及豆制品",
+        "推荐指数": "5",
+        "能量KJ": "2374",
+        "蛋白g": "25",
+        "脂肪g": "49",
+        "碳水化合物g": "16",
+        "淀粉g": "0",
+        "总膳食纤维g": "8",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "花生酱",
+        "分类": "豆类及豆制品",
+        "推荐指数": "-12",
+        "能量KJ": "2464",
+        "蛋白g": "24",
+        "脂肪g": "49",
+        "碳水化合物g": "21",
+        "淀粉g": "4",
+        "总膳食纤维g": "8",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "蚕豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "30",
+        "能量KJ": "1425",
+        "蛋白g": "26",
+        "脂肪g": "1",
+        "碳水化合物g": "58",
+        "淀粉g": "0",
+        "总膳食纤维g": "25",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "豆浆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "13",
+        "能量KJ": "226",
+        "蛋白g": "3",
+        "脂肪g": "1",
+        "碳水化合物g": "6",
+        "淀粉g": "0",
+        "总膳食纤维g": "0",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "鹰嘴豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "19",
+        "能量KJ": "1581",
+        "蛋白g": "20",
+        "脂肪g": "6",
+        "碳水化合物g": "62",
+        "淀粉g": "0",
+        "总膳食纤维g": "12",
+        "胆固醇mg": "0"
+      },
+      {
+        "名称": "黄豆",
+        "分类": "豆类及豆制品",
+        "推荐指数": "29",
+        "能量KJ": "1443",
+        "蛋白g": "22",
+        "脂肪g": "2",
+        "碳水化合物g": "60",
+        "淀粉g": "0",
+        "总膳食纤维g": "25",
+        "胆固醇mg": "0"
+      }
+    ]
+  },
+  "菌群检出详细列表": {
+    "核心菌属": [
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.6731",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "51%",
+        "检出率%": "99.52%",
+        "说明": "说明:多导致人体炎症;致病;导致菌群失衡;产丁酸;肥胖人群丰度较高;参与胆汁酸代谢;对抗艰难梭菌;"
+      },
+      {
+        "名称": "普雷沃氏菌属 Prevotella",
+        "丰度%": "0.6430",
+        "正常范围%": "0.3652-81.2736",
+        "人群水平%": "29%",
+        "检出率%": "99.52%",
+        "说明": "说明:核心菌,健康的植物性饮食相关菌,在自闭症、多发性硬化中减少;丰度高促炎,加剧过敏、"
+      },
+      {
+        "名称": "瘤胃球菌属 Ruminococcus",
+        "丰度%": "2.1607",
+        "正常范围%": "0.266-33.2664",
+        "人群水平%": "74%",
+        "检出率%": "99.52%",
+        "说明": "说明:消化抗性淀粉、纤维素,丰度高促进肠炎和过敏相关疾病,"
+      },
+      {
+        "名称": "拟杆菌属 Bacteroides",
+        "丰度%": "18.4336",
+        "正常范围%": "1.0292-55.9251",
+        "人群水平%": "44%",
+        "检出率%": "99.04%",
+        "说明": "说明:基石菌,消化蔬菜和谷食,蛋白,降解复杂多糖,交叉喂养关键菌,维持免疫和肠道稳态,"
+      },
+      {
+        "名称": "优杆菌属 Eubacterium",
+        "丰度%": "0.4918",
+        "正常范围%": "0.0574-5.8432",
+        "人群水平%": "63%",
+        "检出率%": "98.56%",
+        "说明": "说明:基石菌,产短链脂肪酸尤其丁酸,有助于肠道健康,降解胆固醇、调节餐后血糖、"
+      },
+      {
+        "名称": "Lachnoclostridium",
+        "丰度%": "1.5173",
+        "正常范围%": "0.117-6.2036",
+        "人群水平%": "76%",
+        "检出率%": "98.56%",
+        "说明": "说明:丁酸,与内脏脂肪积累相关,与肥胖、高血压、糖尿病正相关,与肠道炎症、肠癌和阿尔茨海默病进展有关,"
+      },
+      {
+        "名称": "粪杆菌属 Faecalibacterium",
+        "丰度%": "14.2451",
+        "正常范围%": "5.1543-18.1656",
+        "人群水平%": "94%",
+        "检出率%": "98.08%",
+        "说明": "说明:基石菌,丁酸生产菌,下一代"
+      },
+      {
+        "名称": "经黏液真杆菌属 Blautia",
+        "丰度%": "3.1770",
+        "正常范围%": "0.3366-3.237",
+        "人群水平%": "95%",
+        "检出率%": "97.60%",
+        "说明": "说明:消化复合碳水化合物,健康菌,偏低与炎症肠病,营养不良相关,减肥有效菌,缓解炎症性疾病和代谢疾病,"
+      },
+      {
+        "名称": "毛螺菌属 Lachnospira",
+        "丰度%": "2.6397",
+        "正常范围%": "0-4.805",
+        "人群水平%": "95%",
+        "检出率%": "88.94%",
+        "说明": "说明:基石菌,发酵代谢膳食纤维,利用果蔬果胶产生乙酸,丁酸,与睡眠质量呈负相关,过少与多种疾病相关,"
+      },
+      {
+        "名称": "考拉杆菌属 Phascolarctobacterium",
+        "丰度%": "1.4663",
+        "正常范围%": "0-8.8711",
+        "人群水平%": "60%",
+        "检出率%": "88.94%",
+        "说明": "说明:东方人肠道的核心菌属,高易减肥,与水果蔬菜摄入相关,随年龄增加,在重度抑郁、阿尔茨海默病(AD)、自闭症儿童富集,"
+      },
+      {
+        "名称": "巨单胞菌属 Megamonas",
+        "丰度%": "ND",
+        "正常范围%": "0-21.672",
+        "人群水平%": "29%",
+        "检出率%": "87.50%",
+        "说明": "说明:发酵各种碳水化合物、产乙酸、丙酸、乳酸,自闭症谱系障碍、注意缺陷、多动障碍 (ADHD)急性脑卒中(AIS)"
+      },
+      {
+        "名称": "粪球菌属 Coprococcus",
+        "丰度%": "1.4292",
+        "正常范围%": "0-3.618",
+        "人群水平%": "92%",
+        "检出率%": "86.06%",
+        "说明": "说明:可产丁酸,抑制免疫反应,降低过敏,抑郁、帕金森、认知障碍、便秘,慢性肾病、虚弱者减少,过多导致菌群紊乱,"
+      },
+      {
+        "名称": "双歧杆菌属 Bifidobacterium",
+        "丰度%": "0.1141"
+      },
+      {
+        "名称": "0.1914-14.598",
+        "丰度%": "39%",
+        "检出率%": "97.12%",
+        "说明": "说明:最重要的"
+      }
+    ],
+    "益生菌": [
+      {
+        "名称": "肠道菌群平衡",
+        "丰度%": "38"
+      },
+      {
+        "名称": "菌群多样性",
+        "丰度%": "72"
+      },
+      {
+        "名称": "共检测到:",
+        "丰度%": "919"
+      },
+      {
+        "名称": "种菌        您的香浓多样性指数是:",
+        "丰度%": "5.69"
+      },
+      {
+        "名称": "肠道炎症水平",
+        "丰度%": "8"
+      }
+    ],
+    "有害菌属": [
+      {
+        "名称": "埃希氏菌属 Escherichia",
+        "丰度%": "0.0181",
+        "正常范围%": "0-9.3023",
+        "人群水平%": "9%",
+        "检出率%": "99.52%",
+        "说明": "说明:正常菌属,条件致病菌,过多致病,导致菌群失衡"
+      },
+      {
+        "名称": "Streptococcus",
+        "丰度%": "0.1322",
+        "正常范围%": "0-1.3257",
+        "人群水平%": "47%",
+        "检出率%": "99.52%",
+        "说明": "说明:可引起化脓性炎症,个别菌为"
+      },
+      {
+        "名称": "脱硫弧菌属 Desulfovibrio",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0999",
+        "人群水平%": "51%",
+        "检出率%": "33.65%",
+        "说明": "说明:属于变形菌门,产生硫化氢,导致炎症、腹泻,对肠道上皮具有毒性,导致胃肠道疾病,约50%人群的口腔和肠道会携带,"
+      },
+      {
+        "名称": "螺杆菌属 Helicobacter",
+        "丰度%": "ND",
+        "正常范围%": "0-0.036",
+        "人群水平%": "86%",
+        "检出率%": "22.12%",
+        "说明": "说明:革兰氏阴性菌,微需氧菌,该菌属下的一些菌种被发现在人类上消化道内壁,部分种为致病菌,"
+      },
+      {
+        "名称": "弓形菌属 Arcobacter",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0066",
+        "人群水平%": "96%",
+        "检出率%": "7.69%",
+        "说明": "说明:好氧菌,腹泻致病菌,与河流海洋污染相关的潜在"
+      }
+    ],
+    "其它重要菌属": [
+      {
+        "名称": "柯林斯氏菌属 Collinsella",
+        "丰度%": "0.0552",
+        "正常范围%": "0-5.7436",
+        "人群水平%": "46%",
+        "检出率%": "90.38%",
+        "说明": "说明:产气菌,与脂质代谢及心脑血管相关,过多可导致菌群紊乱,部分"
+      }
+    ],
+    "病原菌属": [],
+    "病原菌检出": [],
+    "肥胖相关菌": [
+      {
+        "名称": "厚壁菌门 Firmicutes",
+        "丰度%": "75.6217",
+        "正常范围%": "19.3377-90.0565",
+        "人群水平%": "93%"
+      },
+      {
+        "名称": "阿德勒氏菌属 Adlercreutzia",
+        "丰度%": "ND",
+        "正常范围%": "0-0.004",
+        "人群水平%": "90%"
+      },
+      {
+        "名称": "双歧杆菌属 Bifidobacterium",
+        "丰度%": "0.1141"
+      },
+      {
+        "名称": "0.1914-12.598",
+        "丰度%": "39%"
+      }
+    ],
+    "便秘相关菌": [
+      {
+        "名称": "史氏甲烷短杆菌 Methanobrevibacter smithii",
+        "丰度%": "ND",
+        "正常范围%": "0-1.1952",
+        "人群水平%": "85%"
+      },
+      {
+        "名称": "粪球菌属 Coprococcus",
+        "丰度%": "1.4292",
+        "正常范围%": "0-3.618",
+        "人群水平%": "92%"
+      },
+      {
+        "名称": "埃希氏菌属 Escherichia",
+        "丰度%": "0.0181",
+        "正常范围%": "0-9.3023",
+        "人群水平%": "9%"
+      },
+      {
+        "名称": "毛螺菌属 Lachnospira",
+        "丰度%": "2.6397",
+        "正常范围%": "0-4.805",
+        "人群水平%": "95%"
+      },
+      {
+        "名称": "厌氧棍状菌属 Anaerotruncus",
+        "丰度%": "0.0110",
+        "正常范围%": "0-0.1328",
+        "人群水平%": "77%"
+      },
+      {
+        "名称": "葡萄球菌属 Staphylococcus",
+        "丰度%": "0.0626"
+      },
+      {
+        "名称": "0-0.0105",
+        "丰度%": "97%"
+      },
+      {
+        "名称": "Streptococcus",
+        "丰度%": "0.1322",
+        "正常范围%": "0-1.3257",
+        "人群水平%": "47%"
+      },
+      {
+        "名称": "脆弱拟杆菌 Bacteroides fragilis",
+        "丰度%": "2.2654"
+      },
+      {
+        "名称": "0-0.4212",
+        "丰度%": "85%"
+      },
+      {
+        "名称": "卵形拟杆菌 Bacteroides ovatus",
+        "丰度%": "1.2341",
+        "正常范围%": "0.0005-1.4154",
+        "人群水平%": "96%"
+      },
+      {
+        "名称": "下水道菌属 Cloacibacillus",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0468",
+        "人群水平%": "72%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.6731",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "51%"
+      },
+      {
+        "名称": "肠杆菌属 Enterobacter",
+        "丰度%": "ND",
+        "正常范围%": "0-0.083",
+        "人群水平%": "42%"
+      },
+      {
+        "名称": "Erysipelatoclostridium",
+        "丰度%": "0.0110",
+        "正常范围%": "0-1.0458",
+        "人群水平%": "32%"
+      },
+      {
+        "名称": "粪杆菌属 Faecalibacterium",
+        "丰度%": "14.2451",
+        "正常范围%": "0.0351-18.1656",
+        "人群水平%": "94%"
+      },
+      {
+        "名称": "梭杆菌属 Fusobacterium",
+        "丰度%": "ND",
+        "正常范围%": "0-1.21",
+        "人群水平%": "37%"
+      },
+      {
+        "名称": "霍尔德曼穆尔菌属 Holdemanella",
+        "丰度%": "ND",
+        "正常范围%": "0-0.2904",
+        "人群水平%": "65%"
+      },
+      {
+        "名称": "霍尔德曼氏菌属 Holdemania",
+        "丰度%": "0.0515"
+      },
+      {
+        "名称": "0-0.0378",
+        "丰度%": "93%"
+      },
+      {
+        "名称": "巨球形菌属 Megasphaera",
+        "丰度%": "0.0294",
+        "正常范围%": "0-0.1971",
+        "人群水平%": "67%"
+      },
+      {
+        "名称": "臭气杆菌属 Odoribacter",
+        "丰度%": "0.3169",
+        "正常范围%": "0-1.1786",
+        "人群水平%": "89%"
+      },
+      {
+        "名称": "副拟杆菌属 Parabacteroides",
+        "丰度%": "0.6039",
+        "正常范围%": "0-5.433",
+        "人群水平%": "41%"
+      },
+      {
+        "名称": "瘤胃球菌属 Ruminococcus",
+        "丰度%": "2.1607",
+        "正常范围%": "0.266-33.2664",
+        "人群水平%": "74%"
+      },
+      {
+        "名称": "Streptococcus",
+        "丰度%": "0.1322",
+        "正常范围%": "0-1.3257",
+        "人群水平%": "47%"
+      },
+      {
+        "名称": "双歧杆菌属 Bifidobacterium",
+        "丰度%": "0.1141"
+      },
+      {
+        "名称": "0.1914-12.598",
+        "丰度%": "39%"
+      }
+    ],
+    "抑郁相关菌": [
+      {
+        "名称": "脱硫弧菌属 Desulfovibrio",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0999",
+        "人群水平%": "51%"
+      },
+      {
+        "名称": "另枝菌属 Alistipes",
+        "丰度%": "0.7512",
+        "正常范围%": "0-20.1524",
+        "人群水平%": "64%"
+      },
+      {
+        "名称": "拟杆菌属 Bacteroides",
+        "丰度%": "18.4336",
+        "正常范围%": "1.0292-55.9251",
+        "人群水平%": "44%"
+      },
+      {
+        "名称": "埃希氏菌属 Escherichia",
+        "丰度%": "0.0181",
+        "正常范围%": "0-9.3023",
+        "人群水平%": "9%"
+      },
+      {
+        "名称": "解黄酮菌属 Flavonifractor",
+        "丰度%": "0.2579",
+        "正常范围%": "0-0.415",
+        "人群水平%": "84%"
+      },
+      {
+        "名称": "震颤杆菌属 Oscillibacter",
+        "丰度%": "0.0183",
+        "正常范围%": "0-0.0738",
+        "人群水平%": "80%"
+      },
+      {
+        "名称": "副拟杆菌属 Parabacteroides",
+        "丰度%": "0.6039",
+        "正常范围%": "0-5.433",
+        "人群水平%": "41%"
+      },
+      {
+        "名称": "放线菌属 Actinomyces",
+        "丰度%": "0.0257",
+        "正常范围%": "0-0.0756",
+        "人群水平%": "72%"
+      },
+      {
+        "名称": "厌氧棒状菌属 Anaerostipes",
+        "丰度%": "0.7179",
+        "正常范围%": "0-0.9296",
+        "人群水平%": "94%"
+      },
+      {
+        "名称": "经黏液真杆菌属 Blautia",
+        "丰度%": "3.1770",
+        "正常范围%": "0.3366-3.237",
+        "人群水平%": "95%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.6731",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "51%"
+      },
+      {
+        "名称": "爱格士氏菌属 Eggerthella",
+        "丰度%": "0.0552"
+      },
+      {
+        "名称": "0-0.0166",
+        "丰度%": "93%"
+      },
+      {
+        "名称": "嗜血杆菌属 Haemophilus",
+        "丰度%": "0.0441",
+        "正常范围%": "0-0.7752",
+        "人群水平%": "62%"
+      },
+      {
+        "名称": "霍尔德曼氏菌属 Holdemania",
+        "丰度%": "0.0515"
+      },
+      {
+        "名称": "0-0.0378",
+        "丰度%": "93%"
+      },
+      {
+        "名称": "克雷伯氏菌属 Klebsiella",
+        "丰度%": "0.0510",
+        "正常范围%": "0-15.81",
+        "人群水平%": "36%"
+      },
+      {
+        "名称": "副普雷沃氏菌属 Paraprevotella",
+        "丰度%": "ND",
+        "正常范围%": "0-1.998",
+        "人群水平%": "43%"
+      },
+      {
+        "名称": "副萨特氏菌属 Parasutterella",
+        "丰度%": "0.4495",
+        "正常范围%": "0-2.4003",
+        "人群水平%": "73%"
+      },
+      {
+        "名称": "普雷沃氏菌属 Prevotella",
+        "丰度%": "0.6430",
+        "正常范围%": "0.3652-81.2736",
+        "人群水平%": "29%"
+      },
+      {
+        "名称": "韦荣菌属 Veillonella",
+        "丰度%": "0.2320",
+        "正常范围%": "0-8.9142",
+        "人群水平%": "63%"
+      },
+      {
+        "名称": "单形拟杆菌 Bacteroides uniformis",
+        "丰度%": "1.9690",
+        "正常范围%": "0.0332-8.3187",
+        "人群水平%": "72%"
+      },
+      {
+        "名称": "普氏栖粪杆菌 Faecalibacterium prausnitzii",
+        "丰度%": "13.9120",
+        "正常范围%": "0.0351-18.1656",
+        "人群水平%": "94%"
+      },
+      {
+        "名称": "食葡糖罗斯拜瑞氏菌 Roseburia inulinivorans",
+        "丰度%": "0.8472",
+        "正常范围%": "0.0165-4.9966",
+        "人群水平%": "78%"
+      },
+      {
+        "名称": "双歧杆菌属 Bifidobacterium",
+        "丰度%": "0.1141"
+      },
+      {
+        "名称": "0.1914-12.598",
+        "丰度%": "39%"
+      }
+    ],
+    "过敏相关菌": [
+      {
+        "名称": "脆弱拟杆菌 Bacteroides fragilis",
+        "丰度%": "2.2654"
+      },
+      {
+        "名称": "0-0.4212",
+        "丰度%": "85%"
+      },
+      {
+        "名称": "枸橼酸杆菌属 Citrobacter",
+        "丰度%": "0.0036",
+        "正常范围%": "0-0.0668",
+        "人群水平%": "49%"
+      },
+      {
+        "名称": "克雷伯氏菌属 Klebsiella",
+        "丰度%": "0.0510",
+        "正常范围%": "0-15.81",
+        "人群水平%": "36%"
+      },
+      {
+        "名称": "莫拉氏菌属 Moraxella",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0096",
+        "人群水平%": "80%"
+      },
+      {
+        "名称": "变形菌门 Proteobacteria",
+        "丰度%": "2.4261",
+        "正常范围%": "0-21.089",
+        "人群水平%": "19%"
+      },
+      {
+        "名称": "肠杆菌科 Enterobacteriaceae",
+        "丰度%": "0.1053",
+        "正常范围%": "0-64.256",
+        "人群水平%": "13%"
+      },
+      {
+        "名称": "活泼瘤胃球菌 Ruminococcus gnavus",
+        "丰度%": "0.2246",
+        "正常范围%": "0-2.583",
+        "人群水平%": "71%"
+      },
+      {
+        "名称": "气单胞菌属 Aeromonas",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0334",
+        "人群水平%": "99%"
+      },
+      {
+        "名称": "经黏液真杆菌属 Blautia",
+        "丰度%": "3.1770",
+        "正常范围%": "0.3366-3.237",
+        "人群水平%": "95%"
+      },
+      {
+        "名称": "肠球菌属 Enterococcus",
+        "丰度%": "ND",
+        "正常范围%": "0-1.1362",
+        "人群水平%": "41%"
+      },
+      {
+        "名称": "粪杆菌属 Faecalibacterium",
+        "丰度%": "14.2451",
+        "正常范围%": "0.0351-18.1656",
+        "人群水平%": "94%"
+      },
+      {
+        "名称": "丙酸杆菌属 Propionibacterium",
+        "丰度%": "0.0036",
+        "正常范围%": "0-0.0162",
+        "人群水平%": "96%"
+      }
+    ],
+    "腹胀相关菌": [
+      {
+        "名称": "史氏甲烷短杆菌 Methanobrevibacter smithii",
+        "丰度%": "ND",
+        "正常范围%": "0-1.1952",
+        "人群水平%": "85%"
+      },
+      {
+        "名称": "拟杆菌属 Bacteroides",
+        "丰度%": "18.4336",
+        "正常范围%": "1.0292-55.9251",
+        "人群水平%": "44%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.6731",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "51%"
+      },
+      {
+        "名称": "瘤胃球菌属 Ruminococcus",
+        "丰度%": "2.1607",
+        "正常范围%": "0.266-33.2664",
+        "人群水平%": "74%"
+      },
+      {
+        "名称": "变形菌门 Proteobacteria",
+        "丰度%": "2.4261",
+        "正常范围%": "0-21.08931741",
+        "人群水平%": "19%"
+      },
+      {
+        "名称": "艰难梭菌 Clostridium difficile",
+        "丰度%": "ND"
+      },
+      {
+        "名称": "肠球菌属 Enterococcus",
+        "丰度%": "ND",
+        "正常范围%": "0-1.1362",
+        "人群水平%": "41%"
+      },
+      {
+        "名称": "普雷沃氏菌属 Prevotella",
+        "丰度%": "0.6430",
+        "正常范围%": "0.3652-81.2736",
+        "人群水平%": "29%"
+      },
+      {
+        "名称": "Streptococcus",
+        "丰度%": "0.1322",
+        "正常范围%": "0-1.3257",
+        "人群水平%": "47%"
+      },
+      {
+        "名称": "蓝藻门 Cyanobacteria",
+        "丰度%": "ND",
+        "正常范围%": "0-0.052432984",
+        "人群水平%": "70%"
+      },
+      {
+        "名称": "产气荚膜梭菌 Clostridium perfringens",
+        "丰度%": "ND"
+      },
+      {
+        "名称": "乳杆菌属 Lactobacillus",
+        "丰度%": "0.1360"
+      },
+      {
+        "名称": "0.166-6.5835",
+        "丰度%": "47%"
+      },
+      {
+        "名称": "毛螺旋菌科 Lachnospiraceae",
+        "丰度%": "30.8155",
+        "正常范围%": "0.8403-66.733",
+        "人群水平%": "94%"
+      },
+      {
+        "名称": "双歧杆菌属 Bifidobacterium",
+        "丰度%": "0.1141"
+      },
+      {
+        "名称": "0.1914-12.598",
+        "丰度%": "39%"
+      }
+    ],
+    "失眠相关菌": [
+      {
+        "名称": "阿克曼氏菌属 Akkermansia",
+        "丰度%": "0.0184",
+        "正常范围%": "0.0018-7.8352",
+        "人群水平%": "51%"
+      },
+      {
+        "名称": "拟杆菌属 Bacteroides",
+        "丰度%": "18.4336",
+        "正常范围%": "1.0292-55.9251",
+        "人群水平%": "44%"
+      },
+      {
+        "名称": "梭菌目 Clostridiales",
+        "丰度%": "51.4291",
+        "正常范围%": "5.2999-89.2167",
+        "人群水平%": "77%"
+      },
+      {
+        "名称": "长双歧杆菌 Bifidobacterium longum",
+        "丰度%": "0.1141"
+      },
+      {
+        "名称": "0-0.0996",
+        "丰度%": "97%"
+      },
+      {
+        "名称": "经黏液真杆菌属 Blautia",
+        "丰度%": "3.1770",
+        "正常范围%": "0.3366-3.237",
+        "人群水平%": "95%"
+      },
+      {
+        "名称": "梭菌属 Clostridium",
+        "丰度%": "0.6731",
+        "正常范围%": "0.0306-6.9615",
+        "人群水平%": "51%"
+      },
+      {
+        "名称": "粪杆菌属 Faecalibacterium",
+        "丰度%": "14.2451",
+        "正常范围%": "0.0351-18.1656",
+        "人群水平%": "94%"
+      },
+      {
+        "名称": "Lachnoclostridium",
+        "丰度%": "1.5173",
+        "正常范围%": "0.117-6.2036",
+        "人群水平%": "76%"
+      },
+      {
+        "名称": "普雷沃氏菌属 Prevotella",
+        "丰度%": "0.6430",
+        "正常范围%": "0.3652-81.2736",
+        "人群水平%": "29%"
+      },
+      {
+        "名称": "龙包茨氏菌属 Romboutsia",
+        "丰度%": "ND",
+        "正常范围%": "0-0.0189",
+        "人群水平%": "73%"
+      },
+      {
+        "名称": "Streptococcus",
+        "丰度%": "0.1322",
+        "正常范围%": "0-1.3257",
+        "人群水平%": "47%"
+      },
+      {
+        "名称": "厚壁菌门 Firmicutes",
+        "丰度%": "75.622%",
+        "人群水平%": "93%",
+        "检出率%": "98.95%"
+      },
+      {
+        "名称": "拟杆菌门 Bacteroidetes",
+        "丰度%": "20.818%",
+        "人群水平%": "33%",
+        "检出率%": "98.03%"
+      },
+      {
+        "名称": "变形菌门 Proteobacteria",
+        "丰度%": "2.426%",
+        "人群水平%": "19%",
+        "检出率%": "93.53%"
+      },
+      {
+        "名称": "放线菌门 Actinobacteria",
+        "丰度%": "0.680%",
+        "人群水平%": "55%",
+        "检出率%": "94.62%"
+      },
+      {
+        "名称": "衣原体 Chlamydiae",
+        "丰度%": "0.328%",
+        "人群水平%": "99%",
+        "检出率%": "0.14%"
+      },
+      {
+        "名称": "疣微菌门 Verrucomicrobia",
+        "丰度%": "0.018%",
+        "人群水平%": "59%",
+        "检出率%": "56.29%"
+      },
+      {
+        "名称": "您的厚壁菌比拟杆菌比值为:",
+        "丰度%": "3.63"
+      },
+      {
+        "名称": "中国人群平均的厚壁菌比拟杆菌比例为:",
+        "丰度%": "2.6"
+      }
+    ]
+  }
+}

+ 4314 - 0
cfc-backend/src/main/resources/knowledge-base/报告指标知识库.json

@@ -0,0 +1,4314 @@
+{
+  "元数据": {
+    "名称": "菌群报告指标知识库",
+    "版本": "3.0",
+    "说明": "v3: 新增食物库、菌属功能库、指标调整建议。数据与模板分离,学名匹配。",
+    "数据来源": "5份肠道菌群健康检测报告交叉验证",
+    "用途": "用于报告指标值的自动化状态比对,取值规则:遍历状态分级,若值在[最小值, 最大值)区间内则匹配该状态"
+  },
+  "疾病风险评估": {
+    "标准范围": {
+      "最小值": 0,
+      "最大值": 1
+    },
+    "状态分级": [
+      {
+        "状态": "低风险",
+        "最小值": 0,
+        "最大值": 0.3
+      },
+      {
+        "状态": "注意",
+        "最小值": 0.3,
+        "最大值": 0.5
+      },
+      {
+        "状态": "高风险",
+        "最小值": 0.5,
+        "最大值": 1
+      }
+    ],
+    "指标": [
+      {
+        "名称": "炎症性肠炎",
+        "说明": "肠道慢性炎症性疾病风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制炎症性肠炎的风险水平。"
+      },
+      {
+        "名称": "肠易激综合征",
+        "说明": "功能性肠道疾病风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制肠易激综合征的风险水平。"
+      },
+      {
+        "名称": "感染性腹泻",
+        "说明": "细菌/病毒感染性腹泻风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制感染性腹泻的风险水平。"
+      },
+      {
+        "名称": "自闭症",
+        "说明": "自闭症谱系障碍风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制自闭症的风险水平。"
+      },
+      {
+        "名称": "抑郁症",
+        "说明": "抑郁症风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制抑郁症的风险水平。"
+      },
+      {
+        "名称": "甲状腺疾病",
+        "说明": "甲状腺功能异常风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制甲状腺疾病的风险水平。"
+      },
+      {
+        "名称": "肺部感染或疾病",
+        "说明": "呼吸系统疾病风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制肺部感染或疾病的风险水平。"
+      },
+      {
+        "名称": "肺部疾病",
+        "说明": "肺部疾病风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制肺部疾病的风险水平。"
+      },
+      {
+        "名称": "自体免疫病",
+        "说明": "自身免疫性疾病风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制自体免疫病的风险水平。"
+      },
+      {
+        "名称": "结直肠癌",
+        "说明": "结直肠癌风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制结直肠癌的风险水平。"
+      },
+      {
+        "名称": "肥胖",
+        "说明": "肥胖风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制肥胖的风险水平。"
+      },
+      {
+        "名称": "便秘",
+        "说明": "便秘风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制便秘的风险水平。"
+      },
+      {
+        "名称": "过敏",
+        "说明": "过敏性疾病风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制过敏的风险水平。"
+      },
+      {
+        "名称": "失眠",
+        "说明": "睡眠障碍风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制失眠的风险水平。"
+      },
+      {
+        "名称": "肝病",
+        "说明": "肝脏疾病风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制肝病的风险水平。"
+      },
+      {
+        "名称": "肾病",
+        "说明": "肾脏疾病风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制肾病的风险水平。"
+      },
+      {
+        "名称": "胃病",
+        "说明": "胃部疾病风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制胃病的风险水平。"
+      },
+      {
+        "名称": "胆病",
+        "说明": "胆囊/胆道疾病风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制胆病的风险水平。"
+      },
+      {
+        "名称": "心脑血管疾病",
+        "说明": "心脑血管疾病风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制心脑血管疾病的风险水平。"
+      },
+      {
+        "名称": "II型糖尿病",
+        "说明": "II型糖尿病风险评估",
+        "偏高影响": "",
+        "偏低影响": "低风险提示该疾病风险较低,保持现有健康状态即可。",
+        "调整建议": "维持健康的饮食和生活习惯,定期关注肠道菌群变化,有助于控制II型糖尿病的风险水平。"
+      }
+    ]
+  },
+  "主要营养评估": {
+    "标准范围": {
+      "最小值": 0,
+      "最大值": 100
+    },
+    "状态分级": [
+      {
+        "状态": "缺乏",
+        "最小值": 0,
+        "最大值": 5
+      },
+      {
+        "状态": "偏低",
+        "最小值": 5,
+        "最大值": 15
+      },
+      {
+        "状态": "正常",
+        "最小值": 15,
+        "最大值": 100
+      }
+    ],
+    "指标": [
+      {
+        "名称": "碳水化合物",
+        "说明": "主要能量来源",
+        "偏高影响": "碳水化合物摄入偏高提示当前摄入充足,无需额外补充。",
+        "偏低影响": "碳水化合物摄入不足可能影响能量供给和身体机能。",
+        "调整建议": "保持均衡摄入,根据个人情况适当调整碳水化合物来源食物的比例。"
+      },
+      {
+        "名称": "蛋白质",
+        "说明": "机体构建和修复的重要营养素",
+        "偏高影响": "蛋白质摄入偏高提示当前摄入充足,无需额外补充。",
+        "偏低影响": "蛋白质摄入不足可能影响能量供给和身体机能。",
+        "调整建议": "保持均衡摄入,根据个人情况适当调整蛋白质来源食物的比例。"
+      },
+      {
+        "名称": "脂肪",
+        "说明": "必需脂肪酸来源,脂溶性维生素载体",
+        "偏高影响": "脂肪摄入偏高提示当前摄入充足,无需额外补充。",
+        "偏低影响": "脂肪摄入不足可能影响能量供给和身体机能。",
+        "调整建议": "保持均衡摄入,根据个人情况适当调整脂肪来源食物的比例。"
+      },
+      {
+        "名称": "纤维素",
+        "说明": "促进肠道蠕动,维持菌群健康",
+        "偏高影响": "纤维素摄入偏高提示当前摄入充足,无需额外补充。",
+        "偏低影响": "纤维素摄入不足可能影响能量供给和身体机能。",
+        "调整建议": "保持均衡摄入,根据个人情况适当调整纤维素来源食物的比例。"
+      },
+      {
+        "名称": "乳制品",
+        "说明": "钙质和优质蛋白来源",
+        "偏高影响": "乳制品摄入偏高提示当前摄入充足,无需额外补充。",
+        "偏低影响": "乳制品摄入不足可能影响能量供给和身体机能。",
+        "调整建议": "保持均衡摄入,根据个人情况适当调整乳制品来源食物的比例。"
+      }
+    ]
+  },
+  "氨基酸评估": {
+    "标准范围": {
+      "最小值": 0,
+      "最大值": 100
+    },
+    "状态分级": [
+      {
+        "状态": "缺乏",
+        "最小值": 0,
+        "最大值": 5
+      },
+      {
+        "状态": "偏低",
+        "最小值": 5,
+        "最大值": 15
+      },
+      {
+        "状态": "正常",
+        "最小值": 15,
+        "最大值": 100
+      }
+    ],
+    "指标": [
+      {
+        "名称": "苏氨酸",
+        "说明": "必需氨基酸,参与蛋白质合成和免疫功能",
+        "偏高影响": "",
+        "偏低影响": "苏氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含苏氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      },
+      {
+        "名称": "异亮氨酸",
+        "说明": "支链氨基酸,促进肌肉合成和能量代谢",
+        "偏高影响": "",
+        "偏低影响": "异亮氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含异亮氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      },
+      {
+        "名称": "亮氨酸",
+        "说明": "支链氨基酸,激活肌肉蛋白合成通路",
+        "偏高影响": "",
+        "偏低影响": "亮氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含亮氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      },
+      {
+        "名称": "赖氨酸",
+        "说明": "必需氨基酸,参与钙吸收和胶原蛋白合成",
+        "偏高影响": "",
+        "偏低影响": "赖氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含赖氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      },
+      {
+        "名称": "蛋氨酸",
+        "说明": "含硫氨基酸,参与甲基化和解毒过程",
+        "偏高影响": "",
+        "偏低影响": "蛋氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含蛋氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      },
+      {
+        "名称": "胱氨酸",
+        "说明": "非必需氨基酸,参与谷胱甘肽合成",
+        "偏高影响": "",
+        "偏低影响": "胱氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含胱氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      },
+      {
+        "名称": "苯丙氨酸",
+        "说明": "必需氨基酸,多巴胺和肾上腺素前体",
+        "偏高影响": "",
+        "偏低影响": "苯丙氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含苯丙氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      },
+      {
+        "名称": "酪氨酸",
+        "说明": "非必需氨基酸,甲状腺激素和黑色素前体",
+        "偏高影响": "",
+        "偏低影响": "酪氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含酪氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      },
+      {
+        "名称": "缬氨酸",
+        "说明": "支链氨基酸,参与肌肉代谢和能量供应",
+        "偏高影响": "",
+        "偏低影响": "缬氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含缬氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      },
+      {
+        "名称": "组氨酸",
+        "说明": "必需氨基酸,组胺前体,参与免疫调节",
+        "偏高影响": "",
+        "偏低影响": "组氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含组氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      },
+      {
+        "名称": "丙氨酸",
+        "说明": "非必需氨基酸,参与葡萄糖-丙氨酸循环",
+        "偏高影响": "",
+        "偏低影响": "丙氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含丙氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      },
+      {
+        "名称": "丝氨酸",
+        "说明": "非必需氨基酸,参与磷脂和核苷酸合成",
+        "偏高影响": "",
+        "偏低影响": "丝氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含丝氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      },
+      {
+        "名称": "甘氨酸",
+        "说明": "最简单的氨基酸,参与胶原蛋白和胆汁酸合成",
+        "偏高影响": "",
+        "偏低影响": "甘氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含甘氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      },
+      {
+        "名称": "脯氨酸",
+        "说明": "非必需氨基酸,胶原蛋白的重要组成成分",
+        "偏高影响": "",
+        "偏低影响": "脯氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含脯氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      },
+      {
+        "名称": "谷氨酸",
+        "说明": "兴奋性神经递质,参与氨代谢和解毒",
+        "偏高影响": "",
+        "偏低影响": "谷氨酸水平偏低可能影响蛋白质合成和相关代谢功能。",
+        "调整建议": "增加富含谷氨酸的蛋白质食物摄入,如肉类、蛋类、豆制品等。"
+      }
+    ]
+  },
+  "维生素评估": {
+    "标准范围": {
+      "最小值": 0,
+      "最大值": 100
+    },
+    "状态分级": [
+      {
+        "状态": "缺乏",
+        "最小值": 0,
+        "最大值": 5
+      },
+      {
+        "状态": "偏低",
+        "最小值": 5,
+        "最大值": 15
+      },
+      {
+        "状态": "正常",
+        "最小值": 15,
+        "最大值": 100
+      }
+    ],
+    "指标": [
+      {
+        "名称": "维生素A",
+        "说明": "维持视力、免疫功能和皮肤健康",
+        "偏高影响": "",
+        "偏低影响": "维生素A不足可能影响相应的生理功能。",
+        "调整建议": "增加富含维生素A的食物摄入,必要时在专业指导下补充。"
+      },
+      {
+        "名称": "维生素B1",
+        "说明": "硫胺素,参与能量代谢和神经功能",
+        "偏高影响": "",
+        "偏低影响": "维生素B1不足可能影响相应的生理功能。",
+        "调整建议": "增加富含维生素B1的食物摄入,必要时在专业指导下补充。"
+      },
+      {
+        "名称": "维生素B2",
+        "说明": "核黄素,参与能量代谢和细胞生长",
+        "偏高影响": "",
+        "偏低影响": "维生素B2不足可能影响相应的生理功能。",
+        "调整建议": "增加富含维生素B2的食物摄入,必要时在专业指导下补充。"
+      },
+      {
+        "名称": "维生素B5",
+        "说明": "泛酸,辅酶A的组成部分",
+        "偏高影响": "",
+        "偏低影响": "维生素B5不足可能影响相应的生理功能。",
+        "调整建议": "增加富含维生素B5的食物摄入,必要时在专业指导下补充。"
+      },
+      {
+        "名称": "维生素B6",
+        "说明": "参与氨基酸代谢和神经递质合成",
+        "偏高影响": "",
+        "偏低影响": "维生素B6不足可能影响相应的生理功能。",
+        "调整建议": "增加富含维生素B6的食物摄入,必要时在专业指导下补充。"
+      },
+      {
+        "名称": "叶酸",
+        "说明": "维生素B9,参与DNA合成和细胞分裂",
+        "偏高影响": "",
+        "偏低影响": "叶酸不足可能影响相应的生理功能。",
+        "调整建议": "增加富含叶酸的食物摄入,必要时在专业指导下补充。"
+      },
+      {
+        "名称": "维生素B12",
+        "说明": "钴胺素,参与红细胞生成和神经功能",
+        "偏高影响": "",
+        "偏低影响": "维生素B12不足可能影响相应的生理功能。",
+        "调整建议": "增加富含维生素B12的食物摄入,必要时在专业指导下补充。"
+      },
+      {
+        "名称": "维生素C",
+        "说明": "抗氧化,促进胶原蛋白合成和铁吸收",
+        "偏高影响": "",
+        "偏低影响": "维生素C不足可能影响相应的生理功能。",
+        "调整建议": "增加富含维生素C的食物摄入,必要时在专业指导下补充。"
+      },
+      {
+        "名称": "维生素D",
+        "说明": "促进钙吸收,维持骨骼健康和免疫功能",
+        "偏高影响": "",
+        "偏低影响": "维生素D不足可能影响相应的生理功能。",
+        "调整建议": "增加富含维生素D的食物摄入,必要时在专业指导下补充。"
+      },
+      {
+        "名称": "维生素K2",
+        "说明": "参与钙代谢和凝血功能",
+        "偏高影响": "",
+        "偏低影响": "维生素K2不足可能影响相应的生理功能。",
+        "调整建议": "增加富含维生素K2的食物摄入,必要时在专业指导下补充。"
+      }
+    ]
+  },
+  "微量元素评估": {
+    "标准范围": {
+      "最小值": 0,
+      "最大值": 100
+    },
+    "状态分级": [
+      {
+        "状态": "缺乏",
+        "最小值": 0,
+        "最大值": 5
+      },
+      {
+        "状态": "偏低",
+        "最小值": 5,
+        "最大值": 15
+      },
+      {
+        "状态": "正常",
+        "最小值": 15,
+        "最大值": 100
+      }
+    ],
+    "指标": [
+      {
+        "名称": "铁",
+        "说明": "血红蛋白的重要组成部分,缺铁会导致贫血",
+        "偏高影响": "",
+        "偏低影响": "铁缺乏可能影响造血和免疫功能。",
+        "调整建议": "增加富含铁的食物摄入,如红肉、动物肝脏、海鲜等。"
+      },
+      {
+        "名称": "锌",
+        "说明": "参与免疫功能和伤口愈合,影响生长发育",
+        "偏高影响": "",
+        "偏低影响": "锌缺乏可能影响造血和免疫功能。",
+        "调整建议": "增加富含锌的食物摄入,如红肉、动物肝脏、海鲜等。"
+      }
+    ]
+  },
+  "抗生素风险评估": {
+    "标准范围": {
+      "最小值": 0,
+      "最大值": 100
+    },
+    "状态分级": [
+      {
+        "状态": "低风险",
+        "最小值": 0,
+        "最大值": 30
+      },
+      {
+        "状态": "注意",
+        "最小值": 30,
+        "最大值": 60
+      },
+      {
+        "状态": "高风险",
+        "最小值": 60,
+        "最大值": 100
+      }
+    ],
+    "指标": [
+      {
+        "名称": "β-内酰胺酶类",
+        "说明": "青霉素类抗生素耐药基因水平",
+        "偏高影响": "β-内酰胺酶类耐药基因水平偏高,提示可能携带相关耐药性。",
+        "偏低影响": "",
+        "调整建议": "合理使用抗生素,避免滥用,遵医嘱完成疗程。"
+      },
+      {
+        "名称": "氨基糖苷类",
+        "说明": "氨基糖苷类抗生素耐药基因水平",
+        "偏高影响": "氨基糖苷类耐药基因水平偏高,提示可能携带相关耐药性。",
+        "偏低影响": "",
+        "调整建议": "合理使用抗生素,避免滥用,遵医嘱完成疗程。"
+      },
+      {
+        "名称": "大环内酯类",
+        "说明": "大环内酯类抗生素耐药基因水平",
+        "偏高影响": "大环内酯类耐药基因水平偏高,提示可能携带相关耐药性。",
+        "偏低影响": "",
+        "调整建议": "合理使用抗生素,避免滥用,遵医嘱完成疗程。"
+      },
+      {
+        "名称": "呋喃类",
+        "说明": "呋喃类抗生素耐药基因水平",
+        "偏高影响": "呋喃类耐药基因水平偏高,提示可能携带相关耐药性。",
+        "偏低影响": "",
+        "调整建议": "合理使用抗生素,避免滥用,遵医嘱完成疗程。"
+      },
+      {
+        "名称": "喹诺酮类",
+        "说明": "喹诺酮类抗生素耐药基因水平",
+        "偏高影响": "喹诺酮类耐药基因水平偏高,提示可能携带相关耐药性。",
+        "偏低影响": "",
+        "调整建议": "合理使用抗生素,避免滥用,遵医嘱完成疗程。"
+      },
+      {
+        "名称": "磺胺类",
+        "说明": "磺胺类抗生素耐药基因水平",
+        "偏高影响": "磺胺类耐药基因水平偏高,提示可能携带相关耐药性。",
+        "偏低影响": "",
+        "调整建议": "合理使用抗生素,避免滥用,遵医嘱完成疗程。"
+      },
+      {
+        "名称": "甲氧苄啶类",
+        "说明": "甲氧苄啶类抗生素耐药基因水平",
+        "偏高影响": "甲氧苄啶类耐药基因水平偏高,提示可能携带相关耐药性。",
+        "偏低影响": "",
+        "调整建议": "合理使用抗生素,避免滥用,遵医嘱完成疗程。"
+      },
+      {
+        "名称": "氯霉素类",
+        "说明": "氯霉素类抗生素耐药基因水平",
+        "偏高影响": "氯霉素类耐药基因水平偏高,提示可能携带相关耐药性。",
+        "偏低影响": "",
+        "调整建议": "合理使用抗生素,避免滥用,遵医嘱完成疗程。"
+      },
+      {
+        "名称": "四环素类",
+        "说明": "四环素类抗生素耐药基因水平",
+        "偏高影响": "四环素类耐药基因水平偏高,提示可能携带相关耐药性。",
+        "偏低影响": "",
+        "调整建议": "合理使用抗生素,避免滥用,遵医嘱完成疗程。"
+      }
+    ]
+  },
+  "肠道屏障及代谢物": {
+    "标准范围": {
+      "最小值": 0,
+      "最大值": 100
+    },
+    "状态分级": null,
+    "指标": [
+      {
+        "名称": "肠道炎症水平",
+        "标准范围": {
+          "最小值": 0,
+          "最大值": 80
+        },
+        "状态分级": [
+          {
+            "状态": "正常",
+            "最小值": 0,
+            "最大值": 80
+          },
+          {
+            "状态": "过高",
+            "最小值": 80,
+            "最大值": 100
+          }
+        ],
+        "说明": "肠道炎症程度评估",
+        "偏高影响": "肠道炎症水平水平偏高,提示肠道代谢环境异常。",
+        "偏低影响": "",
+        "调整建议": "建议均衡饮食,增加膳食纤维摄入,促进肠道菌群健康。"
+      },
+      {
+        "名称": "肠道产气",
+        "标准范围": {
+          "最小值": 0,
+          "最大值": 50
+        },
+        "状态分级": [
+          {
+            "状态": "正常",
+            "最小值": 0,
+            "最大值": 50
+          },
+          {
+            "状态": "轻度产气",
+            "最小值": 50,
+            "最大值": 80
+          },
+          {
+            "状态": "严重产气",
+            "最小值": 80,
+            "最大值": 100
+          }
+        ],
+        "说明": "肠道产气水平评估",
+        "偏高影响": "肠道产气水平偏高,提示肠道代谢环境异常。",
+        "偏低影响": "",
+        "调整建议": "建议均衡饮食,增加膳食纤维摄入,促进肠道菌群健康。"
+      },
+      {
+        "名称": "肠道屏障",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 100
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 100
+          }
+        ],
+        "说明": "肠道屏障功能评估",
+        "偏高影响": "",
+        "偏低影响": "肠道屏障水平偏低,可能影响肠道健康功能。",
+        "调整建议": "建议均衡饮食,增加膳食纤维摄入,促进肠道菌群健康。"
+      },
+      {
+        "名称": "脂多糖LPS",
+        "标准范围": {
+          "最小值": 0,
+          "最大值": 85
+        },
+        "状态分级": [
+          {
+            "状态": "正常",
+            "最小值": 0,
+            "最大值": 85
+          },
+          {
+            "状态": "过高",
+            "最小值": 85,
+            "最大值": 100
+          }
+        ],
+        "说明": "内毒素水平评估",
+        "偏高影响": "脂多糖LPS水平偏高,提示肠道代谢环境异常。",
+        "偏低影响": "",
+        "调整建议": "建议均衡饮食,增加膳食纤维摄入,促进肠道菌群健康。"
+      },
+      {
+        "名称": "次级胆汁酸",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 95
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 95
+          },
+          {
+            "状态": "过高",
+            "最小值": 95,
+            "最大值": 100
+          }
+        ],
+        "说明": "胆汁酸代谢产物",
+        "偏高影响": "次级胆汁酸水平偏高,提示肠道代谢环境异常。",
+        "偏低影响": "次级胆汁酸水平偏低,可能影响肠道健康功能。",
+        "调整建议": "建议均衡饮食,增加膳食纤维摄入,促进肠道菌群健康。"
+      },
+      {
+        "名称": "对甲酚(p-Cresol)",
+        "标准范围": {
+          "最小值": 0,
+          "最大值": 85
+        },
+        "状态分级": [
+          {
+            "状态": "正常",
+            "最小值": 0,
+            "最大值": 85
+          },
+          {
+            "状态": "过高",
+            "最小值": 85,
+            "最大值": 100
+          }
+        ],
+        "说明": "酪氨酸代谢产物,尿毒症毒素",
+        "偏高影响": "对甲酚(p-Cresol)水平偏高,提示肠道代谢环境异常。",
+        "偏低影响": "",
+        "调整建议": "建议均衡饮食,增加膳食纤维摄入,促进肠道菌群健康。"
+      },
+      {
+        "名称": "吲哚",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 90
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 90
+          },
+          {
+            "状态": "过高",
+            "最小值": 90,
+            "最大值": 100
+          }
+        ],
+        "说明": "色氨酸代谢产物",
+        "偏高影响": "吲哚水平偏高,提示肠道代谢环境异常。",
+        "偏低影响": "吲哚水平偏低,可能影响肠道健康功能。",
+        "调整建议": "建议均衡饮食,增加膳食纤维摄入,促进肠道菌群健康。"
+      },
+      {
+        "名称": "苯酚",
+        "标准范围": {
+          "最小值": 0,
+          "最大值": 85
+        },
+        "状态分级": [
+          {
+            "状态": "正常",
+            "最小值": 0,
+            "最大值": 85
+          },
+          {
+            "状态": "过高",
+            "最小值": 85,
+            "最大值": 100
+          }
+        ],
+        "说明": "酪氨酸代谢产物",
+        "偏高影响": "苯酚水平偏高,提示肠道代谢环境异常。",
+        "偏低影响": "",
+        "调整建议": "建议均衡饮食,增加膳食纤维摄入,促进肠道菌群健康。"
+      },
+      {
+        "名称": "腐胺",
+        "标准范围": {
+          "最小值": 5,
+          "最大值": 85
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "正常",
+            "最小值": 5,
+            "最大值": 85
+          },
+          {
+            "状态": "过高",
+            "最小值": 85,
+            "最大值": 100
+          }
+        ],
+        "说明": "多胺类物质,与细胞增殖和炎症相关",
+        "偏高影响": "腐胺水平偏高,提示肠道代谢环境异常。",
+        "偏低影响": "腐胺水平偏低,可能影响肠道健康功能。",
+        "调整建议": "建议均衡饮食,增加膳食纤维摄入,促进肠道菌群健康。"
+      },
+      {
+        "名称": "硫化氢",
+        "标准范围": {
+          "最小值": 5,
+          "最大值": 85
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "正常",
+            "最小值": 5,
+            "最大值": 85
+          },
+          {
+            "状态": "过高",
+            "最小值": 85,
+            "最大值": 100
+          }
+        ],
+        "说明": "含硫氨基酸代谢产物",
+        "偏高影响": "硫化氢水平偏高,提示肠道代谢环境异常。",
+        "偏低影响": "硫化氢水平偏低,可能影响肠道健康功能。",
+        "调整建议": "建议均衡饮食,增加膳食纤维摄入,促进肠道菌群健康。"
+      },
+      {
+        "名称": "尸胺",
+        "标准范围": {
+          "最小值": 5,
+          "最大值": 85
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "正常",
+            "最小值": 5,
+            "最大值": 85
+          },
+          {
+            "状态": "过高",
+            "最小值": 85,
+            "最大值": 100
+          }
+        ],
+        "说明": "组氨酸代谢产物,与肠道炎症相关",
+        "偏高影响": "尸胺水平偏高,提示肠道代谢环境异常。",
+        "偏低影响": "尸胺水平偏低,可能影响肠道健康功能。",
+        "调整建议": "建议均衡饮食,增加膳食纤维摄入,促进肠道菌群健康。"
+      }
+    ]
+  },
+  "短链脂肪酸": {
+    "标准范围": {
+      "最小值": 0,
+      "最大值": 100
+    },
+    "状态分级": null,
+    "指标": [
+      {
+        "名称": "丁酸盐(Butyrate)",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 95
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 95
+          },
+          {
+            "状态": "过高",
+            "最小值": 95,
+            "最大值": 100
+          }
+        ],
+        "说明": "肠道上皮细胞主要能量来源,抗炎",
+        "偏高影响": "丁酸盐(Butyrate)水平偏高,可能提示肠道发酵过度。",
+        "偏低影响": "丁酸盐(Butyrate)水平偏低,可能影响肠道上皮健康和抗炎能力。",
+        "调整建议": "增加膳食纤维摄入(全谷物、蔬菜、豆类),促进短链脂肪酸生成。"
+      },
+      {
+        "名称": "丙酸盐(Propionate)",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 90
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 90
+          },
+          {
+            "状态": "过高",
+            "最小值": 90,
+            "最大值": 100
+          }
+        ],
+        "说明": "参与肝脏糖异生,调节食欲",
+        "偏高影响": "丙酸盐(Propionate)水平偏高,可能提示肠道发酵过度。",
+        "偏低影响": "丙酸盐(Propionate)水平偏低,可能影响肠道上皮健康和抗炎能力。",
+        "调整建议": "增加膳食纤维摄入(全谷物、蔬菜、豆类),促进短链脂肪酸生成。"
+      },
+      {
+        "名称": "乙酸盐(Acetate)",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 95
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 95
+          },
+          {
+            "状态": "过高",
+            "最小值": 95,
+            "最大值": 100
+          }
+        ],
+        "说明": "最丰富的短链脂肪酸,参与脂质代谢",
+        "偏高影响": "乙酸盐(Acetate)水平偏高,可能提示肠道发酵过度。",
+        "偏低影响": "乙酸盐(Acetate)水平偏低,可能影响肠道上皮健康和抗炎能力。",
+        "调整建议": "增加膳食纤维摄入(全谷物、蔬菜、豆类),促进短链脂肪酸生成。"
+      },
+      {
+        "名称": "异戊酸盐(Isovaleric)",
+        "标准范围": {
+          "最小值": 5,
+          "最大值": 85
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "正常",
+            "最小值": 5,
+            "最大值": 85
+          },
+          {
+            "状态": "过高",
+            "最小值": 85,
+            "最大值": 100
+          }
+        ],
+        "说明": "支链脂肪酸,过量提示蛋白质腐败",
+        "偏高影响": "异戊酸盐(Isovaleric)水平偏高,可能提示肠道发酵过度。",
+        "偏低影响": "异戊酸盐(Isovaleric)水平偏低,可能影响肠道上皮健康和抗炎能力。",
+        "调整建议": "增加膳食纤维摄入(全谷物、蔬菜、豆类),促进短链脂肪酸生成。"
+      }
+    ]
+  },
+  "神经递质及激素": {
+    "标准范围": {
+      "最小值": 0,
+      "最大值": 100
+    },
+    "状态分级": null,
+    "指标": [
+      {
+        "名称": "血清素(5-HT)",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 95
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 95
+          },
+          {
+            "状态": "过高",
+            "最小值": 95,
+            "最大值": 100
+          }
+        ],
+        "说明": "情绪调节、睡眠和食欲相关",
+        "偏高影响": "血清素(5-HT)水平偏高,可能影响神经信号传导平衡。",
+        "偏低影响": "血清素(5-HT)水平偏低,可能影响相关神经功能。",
+        "调整建议": "保持规律作息和均衡营养,必要时在专业指导下干预。"
+      },
+      {
+        "名称": "γ-氨基丁酸(GABA)",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 85
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 85
+          },
+          {
+            "状态": "过高",
+            "最小值": 85,
+            "最大值": 100
+          }
+        ],
+        "说明": "抑制性神经递质,抗焦虑",
+        "偏高影响": "γ-氨基丁酸(GABA)水平偏高,可能影响神经信号传导平衡。",
+        "偏低影响": "γ-氨基丁酸(GABA)水平偏低,可能影响相关神经功能。",
+        "调整建议": "保持规律作息和均衡营养,必要时在专业指导下干预。"
+      },
+      {
+        "名称": "谷氨酸(Glutamate)",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 95
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 95
+          },
+          {
+            "状态": "过高",
+            "最小值": 95,
+            "最大值": 100
+          }
+        ],
+        "说明": "兴奋性神经递质,学习记忆相关",
+        "偏高影响": "谷氨酸(Glutamate)水平偏高,可能影响神经信号传导平衡。",
+        "偏低影响": "谷氨酸(Glutamate)水平偏低,可能影响相关神经功能。",
+        "调整建议": "保持规律作息和均衡营养,必要时在专业指导下干预。"
+      },
+      {
+        "名称": "色氨酸(Tryptophan)",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 95
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 95
+          },
+          {
+            "状态": "过高",
+            "最小值": 95,
+            "最大值": 100
+          }
+        ],
+        "说明": "血清素和褪黑素前体",
+        "偏高影响": "色氨酸(Tryptophan)水平偏高,可能影响神经信号传导平衡。",
+        "偏低影响": "色氨酸(Tryptophan)水平偏低,可能影响相关神经功能。",
+        "调整建议": "保持规律作息和均衡营养,必要时在专业指导下干预。"
+      },
+      {
+        "名称": "DOPAC",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 95
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 95
+          },
+          {
+            "状态": "过高",
+            "最小值": 95,
+            "最大值": 100
+          }
+        ],
+        "说明": "多巴胺代谢产物",
+        "偏高影响": "DOPAC水平偏高,可能影响神经信号传导平衡。",
+        "偏低影响": "DOPAC水平偏低,可能影响相关神经功能。",
+        "调整建议": "保持规律作息和均衡营养,必要时在专业指导下干预。"
+      },
+      {
+        "名称": "多巴胺",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 95
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 95
+          },
+          {
+            "状态": "过高",
+            "最小值": 95,
+            "最大值": 100
+          }
+        ],
+        "说明": "奖赏、动机和运动控制相关",
+        "偏高影响": "多巴胺水平偏高,可能影响神经信号传导平衡。",
+        "偏低影响": "多巴胺水平偏低,可能影响相关神经功能。",
+        "调整建议": "保持规律作息和均衡营养,必要时在专业指导下干预。"
+      },
+      {
+        "名称": "组胺(Histamine)",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 95
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 95
+          },
+          {
+            "状态": "过高",
+            "最小值": 95,
+            "最大值": 100
+          }
+        ],
+        "说明": "免疫反应和胃酸分泌调节",
+        "偏高影响": "组胺(Histamine)水平偏高,可能影响神经信号传导平衡。",
+        "偏低影响": "组胺(Histamine)水平偏低,可能影响相关神经功能。",
+        "调整建议": "保持规律作息和均衡营养,必要时在专业指导下干预。"
+      },
+      {
+        "名称": "一氧化氮",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 95
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 95
+          },
+          {
+            "状态": "过高",
+            "最小值": 95,
+            "最大值": 100
+          }
+        ],
+        "说明": "血管舒张和神经信号传导",
+        "偏高影响": "一氧化氮水平偏高,可能影响神经信号传导平衡。",
+        "偏低影响": "一氧化氮水平偏低,可能影响相关神经功能。",
+        "调整建议": "保持规律作息和均衡营养,必要时在专业指导下干预。"
+      },
+      {
+        "名称": "喹啉(Quinolinic)",
+        "标准范围": {
+          "最小值": 0,
+          "最大值": 95
+        },
+        "状态分级": [
+          {
+            "状态": "正常",
+            "最小值": 0,
+            "最大值": 95
+          },
+          {
+            "状态": "过高",
+            "最小值": 95,
+            "最大值": 100
+          }
+        ],
+        "说明": "色氨酸代谢产物,NMDA受体激动剂",
+        "偏高影响": "喹啉(Quinolinic)水平偏高,可能影响神经信号传导平衡。",
+        "偏低影响": "",
+        "调整建议": "保持规律作息和均衡营养,必要时在专业指导下干预。"
+      },
+      {
+        "名称": "维生素K2",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 99
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 99
+          },
+          {
+            "状态": "过高",
+            "最小值": 99,
+            "最大值": 100
+          }
+        ],
+        "说明": "钙代谢和凝血功能调节",
+        "偏高影响": "维生素K2水平偏高,可能影响神经信号传导平衡。",
+        "偏低影响": "维生素K2水平偏低,可能影响相关神经功能。",
+        "调整建议": "保持规律作息和均衡营养,必要时在专业指导下干预。"
+      },
+      {
+        "名称": "肌醇(Inositol)",
+        "标准范围": {
+          "最小值": 15,
+          "最大值": 99
+        },
+        "状态分级": [
+          {
+            "状态": "缺乏",
+            "最小值": 0,
+            "最大值": 5
+          },
+          {
+            "状态": "不足",
+            "最小值": 5,
+            "最大值": 15
+          },
+          {
+            "状态": "正常",
+            "最小值": 15,
+            "最大值": 99
+          },
+          {
+            "状态": "过高",
+            "最小值": 99,
+            "最大值": 100
+          }
+        ],
+        "说明": "细胞信号传导和脂质代谢",
+        "偏高影响": "肌醇(Inositol)水平偏高,可能影响神经信号传导平衡。",
+        "偏低影响": "肌醇(Inositol)水平偏低,可能影响相关神经功能。",
+        "调整建议": "保持规律作息和均衡营养,必要时在专业指导下干预。"
+      }
+    ]
+  },
+  "主要消化道致病菌": {
+    "标准范围": {
+      "最小值": 0,
+      "最大值": 100
+    },
+    "状态分级": [
+      {
+        "状态": "未检出",
+        "最小值": 0,
+        "最大值": 0
+      },
+      {
+        "状态": "检出",
+        "最小值": 0,
+        "最大值": 100
+      }
+    ],
+    "指标": [
+      {
+        "名称": "幽门螺杆菌",
+        "说明": "与胃炎、胃溃疡和胃癌相关",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整建议": ""
+      },
+      {
+        "名称": "艰难梭菌",
+        "说明": "抗生素相关性腹泻的主要病原菌",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整建议": ""
+      },
+      {
+        "名称": "沙门氏菌",
+        "说明": "食物中毒和肠道感染的常见病原菌",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整建议": ""
+      },
+      {
+        "名称": "志贺氏菌",
+        "说明": "细菌性痢疾的病原菌",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整建议": ""
+      },
+      {
+        "名称": "弯曲杆菌",
+        "说明": "常见的肠道感染病原菌",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整建议": ""
+      }
+    ]
+  },
+  "健康总分评估": {
+    "健康总分": {
+      "标准范围": {
+        "最小值": 0,
+        "最大值": 100
+      },
+      "状态分级": [
+        {
+          "状态": "需关注",
+          "最小值": 0,
+          "最大值": 40
+        },
+        {
+          "状态": "一般",
+          "最小值": 40,
+          "最大值": 60
+        },
+        {
+          "状态": "良好",
+          "最小值": 60,
+          "最大值": 80
+        },
+        {
+          "状态": "优秀",
+          "最小值": 80,
+          "最大值": 100
+        }
+      ],
+      "说明": "健康综合评分"
+    },
+    "菌群健康": {
+      "标准范围": {
+        "最小值": 0,
+        "最大值": 100
+      },
+      "说明": "反映肠道菌群整体健康程度"
+    },
+    "慢病控制": {
+      "标准范围": {
+        "最小值": 0,
+        "最大值": 100
+      },
+      "说明": "反映慢性疾病风险控制水平"
+    },
+    "营养均衡": {
+      "标准范围": {
+        "最小值": 0,
+        "最大值": 100
+      },
+      "说明": "反映营养摄入均衡程度"
+    },
+    "肠道年龄": {
+      "说明": "与实际年龄比较,反映肠道菌群的衰老/年轻程度"
+    }
+  },
+  "食物库": {
+    "说明": "224种食物的基础营养数据,用于展示食物详情和计算推荐指数",
+    "数据": [
+      {
+        "名称": "大麦",
+        "分类": "主食",
+        "能量KJ": "1481",
+        "蛋白g": "12",
+        "脂肪g": "2",
+        "碳水化合物g": "73",
+        "总膳食纤维g": "17"
+      },
+      {
+        "名称": "小米",
+        "分类": "主食",
+        "能量KJ": "1582",
+        "蛋白g": "11",
+        "脂肪g": "4",
+        "碳水化合物g": "72",
+        "总膳食纤维g": "8"
+      },
+      {
+        "名称": "小麦",
+        "分类": "主食",
+        "能量KJ": "1423",
+        "蛋白g": "10",
+        "脂肪g": "1",
+        "碳水化合物g": "75",
+        "总膳食纤维g": "12"
+      },
+      {
+        "名称": "小麦面包",
+        "分类": "主食",
+        "能量KJ": "1116",
+        "蛋白g": "10",
+        "脂肪g": "3",
+        "碳水化合物g": "48",
+        "总膳食纤维g": "4"
+      },
+      {
+        "名称": "意大利面",
+        "分类": "主食",
+        "能量KJ": "386",
+        "蛋白g": "1",
+        "脂肪g": "3",
+        "碳水化合物g": "13",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "燕麦",
+        "分类": "主食",
+        "能量KJ": "297",
+        "蛋白g": "17",
+        "脂肪g": "6",
+        "碳水化合物g": "66",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "玉米粒",
+        "分类": "主食",
+        "能量KJ": "298",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "米饭",
+        "分类": "主食",
+        "能量KJ": "1527",
+        "蛋白g": "7",
+        "脂肪g": "0",
+        "碳水化合物g": "79",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "玉米饼",
+        "分类": "主食",
+        "能量KJ": "912",
+        "蛋白g": "5",
+        "脂肪g": "2",
+        "碳水化合物g": "44",
+        "总膳食纤维g": "6"
+      },
+      {
+        "名称": "荞麦面粉",
+        "分类": "主食",
+        "能量KJ": "1402",
+        "蛋白g": "12",
+        "脂肪g": "3",
+        "碳水化合物g": "70",
+        "总膳食纤维g": "10"
+      },
+      {
+        "名称": "葡萄干浆即食谷物",
+        "分类": "主食",
+        "能量KJ": "1354",
+        "蛋白g": "7",
+        "脂肪g": "1",
+        "碳水化合物g": "78",
+        "总膳食纤维g": "13"
+      },
+      {
+        "名称": "面条",
+        "分类": "主食",
+        "能量KJ": "1609",
+        "蛋白g": "14",
+        "脂肪g": "4",
+        "碳水化合物g": "71",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "鸡蛋面包",
+        "分类": "主食",
+        "能量KJ": "1201",
+        "蛋白g": "9",
+        "脂肪g": "6",
+        "碳水化合物g": "47",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "黑麦面包",
+        "分类": "主食",
+        "能量KJ": "1188",
+        "蛋白g": "9",
+        "脂肪g": "3",
+        "碳水化合物g": "53",
+        "总膳食纤维g": "6"
+      },
+      {
+        "名称": "冰淇淋",
+        "分类": "乳制品",
+        "能量KJ": "690",
+        "蛋白g": "1",
+        "脂肪g": "3",
+        "碳水化合物g": "32",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "奶油",
+        "分类": "乳制品",
+        "能量KJ": "515",
+        "蛋白g": "3",
+        "脂肪g": "10",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "奶酪",
+        "分类": "乳制品",
+        "能量KJ": "1552",
+        "蛋白g": "23",
+        "脂肪g": "29",
+        "碳水化合物g": "2",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "牛奶",
+        "分类": "乳制品",
+        "能量KJ": "268",
+        "蛋白g": "3",
+        "脂肪g": "3",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "脱脂牛奶",
+        "分类": "乳制品",
+        "能量KJ": "142",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "黄油",
+        "分类": "乳制品",
+        "能量KJ": "2999",
+        "蛋白g": "0",
+        "脂肪g": "81",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "山核桃",
+        "分类": "干果",
+        "能量KJ": "2889",
+        "蛋白g": "9",
+        "脂肪g": "71",
+        "碳水化合物g": "13",
+        "总膳食纤维g": "9"
+      },
+      {
+        "名称": "山核桃干",
+        "分类": "干果",
+        "能量KJ": "2749",
+        "蛋白g": "12",
+        "脂肪g": "64",
+        "碳水化合物g": "18",
+        "总膳食纤维g": "6"
+      },
+      {
+        "名称": "杏仁",
+        "分类": "干果",
+        "能量KJ": "2423",
+        "蛋白g": "21",
+        "脂肪g": "49",
+        "碳水化合物g": "21",
+        "总膳食纤维g": "12"
+      },
+      {
+        "名称": "开心果",
+        "分类": "干果",
+        "能量KJ": "2392",
+        "蛋白g": "21",
+        "脂肪g": "45",
+        "碳水化合物g": "28",
+        "总膳食纤维g": "10"
+      },
+      {
+        "名称": "松子",
+        "分类": "干果",
+        "能量KJ": "2816",
+        "蛋白g": "13",
+        "脂肪g": "68",
+        "碳水化合物g": "13",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "栗子",
+        "分类": "干果",
+        "能量KJ": "1519",
+        "蛋白g": "6",
+        "脂肪g": "1",
+        "碳水化合物g": "79",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "核桃",
+        "分类": "干果",
+        "能量KJ": "2738",
+        "蛋白g": "15",
+        "脂肪g": "65",
+        "碳水化合物g": "13",
+        "总膳食纤维g": "6"
+      },
+      {
+        "名称": "椰肉",
+        "分类": "干果",
+        "能量KJ": "1481",
+        "蛋白g": "3",
+        "脂肪g": "33",
+        "碳水化合物g": "15",
+        "总膳食纤维g": "9"
+      },
+      {
+        "名称": "榛子",
+        "分类": "干果",
+        "能量KJ": "2629",
+        "蛋白g": "14",
+        "脂肪g": "60",
+        "碳水化合物g": "16",
+        "总膳食纤维g": "9"
+      },
+      {
+        "名称": "橡子",
+        "分类": "干果",
+        "能量KJ": "1619",
+        "蛋白g": "6",
+        "脂肪g": "23",
+        "碳水化合物g": "40",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "腰果",
+        "分类": "干果",
+        "能量KJ": "2402",
+        "蛋白g": "15",
+        "脂肪g": "46",
+        "碳水化合物g": "32",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "芝麻酱",
+        "分类": "干果",
+        "能量KJ": "2454",
+        "蛋白g": "18",
+        "脂肪g": "50",
+        "碳水化合物g": "24",
+        "总膳食纤维g": "5"
+      },
+      {
+        "名称": "莲子",
+        "分类": "干果",
+        "能量KJ": "372",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "葵花子",
+        "分类": "干果",
+        "能量KJ": "2445",
+        "蛋白g": "20",
+        "脂肪g": "51",
+        "碳水化合物g": "20",
+        "总膳食纤维g": "8"
+      },
+      {
+        "名称": "银杏坚果",
+        "分类": "干果",
+        "能量KJ": "1456",
+        "蛋白g": "10",
+        "脂肪g": "2",
+        "碳水化合物g": "72",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "氏萨",
+        "分类": "快餐",
+        "能量KJ": "1121",
+        "蛋白g": "10",
+        "脂肪g": "12",
+        "碳水化合物g": "29",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "热狗",
+        "分类": "快餐",
+        "能量KJ": "1167",
+        "蛋白g": "9",
+        "脂肪g": "3",
+        "碳水化合物g": "50",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "鸡米花",
+        "分类": "快餐",
+        "能量KJ": "1469",
+        "蛋白g": "17",
+        "脂肪g": "21",
+        "碳水化合物g": "21",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "三文鱼",
+        "分类": "水产品",
+        "能量KJ": "594",
+        "蛋白g": "19",
+        "脂肪g": "6",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "凤尾鱼",
+        "分类": "水产品",
+        "能量KJ": "548",
+        "蛋白g": "20",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "墨鱼",
+        "分类": "水产品",
+        "能量KJ": "331",
+        "蛋白g": "16",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "大氏目鱼",
+        "分类": "水产品",
+        "能量KJ": "382",
+        "蛋白g": "18",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "大西洋鳕鱼",
+        "分类": "水产品",
+        "能量KJ": "343",
+        "蛋白g": "17",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "小龙虾",
+        "分类": "水产品",
+        "能量KJ": "322",
+        "蛋白g": "15",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "扇贝",
+        "分类": "水产品",
+        "能量KJ": "289",
+        "蛋白g": "12",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "条纹鲈鱼",
+        "分类": "水产品",
+        "能量KJ": "406",
+        "蛋白g": "17",
+        "脂肪g": "2",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "海鲈鱼",
+        "分类": "水产品",
+        "能量KJ": "332",
+        "蛋白g": "15",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "牡蛎",
+        "分类": "水产品",
+        "能量KJ": "339",
+        "蛋白g": "9",
+        "脂肪g": "2",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "白鲑",
+        "分类": "水产品",
+        "能量KJ": "611",
+        "蛋白g": "17",
+        "脂肪g": "8",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "石斑鱼",
+        "分类": "水产品",
+        "能量KJ": "385",
+        "蛋白g": "19",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "章鱼",
+        "分类": "水产品",
+        "能量KJ": "343",
+        "蛋白g": "14",
+        "脂肪g": "1",
+        "碳水化合物g": "2",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "虾",
+        "分类": "水产品",
+        "能量KJ": "297",
+        "蛋白g": "13",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "蛤蜊",
+        "分类": "水产品",
+        "能量KJ": "360",
+        "蛋白g": "14",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "蟹",
+        "分类": "水产品",
+        "能量KJ": "364",
+        "蛋白g": "18",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "贻贝",
+        "分类": "水产品",
+        "能量KJ": "360",
+        "蛋白g": "11",
+        "脂肪g": "2",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "金枪鱼",
+        "分类": "水产品",
+        "能量KJ": "602",
+        "蛋白g": "23",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鱼子酱",
+        "分类": "水产品",
+        "能量KJ": "1105",
+        "蛋白g": "24",
+        "脂肪g": "17",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鱿鱼",
+        "分类": "水产品",
+        "能量KJ": "385",
+        "蛋白g": "15",
+        "脂肪g": "1",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鲈鱼",
+        "分类": "水产品",
+        "能量KJ": "381",
+        "蛋白g": "19",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鲍鱼",
+        "分类": "水产品",
+        "能量KJ": "439",
+        "蛋白g": "17",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鲟鱼",
+        "分类": "水产品",
+        "能量KJ": "439",
+        "蛋白g": "16",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鲤鱼",
+        "分类": "水产品",
+        "能量KJ": "531",
+        "蛋白g": "17",
+        "脂肪g": "5",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鲭鱼",
+        "分类": "水产品",
+        "能量KJ": "858",
+        "蛋白g": "18",
+        "脂肪g": "13",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鲱鱼",
+        "分类": "水产品",
+        "能量KJ": "661",
+        "蛋白g": "17",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鲶鱼",
+        "分类": "水产品",
+        "能量KJ": "519",
+        "蛋白g": "20",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鲷鱼",
+        "分类": "水产品",
+        "能量KJ": "418",
+        "蛋白g": "20",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鲽鱼",
+        "分类": "水产品",
+        "能量KJ": "294",
+        "蛋白g": "12",
+        "脂肪g": "1",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鳕鱼",
+        "分类": "水产品",
+        "能量KJ": "364",
+        "蛋白g": "18",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鳗鱼",
+        "分类": "水产品",
+        "能量KJ": "770",
+        "蛋白g": "18",
+        "脂肪g": "11",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鳟鱼",
+        "分类": "水产品",
+        "能量KJ": "619",
+        "蛋白g": "20",
+        "脂肪g": "6",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "沙丁鱼",
+        "分类": "水产品",
+        "能量KJ": "347",
+        "蛋白g": "0",
+        "脂肪g": "1",
+        "碳水化合物g": "19",
+        "总膳食纤维g": "5"
+      },
+      {
+        "名称": "黄尾",
+        "分类": "水产品",
+        "能量KJ": "611",
+        "蛋白g": "23",
+        "脂肪g": "5",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "龙虾",
+        "分类": "水产品",
+        "能量KJ": "324",
+        "蛋白g": "16",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "无花果",
+        "分类": "水果",
+        "能量KJ": "310",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "19",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "李子",
+        "分类": "水果",
+        "能量KJ": "192",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "杏",
+        "分类": "水果",
+        "能量KJ": "201",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "杨桃",
+        "分类": "水果",
+        "能量KJ": "128",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "枣",
+        "分类": "水果",
+        "能量KJ": "1176",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "72",
+        "总膳食纤维g": "6"
+      },
+      {
+        "名称": "柠檬",
+        "分类": "水果",
+        "能量KJ": "121",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "柿子",
+        "分类": "水果",
+        "能量KJ": "293",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "18",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "桃",
+        "分类": "水果",
+        "能量KJ": "165",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "桑葚",
+        "分类": "水果",
+        "能量KJ": "180",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "梨",
+        "分类": "水果",
+        "能量KJ": "239",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "15",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "榴莲",
+        "分类": "水果",
+        "能量KJ": "615",
+        "蛋白g": "1",
+        "脂肪g": "5",
+        "碳水化合物g": "27",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "樱桃",
+        "分类": "水果",
+        "能量KJ": "1395",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "80",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "哈密瓜",
+        "分类": "水果",
+        "能量KJ": "141",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "8",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "橘子",
+        "分类": "水果",
+        "能量KJ": "197",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "橙汁",
+        "分类": "水果",
+        "能量KJ": "188",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "10",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "橙皮",
+        "分类": "水果",
+        "能量KJ": "405",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "25",
+        "总膳食纤维g": "10"
+      },
+      {
+        "名称": "橙菠萝汁",
+        "分类": "水果",
+        "能量KJ": "214",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "12",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "油桃",
+        "分类": "水果",
+        "能量KJ": "185",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "10",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "猕猴桃",
+        "分类": "水果",
+        "能量KJ": "255",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "甜瓜",
+        "分类": "水果",
+        "能量KJ": "150",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "番木瓜",
+        "分类": "水果",
+        "能量KJ": "179",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "10",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "石榴",
+        "分类": "水果",
+        "能量KJ": "346",
+        "蛋白g": "1",
+        "脂肪g": "1",
+        "碳水化合物g": "18",
+        "总膳食纤维g": "4"
+      },
+      {
+        "名称": "红苹果",
+        "分类": "水果",
+        "能量KJ": "247",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "芒果",
+        "分类": "水果",
+        "能量KJ": "250",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "苹果",
+        "分类": "水果",
+        "能量KJ": "218",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "13",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "苹果汁",
+        "分类": "水果",
+        "能量KJ": "191",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "草莓",
+        "分类": "水果",
+        "能量KJ": "136",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "荔枝",
+        "分类": "水果",
+        "能量KJ": "276",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "16",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "菠萝",
+        "分类": "水果",
+        "能量KJ": "209",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "13",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "菠萝蜜",
+        "分类": "水果",
+        "能量KJ": "397",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "23",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "葡萄",
+        "分类": "水果",
+        "能量KJ": "280",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "葡萄干",
+        "分类": "水果",
+        "能量KJ": "264",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "15",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "葡萄柚",
+        "分类": "水果",
+        "能量KJ": "134",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "8",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "蓝莓",
+        "分类": "水果",
+        "能量KJ": "240",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "14",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "蔓越莓",
+        "分类": "水果",
+        "能量KJ": "191",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "西瓜",
+        "分类": "水果",
+        "能量KJ": "127",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "覆盆子",
+        "分类": "水果",
+        "能量KJ": "220",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "11",
+        "总膳食纤维g": "6"
+      },
+      {
+        "名称": "面包果酱",
+        "分类": "水果",
+        "能量KJ": "431",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "27",
+        "总膳食纤维g": "4"
+      },
+      {
+        "名称": "香蕉",
+        "分类": "水果",
+        "能量KJ": "371",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "22",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "鳄梨",
+        "分类": "水果",
+        "能量KJ": "670",
+        "蛋白g": "2",
+        "脂肪g": "14",
+        "碳水化合物g": "8",
+        "总膳食纤维g": "6"
+      },
+      {
+        "名称": "黑莓",
+        "分类": "水果",
+        "能量KJ": "181",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "总膳食纤维g": "5"
+      },
+      {
+        "名称": "龙眼",
+        "分类": "水果",
+        "能量KJ": "251",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "15",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "番茄汤",
+        "分类": "汤",
+        "能量KJ": "165",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "土豆蔬菜汤",
+        "分类": "汤",
+        "能量KJ": "126",
+        "蛋白g": "1",
+        "脂肪g": "1",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "素食蔬菜汤",
+        "分类": "汤",
+        "能量KJ": "119",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "火腿",
+        "分类": "肉类",
+        "能量KJ": "683",
+        "蛋白g": "16",
+        "脂肪g": "8",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "火鸡",
+        "分类": "肉类",
+        "能量KJ": "790",
+        "蛋白g": "28",
+        "脂肪g": "7",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "烟熏火腿",
+        "分类": "肉类",
+        "能量KJ": "591",
+        "蛋白g": "18",
+        "脂肪g": "2",
+        "碳水化合物g": "10",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "烤肉",
+        "分类": "肉类",
+        "能量KJ": "1512",
+        "蛋白g": "20",
+        "脂肪g": "30",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "烤鸭",
+        "分类": "肉类",
+        "能量KJ": "1410",
+        "蛋白g": "18",
+        "脂肪g": "28",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "烧鹅",
+        "分类": "肉类",
+        "能量KJ": "1276",
+        "蛋白g": "25",
+        "脂肪g": "21",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "牛肉汤",
+        "分类": "肉类",
+        "能量KJ": "25",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "牛肉瘦",
+        "分类": "肉类",
+        "能量KJ": "488",
+        "蛋白g": "23",
+        "脂肪g": "2",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "牛肉肥",
+        "分类": "肉类",
+        "能量KJ": "2845",
+        "蛋白g": "10",
+        "脂肪g": "70",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "牛蛙",
+        "分类": "肉类",
+        "能量KJ": "305",
+        "蛋白g": "16",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "猪培根",
+        "分类": "肉类",
+        "能量KJ": "1744",
+        "蛋白g": "12",
+        "脂肪g": "39",
+        "碳水化合物g": "1",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "猪头肉",
+        "分类": "肉类",
+        "能量KJ": "658",
+        "蛋白g": "13",
+        "脂肪g": "10",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "猪瘦肉",
+        "分类": "肉类",
+        "能量KJ": "562",
+        "蛋白g": "21",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "猪耳朵",
+        "分类": "肉类",
+        "能量KJ": "695",
+        "蛋白g": "15",
+        "脂肪g": "10",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "猪肝",
+        "分类": "肉类",
+        "能量KJ": "690",
+        "蛋白g": "26",
+        "脂肪g": "4",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "猪脑",
+        "分类": "肉类",
+        "能量KJ": "577",
+        "蛋白g": "12",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "猪蹄",
+        "分类": "肉类",
+        "能量KJ": "889",
+        "蛋白g": "23",
+        "脂肪g": "12",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "瘦羊肉",
+        "分类": "肉类",
+        "能量KJ": "862",
+        "蛋白g": "28",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "肉丸",
+        "分类": "肉类",
+        "能量KJ": "1196",
+        "蛋白g": "14",
+        "脂肪g": "22",
+        "碳水化合物g": "8",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "肥猪肉",
+        "分类": "肉类",
+        "能量KJ": "2449",
+        "蛋白g": "10",
+        "脂肪g": "60",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "肥羊肉",
+        "分类": "肉类",
+        "能量KJ": "2782",
+        "蛋白g": "6",
+        "脂肪g": "70",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鸡心",
+        "分类": "肉类",
+        "能量KJ": "640",
+        "蛋白g": "15",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鸡汤",
+        "分类": "肉类",
+        "能量KJ": "26",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鸡肉",
+        "分类": "肉类",
+        "能量KJ": "604",
+        "蛋白g": "28",
+        "脂肪g": "3",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鸡肝",
+        "分类": "肉类",
+        "能量KJ": "496",
+        "蛋白g": "16",
+        "脂肪g": "4",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鹅肝",
+        "分类": "肉类",
+        "能量KJ": "556",
+        "蛋白g": "16",
+        "脂肪g": "4",
+        "碳水化合物g": "6",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鹌鹑",
+        "分类": "肉类",
+        "能量KJ": "803",
+        "蛋白g": "19",
+        "脂肪g": "12",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "南瓜",
+        "分类": "蔬菜",
+        "能量KJ": "109",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "卷心菜",
+        "分类": "蔬菜",
+        "能量KJ": "103",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "四季豆",
+        "分类": "蔬菜",
+        "能量KJ": "131",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "土豆",
+        "分类": "蔬菜",
+        "能量KJ": "322",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "土豆面粉",
+        "分类": "蔬菜",
+        "能量KJ": "1493",
+        "蛋白g": "6",
+        "脂肪g": "0",
+        "碳水化合物g": "83",
+        "总膳食纤维g": "5"
+      },
+      {
+        "名称": "大白菜",
+        "分类": "蔬菜",
+        "能量KJ": "55",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "大蒜",
+        "分类": "蔬菜",
+        "能量KJ": "623",
+        "蛋白g": "6",
+        "脂肪g": "0",
+        "碳水化合物g": "33",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "大豆",
+        "分类": "蔬菜",
+        "能量KJ": "614",
+        "蛋白g": "12",
+        "脂肪g": "6",
+        "碳水化合物g": "11",
+        "总膳食纤维g": "4"
+      },
+      {
+        "名称": "小南瓜",
+        "分类": "蔬菜",
+        "能量KJ": "69",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "小萝卜",
+        "分类": "蔬菜",
+        "能量KJ": "76",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "山药",
+        "分类": "蔬菜",
+        "能量KJ": "343",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "20",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "扁豆",
+        "分类": "豆类及豆制品",
+        "能量KJ": "1473",
+        "蛋白g": "24",
+        "脂肪g": "1",
+        "碳水化合物g": "63",
+        "总膳食纤维g": "10"
+      },
+      {
+        "名称": "木薯",
+        "分类": "蔬菜",
+        "能量KJ": "667",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "38",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "洋葱",
+        "分类": "蔬菜",
+        "能量KJ": "166",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "炒蘑菇",
+        "分类": "蔬菜",
+        "能量KJ": "110",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "炒香菇",
+        "分类": "蔬菜",
+        "能量KJ": "162",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "牛蒡根",
+        "分类": "蔬菜",
+        "能量KJ": "302",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "17",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "甘薯",
+        "分类": "蔬菜",
+        "能量KJ": "359",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "20",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "甜椒",
+        "分类": "蔬菜",
+        "能量KJ": "84",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "甜玉米",
+        "分类": "蔬菜",
+        "能量KJ": "360",
+        "蛋白g": "3",
+        "脂肪g": "1",
+        "碳水化合物g": "18",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "甜菜",
+        "分类": "蔬菜",
+        "能量KJ": "180",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "甜菜叶",
+        "分类": "蔬菜",
+        "能量KJ": "92",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "生姜",
+        "分类": "蔬菜",
+        "能量KJ": "75",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "生菜",
+        "分类": "蔬菜",
+        "能量KJ": "62",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "番茄汁",
+        "分类": "蔬菜",
+        "能量KJ": "72",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "白菜",
+        "分类": "蔬菜",
+        "能量KJ": "48",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "1",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "白萝卜",
+        "分类": "蔬菜",
+        "能量KJ": "59",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "白蘑菇",
+        "分类": "蔬菜",
+        "能量KJ": "93",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "秋葵",
+        "分类": "蔬菜",
+        "能量KJ": "138",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "竹笋",
+        "分类": "蔬菜",
+        "能量KJ": "115",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "红心萝卜",
+        "分类": "蔬菜",
+        "能量KJ": "132",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "红豆",
+        "分类": "蔬菜",
+        "能量KJ": "121",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "绿豆",
+        "分类": "蔬菜",
+        "能量KJ": "126",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "羽衣甘蓝",
+        "分类": "蔬菜",
+        "能量KJ": "207",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "8",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "胡萝卜",
+        "分类": "蔬菜",
+        "能量KJ": "173",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "9",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "芋头",
+        "分类": "蔬菜",
+        "能量KJ": "469",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "26",
+        "总膳食纤维g": "4"
+      },
+      {
+        "名称": "芝麻",
+        "分类": "蔬菜",
+        "能量KJ": "2397",
+        "蛋白g": "17",
+        "脂肪g": "49",
+        "碳水化合物g": "23",
+        "总膳食纤维g": "11"
+      },
+      {
+        "名称": "芥末",
+        "分类": "蔬菜",
+        "能量KJ": "114",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "芦笋",
+        "分类": "蔬菜",
+        "能量KJ": "85",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "花椒",
+        "分类": "蔬菜",
+        "能量KJ": "80",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "花椰菜",
+        "分类": "蔬菜",
+        "能量KJ": "104",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "芹菜",
+        "分类": "蔬菜",
+        "能量KJ": "67",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "2",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "苦瓜",
+        "分类": "蔬菜",
+        "能量KJ": "126",
+        "蛋白g": "5",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "茄子",
+        "分类": "蔬菜",
+        "能量KJ": "104",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "苋菜叶",
+        "分类": "蔬菜",
+        "能量KJ": "97",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "菊苣",
+        "分类": "蔬菜",
+        "能量KJ": "71",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "菜豆",
+        "分类": "蔬菜",
+        "能量KJ": "280",
+        "蛋白g": "6",
+        "脂肪g": "0",
+        "碳水化合物g": "13",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "菠菜",
+        "分类": "蔬菜",
+        "能量KJ": "97",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "蕨类",
+        "分类": "蔬菜",
+        "能量KJ": "143",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "藜",
+        "分类": "蔬菜",
+        "能量KJ": "180",
+        "蛋白g": "4",
+        "脂肪g": "0",
+        "碳水化合物g": "7",
+        "总膳食纤维g": "4"
+      },
+      {
+        "名称": "蘑菇",
+        "分类": "蔬菜",
+        "能量KJ": "141",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "西兰花",
+        "分类": "蔬菜",
+        "能量KJ": "141",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "西红柿",
+        "分类": "蔬菜",
+        "能量KJ": "74",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "豆芽",
+        "分类": "蔬菜",
+        "能量KJ": "510",
+        "蛋白g": "13",
+        "脂肪g": "6",
+        "碳水化合物g": "9",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "豇豆",
+        "分类": "蔬菜",
+        "能量KJ": "376",
+        "蛋白g": "2",
+        "脂肪g": "0",
+        "碳水化合物g": "18",
+        "总膳食纤维g": "5"
+      },
+      {
+        "名称": "豌豆",
+        "分类": "豆类及豆制品",
+        "能量KJ": "1435",
+        "蛋白g": "21",
+        "脂肪g": "1",
+        "碳水化合物g": "62",
+        "总膳食纤维g": "15"
+      },
+      {
+        "名称": "辣椒",
+        "分类": "蔬菜",
+        "能量KJ": "88",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "5",
+        "总膳食纤维g": "1"
+      },
+      {
+        "名称": "韭菜",
+        "分类": "蔬菜",
+        "能量KJ": "126",
+        "蛋白g": "3",
+        "脂肪g": "0",
+        "碳水化合物g": "4",
+        "总膳食纤维g": "2"
+      },
+      {
+        "名称": "香菇",
+        "分类": "蔬菜",
+        "能量KJ": "160",
+        "蛋白g": "1",
+        "脂肪g": "0",
+        "碳水化合物g": "6",
+        "总膳食纤维g": "3"
+      },
+      {
+        "名称": "黄瓜",
+        "分类": "蔬菜",
+        "能量KJ": "65",
+        "蛋白g": "0",
+        "脂肪g": "0",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "水煮蛋",
+        "分类": "蛋类",
+        "能量KJ": "597",
+        "蛋白g": "12",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "炒蛋",
+        "分类": "蛋类",
+        "能量KJ": "621",
+        "蛋白g": "9",
+        "脂肪g": "10",
+        "碳水化合物g": "1",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "煎蛋",
+        "分类": "蛋类",
+        "能量KJ": "643",
+        "蛋白g": "10",
+        "脂肪g": "11",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鸡蛋",
+        "分类": "蛋类",
+        "能量KJ": "599",
+        "蛋白g": "12",
+        "脂肪g": "9",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鸡蛋白",
+        "分类": "蛋类",
+        "能量KJ": "216",
+        "蛋白g": "10",
+        "脂肪g": "0",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鸡蛋黄",
+        "分类": "蛋类",
+        "能量KJ": "1346",
+        "蛋白g": "15",
+        "脂肪g": "26",
+        "碳水化合物g": "3",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鹌鹑蛋",
+        "分类": "蛋类",
+        "能量KJ": "663",
+        "蛋白g": "13",
+        "脂肪g": "11",
+        "碳水化合物g": "0",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "利马豆",
+        "分类": "豆类及豆制品",
+        "能量KJ": "1414",
+        "蛋白g": "21",
+        "脂肪g": "0",
+        "碳水化合物g": "63",
+        "总膳食纤维g": "19"
+      },
+      {
+        "名称": "大豆面粉",
+        "分类": "豆类及豆制品",
+        "能量KJ": "1816",
+        "蛋白g": "37",
+        "脂肪g": "20",
+        "碳水化合物g": "31",
+        "总膳食纤维g": "9"
+      },
+      {
+        "名称": "嫩豆腐",
+        "分类": "豆类及豆制品",
+        "能量KJ": "253",
+        "蛋白g": "7",
+        "脂肪g": "3",
+        "碳水化合物g": "1",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "纳豆",
+        "分类": "豆类及豆制品",
+        "能量KJ": "883",
+        "蛋白g": "19",
+        "脂肪g": "11",
+        "碳水化合物g": "12",
+        "总膳食纤维g": "5"
+      },
+      {
+        "名称": "羽扇豆",
+        "分类": "豆类及豆制品",
+        "能量KJ": "1554",
+        "蛋白g": "36",
+        "脂肪g": "9",
+        "碳水化合物g": "40",
+        "总膳食纤维g": "18"
+      },
+      {
+        "名称": "老豆腐",
+        "分类": "豆类及豆制品",
+        "能量KJ": "326",
+        "蛋白g": "9",
+        "脂肪g": "4",
+        "碳水化合物g": "2",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "花生",
+        "分类": "豆类及豆制品",
+        "能量KJ": "2374",
+        "蛋白g": "25",
+        "脂肪g": "49",
+        "碳水化合物g": "16",
+        "总膳食纤维g": "8"
+      },
+      {
+        "名称": "花生酱",
+        "分类": "豆类及豆制品",
+        "能量KJ": "2464",
+        "蛋白g": "24",
+        "脂肪g": "49",
+        "碳水化合物g": "21",
+        "总膳食纤维g": "8"
+      },
+      {
+        "名称": "蚕豆",
+        "分类": "豆类及豆制品",
+        "能量KJ": "1425",
+        "蛋白g": "26",
+        "脂肪g": "1",
+        "碳水化合物g": "58",
+        "总膳食纤维g": "25"
+      },
+      {
+        "名称": "豆浆",
+        "分类": "豆类及豆制品",
+        "能量KJ": "226",
+        "蛋白g": "3",
+        "脂肪g": "1",
+        "碳水化合物g": "6",
+        "总膳食纤维g": "0"
+      },
+      {
+        "名称": "鹰嘴豆",
+        "分类": "豆类及豆制品",
+        "能量KJ": "1581",
+        "蛋白g": "20",
+        "脂肪g": "6",
+        "碳水化合物g": "62",
+        "总膳食纤维g": "12"
+      },
+      {
+        "名称": "黄豆",
+        "分类": "豆类及豆制品",
+        "能量KJ": "1443",
+        "蛋白g": "22",
+        "脂肪g": "2",
+        "碳水化合物g": "60",
+        "总膳食纤维g": "25"
+      }
+    ]
+  },
+  "菌属功能库": {
+    "说明": "所有菌属的功能说明、高低影响、调整方向。学名为主键,个人JSON用学名匹配",
+    "菌属": [
+      {
+        "学名": "Clostridium",
+        "中文名": "梭菌属",
+        "分组": "核心菌属",
+        "功能说明": "多导致⼈体炎症;致病;导致菌群失衡;产丁酸;肥胖⼈群丰度较⾼;参与胆汁酸代谢;对抗艰难梭菌;",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Prevotella",
+        "中文名": "普雷沃氏菌属",
+        "分组": "核心菌属",
+        "功能说明": "核心菌,健康的植物性饮食相关菌,在自闭症、多发性硬化中减少;丰度⾼促炎,加剧过敏、",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Ruminococcus",
+        "中文名": "瘤胃球菌属",
+        "分组": "核心菌属",
+        "功能说明": "消化抗性淀粉、纤维素,丰度⾼促进肠炎和过敏相关疾病,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bacteroides",
+        "中文名": "拟杆菌属",
+        "分组": "核心菌属",
+        "功能说明": "基石菌,消化蔬菜和谷食,蛋白,降解复杂多糖,交叉喂养关键菌,维持免疫和肠道稳态,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Eubacterium",
+        "中文名": "优杆菌属",
+        "分组": "核心菌属",
+        "功能说明": "基石菌,产短链脂肪酸尤其丁酸,有助于肠道健康,降解胆固醇、调节餐后血糖、",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lachnoclostridium",
+        "中文名": "",
+        "分组": "核心菌属",
+        "功能说明": "丁酸,与内脏脂肪积累相关,与肥胖、⾼血压、糖尿病正相关,与肠道炎症、肠癌和阿尔茨海默病进展有关,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Faecalibacterium",
+        "中文名": "粪杆菌属",
+        "分组": "核心菌属",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Blautia",
+        "中文名": "经黏液真杆菌属",
+        "分组": "核心菌属",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Dialister",
+        "中文名": "戴阿利斯特杆菌属",
+        "分组": "核心菌属",
+        "功能说明": "代谢碳水化合物、产短链脂肪酸,许多种都可能导致感染,但是抑郁症患者缺乏,关节炎患者富集,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Roseburia",
+        "中文名": "罗氏菌属",
+        "分组": "核心菌属",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Agathobacter",
+        "中文名": "直肠真杆菌属",
+        "分组": "核心菌属",
+        "功能说明": "可利用抗性淀粉,具有抗炎和调节免疫功能的作用,类⻛湿性关节炎和溃疡性结肠炎⼈群显著减少。",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Gemmiger",
+        "中文名": "吉米菌属",
+        "分组": "核心菌属",
+        "功能说明": "健康饮食,⾼果蔬、谷物及豆类饮食含量⾼,与雄激素分泌相关,缓解便秘,与脂肪堆积分布负相关,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Parabacteroides",
+        "中文名": "副拟杆菌属",
+        "分组": "核心菌属",
+        "功能说明": "帮助糖脂代谢,改善⾼脂影响,产生强大的降解酶,参与胆碱代谢,顺产宝宝和⻓寿老⼈肠道丰富,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Alistipes",
+        "中文名": "另枝菌属",
+        "分组": "核心菌属",
+        "功能说明": "耐胆汁酸菌,丙酸,乙酸生产者,参与腐败途径产生氨、H2S、甲酚、吲哚和苯酚,诱发结直肠癌,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lachnospira",
+        "中文名": "母螺菌属",
+        "分组": "核心菌属",
+        "功能说明": "基石菌,发酵代谢膳食纤维,利用果蔬果㬵产生乙酸,丁酸,与睡眠质量呈负相关,过少与多种疾病相关,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Phascolarctobacterium",
+        "中文名": "考拉杆菌属",
+        "分组": "核心菌属",
+        "功能说明": "东⽅⼈肠道的核心菌属,⾼易减肥,与水果蔬菜摄⼊相关,随年龄增加,在重度抑郁、阿尔茨海默病(AD)、自闭症⼉童富集,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Megamonas",
+        "中文名": "巨单胞菌属",
+        "分组": "核心菌属",
+        "功能说明": "发酵各种碳水化合物、产乙酸、丙酸、乳酸,自闭症谱系障碍、注意缺陷、多动障碍 (ADHD)急性脑卒中(AIS)",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Coprococcus",
+        "中文名": "粪球菌属",
+        "分组": "核心菌属",
+        "功能说明": "可产丁酸,抑制免疫反应,降低过敏,抑郁、帕金森、认知障碍、便秘,慢性肾病、虚弱者减少,过多导致菌群紊乱,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bifidobacterium",
+        "中文名": "双歧杆菌属",
+        "分组": "核心菌属",
+        "功能说明": "最重要的",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lactobacillus",
+        "中文名": "乳杆菌属",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lactobacillus rogosae",
+        "中文名": "罗氏乳杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bifidobacterium adolescentis",
+        "中文名": "",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bifidobacterium longum",
+        "中文名": "",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lactobacillus reuteri",
+        "中文名": "罗伊氏乳杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bifidobacterium bifidum",
+        "中文名": "双歧双歧杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bifidobacterium catenulatum",
+        "中文名": "链状双歧杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bifidobacterium pseudolongum",
+        "中文名": "假长双歧杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bifidobacterium gallicum",
+        "中文名": "",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bifidobacterium stercoris",
+        "中文名": "排泄物双岐杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lactobacillus paracasei",
+        "中文名": "副干酪乳杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lactobacillus plantarum",
+        "中文名": "植物乳杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lactobacillus johnsonii",
+        "中文名": "约氏乳杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lactobacillus helveticus",
+        "中文名": "瑞一乳杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bifidobacterium animalis",
+        "中文名": "动物双歧杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lactobacillus fermentum",
+        "中文名": "发酵乳杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bifidobacterium breve",
+        "中文名": "短双歧杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lactobacillus rhamnosus",
+        "中文名": "",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lactobacillus brevis",
+        "中文名": "短乳杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lactobacillus delbrueckii",
+        "中文名": "德氏乳酸乳杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lactobacillus acidophilus",
+        "中文名": "嗜酸乳杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Escherichia",
+        "中文名": "埃希氏菌属",
+        "分组": "有害菌属",
+        "功能说明": "正常菌属,条件致病菌,过多致病,导致菌群失衡",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Streptococcus",
+        "中文名": "",
+        "分组": "有害菌属",
+        "功能说明": "可引起化脓性炎症,个别菌为",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Desulfovibrio",
+        "中文名": "脱硫弧菌属",
+        "分组": "有害菌属",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Helicobacter",
+        "中文名": "螺杆菌属",
+        "分组": "有害菌属",
+        "功能说明": "⾰兰氏阴性菌,微需氧菌,该菌属下的⼀些菌种被发现在⼈类上消化道内壁,部分种为致病菌,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Arcobacter",
+        "中文名": "",
+        "分组": "有害菌属",
+        "功能说明": "好氧菌,腹泻致病菌,与河流海洋污染相关的潜在病原菌,⼈畜共患菌",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Anaerobiospirillum",
+        "中文名": "厌氧螺菌",
+        "分组": "有害菌属",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Enterococcus",
+        "中文名": "肠球菌属",
+        "分组": "有害菌属",
+        "功能说明": "常⻅上呼吸道,⼝腔或肠道的常居菌,也分布在畜、禽养殖环境,饲料或肠道,抑菌调节肠道菌群,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Neisseria",
+        "中文名": "奈瑟氏菌属",
+        "分组": "有害菌属",
+        "功能说明": "部分为⼈体病原菌,⼝腔,唾液,⿐腔,肺部正常菌,需氧,对干燥、热、消毒剂敏感,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Acinetobacter",
+        "中文名": "不动杆菌属",
+        "分组": "有害菌属",
+        "功能说明": "条件致病菌,医院感染病原体之⼀,尤其ICU,易引起呼吸道感染、泌尿道感染、创伤感染,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Pseudomonas",
+        "中文名": "假单胞菌属",
+        "分组": "有害菌属",
+        "功能说明": "属于变形菌⻔,在环境中⼴泛存在,代谢多变适应⼒强,好氧或微需,会导致感染和食物变质,医院获得性感染主要原因,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Holdemania",
+        "中文名": "霍尔德曼氏菌属",
+        "分组": "有害菌属",
+        "功能说明": "肠道共生菌,降解黏蛋白,机会致病菌,少数研究表明与痛⻛正相关,帕金森,双向情感障碍,过敏,抑郁患者富集",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Collinsella",
+        "中文名": "柯林斯氏菌属",
+        "分组": "其它重要菌属",
+        "功能说明": "产气菌,与脂质代谢及心脑血管相关,过多可导致菌群紊乱,部分病原菌",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bilophila",
+        "中文名": "嗜胆菌属",
+        "分组": "其它重要菌属",
+        "功能说明": "条件致病菌,与耐胆汁酸和脂肪摄⼊相关,便秘⼈群丰度更⾼",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Flavonifractor",
+        "中文名": "",
+        "分组": "其它重要菌属",
+        "功能说明": "参与肠道⼉茶素代谢,减轻免疫反应,产丁酸",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Dorea",
+        "中文名": "",
+        "分组": "其它重要菌属",
+        "功能说明": "消化碳水化合物,多发性硬化症、炎症性肠病、结直肠癌、自闭症谱系障碍以及肥胖⼈群中⾼丰度富集,",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Hungatella",
+        "中文名": "亨盖特氏菌属",
+        "分组": "其它重要菌属",
+        "功能说明": "参与生成氧化三甲胺和牛磺酸。",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Oscillospira",
+        "中文名": "颤螺菌属",
+        "分组": "其它重要菌属",
+        "功能说明": "基石菌、核心菌群,帮助消化抗性淀粉,产丁酸,并在大肠中发酵。与⼉童过敏和肥胖呈负相关。",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Citrobacter",
+        "中文名": "枸橼酸杆菌属",
+        "分组": "其它重要菌属",
+        "功能说明": "常⻅菌,免疫⼒下降可能引发感染。",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Akkermansia",
+        "中文名": "",
+        "分组": "其它重要菌属",
+        "功能说明": "基石菌,可降解淀粉,黏蛋白降解菌,可控制体重,改善代谢和炎症,过多导致肠粘膜屏障破坏。",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Enterobacter",
+        "中文名": "肠杆菌属",
+        "分组": "其它重要菌属",
+        "功能说明": "产酸产气,不引起腹泻,机会性感染,过多导致菌群紊乱和肥胖。",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Turicibacter",
+        "中文名": "苏黎世杆菌属",
+        "分组": "其它重要菌属",
+        "功能说明": "发酵生成乳酸,参与肌肉和疲劳调节。",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Butyrivibrio",
+        "中文名": "丁酸弧菌属",
+        "分组": "其它重要菌属",
+        "功能说明": "利用纤维素、淀粉和其他多聚糖生成丁酸,有助于维持肠道上皮,发挥抗炎、抗氧化作用。可调节体内的氨水平,影响免疫。",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Christensenella",
+        "中文名": "克里斯滕森氏菌属",
+        "分组": "其它重要菌属",
+        "功能说明": "过多:肥胖,代谢综合征,包括⾼血压、⾼血糖、异常胆固醇水平和腹部肥胖,胰岛素抵抗",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Haemophilus",
+        "中文名": "嗜血杆菌属",
+        "分组": "病原菌属",
+        "功能说明": "病原菌,过多可导致菌群紊乱,可引发呼吸道感染,常⻅于呼吸道感染",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Salmonella",
+        "中文名": "沙门氏菌属",
+        "分组": "病原菌属",
+        "功能说明": "是引起食物中毒和肠道感染的常⻅病原菌之⼀",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Sutterella",
+        "中文名": "萨特氏菌属",
+        "分组": "病原菌属",
+        "功能说明": "肠道共生菌,潜在病原菌,自闭症相关,减少IgA",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Corynebacterium",
+        "中文名": "棒杆菌属",
+        "分组": "病原菌属",
+        "功能说明": "可导致急性腹泻、腹痛、恶心",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Aeromonas",
+        "中文名": "气单胞菌属",
+        "分组": "病原菌属",
+        "功能说明": "病原菌",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Staphylococcus",
+        "中文名": "葡萄球菌属",
+        "分组": "病原菌属",
+        "功能说明": "利用碳水化合物或氨基酸,产生乳酸。部分产生毒素,如金黄色葡萄球菌,可能引发肠道炎症、并影响肠道屏障功能",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Vibrio",
+        "中文名": "",
+        "分组": "病原菌属",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bilophila wadsworthia",
+        "中文名": "沃氏嗜胆菌",
+        "分组": "病原菌属",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Salmonella enterica",
+        "中文名": "肠炎沙门氏菌",
+        "分组": "病原菌属",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Escherichia coli",
+        "中文名": "大肠杆菌",
+        "分组": "病原菌属",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bacteroides fragilis",
+        "中文名": "脆弱拟杆菌",
+        "分组": "病原菌属",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bifidobacterium adolescentis",
+        "中文名": "青春双歧杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bifidobacterium longum",
+        "中文名": "长双歧杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bifidobacterium gallicum",
+        "中文名": "高卢双歧杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Bifidobacterium pseudolongum",
+        "中文名": "假长双歧杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Lactobacillus rhamnosus",
+        "中文名": "鼠李糖乳杆菌",
+        "分组": "益生菌",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Arcobacter",
+        "中文名": "弓形菌属",
+        "分组": "有害菌属",
+        "功能说明": "好氧菌,腹泻致病菌,与河流海洋污染相关的潜在病原菌,人畜共患菌",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Christensenella",
+        "中文名": "克里斯滕森氏菌属",
+        "分组": "其它重要菌属",
+        "功能说明": "过多:肥胖,代谢综合征,包括高血压、高血糖、异常胆固醇水平和腹部肥胖,胰岛素抵抗",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Salmonella",
+        "中文名": "沙门氏菌属",
+        "分组": "病原菌属",
+        "功能说明": "是引起食物中毒和肠道感染的常见病原菌之一",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Streptococcus sanguinis",
+        "中文名": "血链球菌",
+        "分组": "病原菌属",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Pseudomonas aeruginosa",
+        "中文名": "铜绿假单胞菌",
+        "分组": "病原菌属",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Actinomyces oris",
+        "中文名": "口腔放线菌",
+        "分组": "病原菌属",
+        "功能说明": "",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Coprobacter",
+        "中文名": "粪杆菌属",
+        "分组": "核心菌属",
+        "功能说明": "肠道共生菌,参与短链脂肪酸代谢",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Paraprevotella",
+        "中文名": "副普雷沃氏菌属",
+        "分组": "核心菌属",
+        "功能说明": "肠道共生菌,与植物性饮食相关",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      },
+      {
+        "学名": "Parasutterella",
+        "中文名": "副萨特氏菌属",
+        "分组": "核心菌属",
+        "功能说明": "肠道共生菌,与宿主代谢相关",
+        "偏高影响": "",
+        "偏低影响": "",
+        "调整方向": ""
+      }
+    ]
+  }
+}

+ 4 - 0
cfc-backend/src/main/resources/mapper/ProductSkuMapper.xml

@@ -20,6 +20,10 @@
         SELECT * FROM product_skus WHERE product_id = #{productId} AND enabled = 1 ORDER BY id ASC
     </select>
 
+    <select id="findByProductIdAll" resultMap="BaseResultMap">
+        SELECT * FROM product_skus WHERE product_id = #{productId} ORDER BY id ASC
+    </select>
+
     <select id="findById" resultMap="BaseResultMap">
         SELECT * FROM product_skus WHERE id = #{id}
     </select>

+ 23 - 0
cfc-backend/src/main/resources/mapper/ReviewOrderMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.etotem.cfc.mapper.ReviewOrderMapper">
+
+    <select id="findByOrderId" resultType="com.etotem.cfc.entity.ReviewOrder">
+        SELECT *
+        FROM review_orders
+        WHERE order_id = #{orderId}
+        LIMIT 1
+    </select>
+
+    <select id="getStatsByOrderId" resultType="java.util.Map">
+        SELECT
+            AVG(rating) AS overallAvg,
+            AVG(organization_rating) AS organizationAvg,
+            AVG(content_rating) AS contentAvg,
+            AVG(experience_rating) AS experienceAvg,
+            COUNT(*) AS totalReviews
+        FROM review_orders
+        WHERE order_id = #{orderId}
+    </select>
+
+</mapper>

+ 87 - 1
cfc-backend/src/main/resources/schema.sql

@@ -32,6 +32,7 @@ CREATE TABLE IF NOT EXISTS users (
     address VARCHAR(500) COMMENT '地址',
     created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
     updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    deleted TINYINT DEFAULT 0 COMMENT '软删除标记: 0=未删除, 1=已删除',
     butler_status VARCHAR(20) COMMENT '管家状态: null/pending/approved/rejected',
     butler_info TEXT COMMENT '管家资质信息(JSON)',
     butler_approved_at DATETIME COMMENT '管家认证通过时间',
@@ -421,6 +422,8 @@ CREATE TABLE IF NOT EXISTS dan_assessment_results (
     dimension VARCHAR(10) DEFAULT 'mind' COMMENT '报告维度: mind(心-A2)/wisdom(智-B4)',
     report_file_id VARCHAR(100) COMMENT '上传文件媒资ID',
     draft_status VARCHAR(10) DEFAULT 'pending' COMMENT '草稿状态: pending(待确认)/confirmed(已确认)',
+    source_report_id BIGINT DEFAULT NULL COMMENT '关联 dan_report_uploads.id(DAN报告独立化扩展)',
+    analysis_status VARCHAR(16) DEFAULT 'pending' COMMENT '分析状态: pending/confirmed',
     INDEX idx_child_id (child_id),
     INDEX idx_teacher_id (teacher_id),
     INDEX idx_assessment_date (assessment_date)
@@ -1089,6 +1092,7 @@ CREATE TABLE IF NOT EXISTS product_orders (
     product_id BIGINT NOT NULL COMMENT '商品ID',
     product_name VARCHAR(200) COMMENT '商品名称',
     product_type VARCHAR(32) COMMENT '商品类型',
+    activity_id BIGINT COMMENT '关联活动ID(product_type=activity时有效)',
     buyer_id BIGINT NOT NULL COMMENT '购买者ID',
     family_id BIGINT COMMENT '家庭ID',
     quantity INT NOT NULL DEFAULT 1 COMMENT '数量',
@@ -1106,6 +1110,10 @@ CREATE TABLE IF NOT EXISTS product_orders (
     money_amount INT DEFAULT 0 COMMENT '现金支付金额(分)',
     consignee_id BIGINT COMMENT '收货人ID',
     purchase_info TEXT COMMENT '购买信息JSON: {id_card, hand_signature, ...}',
+provision_status VARCHAR(32) COMMENT '活动provision状态: unprovisioned(待审核)/provisioned(已发货)/signed_in(已签到)/completed(已完成)/cancelled(审核拒绝)',
+    auditor_id BIGINT COMMENT '审核人ID',
+    audited_at DATETIME COMMENT '审核时间',
+    audit_reason TEXT COMMENT '审核拒绝原因',
     created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
     INDEX idx_user_id (user_id),
@@ -1820,7 +1828,7 @@ CREATE TABLE IF NOT EXISTS onboarding_task (
 
 CREATE TABLE IF NOT EXISTS growth_task (
     id BIGINT AUTO_INCREMENT PRIMARY KEY,
-    type VARCHAR(16) NOT NULL COMMENT 'DAILY/NEWBIE',
+    type VARCHAR(16) NOT NULL COMMENT 'DAILY/NEWBIE/AI_GENERATED',
     title VARCHAR(100) NOT NULL,
     description TEXT,
     reward_points INT DEFAULT 0,
@@ -1830,6 +1838,8 @@ CREATE TABLE IF NOT EXISTS growth_task (
     enabled TINYINT DEFAULT 1,
     sort_order INT DEFAULT 0,
     created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    dimension VARCHAR(20) NULL COMMENT '五维维度(body/mind/wisdom/action/wealth)',
+    source_conversation_id VARCHAR(100) NULL COMMENT '来源AI会话ID',
     INDEX idx_type (type)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成长任务配置表';
 
@@ -3970,3 +3980,79 @@ CREATE TABLE IF NOT EXISTS `service_settlements` (
     KEY `idx_provider_id` (`provider_id`),
     KEY `idx_status` (`status`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务结算记录';
+
+-- 健康知识库 — 菌属/营养素/指标说明
+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 DEFAULT CURRENT_TIMESTAMP,
+    `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    UNIQUE KEY `uk_item_type_name` (`item_type`, `item_name`),
+    KEY `idx_item_type` (`item_type`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='健康知识库 - 菌属/营养素/指标说明';
+-- =============================================
+-- DAN报告上传独立化(拆分 PDF 报告生命周期与数值结果)
+-- =============================================
+
+-- DAN PDF 报告上传/解析/确认记录表
+CREATE TABLE IF NOT EXISTS dan_report_uploads (
+    id                   BIGINT AUTO_INCREMENT PRIMARY KEY,
+    family_id            BIGINT       NOT NULL COMMENT '家庭ID',
+    family_member_id     BIGINT       NOT NULL COMMENT '家庭成员ID',
+    uploader_user_id     BIGINT       NOT NULL COMMENT '上传者用户ID',
+    dimension            VARCHAR(16)  NOT NULL COMMENT '维度: mind(心-A2)/wisdom(智-B4)',
+    report_type          VARCHAR(16)  COMMENT 'A2/B4 报告类型(解析后确认)',
+    file_url             VARCHAR(500) NOT NULL COMMENT 'PDF 文件URL',
+    file_id              VARCHAR(100) COMMENT '媒资文件ID',
+    file_name            VARCHAR(200) COMMENT '原始文件名',
+    file_size            BIGINT       COMMENT '文件大小(字节)',
+    uploaded_at          DATETIME     DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
+    parsed_items         JSON         COMMENT '解析的指标项 [{code, name, value, category}]',
+    parsed_extra         JSON         COMMENT '解析的额外信息(姓名/性别/年龄/报告日期等)',
+    parsed_summary       TEXT         COMMENT '解析的总结文本',
+    parsed_suggestions   TEXT         COMMENT '解析的建议文本',
+    parser_version       VARCHAR(32)  COMMENT '解析器版本',
+    parse_status         VARCHAR(16)  DEFAULT 'pending' COMMENT 'pending/success/failed',
+    parse_error          VARCHAR(500) COMMENT '解析失败原因',
+    parsed_at            DATETIME     COMMENT '解析完成时间',
+    draft_status         VARCHAR(16)  DEFAULT 'pending' COMMENT 'pending/confirmed/discarded',
+    confirmed_at         DATETIME     COMMENT '确认时间',
+    confirmed_by         BIGINT       COMMENT '确认操作人用户ID',
+    edited_items         JSON         COMMENT '编辑后的指标项(覆盖 parsed_items)',
+    edited_extra         JSON         COMMENT '编辑后的额外信息',
+    edited_summary       TEXT         COMMENT '编辑后的总结',
+    edited_suggestions   TEXT         COMMENT '编辑后的建议',
+    edit_count           INT          DEFAULT 0 COMMENT '编辑次数',
+    linked_result_id     BIGINT       COMMENT '关联 dan_assessment_results.id',
+    created_at           DATETIME     DEFAULT CURRENT_TIMESTAMP,
+    updated_at           DATETIME     DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    deleted_at           DATETIME     COMMENT '软删除时间',
+    INDEX idx_family_id (family_id),
+    INDEX idx_member_id (family_member_id),
+    INDEX idx_draft_status (draft_status),
+    INDEX idx_dimension (dimension),
+    INDEX idx_parse_status (parse_status),
+    INDEX idx_linked_result (linked_result_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='DAN测评PDF报告上传/解析/确认记录';
+
+CREATE TABLE IF NOT EXISTS review_orders (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
+    order_id BIGINT NOT NULL COMMENT '订单ID',
+    reviewer_id BIGINT NOT NULL COMMENT '评价人ID',
+    rating INT COMMENT '总体评分',
+    review_text TEXT COMMENT '评价内容',
+    review_at DATETIME COMMENT '评价时间',
+    organization_rating INT COMMENT '活动组织评分(0-5)',
+    content_rating INT COMMENT '活动内容评分(0-5)',
+    experience_rating INT COMMENT '活动体验评分(0-5)',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    UNIQUE KEY uk_order_id (order_id),
+    INDEX idx_reviewer_id (reviewer_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动订单评价表';

+ 14 - 5
cfc-backend/src/test/java/com/etotem/cfc/integration/PlannerBindInviteFlowTest.java

@@ -7,6 +7,7 @@ import com.etotem.cfc.dto.BindGuideDTO;
 import com.etotem.cfc.entity.GuideFamily;
 import com.etotem.cfc.service.BindInviteService;
 import com.etotem.cfc.service.GuideFamilyService;
+import com.etotem.cfc.service.MembershipService;
 import com.etotem.cfc.service.TeacherMessageService;
 import com.etotem.cfc.mapper.GuideFamilyMapper;
 import org.junit.jupiter.api.*;
@@ -63,6 +64,9 @@ public class PlannerBindInviteFlowTest {
     @MockBean
     private GuideFamilyMapper guideFamilyMapper;
 
+    @MockBean
+    private MembershipService membershipService;
+
     // ========== 测试数据 ==========
 
     private static final Long GUIDE_USER_ID = 4001L;
@@ -183,10 +187,11 @@ public class PlannerBindInviteFlowTest {
 
         when(guideFamilyService.confirmBind(eq(GUIDE_USER_ID), eq(FAMILY_ID), eq("学业规划"), eq(29900)))
                 .thenReturn(true);
+        when(membershipService.getUserFamilyId(PARENT_USER_ID)).thenReturn(FAMILY_ID);
 
         // === When:家长点击"确认绑定" ===
         Result<Boolean> result = bindController.acceptBind(
-                PARENT_USER_ID, FAMILY_ID, bindDTO);
+                PARENT_USER_ID, bindDTO);
 
         // === Then:Milestone-3 - 绑定成功 ===
         assertEquals(200, result.getCode());
@@ -209,10 +214,11 @@ public class PlannerBindInviteFlowTest {
 
         when(guideFamilyService.confirmBind(eq(GUIDE_USER_ID), eq(FAMILY_ID), anyString(), anyInt()))
                 .thenThrow(new RuntimeException("该规划师已在服务中,无需重复绑定"));
+        when(membershipService.getUserFamilyId(PARENT_USER_ID)).thenReturn(FAMILY_ID);
 
         // === When:家长尝试再次绑定 ===
         Result<Boolean> result = bindController.acceptBind(
-                PARENT_USER_ID, FAMILY_ID, bindDTO);
+                PARENT_USER_ID, bindDTO);
 
         // === Then:返回错误提示 ===
         assertEquals(400, result.getCode());
@@ -236,9 +242,10 @@ public class PlannerBindInviteFlowTest {
         );
 
         when(guideFamilyService.getGuidesByFamily(FAMILY_ID)).thenReturn(mockBindings);
+        when(membershipService.getUserFamilyId(PARENT_USER_ID)).thenReturn(FAMILY_ID);
 
         // === When:家长请求规划师列表 ===
-        Result<List<Map<String, Object>>> result = bindController.getBoundGuides(FAMILY_ID);
+        Result<List<Map<String, Object>>> result = bindController.getBoundGuides(PARENT_USER_ID);
 
         // === Then:Milestone-4 - 返回已绑定规划师列表 ===
         assertEquals(200, result.getCode());
@@ -264,10 +271,11 @@ public class PlannerBindInviteFlowTest {
         GuideFamily unbindGuide = createGuideFamily(BINDING_ID, GUIDE_USER_ID, "学业规划", 29900, "unbound");
         when(guideFamilyService.unbindAndGet(eq(BINDING_ID), eq(FAMILY_ID))).thenReturn(unbindGuide);
         doNothing().when(teacherMessageService).sendMessage(eq(FAMILY_ID), eq(PARENT_USER_ID), eq(GUIDE_USER_ID), anyString());
+        when(membershipService.getUserFamilyId(PARENT_USER_ID)).thenReturn(FAMILY_ID);
 
         // === When:家长确认解除绑定 ===
         Result<Boolean> result = bindController.unbind(
-                PARENT_USER_ID, FAMILY_ID, unbindRequest);
+                PARENT_USER_ID, unbindRequest);
 
         // === Then:Milestone-5 - 解绑成功并通知规划师 ===
         assertEquals(200, result.getCode());
@@ -346,8 +354,9 @@ public class PlannerBindInviteFlowTest {
 
         when(guideFamilyService.confirmBind(eq(GUIDE_USER_ID), eq(FAMILY_ID), eq("学业规划"), eq(29900)))
                 .thenReturn(true);
+        when(membershipService.getUserFamilyId(PARENT_USER_ID)).thenReturn(FAMILY_ID);
 
-        Result<Boolean> step3 = bindController.acceptBind(PARENT_USER_ID, FAMILY_ID, bindDTO);
+        Result<Boolean> step3 = bindController.acceptBind(PARENT_USER_ID, bindDTO);
         assertEquals(200, step3.getCode());
         assertTrue(step3.getData());
     }

+ 533 - 0
cfc-backend/src/test/java/com/etotem/cfc/service/DanReportParseServiceTest.java

@@ -0,0 +1,533 @@
+package com.etotem.cfc.service;
+
+import com.etotem.cfc.service.DanReportParseService.DanParsedReport;
+import com.etotem.cfc.service.DanReportParseService.DataItem;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * DanReportParseService 纯单元测试(无 SpringBootTest,避免 MySQL 连接)
+ *
+ * 测试范围:
+ * - A1 (cognition) 解析:6认知维度提取
+ * - B3 (learning) 解析:执行功能/学习动机/学习策略提取
+ * - A2 (mind) 回归:确保已有解析不受影响
+ * - B4 (wisdom) 回归:确保已有解析不受影响
+ */
+class DanReportParseServiceTest {
+
+    private DanReportParseService service;
+
+    @BeforeEach
+    void setUp() {
+        service = new DanReportParseService();
+    }
+
+    // ==================== A1 儿童核心认知 ====================
+
+    @Test
+    void testParseA1_emptyText_returnsEmpty() {
+        DanParsedReport result = service.parseText("", "cognition");
+        assertTrue(result.isEmpty(), "空文本应返回空结果");
+        assertEquals("A1", result.getReportType());
+        assertEquals("cognition", result.getDimension());
+    }
+
+    @Test
+    void testParseA1_extractsTotalScore() {
+        String text = "112\n总得分\nTotal Score\n79\n百分位(%)\n感知觉 | Perception\n百分位(%)\n14";
+        DanParsedReport result = service.parseText(text, "cognition");
+
+        assertFalse(result.isEmpty());
+
+        // 总分
+        DataItem totalItem = findItemByCode(result.getItems(), "total_score");
+        assertNotNull(totalItem, "应有总分项");
+        assertEquals("112", totalItem.getValue());
+    }
+
+    @Test
+    void testParseA1_shouldExtractPercentile() {
+        String text = "112\n总得分\nTotal Score\n79\n百分位(%)\n感知觉 | Perception\n百分位(%)\n14";
+        DanParsedReport result = service.parseText(text, "cognition");
+
+        DataItem pctItem = findItemByCode(result.getItems(), "percentile");
+        assertNotNull(pctItem, "应有百分位项");
+        assertEquals("79", pctItem.getValue());
+    }
+
+    @Test
+    void testParseA1_shouldExtractCognitiveDimensionFromSummaryPage() {
+        // 模拟 A1 summary 页格式: "感知觉 |  Perception\n百分位(%)\n14"
+        String text = "112\n总得分\nTotal Score\n79\n百分位(%)\n"
+                + "感知觉 |  Perception\n百分位(%)\n14\n"
+                + "注意力 |  Attention\n百分位(%)\n28\n"
+                + "记忆力 |  Memory\n百分位(%)\n42";
+
+        DanParsedReport result = service.parseText(text, "cognition");
+
+        assertFalse(result.isEmpty());
+        assertNotNull(findItemByCode(result.getItems(), "perception_pct"), "应有感知觉百分位");
+        assertNotNull(findItemByCode(result.getItems(), "attention_pct"), "应有注意力百分位");
+        assertNotNull(findItemByCode(result.getItems(), "memory_pct"), "应有记忆力百分位");
+    }
+
+    @Test
+    void testParseA1_shouldExtractCognitiveDimensionFromDetailPage() {
+        // 模拟 A1 detail 页格式: "我的感知觉得分 41  | 14%"
+        String text = "112\n总得分\nTotal Score\n79\n百分位(%)\n"
+                + "我的感知觉得分 41  | 14%\n"
+                + "我的注意力得分 55  | 28%\n"
+                + "我的记忆力得分 63  | 42%\n"
+                + "我的推理能力得分 70  | 55%\n"
+                + "我的空间能力得分 68  | 50%\n"
+                + "我的加工速度得分 72  | 60%";
+
+        DanParsedReport result = service.parseText(text, "cognition");
+
+        assertFalse(result.isEmpty());
+
+        // 验证所有6个维度都有得分和百分位
+        String[] codes = {"perception", "attention", "memory", "reasoning", "spatial", "processingSpeed"};
+        for (String code : codes) {
+            assertNotNull(findItemByCode(result.getItems(), code + "_score"),
+                    "应有" + code + "_score");
+            assertNotNull(findItemByCode(result.getItems(), code + "_pct"),
+                    "应有" + code + "_pct");
+        }
+
+        // 验证具体值
+        DataItem perceptionScore = findItemByCode(result.getItems(), "perception_score");
+        assertEquals("41", perceptionScore.getValue());
+    }
+
+    @Test
+    void testParseA1_shouldFallbackToGenericPattern() {
+        // 模拟 A1 fallback 格式: "感知觉\n百分位(%)\n14"
+        String text = "总分 112\n百分位 79\n感知觉\n百分位(%)\n14\n注意力\n百分位(%)\n28\n记忆力\n百分位(%)\n42\n推理能力\n百分位(%)\n55\n空间能力\n百分位(%)\n50\n加工速度\n百分位(%)\n60";
+
+        DanParsedReport result = service.parseText(text, "cognition");
+
+        assertFalse(result.isEmpty());
+        // 应通过 fallback 逻辑提取到
+        assertNotNull(findItemByCode(result.getItems(), "perception_pct"), "应通过fallback提取感知觉百分位");
+    }
+
+    // ==================== B3 核心学习能力 ====================
+
+    @Test
+    void testParseB3_emptyText_returnsEmpty() {
+        DanParsedReport result = service.parseText("", "learning");
+        assertTrue(result.isEmpty());
+        assertEquals("B3", result.getReportType());
+        assertEquals("learning", result.getDimension());
+    }
+
+    @Test
+    void testParseB3_shouldExtractExecutiveFunction() {
+        String text = "112\n总得分\nTotal Score\n79\n百分位(%)\n"
+                + "抑制控制 94%  工作记忆 89%  认知灵活性 60%";
+
+        DanParsedReport result = service.parseText(text, "learning");
+
+        assertFalse(result.isEmpty());
+        DataItem ic = findItemByCode(result.getItems(), "inhibitoryControl");
+        assertNotNull(ic, "应有抑制控制");
+        assertEquals("94", ic.getValue());
+
+        DataItem wm = findItemByCode(result.getItems(), "workingMemory");
+        assertNotNull(wm, "应有工作记忆");
+        assertEquals("89", wm.getValue());
+
+        DataItem cf = findItemByCode(result.getItems(), "cognitiveFlexibility");
+        assertNotNull(cf, "应有认知灵活性");
+        assertEquals("60", cf.getValue());
+    }
+
+    @Test
+    void testParseB3_shouldExtractLearningMotivation() {
+        String text = "112\n总得分\nTotal Score\n79\n百分位(%)\n"
+                + "抑制控制 94%\n"
+                + "深层动机\n我的得分:8分\n"
+                + "表面动机\n我的得分:3分\n"
+                + "自我效能感\n我的得分:7分";
+
+        DanParsedReport result = service.parseText(text, "learning");
+
+        assertFalse(result.isEmpty());
+        DataItem dm = findItemByCode(result.getItems(), "deepMotivation");
+        assertNotNull(dm, "应有深层动机");
+        assertEquals("8", dm.getValue());
+    }
+
+    @Test
+    void testParseB3_shouldExtractLearningStrategy() {
+        String text = "112\n总得分\nTotal Score\n79\n百分位(%)\n"
+                + "深层方法与策略\n我的得分:6.8分\n"
+                + "表面方法与策略\n我的得分:4.2分\n"
+                + "学习自我调节\n我的得分:7.5分";
+
+        DanParsedReport result = service.parseText(text, "learning");
+
+        assertFalse(result.isEmpty());
+        DataItem ds = findItemByCode(result.getItems(), "deepStrategy");
+        assertNotNull(ds, "应有深层方法与策略");
+        assertEquals("6.8", ds.getValue());
+    }
+
+    @Test
+    void testParseB3_shouldExtractAllDimensions() {
+        String text = "112\n总得分\nTotal Score\n79\n百分位(%)\n"
+                + "抑制控制 94%  工作记忆 89%  认知灵活性 60%\n"
+                + "深层动机\n我的得分:8分\n"
+                + "表面动机\n我的得分:3分\n"
+                + "自我效能感\n我的得分:7分\n"
+                + "深层方法与策略\n我的得分:6.8分\n"
+                + "表面方法与策略\n我的得分:4.2分\n"
+                + "学习自我调节\n我的得分:7.5分";
+
+        DanParsedReport result = service.parseText(text, "learning");
+
+        assertFalse(result.isEmpty());
+
+        // 执行功能3项
+        assertNotNull(findItemByCode(result.getItems(), "inhibitoryControl"));
+        assertNotNull(findItemByCode(result.getItems(), "workingMemory"));
+        assertNotNull(findItemByCode(result.getItems(), "cognitiveFlexibility"));
+
+        // 学习动机3项
+        assertNotNull(findItemByCode(result.getItems(), "deepMotivation"));
+        assertNotNull(findItemByCode(result.getItems(), "surfaceMotivation"));
+        assertNotNull(findItemByCode(result.getItems(), "selfEfficacy"));
+
+        // 学习策略3项
+        assertNotNull(findItemByCode(result.getItems(), "deepStrategy"));
+        assertNotNull(findItemByCode(result.getItems(), "surfaceStrategy"));
+        assertNotNull(findItemByCode(result.getItems(), "selfRegulation"));
+
+        // 总分和百分位
+        assertNotNull(findItemByCode(result.getItems(), "total_score"));
+        assertNotNull(findItemByCode(result.getItems(), "percentile"));
+    }
+
+    @Test
+    void testParseB3_shouldHandleInlineScoreFormat() {
+        // 处理 "深层动机 8分" 格式(没有"我的得分")
+        String text = "112\n总得分\nTotal Score\n79\n百分位(%)\n"
+                + "深层动机 8分\n"
+                + "表面动机 3分\n"
+                + "自我效能感 7分";
+
+        DanParsedReport result = service.parseText(text, "learning");
+
+        assertFalse(result.isEmpty());
+        DataItem dm = findItemByCode(result.getItems(), "deepMotivation");
+        assertNotNull(dm, "应有深层动机");
+        assertEquals("8", dm.getValue());
+    }
+
+    // ==================== 回归测试 ====================
+
+    @Test
+    void testParseA2_regression() {
+        // A2 解析仍正常工作
+        String text = "测试数据\n测评日期:2024-01-01\n"
+                + "大五人格\n开放性 7.5分\n尽责性 8.0分";
+
+        DanParsedReport result = service.parseText(text, "mind");
+
+        assertFalse(result.isEmpty(), "A2 解析应正常");
+        assertEquals("A2", result.getReportType());
+    }
+
+    @Test
+    void testParseB4_regression() {
+        // B4 解析仍正常工作
+        String text = "测试数据\n测评日期:2024-01-01\n"
+                + "自我概念\n自信心 7分\n自尊心 8分";
+
+        DanParsedReport result = service.parseText(text, "wisdom");
+
+        assertFalse(result.isEmpty(), "B4 解析应正常");
+        assertEquals("B4", result.getReportType());
+    }
+
+    @Test
+    void testParse_unknownDimension_returnsEmpty() {
+        DanParsedReport result = service.parseText("some text", "unknown");
+        assertTrue(result.isEmpty());
+    }
+
+    @Test
+    void testParseA1_nonNumericText_returnsEmpty() {
+        DanParsedReport result = service.parseText("纯中文文本 没有数字", "cognition");
+        assertNotNull(result);
+    }
+
+    // ==================== B2 儿童自我与家庭教养 ====================
+
+    @Test
+    void testParseB2_emptyText_returnsEmpty() {
+        DanParsedReport result = service.parseText("", "behavior");
+        assertTrue(result.isEmpty());
+        assertEquals("B2", result.getReportType());
+        assertEquals("behavior", result.getDimension());
+    }
+
+    @Test
+    void testParseB2_shouldExtractSelfConcept() {
+        String text = "112\n总得分\nTotal Score\n79\n百分位(%)\n"
+                + "行为表现 9分\n能力与学校表现 8分\n躯体外貌 7分\n"
+                + "情绪状态 6分\n合群 8分\n幸福与满足 9分";
+
+        DanParsedReport result = service.parseText(text, "behavior");
+        assertFalse(result.isEmpty());
+        assertNotNull(findItemByCode(result.getItems(), "selfConcept_behavior"), "应有自我概念_行为表现");
+        assertNotNull(findItemByCode(result.getItems(), "selfConcept_school"), "应有自我概念_能力与学校");
+        assertNotNull(findItemByCode(result.getItems(), "selfConcept_happiness"), "应有自我概念_幸福与满足");
+    }
+
+    @Test
+    void testParseB2_shouldExtractBehavior() {
+        String text = "总得分 112\n品行问题 1分 优秀\n情绪问题 2分 良好\n学习问题 3分 一般\n"
+                + "Emotional state 2分\nConduct problems 1分";
+
+        DanParsedReport result = service.parseText(text, "behavior");
+        assertFalse(result.isEmpty());
+
+        // 中文优先匹配
+        DataItem conduct = findItemByCode(result.getItems(), "conduct");
+        assertNotNull(conduct, "应有品行问题");
+    }
+
+    @Test
+    void testParseB2_shouldExtractFamilyEnvironment() {
+        String text = "总得分 112\n亲密 9分\n情感表达 7分\n和谐 5分\n"
+                + "独立性 8分\n成就向导 6分\n文化氛围 7分\n娱乐活动 8分\n"
+                + "道德观念 9分\n家务安排 6分\n家庭规则 7分";
+
+        DanParsedReport result = service.parseText(text, "behavior");
+
+        assertFalse(result.isEmpty());
+        assertNotNull(findItemByCode(result.getItems(), "family_intimacy"), "应有家庭_亲密");
+        assertNotNull(findItemByCode(result.getItems(), "family_rules"), "应有家庭_家庭规则");
+    }
+
+    // ==================== B6 职业发展 ====================
+
+    @Test
+    void testParseB6_emptyText_returnsEmpty() {
+        DanParsedReport result = service.parseText("", "career");
+        assertTrue(result.isEmpty());
+        assertEquals("B6", result.getReportType());
+        assertEquals("career", result.getDimension());
+    }
+
+    @Test
+    void testParseB6_shouldExtractHollandInterest() {
+        String text = "总得分 112\n"
+                + "NO.1: 艺术型 Artistic 7分  NO.2: 社会型 Social 5分\n";
+
+        DanParsedReport result = service.parseText(text, "career");
+        assertFalse(result.isEmpty());
+        assertNotNull(findItemByCode(result.getItems(), "interest_artistic"), "应有兴趣_艺术型");
+        assertNotNull(findItemByCode(result.getItems(), "interest_social"), "应有兴趣_社会型");
+    }
+
+    @Test
+    void testParseB6_shouldExtractMultipleIntelligence() {
+        String text = "总得分 112\n"
+                + "内省能力 INTRAPERSONAL 8分\n"
+                + "逻辑数学能力 LOGICAL 7分\n";
+
+        DanParsedReport result = service.parseText(text, "career");
+        assertFalse(result.isEmpty());
+        assertNotNull(findItemByCode(result.getItems(), "ability_intrapersonal"), "应有能力_内省");
+        assertNotNull(findItemByCode(result.getItems(), "ability_logical"), "应有能力_逻辑数学");
+    }
+
+    // ==================== C1 校园版 ====================
+
+    @Test
+    void testParseC1_emptyText_returnsEmpty() {
+        DanParsedReport result = service.parseText("", "campus");
+        assertTrue(result.isEmpty());
+        assertEquals("C1", result.getReportType());
+        assertEquals("campus", result.getDimension());
+    }
+
+    @Test
+    void testParseC1_shouldExtractCognitiveFromDetail() {
+        String text = "总得分 112\n"
+                + "我的感知觉得分 41  | 14%\n"
+                + "我的注意力得分 55  | 28%\n"
+                + "SELF-CONCEPT\n";
+
+        DanParsedReport result = service.parseText(text, "campus");
+        assertFalse(result.isEmpty());
+        assertNotNull(findItemByCode(result.getItems(), "perception_score"), "应有感知觉得分");
+        assertNotNull(findItemByCode(result.getItems(), "perception_pct"), "应有感知觉百分位");
+    }
+
+    @Test
+    void testParseC1_shouldExtractBigFive() {
+        String text = "总得分 112\n您在「开放性」上的得分是 7.5 分\n您在「宜人性」上的得分是 8.0 分\n";
+
+        DanParsedReport result = service.parseText(text, "campus");
+        assertFalse(result.isEmpty());
+        assertNotNull(findItemByCode(result.getItems(), "big5_开放性"), "应有大五_开放性");
+        assertNotNull(findItemByCode(result.getItems(), "big5_宜人性"), "应有大五_宜人性");
+    }
+
+    @Test
+    void testParseC1_shouldExtractSelfDriving() {
+        String text = "总得分 112\n我的得分:8分\n我的得分:7分\n我的得分:9分\nSELF-CONCEPT\n";
+
+        DanParsedReport result = service.parseText(text, "campus");
+        assertFalse(result.isEmpty());
+        assertNotNull(findItemByCode(result.getItems(), "autonomy"), "应有自主性");
+        assertNotNull(findItemByCode(result.getItems(), "competence"), "应有胜任感");
+        assertNotNull(findItemByCode(result.getItems(), "belonging"), "应有归属感");
+    }
+
+    @Test
+    void testParseC1_shouldExtractSelfConcept() {
+        String text = "总得分 112\n"
+                + "14% 28% 42% 55% 50% 60% 70% 65% 80% 75% 90% 85%\n"
+                + "SELF-CONCEPT\n";
+
+        DanParsedReport result = service.parseText(text, "campus");
+        assertFalse(result.isEmpty());
+        // 应能从SELF-CONCEPT前的百分位中提取自我概念
+        assertNotNull(findItemByCode(result.getItems(), "sc_behavior"), "应有自我概念_行为表现");
+    }
+
+    // ==================== B5 青春期挑战 ====================
+
+    @Test
+    void testParseB5_emptyText_returnsEmpty() {
+        DanParsedReport result = service.parseText("", "adolescent");
+        assertTrue(result.isEmpty());
+        assertEquals("B5", result.getReportType());
+        assertEquals("adolescent", result.getDimension());
+    }
+
+    @Test
+    void testParseB5_shouldExtractEmotionRegulation() {
+        String text = "总得分 112\n"
+                + "认知重评 Cognitive Reappraisal 7.5分\n"
+                + "表达抑制 Expressive Suppression 4.2分";
+
+        DanParsedReport result = service.parseText(text, "adolescent");
+        assertFalse(result.isEmpty());
+        DataItem reappraisal = findItemByCode(result.getItems(), "er_reappraisal");
+        assertNotNull(reappraisal, "应有认知重评");
+        assertEquals("7.5", reappraisal.getValue());
+    }
+
+    @Test
+    void testParseB5_shouldExtractAcademicStress() {
+        String text = "总得分 112\n"
+                + "学业压力源\n学业负担\n7\n家庭期望\n5\n师生关系\n3\n自我期望\n8\n同伴竞争\n6\n人际关系问题";
+
+        DanParsedReport result = service.parseText(text, "adolescent");
+        assertFalse(result.isEmpty());
+        assertNotNull(findItemByCode(result.getItems(), "stress_burden"), "应有学业压力_学业负担");
+        assertNotNull(findItemByCode(result.getItems(), "stress_family"), "应有学业压力_家庭期望");
+    }
+
+    @Test
+    void testParseB5_shouldExtractInterpersonal() {
+        String text = "总得分 112\n"
+                + "人际关系问题\n"
+                + "母亲关系\n与母亲关系良好。\n7\n"
+                + "父亲关系\n与父亲交流较少。\n5\n社交能力";
+
+        DanParsedReport result = service.parseText(text, "adolescent");
+        assertFalse(result.isEmpty());
+        DataItem mother = findItemByCode(result.getItems(), "rel_mother");
+        assertNotNull(mother, "应有人际_母亲关系");
+        assertEquals("7", mother.getValue());
+    }
+
+    @Test
+    void testParseB5_shouldExtractSocialAbility() {
+        String text = "总得分 112\n社交能力\n"
+                + "同龄人平均水平\n5\n6\n7\n8\n9\n睡眠";
+
+        DanParsedReport result = service.parseText(text, "adolescent");
+        assertFalse(result.isEmpty());
+        assertNotNull(findItemByCode(result.getItems(), "soc_initiative"), "应有社交_主动交往");
+        assertNotNull(findItemByCode(result.getItems(), "soc_conflict"), "应有社交_冲突解决");
+    }
+
+    @Test
+    void testParseB5_shouldExtractSleepData() {
+        String text = "总得分 112\n"
+                + "睡眠时长 7.5小时\n"
+                + "睡眠效率 85%\n"
+                + "入睡时间 15-30分钟\n"
+                + "主观睡眠质量\n3";
+
+        DanParsedReport result = service.parseText(text, "adolescent");
+        assertFalse(result.isEmpty());
+        assertNotNull(findItemByCode(result.getItems(), "sleep_hours"), "应有睡眠时长");
+        assertNotNull(findItemByCode(result.getItems(), "sleep_efficiency"), "应有睡眠效率");
+        assertNotNull(findItemByCode(result.getItems(), "sleep_latency"), "应有入睡时间");
+    }
+
+    @Test
+    void testParseB5_shouldExtractExerciseAndInternet() {
+        String text = "总得分 112\n"
+                + "运动时长 60分钟\n"
+                + "运动强度 中\n"
+                + "网络使用 2.5小时";
+
+        DanParsedReport result = service.parseText(text, "adolescent");
+        assertFalse(result.isEmpty());
+        assertNotNull(findItemByCode(result.getItems(), "exercise_duration"), "应有运动时长");
+        assertNotNull(findItemByCode(result.getItems(), "internet_duration"), "应有网络使用时长");
+    }
+
+    // ==================== B5 指南针图像分析 ====================
+
+    @Test
+    void testParseB5_noCompassImage_shouldNotFail() {
+        // 没有指南针图像时parseB5Report应正常工作, 不抛异常
+        String text = "总得分 200\n认知重评 5分\n表达抑制 3分\n学业压力源\n学业负担\n3\n睡眠时长 8小时";
+        DanParsedReport result = service.parseText(text, "adolescent");
+
+        assertFalse(result.isEmpty());
+        assertEquals("B5", result.getReportType());
+        // 文本提取应正常工作
+        assertNotNull(findItemByCode(result.getItems(), "er_reappraisal"), "应能提取认知重评");
+        assertNotNull(findItemByCode(result.getItems(), "sleep_hours"), "应能提取睡眠时长");
+    }
+
+    @Test
+    void testParseB5_withCompassScoringAlgorithm_shouldProduceValidResults() {
+        // 验证指南针评分算法: 验证常数、象限角度有效性、子维度数量
+        String text = "总得分 200\n认知重评 5.0分\n母亲关系\n5\n父亲关系\n4\n师生关系\n3\n同伴关系\n2";
+
+        // 不能直接访问私有方法 extractB5CompassScores, 
+        // 但可以验证 parseB5Report 在不抛异常的情况下正常工作
+        DanParsedReport result = service.parseText(text, "adolescent");
+        assertFalse(result.isEmpty());
+    }
+
+    // ==================== 工具方法 ====================
+
+    private DataItem findItemByCode(List<DataItem> items, String code) {
+        if (items == null) return null;
+        for (DataItem item : items) {
+            if (item.getCode().equals(code)) {
+                return item;
+            }
+        }
+        return null;
+    }
+}

+ 1 - 0
cfc-frontend/.npmrc

@@ -0,0 +1 @@
+legacy-peer-deps=true

+ 229 - 0
cfc-frontend/components/AITaskCard.vue

@@ -0,0 +1,229 @@
+<template>
+  <view class="ai-task-card">
+    <view class="card-header">
+      <text class="card-title">{{ task.title }}</text>
+      <view class="dimension-badge" :style="{ backgroundColor: dimensionColor }">
+        <text class="dimension-text">{{ task.dimension }}</text>
+      </view>
+    </view>
+
+    <view class="card-body">
+      <text class="card-description">{{ task.description }}</text>
+    </view>
+
+    <view class="card-footer">
+      <view class="reward-info">
+        <text class="reward-label">奖励能量</text>
+        <text class="reward-points">+{{ task.rewardPoints }}</text>
+      </view>
+
+      <button
+        class="accept-btn"
+        :loading="loading"
+        :disabled="loading"
+        @click="handleAccept"
+      >
+        <text class="btn-text">{{ loading ? '接受中...' : '接受任务' }}</text>
+      </button>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'AITaskCard',
+
+  props: {
+    task: {
+      type: Object,
+      default: function() {
+        return {
+          title: '',
+          description: '',
+          dimension: '',
+          rewardPoints: 0,
+          id: null
+        }
+      }
+    },
+    conversationId: {
+      type: String,
+      default: ''
+    }
+  },
+
+  data: function() {
+    return {
+      loading: false
+    }
+  },
+
+  computed: {
+    dimensionColor: function() {
+      var colorMap = {
+        '身': '#10B981',
+        '心': '#F59E0B',
+        '智': '#3B82F6',
+        '行': '#8B5CF6',
+        '富': '#F97316'
+      }
+      return colorMap[this.task.dimension] || '#F97316'
+    }
+  },
+
+  methods: {
+    handleAccept: function() {
+      var self = this
+      if (self.loading) {
+        return
+      }
+
+      var token = uni.getStorageSync('token')
+      if (!token) {
+        uni.showToast({
+          title: '请先登录',
+          icon: 'none'
+        })
+        return
+      }
+
+      self.loading = true
+
+      uni.request({
+        url: self.$apiBase + '/api/growth-task/accept-dynamic',
+        method: 'POST',
+        header: {
+          'Authorization': 'Bearer ' + token,
+          'Content-Type': 'application/json'
+        },
+        data: {
+          taskId: self.task.id,
+          conversationId: self.conversationId
+        },
+        success: function(res) {
+          if (res.statusCode === 200 && res.data && res.data.code === 200) {
+            uni.showToast({
+              title: '任务已接受',
+              icon: 'success'
+            })
+            self.$emit('accepted', self.task)
+          } else {
+            var message = (res.data && res.data.message) || '接受失败'
+            uni.showToast({
+              title: message,
+              icon: 'none'
+            })
+          }
+        },
+        fail: function() {
+          uni.showToast({
+            title: '网络请求失败',
+            icon: 'none'
+          })
+        },
+        complete: function() {
+          self.loading = false
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.ai-task-card {
+  background-color: #FFFFFF;
+  border-radius: 16rpx;
+  padding: 32rpx;
+  margin: 24rpx;
+  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.06);
+}
+
+.card-header {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 24rpx;
+}
+
+.card-title {
+  font-size: 32rpx;
+  font-weight: 600;
+  color: #1F2937;
+  flex: 1;
+  margin-right: 16rpx;
+}
+
+.dimension-badge {
+  padding: 8rpx 20rpx;
+  border-radius: 24rpx;
+  flex-shrink: 0;
+}
+
+.dimension-text {
+  font-size: 24rpx;
+  font-weight: 500;
+  color: #FFFFFF;
+}
+
+.card-body {
+  margin-bottom: 32rpx;
+}
+
+.card-description {
+  font-size: 28rpx;
+  color: #6B7280;
+  line-height: 44rpx;
+}
+
+.card-footer {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+  align-items: center;
+  padding-top: 24rpx;
+  border-top: 1rpx solid #F3F4F6;
+}
+
+.reward-info {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+}
+
+.reward-label {
+  font-size: 26rpx;
+  color: #9CA3AF;
+  margin-right: 12rpx;
+}
+
+.reward-points {
+  font-size: 32rpx;
+  font-weight: 700;
+  color: #F97316;
+}
+
+.accept-btn {
+  background-color: #F97316;
+  color: #FFFFFF;
+  border: none;
+  border-radius: 12rpx;
+  padding: 20rpx 40rpx;
+  font-size: 28rpx;
+  font-weight: 500;
+  line-height: 1.2;
+}
+
+.accept-btn:active {
+  background-color: #EA580C;
+}
+
+.accept-btn:disabled {
+  background-color: #FDBA74;
+}
+
+.btn-text {
+  color: #FFFFFF;
+}
+</style>

+ 174 - 32
cfc-frontend/components/FamilyRelationGraph.vue

@@ -1,6 +1,10 @@
 <template>
   <!-- 全 Canvas 关系图谱 - Force-directed 物理布局 -->
   <view class="family-graph-wrapper" v-if="simNodes && simNodes.length >= 1">
+    <!-- 右上角小齿轮 -->
+    <view class="gear-icon" @click="onManageTap">
+      <text class="gear-text">⚙</text>
+    </view>
     <canvas
       class="family-graph-canvas"
       canvas-id="forceGraphCanvas"
@@ -9,7 +13,19 @@
       :style="{ width: canvasWidth + 'px', height: canvasHeight + 'px' }"
       @touchstart="onTouchStart"
       @touchmove="onTouchMove"
-      @touchend="onTouchEnd" />
+      @touchend="onTouchEnd"
+      @click="onCanvasClick" />
+    <!-- PC 端悬停检测层 -->
+    <view
+      v-if="isPC"
+      class="hover-layer"
+      :style="{ width: canvasWidth + 'px', height: canvasHeight + 'px' }"
+      @mousemove="onHoverMove"
+      @mouseleave="onHoverLeave" />
+    <!-- + 添加成员提示(触摸/悬停时显示在中心节点旁) -->
+    <view class="add-hint" :class="{ 'add-hint-visible': touchingSelf || hoveringSelf }" :style="addHintPosition">
+      <text class="add-hint-text">+</text>
+    </view>
   </view>
   <!-- 空状态 -->
   <view class="family-graph-empty" v-else-if="members && members.length === 0">
@@ -93,6 +109,13 @@ export default {
       animFrameId: null,
       isSimulating: false,
 
+      // 触摸/悬停状态(显示 + 号)
+      touchingSelf: false,
+      hoveringSelf: false,
+
+      // 是否 PC 环境(h5 编译)
+      isPC: false,
+
       // 主题色
       themeColors: {
         body: '#8D6E63',
@@ -108,6 +131,16 @@ export default {
       return this.themeColors[this.dimensionCode] || '#8D6E63'
     },
 
+    // + 提示位置(跟随中心节点偏移)
+    addHintPosition: function() {
+      var selfNode = this.simNodes.find(function(n) { return n.isSelf })
+      if (!selfNode) return {}
+      return {
+        left: (selfNode.x + selfNode.radius * 0.7) + 'px',
+        top: (selfNode.y - selfNode.radius * 0.5) + 'px'
+      }
+    },
+
     // 将 members 转换为 simNodes
     nodeData: function() {
       var self = this
@@ -234,16 +267,20 @@ export default {
       this.startSimulation()
     },
 
-    startSimulation: function() {
+startSimulation: function() {
       if (this.isSimulating) return
       this.isSimulating = true
-      this.simulationTick()
+      // 延迟一帧启动,确保DOM已更新
+      var self = this
+      setTimeout(function() {
+        self.simulationTick()
+      }, 50)
     },
 
     stopSimulation: function() {
       this.isSimulating = false
       if (this.animFrameId) {
-        cancelAnimationFrame(this.animFrameId)
+        clearTimeout(this.animFrameId)
         this.animFrameId = null
       }
     },
@@ -329,10 +366,10 @@ export default {
       // 6. 渲染
       this.render()
 
-      // 7. 下一帧
-      this.animFrameId = requestAnimationFrame(function() {
+      // 7. 下一帧(使用 setTimeout 代替 requestAnimationFrame)
+      this.animFrameId = setTimeout(function() {
         self.simulationTick()
-      })
+      }, 33)
     },
 
     // ===== 渲染 =====
@@ -344,9 +381,17 @@ export default {
         .fields({ node: true, size: true })
         .exec(function(res) {
           if (!res || !res[0] || !res[0].node) {
-            self.renderLegacy()
+            // Canvas 节点尚未就绪,延迟重试
+            if (self._retryCount === undefined) self._retryCount = 0
+            if (self._retryCount < 5) {
+              self._retryCount++
+              setTimeout(function() {
+                self.render()
+              }, 200)
+            }
             return
           }
+          self._retryCount = 0
           var canvas = res[0].node
           var ctx = canvas.getContext('2d')
           canvas.width = self.canvasWidth * self.dpr
@@ -431,23 +476,36 @@ export default {
       }
     },
 
-    renderLegacy: function() {
+renderLegacy: function() {
       var ctx = uni.createCanvasContext('forceGraphCanvas', this)
-      var self = this
+      if (!ctx) return
+      
+      // hex转rgba辅助
+      function hexToRgba(hex, alpha) {
+        if (hex && hex.length === 7) {
+          var r = parseInt(hex.slice(1, 3), 16)
+          var g = parseInt(hex.slice(3, 5), 16)
+          var b = parseInt(hex.slice(5, 7), 16)
+          return 'rgba(' + r + ',' + g + ',' + b + ',' + alpha + ')'
+        }
+        return hex || '#FF6B9D'
+      }
+
       ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight)
+
       var edges = this.edges
       for (var i = 0; i < edges.length; i++) {
         var edge = edges[i]
-        var trust = edge.trust || 75
         var comm = edge.communication || 50
-        var hue = 120 * trust / 100
-        ctx.setStrokeStyle('hsla(' + hue + ', 75%, 45%, 0.6)')
-        ctx.setLineWidth(1 + (comm / 100) * 4)
+        var hue = 120 * (edge.trust || 75) / 100
+        ctx.strokeStyle = 'hsla(' + hue + ', 75%, 45%, 0.6)'
+        ctx.lineWidth = 1 + (comm / 100) * 4
         ctx.beginPath()
         ctx.moveTo(edge.source.x, edge.source.y)
         ctx.lineTo(edge.target.x, edge.target.y)
         ctx.stroke()
       }
+      
       var nodes = this.simNodes
       for (var j = 0; j < nodes.length; j++) {
         var node = nodes[j]
@@ -456,43 +514,43 @@ export default {
         if (node.isSelf) {
           ctx.beginPath()
           ctx.arc(node.x, node.y, r, 0, 2 * Math.PI)
-          ctx.setFillStyle('#FFFFFF')
+          ctx.fillStyle = '#FFFFFF'
           ctx.fill()
-          ctx.setStrokeStyle(this.themeColor)
-          ctx.setLineWidth(3)
+          ctx.strokeStyle = this.themeColor
+          ctx.lineWidth = 3
           ctx.stroke()
           // inner ring
           ctx.beginPath()
           ctx.arc(node.x, node.y, r * 0.7, 0, 2 * Math.PI)
-          ctx.setStrokeStyle(this.themeColor + '88')
-          ctx.setLineWidth(2)
+          ctx.strokeStyle = hexToRgba(this.themeColor, 0.53)
+          ctx.lineWidth = 2
           ctx.stroke()
         } else if (node.relationshipType === 'spouse') {
           this.drawHeartLegacy(ctx, node.x, node.y, r)
-          ctx.setFillStyle(this.themeColor + '22')
+          ctx.fillStyle = hexToRgba(this.themeColor, 0.13)
           ctx.fill()
         } else if (node.relationshipType === 'parent') {
           this.drawRoundedRectLegacy(ctx, node.x, node.y, r * 2, r * 2, r * 0.3)
-          ctx.setFillStyle(this.themeColor + '22')
+          ctx.fillStyle = hexToRgba(this.themeColor, 0.13)
           ctx.fill()
         } else if (node.relationshipType === 'sibling') {
           this.drawPolygonLegacy(ctx, node.x, node.y, r, 8)
-          ctx.setFillStyle(this.themeColor + '22')
+          ctx.fillStyle = hexToRgba(this.themeColor, 0.13)
           ctx.fill()
         } else {
           ctx.beginPath()
           ctx.arc(node.x, node.y, r, 0, 2 * Math.PI)
-          ctx.setFillStyle(this.themeColor + '22')
+          ctx.fillStyle = hexToRgba(this.themeColor, 0.13)
           ctx.fill()
         }
 
-        ctx.setFillStyle(node.isSelf ? this.themeColor : '#4A5568')
-        ctx.setFont('bold ' + (r * 0.9) + 'px sans-serif')
-        ctx.setTextAlign('center')
-        ctx.setTextBaseline('middle')
+        ctx.fillStyle = node.isSelf ? this.themeColor : '#4A5568'
+        ctx.font = 'bold ' + (r * 0.9) + 'px sans-serif'
+        ctx.textAlign = 'center'
+        ctx.textBaseline = 'middle'
         ctx.fillText(node.displayName, node.x, node.y)
-        ctx.setFillStyle(node.isSelf ? this.themeColor : '#94A3B8')
-        ctx.setFont((r * 0.4) + 'px sans-serif')
+        ctx.fillStyle = node.isSelf ? this.themeColor : '#94A3B8'
+        ctx.font = (r * 0.4) + 'px sans-serif'
         ctx.fillText(node.nickname.substring(0, 3), node.x, node.y + r + 10)
       }
       ctx.draw()
@@ -529,8 +587,12 @@ export default {
           var y = touch.clientY - rect.top
           var node = self.getTouchNode(x, y)
           if (node) {
-            self.dragging = { node: node, offsetX: x - node.x, offsetY: y - node.y }
-            self.dragStartPos = { x: x, y: y }
+            if (node.isSelf) {
+              self.touchingSelf = true
+            } else {
+              self.dragging = { node: node, offsetX: x - node.x, offsetY: y - node.y }
+              self.dragStartPos = { x: x, y: y }
+            }
           }
         }
       })
@@ -558,6 +620,18 @@ export default {
     },
 
     onTouchEnd: function(e) {
+      var wasTouchingSelf = this.touchingSelf
+      this.touchingSelf = false
+      if (wasTouchingSelf) {
+        // 触摸的是中心"我"节点 → 跳转添加成员页面
+        if (this.interactive) {
+          this.$emit('addMemberTap')
+          this.goAddMember()
+        }
+        this.dragging = null
+        this.dragStartPos = null
+        return
+      }
       if (!this.dragging) return
       var wasDragged = this.dragStartPos && (
         Math.abs(this.dragging.node.x - this.dragStartPos.x) > 5 ||
@@ -595,6 +669,20 @@ export default {
       return (typeof val !== 'undefined' && val !== null) ? val : 75
     },
 
+    // 跳转到添加成员页面
+    goAddMember: function() {
+      uni.navigateTo({
+        url: '/pages/family/add-member'
+      })
+    },
+
+    // 点击右上角小齿轮 → 跳转成员管理页
+    onManageTap: function() {
+      uni.navigateTo({
+        url: '/pages/profile/family-members'
+      })
+    },
+
     updateCanvasSize: function() {
       var self = this
       var query = uni.createSelectorQuery().in(this)
@@ -699,7 +787,7 @@ export default {
 .family-graph-wrapper {
   position: relative;
   width: 100%;
-  height: 280px;
+  min-height: 200rpx;
   margin: 10rpx 0;
   background: #FFFFFF;
   border-radius: 24rpx;
@@ -711,6 +799,60 @@ export default {
   left: 0;
   z-index: 1;
 }
+/* PC 端悬停检测覆盖层 */
+.hover-layer {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 2;
+  background: transparent;
+  pointer-events: auto;
+}
+/* 右上角小齿轮 */
+.gear-icon {
+  position: absolute;
+  top: 12rpx;
+  right: 12rpx;
+  z-index: 10;
+  width: 56rpx;
+  height: 56rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background: rgba(255, 255, 255, 0.9);
+  border-radius: 50%;
+  box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.gear-text {
+  font-size: 32rpx;
+  color: #94A3B8;
+}
+/* + 添加成员提示 */
+.add-hint {
+  position: absolute;
+  z-index: 5;
+  width: 40rpx;
+  height: 40rpx;
+  border-radius: 50%;
+  background: #10B981;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  opacity: 0;
+  transform: scale(0.5);
+  transition: opacity 0.15s, transform 0.15s;
+  pointer-events: none;
+}
+.add-hint.add-hint-visible {
+  opacity: 1;
+  transform: scale(1);
+}
+.add-hint-text {
+  font-size: 28rpx;
+  color: #FFFFFF;
+  font-weight: bold;
+  line-height: 1;
+}
 .family-graph-empty {
   display: flex;
   align-items: center;

+ 157 - 0
cfc-frontend/components/feedback-popup.vue

@@ -0,0 +1,157 @@
+<template>
+  <view class="fb-overlay" v-if="visible" @tap="close">
+    <view class="fb-body" @tap.stop>
+      <view class="fb-header">
+        <text class="fb-title">报告反馈</text>
+        <text class="fb-close" @tap="close">×</text>
+      </view>
+      <textarea class="fb-textarea" v-model="content" placeholder="请描述您的问题或建议..." maxlength="500" />
+      <picker :value="typeIndex" :range="types" @change="onTypeChange">
+        <view class="fb-picker">
+          <text>{{ types[typeIndex] }}</text>
+          <text class="fb-arrow">▼</text>
+        </view>
+      </picker>
+      <view class="fb-actions">
+        <view class="fb-btn fb-btn-cancel" @tap="close">取消</view>
+        <view class="fb-btn fb-btn-submit" @tap="submit">提交反馈</view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { submitFeedback } from '../utils/api.js'
+
+export default {
+  props: {
+    visible: Boolean,
+    reportId: Number
+  },
+  data: function() {
+    return {
+      content: '',
+      types: ['功能建议', '数据疑问', '内容错误', '其他'],
+      typeIndex: 0,
+      submitting: false
+    }
+  },
+  methods: {
+    onTypeChange: function(e) {
+      this.typeIndex = e.detail.value
+    },
+    close: function() {
+      this.$emit('close')
+    },
+    submit: function() {
+      if (!this.content.trim()) {
+        uni.showToast({ title: '请填写内容', icon: 'none' })
+        return
+      }
+      if (this.submitting) return
+      this.submitting = true
+      var self = this
+      var payload = {
+        reportId: this.reportId,
+        type: this.types[this.typeIndex],
+        content: this.content.trim()
+      }
+      submitFeedback(payload).then(function(res) {
+        if (res.code === 200) {
+          uni.showToast({ title: '感谢反馈', icon: 'success' })
+          self.content = ''
+          self.typeIndex = 0
+          self.close()
+        } else {
+          uni.showToast({ title: res.message || '提交失败', icon: 'none' })
+        }
+      }).catch(function() {
+        uni.showToast({ title: '提交失败', icon: 'none' })
+      }).then(function() {
+        self.submitting = false
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.fb-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: rgba(0,0,0,0.4);
+  z-index: 999;
+  display: flex;
+  align-items: flex-end;
+}
+.fb-body {
+  background: #fff;
+  border-radius: 20rpx 20rpx 0 0;
+  padding: 30rpx;
+  width: 100%;
+  box-sizing: border-box;
+}
+.fb-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20rpx;
+}
+.fb-title {
+  font-size: 32rpx;
+  font-weight: 600;
+  color: #333;
+}
+.fb-close {
+  font-size: 40rpx;
+  color: #999;
+  padding: 0 10rpx;
+}
+.fb-textarea {
+  width: 100%;
+  height: 200rpx;
+  border: 1rpx solid #eee;
+  border-radius: 12rpx;
+  padding: 20rpx;
+  font-size: 26rpx;
+  box-sizing: border-box;
+  margin-bottom: 16rpx;
+}
+.fb-picker {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 20rpx;
+  border: 1rpx solid #eee;
+  border-radius: 12rpx;
+  margin-bottom: 20rpx;
+  font-size: 26rpx;
+  color: #333;
+}
+.fb-arrow {
+  color: #999;
+  font-size: 22rpx;
+}
+.fb-actions {
+  display: flex;
+}
+.fb-btn {
+  flex: 1;
+  text-align: center;
+  padding: 20rpx;
+  border-radius: 12rpx;
+  font-size: 28rpx;
+}
+.fb-btn-cancel {
+  border: 1rpx solid #ddd;
+  color: #666;
+  margin-right: 20rpx;
+}
+.fb-btn-submit {
+  background: #4A9BD7;
+  color: #fff;
+}
+</style>

+ 108 - 0
cfc-frontend/components/health-knowledge-popup.vue

@@ -0,0 +1,108 @@
+<template>
+  <view class="kb-popup-overlay" v-if="visible" @tap="close">
+    <view class="kb-popup-content" @tap.stop>
+      <view class="kb-popup-header">
+        <text class="kb-popup-title">{{ data.itemName || '' }}</text>
+        <text class="kb-popup-close" @tap="close">×</text>
+      </view>
+      <scroll-view class="kb-popup-body" scroll-y>
+        <view class="kb-field" v-if="data.category">
+          <text class="kb-field-label">分类</text>
+          <text class="kb-field-value">{{ data.category }}</text>
+        </view>
+        <view class="kb-field" v-if="data.normalRange">
+          <text class="kb-field-label">正常范围</text>
+          <text class="kb-field-value">{{ data.normalRange }}</text>
+        </view>
+        <view class="kb-field" v-if="data.description">
+          <text class="kb-field-label">说明</text>
+          <text class="kb-field-value">{{ data.description }}</text>
+        </view>
+        <view class="kb-field" v-if="data.suggestion">
+          <text class="kb-field-label">相关建议</text>
+          <text class="kb-field-value">{{ data.suggestion }}</text>
+        </view>
+        <view class="kb-empty" v-if="!data.itemName">
+          <text>暂无相关说明</text>
+        </view>
+      </scroll-view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  props: {
+    visible: { type: Boolean, default: false },
+    data: { type: Object, default: function() { return {} } }
+  },
+  methods: {
+    close: function() {
+      this.$emit('close')
+    }
+  }
+}
+</script>
+
+<style scoped>
+.kb-popup-overlay {
+  position: fixed;
+  top: 0; left: 0; right: 0; bottom: 0;
+  background: rgba(0,0,0,0.5);
+  z-index: 999;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.kb-popup-content {
+  width: 600rpx;
+  max-height: 70vh;
+  background: #fff;
+  border-radius: 24rpx;
+  overflow: hidden;
+  display: flex;
+  flex-direction: column;
+}
+.kb-popup-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 30rpx 30rpx 20rpx;
+  border-bottom: 1rpx solid #f0f0f0;
+}
+.kb-popup-title {
+  font-size: 32rpx;
+  font-weight: 600;
+  color: #333;
+  flex: 1;
+}
+.kb-popup-close {
+  font-size: 40rpx;
+  color: #999;
+  padding: 0 10rpx;
+}
+.kb-popup-body {
+  padding: 20rpx 30rpx 30rpx;
+  max-height: 50vh;
+}
+.kb-field {
+  margin-bottom: 20rpx;
+}
+.kb-field-label {
+  font-size: 26rpx;
+  color: #999;
+  display: block;
+  margin-bottom: 6rpx;
+}
+.kb-field-value {
+  font-size: 28rpx;
+  color: #333;
+  line-height: 1.6;
+}
+.kb-empty {
+  text-align: center;
+  color: #ccc;
+  padding: 40rpx 0;
+  font-size: 28rpx;
+}
+</style>

+ 1 - 1
cfc-frontend/config.js

@@ -25,7 +25,7 @@ try {
         API_BASE_URL = 'https://cfc.iwintrue.com'
         break
       case 'release':
-        API_BASE_URL = 'https://cfc.bianwoyou.com.cn'
+        API_BASE_URL = 'https://cfc.etotem.com.cn'
         break
     }
   }

+ 58 - 66
cfc-frontend/manifest.json

@@ -1,68 +1,60 @@
 {
-    "name" : "浠艾福",
-    "appid" : "__UNI__DA59D6D",
-    "description" : "关爱家庭成长小程序",
-    "versionName" : "1.0.0",
-    "versionCode" : "100",
-    "transformPx" : false,
-    "app-plus" : {
-        "usingComponents" : true,
-        "nvueStyleCompiler" : "uni-app",
-        "compilerVersion" : 3,
-        "splashscreen" : {
-            "alwaysShowBeforeRender" : true,
-            "waiting" : true,
-            "autoclose" : true,
-            "delay" : 0
-        },
-        "modules" : {},
-        "distribute" : {
-            "android" : {
-                "permissions" : [
-                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
-                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
-                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
-                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
-                ]
-            },
-            "ios" : {},
-            "sdkConfigs" : {}
-        }
+  "name": "浠艾福",
+  "appid": "__UNI__DA59D6D",
+  "description": "关爱家庭成长小程序",
+  "versionName": "1.0.0",
+  "versionCode": "100",
+  "transformPx": false,
+  "app-plus": {
+    "nvueStyleCompiler": "uni-app",
+    "compilerVersion": 3,
+    "splashscreen": {
+      "alwaysShowBeforeRender": true,
+      "waiting": true,
+      "autoclose": true,
+      "delay": 0
     },
-    "quickapp" : {},
-    "mp-weixin" : {
-        "appid" : "wx5ba8038ef16fb245",
-        "setting" : {
-            "urlCheck" : false,
-            "es6" : true,
-            "postcss" : true,
-            "minified" : true,
-            "lazyCodeLoading" : "requiredComponents"
-        },
-        "usingComponents" : true
-    },
-    "mp-alipay" : {
-        "usingComponents" : true
-    },
-    "mp-baidu" : {
-        "usingComponents" : true
-    },
-    "mp-toutiao" : {
-        "usingComponents" : true
-    },
-    "uniStatistics" : {
-        "enable" : false
-    },
-    "vueVersion" : "2"
-}
+    "modules": {},
+    "distribute": {
+      "android": {
+        "permissions": [
+          "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+          "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+          "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+          "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+          "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+          "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+          "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+          "<uses-feature android:name=\"android.hardware.camera\"/>",
+          "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+        ]
+      },
+      "ios": {},
+      "sdkConfigs": {}
+    }
+  },
+  "quickapp": {},
+  "mp-weixin": {
+    "appid": "wx5ba8038ef16fb245",
+    "setting": {
+      "urlCheck": false,
+      "es6": true,
+      "postcss": true,
+      "minified": true,
+      "lazyCodeLoading": "requiredComponents"
+    }
+  },
+  "mp-alipay": {},
+  "mp-baidu": {},
+  "mp-toutiao": {},
+  "uniStatistics": {
+    "enable": false
+  },
+  "vueVersion": "2"
+}

+ 36 - 0
cfc-frontend/pages.json

@@ -934,6 +934,12 @@
             "navigationBarTitleText": "健康报告"
           }
         },
+        {
+          "path": "physical-exam-detail",
+          "style": {
+            "navigationBarTitleText": "体检报告详情"
+          }
+        },
         {
           "path": "nutrition-profile",
           "style": {
@@ -975,6 +981,30 @@
           "style": {
             "navigationBarTitleText": "菌群"
           }
+        },
+        {
+          "path": "gut-flora-detail",
+          "style": {
+            "navigationBarTitleText": "菌群报告详情"
+          }
+        },
+        {
+          "path": "gut-flora-species-detail",
+          "style": {
+            "navigationBarTitleText": "菌群详情"
+          }
+        },
+        {
+          "path": "gut-flora-foods-detail",
+          "style": {
+            "navigationBarTitleText": "饮食推荐"
+          }
+        },
+        {
+          "path": "gut-flora-risks-detail",
+          "style": {
+            "navigationBarTitleText": "疾病风险"
+          }
         }
       ]
     },
@@ -1310,5 +1340,11 @@
         "selectedIconPath": "static/tab-profile-active.png"
       }
     ]
+  },
+  "easycom": {
+    "auto": "components/@dcloudio/uni-$2/components/uni-$1/uni-$1.vue",
+    "pages": {
+      "pages/*": "components/@dcloudio/uni-$2/components/uni-$1/uni-$1.vue"
+    }
   }
 }

+ 7 - 14
cfc-frontend/pages/action/index.vue

@@ -82,12 +82,11 @@
       @articleClick="goArticleDetail"
       @moreArticles="goMoreArticles" />
 
-    <!-- ===== 重要关系维护 + 关系健康概览 ===== -->
-    <OctopusGraph
-      :contactList="contactList"
-      :healthAlerts="healthAlerts"
-      :milestones="milestones"
-      :isLoggedIn="isLoggedIn" />
+        <!-- ===== 重要关系维护 ===== -->
+        <OctopusGraph
+          :contactList="contactList"
+          :healthAlerts="healthAlerts"
+          :isLoggedIn="isLoggedIn" />
 
     <!-- 功能入口(4个:活动、商品、课程) -->
     <view class="func-section" v-if="sectionVisible('func_entries')">
@@ -151,7 +150,7 @@ export default {
       contactList: [],
       showImportModal: false,
       healthAlerts: [],
-      milestones: [],
+    
       funcList: [
         { icon: '\u{1F3CB}', label: '任务', needLogin: true, page: '/pages/tasks/tasks' },
         { icon: '\u{1F3C0}', label: '活动', needLogin: false, page: '/pages/discover/index?type=activity' },
@@ -473,13 +472,7 @@ export default {
       }).catch(function() {
         self.healthAlerts = []
       })
-      getMilestones({}, 30).then(function(res) {
-        if (res.code === 200 && res.data) {
-          self.milestones = Array.isArray(res.data) ? res.data : []
-        }
-      }).catch(function() {
-        self.milestones = []
-      })
+      
     },
     goInteractionLog: function(memberId) {
       if (memberId) {

+ 96 - 52
cfc-frontend/pages/ai/chat.vue

@@ -75,18 +75,26 @@
             <view class="message-avatar">{{ mascotIcon || '🤖' }}</view>
             <view class="message-bubble ai-bubble">
               <text class="ai-answer-text">{{ msg.answer }}</text>
-              <!-- 推荐卡片 -->
-              <view class="rec-list" v-if="msg.recommendations && msg.recommendations.length > 0">
-                <view class="rec-card" v-for="(rec, ri) in msg.recommendations" :key="ri" @click="gotoRec(rec)">
-                  <image class="rec-cover" v-if="rec.coverImage" :src="rec.coverImage" mode="aspectFill" />
-                  <view class="rec-info">
-                    <text class="rec-type-tag">{{ rec.type === 'product' ? '商品' : rec.type === 'activity' ? '活动' : '文章' }}</text>
-                    <text class="rec-name">{{ rec.name }}</text>
-                    <text class="rec-desc">{{ rec.description }}</text>
-                    <text class="rec-price" v-if="rec.price">¥{{ rec.price }}</text>
-                  </view>
-                </view>
-              </view>
+        <!-- 推荐卡片 -->
+        <view class="rec-list" v-if="msg.recommendations && msg.recommendations.length > 0">
+          <view class="rec-card" v-for="(rec, ri) in msg.recommendations" :key="ri" @click="gotoRec(rec)">
+            <image class="rec-cover" v-if="rec.coverImage" :src="rec.coverImage" mode="aspectFill" />
+            <view class="rec-info">
+              <text class="rec-type-tag">{{ rec.type === 'product' ? '商品' : rec.type === 'activity' ? '活动' : '文章' }}</text>
+              <text class="rec-name">{{ rec.name }}</text>
+              <text class="rec-desc">{{ rec.description }}</text>
+              <text class="rec-price" v-if="rec.price">¥{{ rec.price }}</text>
+            </view>
+          </view>
+        </view>
+        <!-- AI 任务卡片 -->
+        <view class="task-list" v-if="msg.tasks && msg.tasks.length > 0">
+          <AITaskCard v-for="(task, ti) in msg.tasks" :key="ti" :task="task" :conversationId="currentConversationId" @accepted="onTaskAccepted" />
+        </view>
+        <!-- 报告来源标识 -->
+        <view class="source-label" v-if="msg.sourceReport">
+          来源:{{ msg.sourceReport.type === 'nutrition' ? '营养报告' : '测评报告' }} #{{ msg.sourceReport.id }}
+        </view>
             </view>
           </view>
         </view>
@@ -122,9 +130,10 @@
 <script>
 import { aiSendMessage, aiGetConversations, aiGetMessages, aiDeleteConversation, aiSendNutritionMessage } from '../../utils/api.js'
 import BaseEmpty from '../../components/BaseEmpty.vue'
+import AITaskCard from '../../components/AITaskCard.vue'
 
 export default {
-  components: { BaseEmpty },
+  components: { BaseEmpty, AITaskCard },
   data() {
     return {
       inputText: '',
@@ -138,6 +147,7 @@ export default {
       pendingFirstMessage: '',
       fromPage: '',
       mode: '',
+      reportId: '',
       recommendations: [],
       mascotCode: '',
       mascotName: '',
@@ -174,6 +184,7 @@ export default {
   onLoad: function(options) {
     this.mode = options.mode || ''
     this.fromPage = options.fromPage ? decodeURIComponent(options.fromPage) : ''
+    this.reportId = options.reportId || ''
     if (options.firstMessage) {
       this.pendingFirstMessage = decodeURIComponent(options.firstMessage)
     }
@@ -211,6 +222,10 @@ export default {
     goBack() {
       uni.navigateBack()
     },
+    
+    onTaskAccepted() {
+      this.loadConversations()
+    },
 
     async loadConversations() {
       try {
@@ -249,53 +264,65 @@ export default {
       })
     },
 
-    async sendMessage() {
-      const text = this.inputText.trim()
-      if (!text || this.sending) return
+  async sendMessage() {
+    const text = this.inputText.trim()
+    if (!text || this.sending) return
 
-      // 立即显示用户消息
-      const tempMsg = { id: 'temp_' + Date.now(), query: text, answer: '' }
-      this.messages.push(tempMsg)
-      this.inputText = ''
-      this.sending = true
+    // 立即显示用户消息
+    const tempMsg = { id: 'temp_' + Date.now(), query: text, answer: '' }
+    this.messages.push(tempMsg)
+    this.inputText = ''
+    this.sending = true
 
-      this.$nextTick(() => {
-        this.scrollToBottom()
-      })
+    this.$nextTick(() => {
+      this.scrollToBottom()
+    })
 
-      try {
-        var params = {
-          query: text,
-          conversationId: this.currentConversationId
-        }
+    try {
+      var params = {
+        query: text,
+        conversationId: this.currentConversationId
+      }
+      if (this.reportId) {
+        params.reportId = this.reportId
+      }
 
-        var res, data
-        if (this.mode === 'nutrition') {
-          // 营养模式:调精准营养助手
-          res = await aiSendNutritionMessage(params)
-          data = res.data || {}
-          // 更新最后一条消息的回复 + 推荐列表
-          const lastMsg = this.messages[this.messages.length - 1]
-          if (lastMsg) {
-            lastMsg.answer = data.answer || ''
-            lastMsg.recommendations = data.recommendations || []
+      var res, data
+      if (this.mode === 'nutrition') {
+        // 营养模式:调精准营养助手
+        res = await aiSendNutritionMessage(params)
+        data = res.data || {}
+        // 更新最后一条消息的回复 + 推荐列表 + 任务
+        const lastMsg = this.messages[this.messages.length - 1]
+        if (lastMsg) {
+          lastMsg.answer = data.answer || ''
+          lastMsg.recommendations = data.recommendations || []
+          lastMsg.tasks = data.tasks || []
+          if (this.reportId) {
+            lastMsg.sourceReport = { id: this.reportId, type: 'nutrition' }
           }
-        } else {
-          res = await aiSendMessage(params)
-          data = res.data || {}
-          // 更新最后一条消息的回复
-          const lastMsg = this.messages[this.messages.length - 1]
-          if (lastMsg) {
-            lastMsg.answer = data.answer || ''
+        }
+      } else {
+        res = await aiSendMessage(params)
+        data = res.data || {}
+        // 更新最后一条消息的回复 + 推荐列表 + 任务
+        const lastMsg = this.messages[this.messages.length - 1]
+        if (lastMsg) {
+          lastMsg.answer = data.answer || ''
+          lastMsg.recommendations = data.recommendations || []
+          lastMsg.tasks = data.tasks || []
+          if (this.reportId) {
+            lastMsg.sourceReport = { id: this.reportId, type: 'assessment' }
           }
         }
+      }
 
-        // 更新 conversationId(新建会话时 Dify 返回)
-        if (data.conversationId && !this.currentConversationId) {
-          this.currentConversationId = data.conversationId
-          // 刷新会话列表
-          this.loadConversations()
-        }
+      // 更新 conversationId(新建会话时 Dify 返回)
+      if (data.conversationId && !this.currentConversationId) {
+        this.currentConversationId = data.conversationId
+        // 刷新会话列表
+        this.loadConversations()
+      }
       } catch (e) {
         // 显示错误
         const lastMsg = this.messages[this.messages.length - 1]
@@ -711,6 +738,23 @@ export default {
   gap: 12rpx;
 }
 
+/* 任务卡片列表 */
+.task-list {
+  border-top: 1rpx solid var(--border-light, #E2E8F0);
+  padding-top: 16rpx;
+  display: flex;
+  flex-direction: column;
+  gap: 12rpx;
+}
+
+/* 报告来源标识 */
+.source-label {
+  margin-top: 16rpx;
+  font-size: 22rpx;
+  color: var(--muted, #94A3B8);
+  text-align: right;
+}
+
 .rec-card {
   display: flex;
   flex-direction: row;

+ 1 - 189
cfc-frontend/pages/body/index.vue

@@ -82,42 +82,6 @@
       </view>
     </view>
 
-    <!-- 健康报告摘要(登录后可见) -->
-    <view class="section" v-if="sectionVisible('health_report') && isLoggedIn">
-      <view class="section-header">
-        <text class="section-title">健康报告</text>
-        <text class="section-more" @click="goToHealthReport">查看详情 ›</text>
-      </view>
-      <view class="report-card" v-if="latestReport">
-        <view class="report-type-tag">{{ reportTypeLabel }}</view>
-        <view class="report-score-row">
-          <view class="score-circle">
-            <text class="score-value">{{ latestReport.overallScore || '--' }}</text>
-            <text class="score-label">综合评分</text>
-          </view>
-          <view class="report-meta">
-            <view class="meta-item" v-if="latestReport.gutHealthScore">
-              <text class="meta-label">肠道健康</text>
-              <text class="meta-value">{{ latestReport.gutHealthScore }}</text>
-            </view>
-            <view class="meta-item" v-if="latestReport.nutritionScore">
-              <text class="meta-label">营养状况</text>
-              <text class="meta-value">{{ latestReport.nutritionScore }}</text>
-            </view>
-            <view class="meta-item" v-if="latestReport.gutAge">
-              <text class="meta-label">肠道年龄</text>
-              <text class="meta-value">{{ latestReport.gutAge }}</text>
-            </view>
-          </view>
-        </view>
-        <text class="report-date">报告日期:{{ formatDate(latestReport.reportDate) }}</text>
-      </view>
-      <view class="report-empty" v-else>
-        <text class="empty-tip">暂无健康报告</text>
-        <text class="empty-sub">规划师录入后将自动显示</text>
-      </view>
-    </view>
-
     <!-- ===== 精准营养(上传报告+产品+文章) ===== -->
     <view class="section nutrition-section" v-if="isLoggedIn">
       <view class="section-header">
@@ -199,34 +163,6 @@ import HealthCheckinCard from '../../components/HealthCheckinCard.vue'
 import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
 
 import { getVisibleSections, getEnergyOverview, getChildren, getTodayTasksByCategory, getActivityList, getProductsByDomain, getFamilyEnergySandbox, getVisibleFamilyMembers, getDimensionOverview, getFeaturedArticles } from '../../utils/api.js'
-import config from '../../config.js'
-
-var BASE_URL = config.api('')
-
-const healthRequest = function(url, data) {
-  var token = uni.getStorageSync('token')
-  return new Promise(function(resolve, reject) {
-    uni.request({
-      url: BASE_URL + url,
-      method: 'POST',
-      data: data,
-      header: {
-        'Content-Type': 'application/json',
-        'Authorization': token ? 'Bearer ' + token : ''
-      },
-      success: function(res) {
-        if (res.data.code === 200) {
-          resolve(res.data)
-        } else {
-          reject(res.data)
-        }
-      },
-      fail: function(err) {
-        reject(err)
-      }
-    })
-  })
-}
 
 export default {
   components: { TabTransition, PageBanner, LoginGuideCard, FamilyEnergyBar, DimensionTasks, DimensionActivities, DimensionProducts, DimensionProductList, DimensionArticles, FamilyRelationGraph, RadarChart, HealthDimensionsSection, HealthCheckinCard, AIFloatingAvatar },
@@ -243,7 +179,7 @@ export default {
       sandboxData: null,
       dualDimension: null,
       visibleSections: [],
-      latestReport: null,
+
       dimensionTasks: [],
       dimensionActivities: [],
       dimensionProducts: [],
@@ -261,10 +197,6 @@ export default {
     }
   },
   computed: {
-    reportTypeLabel: function() {
-      if (!this.latestReport) return ''
-      return this.latestReport.reportType === 'gut_flora' ? '肠道检测报告' : '体检报告'
-    },
     energyMapForGraph: function() {
       var map = {}
       if (this.sandboxData && this.sandboxData.members) {
@@ -380,7 +312,6 @@ export default {
     },
     loadDashboardData: function() {
       if (!this.activeChildId) return
-      this.loadHealthReport()
       this.loadEnergyData()
       this.loadDimensionTasks()
       this.loadDimensionActivities()
@@ -416,16 +347,6 @@ export default {
         console.log('获取沙盘数据失败', e)
       })
     },
-    loadHealthReport: function() {
-      var self = this
-      healthRequest('/api/health/report/latest', { childId: this.activeChildId }).then(function(res) {
-        if (res.data) {
-          self.latestReport = res.data
-        }
-      }).catch(function(e) {
-        console.log('获取健康报告失败', e)
-      })
-    },
     loadEnergyData: function() {
       var self = this
       getEnergyOverview(this.activeChildId).then(function(res) {
@@ -571,14 +492,6 @@ export default {
       }
       if (item.page) uni.navigateTo({ url: item.page })
     },
-    goToHealthReport: function() {
-      var id = this.activeChildId || uni.getStorageSync('currentChildId')
-      if (!id) {
-        uni.showToast({ title: '请先选择成员', icon: 'none' })
-        return
-      }
-      uni.navigateTo({ url: '/pages/body-detail/health-report?childId=' + id })
-    },
     goDimensionDetail: function(dimKey) {
       uni.navigateTo({ url: '/pages/body/dimension-detail?dimension=' + dimKey + '&childId=' + this.activeChildId })
     },
@@ -602,18 +515,6 @@ export default {
       var id = this.activeChildId || uni.getStorageSync('currentChildId') || ''
       uni.navigateTo({ url: '/pages/health/report-upload?childId=' + id + '&from=body' })
     },
-    formatDate: function(dateStr) {
-      if (!dateStr) return '--'
-      try {
-        var d = new Date(dateStr)
-        var y = d.getFullYear()
-        var m = ('' + (d.getMonth() + 1)).padStart(2, '0')
-        var day = ('' + d.getDate()).padStart(2, '0')
-        return y + '-' + m + '-' + day
-      } catch (e) {
-        return dateStr
-      }
-    },
     _watchPageReady() {
       var self = this
       var unwatch = this.$watch(function() {
@@ -706,95 +607,6 @@ export default {
   border-radius: 20rpx;
   margin-left: 12rpx;
 }
-.section-more {
-  font-size: 24rpx;
-  color: #5B9BD5;
-}
-
-/* ===== 健康报告 ===== */
-.report-card {
-  background: #fff;
-  border-radius: 20rpx;
-  padding: 24rpx;
-  box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.06);
-}
-.report-type-tag {
-  display: inline-block;
-  background: #E8F5E9;
-  color: #2E7D32;
-  font-size: 22rpx;
-  padding: 4rpx 16rpx;
-  border-radius: 20rpx;
-  margin-bottom: 16rpx;
-}
-.report-score-row {
-  display: flex;
-  flex-direction: row;
-  align-items: center;
-}
-.score-circle {
-  width: 140rpx;
-  height: 140rpx;
-  border-radius: 70rpx;
-  background: linear-gradient(135deg, #E3F2FD, #BBDEFB);
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  margin-right: 24rpx;
-}
-.score-value {
-  font-size: 48rpx;
-  font-weight: bold;
-  color: #1565C0;
-}
-.score-label {
-  font-size: 20rpx;
-  color: #64B5F6;
-}
-.report-meta {
-  flex: 1;
-}
-.meta-item {
-  display: flex;
-  flex-direction: row;
-  align-items: center;
-  margin-bottom: 12rpx;
-}
-.meta-label {
-  font-size: 24rpx;
-  color: #666;
-  width: 140rpx;
-}
-.meta-value {
-  font-size: 26rpx;
-  color: #333;
-  font-weight: 500;
-}
-.report-date {
-  font-size: 22rpx;
-  color: #bbb;
-  margin-top: 16rpx;
-}
-.report-empty {
-  background: #fff;
-  border-radius: 20rpx;
-  padding: 40rpx;
-  text-align: center;
-  box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.06);
-}
-.empty-tip {
-  font-size: 28rpx;
-  color: #999;
-  display: block;
-}
-.empty-sub {
-  font-size: 24rpx;
-  color: #ccc;
-  display: block;
-  margin-top: 8rpx;
-}
-
 /* ===== 快捷操作 ===== */
 .quick-actions {
   display: flex;

+ 138 - 4
cfc-frontend/pages/dan-assessment/report-upload.vue

@@ -15,17 +15,40 @@
         <view class="dimension-options">
           <view
             :class="['dimension-option', dimension === 'mind' ? 'active' : '']"
-            @click="dimension = 'mind'">
+            @click="selectDimension('mind')">
             <text class="dimension-name">&#x2764; 心维度 (A2)</text>
           </view>
           <view
             :class="['dimension-option', dimension === 'wisdom' ? 'active' : '']"
-            @click="dimension = 'wisdom'">
+            @click="selectDimension('wisdom')">
             <text class="dimension-name">&#x1F9E0; 智维度 (B4)</text>
           </view>
         </view>
       </view>
 
+      <!-- 购买推荐 -->
+      <view class="purchase-section" v-if="recommendedProducts.length > 0">
+        <view class="purchase-header">
+          <text class="purchase-icon">📦</text>
+          <text class="purchase-title">为家人购买检测服务</text>
+        </view>
+        <scroll-view class="purchase-scroll" scroll-x enable-flex show-scrollbar="false">
+          <view
+            class="purchase-card"
+            v-for="item in recommendedProducts"
+            :key="item.id"
+            @click="goToProduct(item.id)"
+          >
+            <image class="purchase-cover" :src="item.coverImage || '/static/default-product.png'" mode="aspectFill" />
+            <text class="purchase-name">{{ item.name }}</text>
+            <text class="purchase-price">{{ formatPriceWithSymbol(item.price) }}</text>
+            <view class="purchase-btn">
+              <text class="purchase-btn-text">去购买</text>
+            </view>
+          </view>
+        </scroll-view>
+      </view>
+
       <view class="upload-area" @click="chooseFile">
         <view class="upload-icon" v-if="!selectedFile">&#x1F4C4;</view>
         <view class="upload-icon" v-else>&#x2705;</view>
@@ -117,7 +140,12 @@
 </template>
 
 <script>
-import { danParsePreview, danConfirmReport } from '../../utils/api.js'
+import { danParsePreview, danConfirmReport, productList } from '../../utils/api.js'
+
+var REPORT_DOMAIN_MAP = {
+  mind: 'mind',
+  wisdom: 'wisdom'
+}
 
 export default {
   data() {
@@ -128,9 +156,14 @@ export default {
       previewData: null,
       draftId: null,
       loading: false,
-      confirming: false
+      confirming: false,
+      recommendedProducts: [],
+      loadingProducts: false
     }
   },
+  onLoad: function() {
+    this.loadRecommendProducts(this.dimension)
+  },
   methods: {
     goBack: function() {
       uni.navigateBack()
@@ -215,6 +248,37 @@ export default {
       this.selectedFile = null
       this.previewData = null
       this.draftId = null
+    },
+    selectDimension: function(dim) {
+      this.dimension = dim
+      this.loadRecommendProducts(dim)
+    },
+    loadRecommendProducts: function(dimension) {
+      var domain = REPORT_DOMAIN_MAP[dimension]
+      if (!domain) {
+        this.recommendedProducts = []
+        return
+      }
+      var self = this
+      self.loadingProducts = true
+      productList({ domain: domain, productType: 'assessment', size: 4 }).then(function(res) {
+        if (res && res.data && res.data.records) {
+          self.recommendedProducts = res.data.records
+        } else {
+          self.recommendedProducts = []
+        }
+      }).catch(function() {
+        self.recommendedProducts = []
+      }).finally(function() {
+        self.loadingProducts = false
+      })
+    },
+    goToProduct: function(productId) {
+      uni.navigateTo({ url: '/pages/discover/product-detail/product-detail?id=' + productId })
+    },
+    formatPriceWithSymbol: function(cents) {
+      if (cents === null || cents === undefined) return '¥0'
+      return '¥' + (cents / 100).toFixed(2)
     }
   }
 }
@@ -502,4 +566,74 @@ export default {
   font-size: 30rpx;
   color: #333;
 }
+.purchase-section {
+  background: #F0F9FF;
+  border-radius: 16rpx;
+  padding: 24rpx;
+  margin-top: 24rpx;
+  border: 2rpx solid #BAE6FD;
+}
+.purchase-header {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  margin-bottom: 16rpx;
+}
+.purchase-icon {
+  font-size: 28rpx;
+  margin-right: 8rpx;
+}
+.purchase-title {
+  font-size: 26rpx;
+  font-weight: bold;
+  color: #0369A1;
+}
+.purchase-scroll {
+  display: flex;
+  flex-direction: row;
+  white-space: nowrap;
+}
+.purchase-card {
+  display: inline-flex;
+  flex-direction: column;
+  width: 220rpx;
+  background: #fff;
+  border-radius: 12rpx;
+  padding: 16rpx;
+  margin-right: 16rpx;
+  flex-shrink: 0;
+}
+.purchase-cover {
+  width: 188rpx;
+  height: 120rpx;
+  border-radius: 8rpx;
+  background: #F1F5F9;
+  margin-bottom: 8rpx;
+}
+.purchase-name {
+  font-size: 22rpx;
+  color: #333;
+  line-height: 1.3;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  margin-bottom: 4rpx;
+}
+.purchase-price {
+  font-size: 24rpx;
+  color: #EF4444;
+  font-weight: bold;
+  margin-bottom: 8rpx;
+}
+.purchase-btn {
+  background: #3B82F6;
+  border-radius: 8rpx;
+  padding: 8rpx 0;
+  text-align: center;
+}
+.purchase-btn-text {
+  font-size: 22rpx;
+  color: #fff;
+  font-weight: 500;
+}
 </style>

+ 12 - 23
cfc-frontend/pages/discover-detail/product-detail/product-detail.vue

@@ -117,30 +117,19 @@ export default {
         uni.navigateTo({ url: '/pages/login/login' })
         return
       }
-      uni.showLoading({ title: '创建订单...' })
-      productOrderCreate({
+      // 跳转结算页面,传递商品信息
+      const price = this.product.memberPrice || this.product.price
+      const productData = {
         productId: this.product.id,
-        quantity: 1,
-        paymentMethod: 'wechat'
-      }).then(res => {
-        uni.hideLoading()
-        if (res.code === 200 && res.data) {
-          const orderNo = res.data.orderNo
-          uni.showModal({
-            title: '订单已创建',
-            content: '订单号:' + orderNo + ',确定支付吗?',
-            success: (confirm) => {
-              if (confirm.confirm) {
-                this.doPay(orderNo)
-              }
-            }
-          })
-        } else {
-          uni.showToast({ title: res.message || '创建订单失败', icon: 'none' })
-        }
-      }).catch(() => {
-        uni.hideLoading()
-        uni.showToast({ title: '创建订单失败', icon: 'none' })
+        productName: this.product.name,
+        coverImage: this.product.coverImage,
+        unitPrice: price,
+        quantity: 1
+      }
+      // 先存储到 storage,checkout 页面会读取
+      uni.setStorageSync('checkoutItems', [productData])
+      uni.navigateTo({
+        url: '/pages/shop/checkout/checkout?from=product&id=' + this.product.id
       })
     },
     onAddToCart() {

+ 409 - 292
cfc-frontend/pages/health/gut-flora-detail.vue

@@ -4,215 +4,385 @@
       <view class="nav-back" @tap="goBack">
         <text class="back-text">‹ 返回</text>
       </view>
-      <text class="nav-title">菌群报告详情</text>
+      <text class="nav-title">肠道菌群报告</text>
     </view>
 
     <scroll-view class="content" scroll-y>
       <!-- 报告头部 -->
       <view class="report-header">
         <text class="report-title">肠道菌群检测报告</text>
-        <text class="report-date" v-if="report.reportDate">报告日期: {{ report.reportDate }}</text>
-        <text class="report-number" v-if="report.reportNumber">报告编号: {{ report.reportNumber }}</text>
+        <view class="report-meta">
+          <text class="meta-item" v-if="report.personName">{{ report.personName }}</text>
+          <text class="meta-item" v-if="report.gender">{{ report.gender }}</text>
+          <text class="meta-item" v-if="report.age">{{ report.age }}岁</text>
+        </view>
+        <view class="report-meta">
+          <text class="meta-item" v-if="report.reportDate">日期: {{ report.reportDate }}</text>
+          <text class="meta-item" v-if="report.reportNumber">编号: {{ report.reportNumber }}</text>
+        </view>
+        <view class="badge-row" v-if="report.gutAge || report.gutType">
+          <text class="badge" v-if="report.gutAge">肠龄: {{ report.gutAge }}</text>
+          <text class="badge" v-if="report.gutType">肠型: {{ report.gutType }}</text>
+        </view>
+        <!-- 报告解读 -->
+        <view class="interpretation-box" v-if="reportInterpretation && reportInterpretation.gutAgeAssessment">
+          <text class="interp-text">{{ reportInterpretation.gutAgeAssessment }}</text>
+        </view>
       </view>
 
-      <!-- 5个评分圆环 -->
-      <view class="scores-section">
-        <view class="score-ring" v-for="(score, idx) in scoreRings" :key="idx">
-          <view class="ring-wrapper">
-            <canvas class="ring-canvas" :canvas-id="'ring_' + idx" style="width:120rpx;height:120rpx;"></canvas>
-            <text class="ring-value">{{ score.value }}</text>
+      <!-- 评分圆环 -->
+      <scroll-view class="scores-scroll" scroll-x>
+        <view class="score-item" v-for="(score, idx) in scoreItems" :key="idx">
+          <view class="score-ring" :style="'border-color: ' + score.color + '; color: ' + score.color">
+            <text class="score-val">{{ score.value }}</text>
           </view>
-          <text class="ring-label">{{ score.label }}</text>
+          <text class="score-label">{{ score.label }}</text>
+        </view>
+      </scroll-view>
+
+      <!-- 快速跳转 -->
+      <view class="quick-nav">
+        <view class="nav-card" @tap="goToSpecies">
+          <text class="nav-icon">🦠</text>
+          <text class="nav-label">菌群详情</text>
+          <text class="nav-count">{{ floraCount }}种</text>
+        </view>
+        <view class="nav-card" @tap="goToPathogen">
+          <text class="nav-icon">🔬</text>
+          <text class="nav-label">病原菌</text>
+          <text class="nav-count">{{ pathogenCount }}项</text>
+        </view>
+        <view class="nav-card" @tap="goToTaxonomy">
+          <text class="nav-icon">📊</text>
+          <text class="nav-label">菌群层级</text>
+          <text class="nav-count">5级</text>
+        </view>
+        <view class="nav-card" @tap="goToRisks">
+          <text class="nav-icon">⚠️</text>
+          <text class="nav-label">疾病风险</text>
+          <text class="nav-count">{{ riskCount }}项</text>
+        </view>
+        <view class="nav-card" @tap="goToFoods">
+          <text class="nav-icon">🍽️</text>
+          <text class="nav-label">饮食推荐</text>
+          <text class="nav-count">{{ foodCount }}项</text>
+        </view>
+        <view class="nav-card" @tap="goToIndicators">
+          <text class="nav-icon">📋</text>
+          <text class="nav-label">全部指标</text>
+          <text class="nav-count">{{ indicatorCount }}项</text>
         </view>
       </view>
 
-      <!-- 菌群分类 -->
-      <view class="section-card" v-for="(group, gIdx) in bacteriaGroups" :key="gIdx">
-        <view class="section-title">
-          <text>{{ group.name }}</text>
-          <text class="section-count">{{ group.items.length }}种</text>
+      <!-- 肠道功能手风琴 -->
+      <view class="accordion-section">
+        <view class="accordion-header" @tap="toggleAccordion('gut')">
+          <text class="accordion-title">肠道功能与代谢物</text>
+          <text class="accordion-arrow">{{ accordionOpen.gut ? '收起' : '展开' }}</text>
         </view>
-        <view class="bacteria-item" v-for="(item, iIdx) in group.items" :key="iIdx">
-          <view class="bacteria-header">
-            <text class="bacteria-name">{{ item.name }}</text>
-            <text class="bacteria-status" :class="'status-' + (item.status || 'normal')">{{ statusText(item.status) }}</text>
+        <view class="accordion-body" v-if="accordionOpen.gut">
+          <view class="indicator-card" v-for="(item, idx) in gutIndicators" :key="idx">
+            <view class="indicator-row">
+              <text class="indicator-name" @tap="showKnowledge(indicatorType(item), item.indicatorName)">
+                {{ item.indicatorName }}
+                <text class="arrow-up" v-if="item.status === '偏高' || item.status === '过多'"> ↑</text>
+                <text class="arrow-down" v-else-if="item.status === '偏低' || item.status === '缺乏' || item.status === '不足'"> ↓</text>
+                <text class="arrow-warn" v-else-if="item.status === '异常'"> ⚠</text>
+              </text>
+              <view class="indicator-value" v-if="!isEditing">
+                <text :class="'val-text val-' + item.status">{{ item.indicatorValue || '--' }}</text>
+              </view>
+              <view class="indicator-edit" v-if="isEditing">
+                <input class="edit-input" type="text" v-model="item.indicatorValue" />
+                <picker :value="indStatusIndex(item.status)" :range="indStatuses" @change="onIndStatusChange($event, item)">
+                  <text class="edit-picker">{{ item.status || '正常' }}</text>
+                </picker>
+              </view>
+            </view>
+            <text class="indicator-range" v-if="item.refRange">参考: {{ item.refRange }}</text>
           </view>
-          <view class="bar-track">
-            <view class="bar-fill" :style="'width:' + (item.abundance || 0) + '%'"></view>
-          </view>
-          <text class="bar-label">{{ (item.abundance || 0).toFixed(1) }}%</text>
+          <view class="empty-hint" v-if="gutIndicators.length === 0">暂无数据</view>
         </view>
-        <view class="empty-hint" v-if="group.items.length === 0">暂无数据</view>
       </view>
 
-      <!-- 饮食推荐 -->
-      <view class="section-card" v-if="foods.length > 0">
-        <view class="section-title">
-          <text>饮食推荐</text>
-          <text class="section-count">{{ foods.length }}项</text>
+      <!-- 营养指标手风琴 -->
+      <view class="accordion-section">
+        <view class="accordion-header" @tap="toggleAccordion('nutri')">
+          <text class="accordion-title">营养指标</text>
+          <text class="accordion-arrow">{{ accordionOpen.nutri ? '收起' : '展开' }}</text>
         </view>
-        <view class="food-item" v-for="(food, fIdx) in foods" :key="fIdx">
-          <text class="food-name">{{ food.foodName || food.name }}</text>
-          <text class="food-category" v-if="food.category">{{ food.category }}</text>
-          <text class="food-reason" v-if="food.reason">{{ food.reason }}</text>
+        <view class="accordion-body" v-if="accordionOpen.nutri">
+          <view class="sub-group" v-for="(group, gIdx) in nutritionGroups" :key="gIdx">
+            <text class="sub-group-title">{{ group.category }}</text>
+            <view class="indicator-card" v-for="(item, idx) in group.items" :key="idx">
+              <view class="indicator-row">
+                <text class="indicator-name" @tap="showKnowledge(indicatorType(item), item.indicatorName)">
+                  {{ item.indicatorName }}
+                  <text class="arrow-up" v-if="item.status === '偏高' || item.status === '过多'"> ↑</text>
+                  <text class="arrow-down" v-else-if="item.status === '偏低' || item.status === '缺乏' || item.status === '不足'"> ↓</text>
+                  <text class="arrow-warn" v-else-if="item.status === '异常'"> ⚠</text>
+                </text>
+                <view class="indicator-value" v-if="!isEditing">
+                  <text :class="'val-text val-' + item.status">{{ item.indicatorValue || '--' }}</text>
+                </view>
+                <view class="indicator-edit" v-if="isEditing">
+                  <input class="edit-input" type="text" v-model="item.indicatorValue" />
+                  <picker :value="indStatusIndex(item.status)" :range="indStatuses" @change="onIndStatusChange($event, item)">
+                    <text class="edit-picker">{{ item.status || '正常' }}</text>
+                  </picker>
+                </view>
+              </view>
+              <text class="indicator-range" v-if="item.refRange">参考: {{ item.refRange }}</text>
+            </view>
+          </view>
+          <view class="empty-hint" v-if="nutritionGroups.length === 0">暂无数据</view>
         </view>
       </view>
 
+      <view class="feedback-section" @tap="openFeedback">
+        <text class="feedback-icon">💬</text>
+        <text class="feedback-text">对这个报告有疑问或建议?告诉我们</text>
+        <text class="feedback-arrow">›</text>
+      </view>
+
       <view class="bottom-spacer"></view>
     </scroll-view>
 
-    <!-- 营养咨询 FAB -->
-    <view class="fab" @tap="goToNutritionChat">
-      <text class="fab-icon">💬</text>
+    <health-knowledge-popup :visible="knowledgeVisible" :data="knowledgeData" @close="closeKnowledge" />
+
+    <feedback-popup :visible="feedbackVisible" :report-id="reportId" @close="closeFeedback" />
+
+    <view class="fab" v-if="!isEditing" @tap="toggleEdit">
+      <text class="fab-icon">✏️</text>
+    </view>
+    <view class="bottom-bar" v-if="isEditing">
+      <view class="btn-cancel" @tap="cancelEdit">取消</view>
+      <view class="btn-save" @tap="saveEdit">保存</view>
     </view>
   </view>
 </template>
 
 <script>
-import { getReportDetail } from '../../utils/api.js'
-import { createReportSurvey } from '../../utils/api.js'
+import { getReportDetail, editHealthReport, queryKnowledgeBase, queryIndicatorKnowledge } from '../../utils/api.js'
+import HealthKnowledgePopup from '../../components/health-knowledge-popup.vue'
+import FeedbackPopup from '../../components/feedback-popup.vue'
+
+var INDICATOR_TYPE_MAP = {
+  '维生素': 'vitamin',
+  '氨基酸': 'amino_acid',
+  '微量元素': 'indicator',
+  '肠道屏障与代谢物': 'indicator',
+  '短链脂肪酸': 'indicator',
+  '神经递质与激素': 'indicator',
+  '抗生素风险评估': 'indicator'
+}
 
 export default {
+  components: { HealthKnowledgePopup, FeedbackPopup },
   data() {
     return {
       reportId: null,
+      reportData: null,
       report: {},
-      scoreRings: [],
-      bacteriaGroups: [
-        { name: '有益菌', items: [] },
-        { name: '有害菌', items: [] },
-        { name: '中性菌', items: [] }
-      ],
-      foods: []
+      reportInterpretation: null,
+      isEditing: false,
+      accordionOpen: { gut: false, nutri: false },
+      scoreItems: [],
+      allIndicators: [],
+      gutIndicators: [],
+      nutritionGroups: [],
+      floraCount: 0,
+      riskCount: 0,
+      foodCount: 0,
+      indicatorCount: 0,
+      pathogenCount: 0,
+      knowledgeVisible: false,
+      knowledgeData: {},
+      feedbackVisible: false,
+      indStatuses: ['正常', '偏低', '偏高', '缺乏', '不足', '过多', '异常']
     }
   },
   onLoad: function(options) {
     this.reportId = options.reportId ? parseInt(options.reportId) : null
     if (this.reportId) {
-      this.loadReportDetail()
+      this.loadData()
     }
   },
-  onReady: function() {
-    // canvas需要DOM就绪后绘制
-    setTimeout(() => {
-      this.drawRings()
-    }, 500)
-  },
   methods: {
-    goBack: function() {
-      uni.navigateBack()
-    },
-    loadReportDetail: function() {
+    goBack: function() { uni.navigateBack() },
+    loadData: function() {
       var self = this
-      uni.showLoading({ title: '加载中...' })
       getReportDetail(this.reportId).then(function(res) {
-        uni.hideLoading()
-        if (res && res.code === 200 && res.data) {
-          var data = res.data
-          self.report = {
-            reportDate: data.reportDate || '',
-            reportNumber: data.reportNumber || '',
-            personName: data.personName || ''
+        if (res.code === 200 && res.data) {
+          self.reportData = res.data
+          self.report = res.data.report || res.data
+          self.reportInterpretation = res.data.reportInterpretation || null
+          self.buildScores(res.data)
+          self.buildIndicators(res.data)
+          self.floraCount = (res.data.gutFlora || []).length
+          self.riskCount = (res.data.diseaseRisks || []).length
+          self.foodCount = (res.data.foods || []).length
+          self.indicatorCount = (res.data.indicators || []).length
+          // 计算病原菌总数
+          var flora = res.data.gutFlora || []
+          self.pathogenCount = flora.filter(function(i) {
+            return i.category === 'pathogen_genus' || i.category === 'pathogen_detection'
+          }).length
+        }
+      })
+    },
+    buildScores: function(data) {
+      var r = data.report || data
+      var items = []
+      var scoreFields = [
+        { key: 'overallScore', label: '综合', color: '#4A9BD7' },
+        { key: 'gutHealthScore', label: '菌群健康', color: '#10B981' },
+        { key: 'chronicDiseaseScore', label: '慢病控制', color: '#F59E0B' },
+        { key: 'nutritionScore', label: '营养均衡', color: '#FF8C42' },
+        { key: 'gutBalanceScore', label: '平衡', color: '#6366F1' },
+        { key: 'gutDiversityScore', label: '多样性', color: '#FF6B9D' },
+        { key: 'beneficialBacteriaScore', label: '有益菌', color: '#10B981' },
+        { key: 'harmfulBacteriaScore', label: '有害菌', color: '#C62828' },
+        { key: 'coreSpeciesScore', label: '核心菌属', color: '#4A9BD7' }
+      ]
+      for (var i = 0; i < scoreFields.length; i++) {
+        var f = scoreFields[i]
+        if (r[f.key] != null) {
+          items.push({ value: r[f.key], label: f.label, color: f.color })
+        }
+      }
+      this.scoreItems = items
+    },
+    buildIndicators: function(data) {
+      var indicators = data.indicators || []
+      this.allIndicators = indicators
+      var gutCategories = ['肠道屏障与代谢物', '短链脂肪酸', '神经递质与激素', '抗生素风险评估']
+      this.gutIndicators = indicators.filter(function(item) {
+        return gutCategories.indexOf(item.category) >= 0
+      })
+      var seen = {}
+      var groups = []
+      for (var i = 0; i < indicators.length; i++) {
+        var item = indicators[i]
+        if (gutCategories.indexOf(item.category) >= 0) continue
+        if (!seen[item.category]) {
+          seen[item.category] = true
+          groups.push({ category: item.category, items: [] })
+        }
+        for (var g = 0; g < groups.length; g++) {
+          if (groups[g].category === item.category) {
+            groups[g].items.push(item)
+            break
           }
-          // 解析评分
-          self.scoreRings = [
-            { label: '综合评分', value: data.overallScore || 0, max: 100 },
-            { label: '肠道健康', value: data.gutHealthScore || 0, max: 100 },
-            { label: '营养评分', value: data.nutritionScore || 0, max: 100 },
-            { label: '有益菌', value: data.beneficialScore || 0, max: 100 },
-            { label: '多样性', value: data.diversityScore || 0, max: 100 }
-          ]
-          // 解析 payload 中的菌群数据
-          var payload = data.payload
-          if (payload) {
-            self.parseBacteria(payload)
-            if (payload.foods) {
-              self.foods = payload.foods
-            }
+        }
+      }
+      this.nutritionGroups = groups
+    },
+    toggleAccordion: function(key) {
+      this.accordionOpen[key] = !this.accordionOpen[key]
+    },
+    indicatorType: function(item) {
+      return INDICATOR_TYPE_MAP[item.category] || 'nutrient'
+    },
+    indStatusIndex: function(status) {
+      var idx = this.indStatuses.indexOf(status)
+      return idx >= 0 ? idx : 0
+    },
+    onIndStatusChange: function(e, item) {
+      item.status = this.indStatuses[e.detail.value]
+    },
+    showKnowledge: function(type, name) {
+      var self = this
+      // 优先使用 KB v3 查询指标调整建议
+      queryIndicatorKnowledge(name).then(function(res) {
+        if (res.code === 200 && res.data) {
+          var v3 = res.data
+          var high = v3['偏高影响'] || ''
+          var low = v3['偏低影响'] || ''
+          self.knowledgeData = {
+            itemName: v3['名称'] || name,
+            category: v3['说明'] || '',
+            description: (high ? '偏高影响:' + high + '\n' : '') + (low ? '偏低影响:' + low : ''),
+            suggestion: v3['调整建议'] || ''
           }
-          // 延迟绘制canvas
-          self.$nextTick(function() {
-            setTimeout(function() { self.drawRings() }, 300)
-          })
+          self.knowledgeVisible = true
         } else {
-          uni.showToast({ title: '加载失败', icon: 'none' })
+          // 回退旧版 DB 查询
+          self.queryOldKnowledgeBase(type, name)
         }
       }).catch(function() {
-        uni.hideLoading()
-        uni.showToast({ title: '加载失败', icon: 'none' })
+        self.queryOldKnowledgeBase(type, name)
       })
     },
-    parseBacteria: function(payload) {
-      var species = payload.probioticSpecies || payload.gutFlora || []
-      var groups = [
-        { name: '有益菌', items: [] },
-        { name: '有害菌', items: [] },
-        { name: '中性菌', items: [] }
-      ]
-      for (var i = 0; i < species.length; i++) {
-        var item = species[i]
-        var category = item.category || 'beneficial'
-        var groupIdx = 0
-        if (category === 'beneficial') groupIdx = 0
-        else if (category === 'harmful') groupIdx = 1
-        else groupIdx = 2
-        groups[groupIdx].items.push({
-          name: item.name || item.speciesName || '未知',
-          abundance: item.abundance || item.relativeAbundance || 0,
-          status: item.status || 'normal'
-        })
-      }
-      this.bacteriaGroups = groups
+    queryOldKnowledgeBase: function(type, name) {
+      var self = this
+      queryKnowledgeBase(type, name).then(function(res) {
+        if (res.code === 200 && res.data) {
+          self.knowledgeData = res.data
+          self.knowledgeVisible = true
+        } else {
+          self.knowledgeData = { itemName: name }
+          self.knowledgeVisible = true
+        }
+      })
+    },
+    closeKnowledge: function() {
+      this.knowledgeVisible = false
+      this.knowledgeData = {}
+    },
+    openFeedback: function() {
+      this.feedbackVisible = true
     },
-    drawRings: function() {
+    closeFeedback: function() {
+      this.feedbackVisible = false
+    },
+    toggleEdit: function() {
+      this.isEditing = true
+    },
+    cancelEdit: function() {
+      this.isEditing = false
+      this.loadData()
+    },
+    saveEdit: function() {
       var self = this
-      this.scoreRings.forEach(function(score, idx) {
-        var ctx = uni.createCanvasContext('ring_' + idx, self)
-        var size = 120
-        var cx = size / 2
-        var cy = size / 2
-        var radius = 40
-        var lineWidth = 10
-        var percent = Math.min(score.value / (score.max || 100), 1)
-
-        // 背景圆环
-        ctx.setStrokeStyle('#E8E8E8')
-        ctx.setLineWidth(lineWidth)
-        ctx.setLineCap('round')
-        ctx.beginPath()
-        ctx.arc(cx, cy, radius, 0, 2 * Math.PI)
-        ctx.stroke()
-
-        // 前景圆环
-        var colors = ['#5B9BD5', '#FF8C42', '#10B981', '#6366F1', '#FF6B9D']
-        ctx.setStrokeStyle(colors[idx % colors.length])
-        ctx.setLineWidth(lineWidth)
-        ctx.setLineCap('round')
-        ctx.beginPath()
-        ctx.arc(cx, cy, radius, -Math.PI / 2, -Math.PI / 2 + 2 * Math.PI * percent)
-        ctx.stroke()
-
-        ctx.draw()
+      var payload = {
+        overallScore: this.report.overallScore,
+        gutHealthScore: this.report.gutHealthScore,
+        nutritionScore: this.report.nutritionScore,
+        indicators: this.allIndicators
+      }
+      editHealthReport(this.reportId, payload, 0).then(function(res) {
+        if (res.code === 200) {
+          uni.showToast({ title: '已保存', icon: 'success' })
+          self.isEditing = false
+          self.loadData()
+        } else {
+          uni.showToast({ title: res.message || '保存失败', icon: 'none' })
+        }
       })
     },
-    statusText: function(status) {
-      if (status === 'high') return '偏高'
-      if (status === 'low') return '偏低'
-      if (status === 'abnormal') return '异常'
-      return '正常'
+    goToSpecies: function() {
+      uni.navigateTo({ url: '/pages/health/gut-flora-species-detail?reportId=' + this.reportId })
+    },
+    goToPathogen: function() {
+      uni.navigateTo({ url: '/pages/health/gut-flora-species-detail?reportId=' + this.reportId + '&tab=pathogen_genus' })
+    },
+    goToTaxonomy: function() {
+      uni.navigateTo({ url: '/pages/health/gut-flora-species-detail?reportId=' + this.reportId + '&tab=taxonomy_class' })
+    },
+    goToRisks: function() {
+      uni.navigateTo({ url: '/pages/health/gut-flora-risks-detail?reportId=' + this.reportId })
+    },
+    goToFoods: function() {
+      uni.navigateTo({ url: '/pages/health/gut-flora-foods-detail?reportId=' + this.reportId })
     },
-    goToNutritionChat: function() {
+    goToIndicators: function() {
+      this.accordionOpen.nutri = true
+    },
+    goAIChat: function() {
       if (!this.reportId) return
-      createReportSurvey(this.reportId, '').then(function(res) {
-        if (res && res.code === 200) {
-          uni.navigateTo({
-            url: '/pages/health/nutrition-chat?reportId=' + (res.data && res.data.surveyId ? res.data.surveyId : '')
-          })
-        }
-      }).catch(function() {
-        uni.navigateTo({
-          url: '/pages/health/nutrition-chat?reportId=' + this.reportId
-        })
+      uni.navigateTo({
+        url: '/pages/ai/chat?mode=nutrition&reportId=' + this.reportId + '&firstMessage=' + encodeURIComponent('请根据这份肠道菌群检测报告,分析我孩子的肠道健康状况并提出建议')
       })
     }
   }
@@ -220,164 +390,111 @@ export default {
 </script>
 
 <style scoped>
-.page {
-  min-height: 100vh;
-  background-color: #F5F7FA;
-}
-.nav-bar {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  height: 88rpx;
-  padding-top: var(--status-bar-height, 0);
-  background-color: #FFFFFF;
-  position: relative;
-  border-bottom: 1rpx solid #f0f0f0;
-}
-.nav-back {
-  position: absolute;
-  left: 30rpx;
-  top: 50%;
-  transform: translateY(-50%);
-  padding: 10rpx;
-}
-.back-text { font-size: 28rpx; color: #333; }
-.nav-title { font-size: 32rpx; font-weight: 600; color: #333; }
+.page { min-height: 100vh; background: #f8f8f8; }
+.nav-bar { display: flex; align-items: center; padding: 20rpx 30rpx; background: #fff; position: relative; }
+.nav-back { padding: 10rpx 0; }
+.back-text { font-size: 28rpx; color: #4A9BD7; }
+.nav-title { flex: 1; text-align: center; font-size: 32rpx; font-weight: 600; }
+.content { height: calc(100vh - 100rpx); }
 
-.content {
-  flex: 1;
-  padding: 30rpx;
-}
+.report-header { background: linear-gradient(135deg, #4A9BD7, #6366F1); padding: 40rpx 30rpx; color: #fff; }
+.report-title { font-size: 36rpx; font-weight: 700; display: block; margin-bottom: 16rpx; }
+.report-meta { display: flex; gap: 20rpx; margin-bottom: 6rpx; }
+.meta-item { font-size: 24rpx; opacity: 0.9; }
+.badge-row { display: flex; gap: 16rpx; margin-top: 12rpx; }
+.badge { padding: 6rpx 20rpx; background: rgba(255,255,255,0.2); border-radius: 20rpx; font-size: 22rpx; }
 
-.report-header {
-  background: linear-gradient(135deg, #5B9BD5, #3A7CC4);
-  border-radius: 20rpx;
-  padding: 30rpx;
-  margin-bottom: 30rpx;
-}
-.report-title { font-size: 34rpx; font-weight: bold; color: #fff; display: block; margin-bottom: 12rpx; }
-.report-date { font-size: 24rpx; color: rgba(255,255,255,0.85); display: block; margin-bottom: 6rpx; }
-.report-number { font-size: 22rpx; color: rgba(255,255,255,0.7); display: block; }
+.scores-scroll { padding: 20rpx 0; white-space: nowrap; background: #fff; }
+.score-item { display: inline-flex; flex-direction: column; align-items: center; margin: 0 20rpx; }
+.score-ring { width: 100rpx; height: 100rpx; border-radius: 50%; border: 6rpx solid; display: flex; align-items: center; justify-content: center; font-size: 32rpx; font-weight: 700; margin-bottom: 8rpx; }
+.score-label { font-size: 22rpx; color: #666; }
 
-.scores-section {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-around;
-  background: #fff;
-  border-radius: 20rpx;
-  padding: 30rpx 20rpx;
-  margin-bottom: 30rpx;
-  box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.04);
-}
-.score-ring {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  min-width: 120rpx;
-}
-.ring-wrapper {
-  position: relative;
-  width: 120rpx;
-  height: 120rpx;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
-.ring-canvas {
-  position: absolute;
-  top: 0;
-  left: 0;
-}
-.ring-value {
-  font-size: 28rpx;
-  font-weight: bold;
-  color: #333;
-  z-index: 1;
-}
-.ring-label {
-  font-size: 22rpx;
-  color: #666;
-  margin-top: 10rpx;
-}
+.quick-nav { display: flex; padding: 20rpx; background: #fff; margin-bottom: 16rpx; }
+.nav-card { flex: 1; display: flex; flex-direction: column; align-items: center; padding: 16rpx 0; }
+.nav-icon { font-size: 40rpx; margin-bottom: 6rpx; }
+.nav-label { font-size: 24rpx; color: #333; }
+.nav-count { font-size: 20rpx; color: #999; }
 
-.section-card {
-  background: #fff;
-  border-radius: 20rpx;
-  padding: 30rpx;
-  margin-bottom: 30rpx;
-  box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.04);
-}
-.section-title {
-  display: flex;
-  flex-direction: row;
-  align-items: center;
-  justify-content: space-between;
-  font-size: 30rpx;
-  font-weight: 600;
-  color: #333;
-  margin-bottom: 24rpx;
-  padding-bottom: 16rpx;
-  border-bottom: 2rpx solid #f0f0f0;
-}
-.section-count { font-size: 24rpx; color: #999; font-weight: normal; }
+.accordion-section { background: #fff; margin-bottom: 16rpx; }
+.accordion-header { display: flex; justify-content: space-between; padding: 30rpx; border-bottom: 1rpx solid #f0f0f0; }
+.accordion-title { font-size: 30rpx; font-weight: 600; color: #333; }
+.accordion-arrow { font-size: 24rpx; color: #999; }
+.accordion-body { padding: 10rpx 30rpx 20rpx; }
 
-.bacteria-item {
-  margin-bottom: 20rpx;
-}
-.bacteria-header {
-  display: flex;
-  flex-direction: row;
-  align-items: center;
-  justify-content: space-between;
-  margin-bottom: 8rpx;
-}
-.bacteria-name { font-size: 26rpx; color: #333; font-weight: 500; }
-.bacteria-status { font-size: 22rpx; padding: 2rpx 12rpx; border-radius: 6rpx; }
-.status-normal { background: #E8F5E9; color: #2E7D32; }
-.status-high { background: #FFEBEE; color: #C62828; }
-.status-low { background: #FFF3E0; color: #E65100; }
-.status-abnormal { background: #FFF3E0; color: #E65100; }
+.sub-group { margin-bottom: 16rpx; }
+.sub-group-title { font-size: 26rpx; color: #4A9BD7; font-weight: 600; display: block; margin: 12rpx 0 8rpx; }
 
-.bar-track {
-  height: 12rpx;
-  background: #F0F0F0;
-  border-radius: 6rpx;
-  overflow: hidden;
-}
-.bar-fill {
-  height: 100%;
-  background: linear-gradient(90deg, #5B9BD5, #3A7CC4);
-  border-radius: 6rpx;
-}
-.bar-label { font-size: 22rpx; color: #999; margin-top: 4rpx; display: block; }
-.empty-hint { font-size: 26rpx; color: #999; text-align: center; padding: 40rpx 0; }
+.indicator-card { padding: 16rpx 0; border-bottom: 1rpx solid #f5f5f5; }
+.indicator-row { display: flex; align-items: center; justify-content: space-between; }
+.indicator-name { font-size: 28rpx; color: #333; flex: 1; }
+.arrow-up { color: #C62828; font-size: 22rpx; }
+.arrow-down { color: #E65100; font-size: 22rpx; }
+.arrow-warn { color: #F59E0B; font-size: 22rpx; }
+
+.val-text { font-size: 28rpx; font-weight: 600; color: #333; }
+.val-偏高 { color: #C62828; }
+.val-过多 { color: #C62828; }
+.val-偏低 { color: #E65100; }
+.val-缺乏 { color: #E65100; }
+.val-不足 { color: #E65100; }
+.val-异常 { color: #C62828; }
+.val-注意 { color: #F59E0B; }
+
+.indicator-range { font-size: 22rpx; color: #bbb; display: block; margin-top: 4rpx; }
+
+.indicator-edit { display: flex; gap: 8rpx; align-items: center; }
+.edit-input { border: 1rpx solid #ddd; border-radius: 8rpx; padding: 6rpx 10rpx; font-size: 26rpx; width: 100rpx; }
+.edit-picker { border: 1rpx solid #ddd; border-radius: 8rpx; padding: 6rpx 10rpx; font-size: 24rpx; color: #333; }
+
+.fab { position: fixed; right: 30rpx; bottom: 40rpx; width: 100rpx; height: 100rpx; background: #4A9BD7; border-radius: 50%; display: flex; align-items: center; justify-content: center; box-shadow: 0 4rpx 16rpx rgba(74,155,215,0.4); }
+.fab-icon { font-size: 40rpx; color: #fff; }
 
-.food-item {
+.bottom-bar { position: fixed; bottom: 0; left: 0; right: 0; display: flex; padding: 20rpx 30rpx; background: #fff; border-top: 1rpx solid #eee; gap: 20rpx; z-index: 100; }
+.btn-cancel { flex: 1; padding: 20rpx; border: 1rpx solid #ddd; border-radius: 12rpx; text-align: center; font-size: 28rpx; color: #666; }
+.btn-save { flex: 1; padding: 20rpx; background: #4A9BD7; border-radius: 12rpx; text-align: center; font-size: 28rpx; color: #fff; }
+.feedback-section {
   display: flex;
-  flex-direction: column;
-  padding: 16rpx 0;
-  border-bottom: 1rpx solid #f5f5f5;
+  align-items: center;
+  padding: 24rpx 30rpx;
+  background: #fff;
+  margin: 16rpx;
+  border-radius: 12rpx;
+  border: 1rpx solid #f0f0f0;
 }
-.food-item:last-child { border-bottom: none; }
-.food-name { font-size: 26rpx; color: #333; font-weight: 500; }
-.food-category { font-size: 22rpx; color: #5B9BD5; margin-top: 4rpx; }
-.food-reason { font-size: 22rpx; color: #666; margin-top: 4rpx; }
+.feedback-icon { font-size: 32rpx; margin-right: 12rpx; }
+.feedback-text { flex: 1; font-size: 26rpx; color: #4A9BD7; }
+.feedback-arrow { font-size: 28rpx; color: #ccc; }
 
 .bottom-spacer { height: 40rpx; }
 
-.fab {
+/* 报告解读 */
+.interpretation-box {
+  background: #FFF8E1;
+  border-radius: 12rpx;
+  padding: 16rpx 20rpx;
+  margin: 16rpx 0 0;
+  border-left: 6rpx solid #FFB300;
+}
+.interp-text {
+  font-size: 24rpx;
+  color: #795548;
+  line-height: 1.6;
+}
+
+/* AI 解读入口 */
+.ai-fab {
   position: fixed;
   right: 30rpx;
   bottom: 100rpx;
-  width: 100rpx;
-  height: 100rpx;
-  border-radius: 50%;
-  background: linear-gradient(135deg, #5B9BD5, #3A7CC4);
   display: flex;
+  flex-direction: row;
   align-items: center;
-  justify-content: center;
-  box-shadow: 0 4rpx 20rpx rgba(91, 155, 213, 0.4);
+  background: linear-gradient(135deg, #6366F1, #8B5CF6);
+  border-radius: 40rpx;
+  padding: 16rpx 28rpx;
+  box-shadow: 0 4rpx 16rpx rgba(99, 102, 241, 0.4);
   z-index: 100;
 }
-.fab-icon { font-size: 44rpx; }
+.ai-fab .fab-icon { font-size: 32rpx; margin-right: 12rpx; }
+.ai-fab .fab-text { font-size: 26rpx; color: #fff; font-weight: 500; }
 </style>

+ 201 - 0
cfc-frontend/pages/health/gut-flora-foods-detail.vue

@@ -0,0 +1,201 @@
+<template>
+  <view class="page">
+    <view class="nav-bar">
+      <view class="nav-back" @tap="goBack">
+        <text class="back-text">‹ 返回</text>
+      </view>
+      <text class="nav-title">饮食推荐</text>
+      <text class="nav-edit" @tap="toggleEdit">{{ isEditing ? '完成' : '编辑' }}</text>
+    </view>
+
+    <scroll-view class="filter-bar" scroll-x>
+      <view class="filter-item" v-for="(cat, idx) in categories" :key="idx"
+            :class="'filter-' + (selectedCategory === cat ? 'active' : '')"
+            @tap="selectedCategory = cat">
+        <text>{{ cat }}</text>
+      </view>
+    </scroll-view>
+
+    <view class="sort-bar">
+      <text class="sort-text" @tap="sortDesc = !sortDesc">排序: {{ sortDesc ? '推荐↓' : '推荐↑' }}</text>
+      <text class="sort-text" @tap="showRecommendedOnly = !showRecommendedOnly">{{ showRecommendedOnly ? '全部' : '仅推荐' }}</text>
+    </view>
+
+    <scroll-view class="content" scroll-y>
+      <view class="food-card" v-for="(item, idx) in filteredFoods" :key="idx">
+        <view class="food-header">
+          <text class="food-name">{{ item.foodName || item.name }}</text>
+          <view class="food-cat-tag">
+            <text>{{ item.category }}</text>
+          </view>
+        </view>
+        <view class="food-detail-row" v-if="!isEditing">
+          <text class="food-nutrition">蛋白{{ item.protein || '--' }} | 脂肪{{ item.fat || '--' }} | 碳水{{ item.carb || '--' }} | 纤维{{ item.fiber || '--' }}</text>
+        </view>
+        <view class="food-detail-row" v-if="!isEditing && item.energy">
+          <text class="food-nutrition">能量 {{ item.energy }}KJ</text>
+        </view>
+        <view class="food-edit-row" v-if="isEditing">
+          <text class="edit-label">推荐指数:</text>
+          <input class="edit-input" type="number" v-model="item.score" />
+        </view>
+        <view class="food-score" :class="(item.score || 0) >= 5 ? 'score-good' : 'score-normal'">
+          <text>推荐: {{ item.score }}</text>
+        </view>
+      </view>
+      <view class="empty-hint" v-if="filteredFoods.length === 0">暂无数据</view>
+      <view class="bottom-spacer"></view>
+    </scroll-view>
+
+    <view class="bottom-bar" v-if="isEditing">
+      <view class="btn-cancel" @tap="cancelEdit">取消</view>
+      <view class="btn-save" @tap="saveEdit">保存</view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { getReportDetail, editHealthReport, getKnowledgeSection } from '../../utils/api.js'
+
+export default {
+  data() {
+    return {
+      reportId: null,
+      reportData: null,
+      foods: [],
+      isEditing: false,
+      editFoods: [],
+      selectedCategory: '全部',
+      sortDesc: true,
+      showRecommendedOnly: false,
+      categories: ['全部', '主食', '蔬菜', '水果', '肉类', '其它']
+    }
+  },
+  computed: {
+    filteredFoods: function() {
+      var list = this.isEditing ? this.editFoods : this.foods
+      if (this.selectedCategory !== '全部') {
+        list = list.filter(function(item) {
+          return (item.category || '') === this.selectedCategory
+        }.bind(this))
+      }
+      if (this.showRecommendedOnly) {
+        list = list.filter(function(item) {
+          return (item.score || 0) >= 5
+        })
+      }
+      list = [].concat(list)
+      list.sort(function(a, b) {
+        var sa = a.score || 0
+        var sb = b.score || 0
+        return this.sortDesc ? sb - sa : sa - sb
+      }.bind(this))
+      return list
+    }
+  },
+  onLoad: function(options) {
+    this.reportId = options.reportId ? parseInt(options.reportId) : null
+    if (this.reportId) {
+      this.loadData()
+    }
+  },
+  methods: {
+    goBack: function() {
+      uni.navigateBack()
+    },
+    loadData: function() {
+      var self = this
+      Promise.all([
+        getReportDetail(this.reportId),
+        getKnowledgeSection('食物库')
+      ]).then(function(results) {
+        var reportRes = results[0]
+        var kbRes = results[1]
+
+        // 构建 KB 食物 map
+        var kbFoodMap = {}
+        if (kbRes.code === 200 && kbRes.data && kbRes.data['数据']) {
+          var kbFoods = kbRes.data['数据']
+          for (var i = 0; i < kbFoods.length; i++) {
+            var f = kbFoods[i]
+            kbFoodMap[f['名称']] = f
+          }
+        }
+
+        if (reportRes.code === 200 && reportRes.data) {
+          self.reportData = reportRes.data
+          var reportFoods = reportRes.data.foods || []
+          // 合并 KB 营养数据(个人 JSON 只保存名称和推荐指数,营养数据从 KB 查)
+          self.foods = reportFoods.map(function(item) {
+            var name = item.foodName || item.name
+            var kb = kbFoodMap[name] || {}
+            return {
+              foodName: name,
+              name: name,
+              score: item.score,
+              category: item.category || kb['分类'] || '其它',
+              protein: kb['蛋白g'] || item.protein,
+              fat: kb['脂肪g'] || item.fat,
+              carb: kb['碳水化合物g'] || item.carb,
+              fiber: kb['总膳食纤维g'] || item.fiber,
+              energy: kb['能量KJ'] || item.energy
+            }
+          })
+        }
+      })
+    },
+    toggleEdit: function() {
+      this.isEditing = true
+      this.editFoods = JSON.parse(JSON.stringify(this.foods))
+    },
+    cancelEdit: function() {
+      this.isEditing = false
+      this.editFoods = []
+    },
+    saveEdit: function() {
+      var self = this
+      editHealthReport(self.reportId, { foods: self.editFoods }, 0).then(function(res) {
+        if (res.code === 200) {
+          uni.showToast({ title: '已保存', icon: 'success' })
+          self.isEditing = false
+          self.loadData()
+        } else {
+          uni.showToast({ title: res.message || '保存失败', icon: 'none' })
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.page { min-height: 100vh; background: #f8f8f8; }
+.nav-bar { display: flex; align-items: center; padding: 20rpx 30rpx; background: #fff; position: relative; }
+.nav-back { padding: 10rpx 0; }
+.back-text { font-size: 28rpx; color: #4A9BD7; }
+.nav-title { flex: 1; text-align: center; font-size: 32rpx; font-weight: 600; }
+.nav-edit { font-size: 28rpx; color: #4A9BD7; padding: 10rpx 0; }
+.filter-bar { background: #fff; padding: 10rpx 20rpx; white-space: nowrap; }
+.filter-item { display: inline-block; padding: 12rpx 28rpx; margin: 0 10rpx; border-radius: 30rpx; font-size: 26rpx; background: #f0f0f0; color: #666; }
+.filter-active { background: #4A9BD7; color: #fff; }
+.sort-bar { display: flex; justify-content: space-between; padding: 16rpx 30rpx; background: #fff; border-top: 1rpx solid #eee; }
+.sort-text { font-size: 24rpx; color: #999; }
+.content { padding: 20rpx 30rpx; height: calc(100vh - 200rpx); }
+.food-card { background: #fff; border-radius: 16rpx; padding: 24rpx; margin-bottom: 16rpx; }
+.food-header { display: flex; align-items: center; margin-bottom: 12rpx; }
+.food-name { font-size: 30rpx; font-weight: 600; color: #333; flex: 1; }
+.food-cat-tag { padding: 4rpx 16rpx; background: #f0f0f0; border-radius: 20rpx; font-size: 22rpx; color: #666; }
+.food-detail-row { margin-bottom: 6rpx; }
+.food-nutrition { font-size: 24rpx; color: #999; }
+.food-edit-row { display: flex; align-items: center; margin-bottom: 6rpx; }
+.edit-label { font-size: 26rpx; color: #666; margin-right: 12rpx; }
+.edit-input { border: 1rpx solid #ddd; border-radius: 8rpx; padding: 8rpx 12rpx; font-size: 26rpx; width: 120rpx; }
+.food-score { margin-top: 8rpx; font-size: 24rpx; }
+.score-good { color: #10B981; }
+.score-normal { color: #999; }
+.empty-hint { text-align: center; color: #ccc; padding: 60rpx 0; font-size: 28rpx; }
+.bottom-bar { position: fixed; bottom: 0; left: 0; right: 0; display: flex; padding: 20rpx 30rpx; background: #fff; border-top: 1rpx solid #eee; gap: 20rpx; }
+.btn-cancel { flex: 1; padding: 20rpx; border: 1rpx solid #ddd; border-radius: 12rpx; text-align: center; font-size: 28rpx; color: #666; }
+.btn-save { flex: 1; padding: 20rpx; background: #4A9BD7; border-radius: 12rpx; text-align: center; font-size: 28rpx; color: #fff; }
+.bottom-spacer { height: 40rpx; }
+</style>

+ 227 - 0
cfc-frontend/pages/health/gut-flora-risks-detail.vue

@@ -0,0 +1,227 @@
+<template>
+  <view class="page">
+    <view class="nav-bar">
+      <view class="nav-back" @tap="goBack">
+        <text class="back-text">‹ 返回</text>
+      </view>
+      <text class="nav-title">疾病风险</text>
+      <text class="nav-edit" @tap="toggleEdit">{{ isEditing ? '完成' : '编辑' }}</text>
+    </view>
+
+    <scroll-view class="content" scroll-y>
+      <view class="section-label">重要风险</view>
+      <view class="risk-card" v-for="(item, idx) in importantRisks" :key="'imp-' + idx"
+            :class="'risk-level-' + (item.riskLevel || 'low')">
+        <view class="risk-header">
+          <text class="risk-name" @tap="showKnowledge('disease', item.diseaseName)">{{ item.diseaseName }}</text>
+          <text class="risk-badge" :class="'badge-' + (item.riskLevel || 'low')">
+            {{ riskBadgeText(item.riskLevel) }}
+          </text>
+        </view>
+        <view class="risk-detail-row" v-if="!isEditing">
+          <text class="risk-value">风险值: {{ item.riskValue || '--' }}</text>
+          <text class="risk-level-text">等级: {{ item.riskLevel || '--' }}</text>
+        </view>
+        <view class="risk-edit-row" v-if="isEditing">
+          <text class="edit-label">风险值:</text>
+          <input class="edit-input" type="text" v-model="item.riskValue" />
+          <text class="edit-label">等级:</text>
+          <picker :value="riskLevelIndex(item.riskLevel)" :range="riskLevels" @change="onRiskLevelChange($event, item)">
+            <text class="edit-picker">{{ item.riskLevel || '请选择' }}</text>
+          </picker>
+        </view>
+      </view>
+
+      <view class="section-label">其它风险</view>
+      <view class="risk-card" v-for="(item, idx) in normalRisks" :key="'norm-' + idx"
+            :class="'risk-level-' + (item.riskLevel || 'low')">
+        <view class="risk-header">
+          <text class="risk-name" @tap="showKnowledge('disease', item.diseaseName)">{{ item.diseaseName }}</text>
+          <text class="risk-badge" :class="'badge-' + (item.riskLevel || 'low')">
+            {{ riskBadgeText(item.riskLevel) }}
+          </text>
+        </view>
+        <view class="risk-detail-row" v-if="!isEditing">
+          <text class="risk-value">风险值: {{ item.riskValue || '--' }}</text>
+          <text class="risk-level-text">等级: {{ item.riskLevel || '--' }}</text>
+        </view>
+        <view class="risk-edit-row" v-if="isEditing">
+          <text class="edit-label">风险值:</text>
+          <input class="edit-input" type="text" v-model="item.riskValue" />
+          <text class="edit-label">等级:</text>
+          <picker :value="riskLevelIndex(item.riskLevel)" :range="riskLevels" @change="onRiskLevelChange($event, item)">
+            <text class="edit-picker">{{ item.riskLevel || '请选择' }}</text>
+          </picker>
+        </view>
+      </view>
+      <view class="empty-hint" v-if="risks.length === 0">暂无疾病风险评估</view>
+      <view class="bottom-spacer"></view>
+    </scroll-view>
+
+    <health-knowledge-popup :visible="knowledgeVisible" :data="knowledgeData" @close="closeKnowledge" />
+
+    <view class="bottom-bar" v-if="isEditing">
+      <view class="btn-cancel" @tap="cancelEdit">取消</view>
+      <view class="btn-save" @tap="saveEdit">保存</view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { getReportDetail, editHealthReport, queryKnowledgeBase, queryIndicatorKnowledge } from '../../utils/api.js'
+import HealthKnowledgePopup from '../../components/health-knowledge-popup.vue'
+
+export default {
+  components: { HealthKnowledgePopup },
+  data() {
+    return {
+      reportId: null,
+      reportData: null,
+      risks: [],
+      isEditing: false,
+      editRisks: [],
+      riskLevels: ['低风险', '需注意', '高风险', '异常'],
+      knowledgeVisible: false,
+      knowledgeData: {}
+    }
+  },
+  computed: {
+    importantRisks: function() {
+      return this.getRisks().filter(function(item) {
+        var level = item.riskLevel || ''
+        return level === '需注意' || level === '高风险' || level === '异常'
+      })
+    },
+    normalRisks: function() {
+      return this.getRisks().filter(function(item) {
+        var level = item.riskLevel || ''
+        return level !== '需注意' && level !== '高风险' && level !== '异常'
+      })
+    }
+  },
+  onLoad: function(options) {
+    this.reportId = options.reportId ? parseInt(options.reportId) : null
+    if (this.reportId) {
+      this.loadData()
+    }
+  },
+  methods: {
+    goBack: function() { uni.navigateBack() },
+    getRisks: function() {
+      return this.isEditing ? this.editRisks : this.risks
+    },
+    loadData: function() {
+      var self = this
+      getReportDetail(this.reportId).then(function(res) {
+        if (res.code === 200 && res.data) {
+          self.reportData = res.data
+          self.risks = res.data.diseaseRisks || []
+        }
+      })
+    },
+    toggleEdit: function() {
+      this.isEditing = true
+      this.editRisks = JSON.parse(JSON.stringify(this.risks))
+    },
+    cancelEdit: function() {
+      this.isEditing = false
+      this.editRisks = []
+    },
+    saveEdit: function() {
+      var self = this
+      editHealthReport(self.reportId, { diseaseRisks: self.editRisks }, 0).then(function(res) {
+        if (res.code === 200) {
+          uni.showToast({ title: '已保存', icon: 'success' })
+          self.isEditing = false
+          self.loadData()
+        } else {
+          uni.showToast({ title: res.message || '保存失败', icon: 'none' })
+        }
+      })
+    },
+    riskBadgeText: function(level) {
+      var map = { '低风险': '✓ 低', '需注意': '⚠ 注意', '高风险': '⚠ 高', '异常': '⚠ 异常' }
+      return map[level] || level || ''
+    },
+    riskLevelIndex: function(level) {
+      var idx = this.riskLevels.indexOf(level)
+      return idx >= 0 ? idx : 0
+    },
+    onRiskLevelChange: function(e, item) {
+      item.riskLevel = this.riskLevels[e.detail.value]
+    },
+    showKnowledge: function(type, name) {
+      var self = this
+      // 优先使用 KB v3 查询指标调整建议
+      queryIndicatorKnowledge(name).then(function(res) {
+        if (res.code === 200 && res.data) {
+          var v3 = res.data
+          var high = v3['偏高影响'] || ''
+          var low = v3['偏低影响'] || ''
+          self.knowledgeData = {
+            itemName: v3['名称'] || name,
+            category: v3['说明'] || '',
+            description: (high ? '偏高影响:' + high + '\n' : '') + (low ? '偏低影响:' + low : ''),
+            suggestion: v3['调整建议'] || ''
+          }
+          self.knowledgeVisible = true
+        } else {
+          // 回退旧版 DB 查询
+          self.queryOldKnowledgeBase(type, name)
+        }
+      }).catch(function() {
+        self.queryOldKnowledgeBase(type, name)
+      })
+    },
+    queryOldKnowledgeBase: function(type, name) {
+      var self = this
+      queryKnowledgeBase(type, name).then(function(res) {
+        if (res.code === 200 && res.data) {
+          self.knowledgeData = res.data
+          self.knowledgeVisible = true
+        } else {
+          self.knowledgeData = { itemName: name }
+          self.knowledgeVisible = true
+        }
+      })
+    },
+    closeKnowledge: function() {
+      this.knowledgeVisible = false
+      this.knowledgeData = {}
+    }
+  }
+}
+</script>
+
+<style scoped>
+.page { min-height: 100vh; background: #f8f8f8; }
+.nav-bar { display: flex; align-items: center; padding: 20rpx 30rpx; background: #fff; position: relative; }
+.nav-back { padding: 10rpx 0; }
+.back-text { font-size: 28rpx; color: #4A9BD7; }
+.nav-title { flex: 1; text-align: center; font-size: 32rpx; font-weight: 600; }
+.nav-edit { font-size: 28rpx; color: #4A9BD7; padding: 10rpx 0; }
+.content { padding: 20rpx 30rpx; height: calc(100vh - 100rpx); }
+.section-label { font-size: 26rpx; color: #999; margin: 10rpx 0 16rpx; padding-left: 8rpx; }
+.risk-card { background: #fff; border-radius: 16rpx; padding: 24rpx; margin-bottom: 16rpx; border-left: 8rpx solid #10B981; }
+.risk-level-需注意 { border-left-color: #F59E0B; }
+.risk-level-高风险 { border-left-color: #C62828; }
+.risk-level-异常 { border-left-color: #C62828; }
+.risk-header { display: flex; align-items: center; margin-bottom: 12rpx; }
+.risk-name { font-size: 30rpx; font-weight: 600; color: #333; flex: 1; }
+.risk-badge { padding: 4rpx 16rpx; border-radius: 20rpx; font-size: 22rpx; }
+.badge-低风险 { background: #E8F5E9; color: #2E7D32; }
+.badge-需注意 { background: #FFF3E0; color: #E65100; }
+.badge-高风险 { background: #FFEBEE; color: #C62828; }
+.badge-异常 { background: #FFEBEE; color: #C62828; }
+.risk-detail-row { display: flex; gap: 24rpx; }
+.risk-value, .risk-level-text { font-size: 24rpx; color: #999; }
+.risk-edit-row { display: flex; align-items: center; gap: 12rpx; flex-wrap: wrap; }
+.edit-label { font-size: 26rpx; color: #666; }
+.edit-input { border: 1rpx solid #ddd; border-radius: 8rpx; padding: 8rpx 12rpx; font-size: 26rpx; width: 120rpx; }
+.edit-picker { border: 1rpx solid #ddd; border-radius: 8rpx; padding: 8rpx 12rpx; font-size: 26rpx; color: #333; }
+.empty-hint { text-align: center; color: #ccc; padding: 60rpx 0; font-size: 28rpx; }
+.bottom-bar { position: fixed; bottom: 0; left: 0; right: 0; display: flex; padding: 20rpx 30rpx; background: #fff; border-top: 1rpx solid #eee; gap: 20rpx; }
+.btn-cancel { flex: 1; padding: 20rpx; border: 1rpx solid #ddd; border-radius: 12rpx; text-align: center; font-size: 28rpx; color: #666; }
+.btn-save { flex: 1; padding: 20rpx; background: #4A9BD7; border-radius: 12rpx; text-align: center; font-size: 28rpx; color: #fff; }
+.bottom-spacer { height: 40rpx; }
+</style>

+ 257 - 0
cfc-frontend/pages/health/gut-flora-species-detail.vue

@@ -0,0 +1,257 @@
+<template>
+  <view class="page">
+    <view class="nav-bar">
+      <view class="nav-back" @tap="goBack">
+        <text class="back-text">‹ 返回</text>
+      </view>
+      <text class="nav-title">菌群详情</text>
+      <text class="nav-edit" @tap="toggleEdit">{{ isEditing ? '完成' : '编辑' }}</text>
+    </view>
+
+    <scroll-view class="tabs" scroll-x>
+      <view class="tab-item" v-for="(tab, idx) in tabs" :key="idx"
+            :class="'tab-' + (selectedTab === tab.key ? 'active' : '')"
+            @tap="selectedTab = tab.key">
+        <text>{{ tab.label }}</text>
+      </view>
+    </scroll-view>
+
+    <scroll-view class="content" scroll-y>
+      <view class="flora-card" v-for="(item, idx) in filteredFlora" :key="idx">
+        <view class="flora-header">
+          <text class="flora-name" :class="'status-' + (item.status || '正常')"
+                @tap="showKnowledge('bacteria', item.bacteriaName)">
+            {{ item.bacteriaName }}
+            <text class="arrow-up" v-if="item.status === '偏高' || item.status === '过多'"> ↑</text>
+            <text class="arrow-down" v-else-if="item.status === '偏低' || item.status === '缺乏' || item.status === '不足'"> ↓</text>
+          </text>
+          <text class="flora-level-tag" v-if="item.level && item.level !== 'GENUS'">{{ item.level }}</text>
+        </view>
+        <view class="flora-details" v-if="!isEditing">
+          <text class="detail-text">丰度 {{ item.bacteriaValue || '--' }} | 正常 {{ item.normalRange || '--' }}</text>
+          <text class="detail-text">人群 {{ item.populationLevel || '--' }} | 检出 {{ item.detectionRate || '--' }}</text>
+        </view>
+        <view class="flora-edit-row" v-if="isEditing">
+          <text class="edit-label">丰度:</text>
+          <input class="edit-input" type="text" v-model="item.bacteriaValue" />
+          <text class="edit-label">状态:</text>
+          <picker :value="floraStatusIndex(item.status)" :range="floraStatuses" @change="onFloraStatusChange($event, item)">
+            <text class="edit-picker">{{ item.status || '正常' }}</text>
+          </picker>
+        </view>
+      </view>
+      <view class="empty-hint" v-if="filteredFlora.length === 0">暂无该分类菌属数据</view>
+      <view class="bottom-spacer"></view>
+    </scroll-view>
+
+    <health-knowledge-popup :visible="knowledgeVisible" :data="knowledgeData" @close="closeKnowledge" />
+
+    <view class="bottom-bar" v-if="isEditing">
+      <view class="btn-cancel" @tap="cancelEdit">取消</view>
+      <view class="btn-save" @tap="saveEdit">保存</view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { getReportDetail, editHealthReport, queryKnowledgeBase, queryBacteriaKnowledge } from '../../utils/api.js'
+import HealthKnowledgePopup from '../../components/health-knowledge-popup.vue'
+
+export default {
+  components: { HealthKnowledgePopup },
+  data() {
+    return {
+      reportId: null,
+      reportData: null,
+      gutFlora: [],
+      probioticSpecies: [],
+      isEditing: false,
+      editFlora: [],
+      selectedTab: 'core',
+      floraStatuses: ['正常', '偏低', '偏高', '缺乏', '不足', '过多'],
+      knowledgeVisible: false,
+      knowledgeData: {},
+      tabs: [
+        { key: 'core', label: '核心菌属' },
+        { key: 'probiotic', label: '益生菌' },
+        { key: 'harmful', label: '有害菌' },
+        { key: 'other', label: '其它菌属' },
+        { key: 'pathogen_genus', label: '病原菌属' },
+        { key: 'pathogen_detection', label: '病原菌检出' },
+        { key: 'taxonomy_class', label: '菌纲' },
+        { key: 'taxonomy_order', label: '菌目' },
+        { key: 'taxonomy_family', label: '菌科' },
+        { key: 'taxonomy_genus', label: '菌属' },
+        { key: 'taxonomy_species', label: '菌种' },
+        { key: 'all', label: '全部' }
+      ]
+    }
+  },
+  computed: {
+    filteredFlora: function() {
+      var list = this.isEditing ? this.editFlora : this.gutFlora
+      if (this.selectedTab === 'all') return list
+      if (this.selectedTab === 'probiotic') {
+        return this.isEditing
+          ? this.editFlora.filter(function(i) { return i.category === 'probiotic' })
+          : this.probioticSpecies
+      }
+      // Taxonomy tabs: filter by category='taxonomy' + level
+      if (this.selectedTab.indexOf('taxonomy_') === 0) {
+        var levelMap = {
+          'taxonomy_class': 'CLASS',
+          'taxonomy_order': 'ORDER',
+          'taxonomy_family': 'FAMILY',
+          'taxonomy_genus': 'GENUS',
+          'taxonomy_species': 'SPECIES'
+        }
+        var targetLevel = levelMap[this.selectedTab]
+        return list.filter(function(item) {
+          return item.category === 'taxonomy' && item.level === targetLevel
+        })
+      }
+      // Other category tabs: filter by category field
+      var categoryMap = {
+        'core': 'core',
+        'harmful': 'harmful',
+        'other': 'other',
+        'pathogen_genus': 'pathogen_genus',
+        'pathogen_detection': 'pathogen_detection'
+      }
+      var targetCategory = categoryMap[this.selectedTab]
+      if (targetCategory) {
+        return list.filter(function(item) {
+          return item.category === targetCategory
+        })
+      }
+      return []
+    }
+  },
+  onLoad: function(options) {
+    this.reportId = options.reportId ? parseInt(options.reportId) : null
+    if (options.tab) {
+      this.selectedTab = options.tab
+    }
+    if (this.reportId) {
+      this.loadData()
+    }
+  },
+  methods: {
+    goBack: function() { uni.navigateBack() },
+    loadData: function() {
+      var self = this
+      getReportDetail(this.reportId).then(function(res) {
+        if (res.code === 200 && res.data) {
+          self.reportData = res.data
+          self.gutFlora = res.data.gutFlora || []
+          self.probioticSpecies = res.data.probioticSpecies || []
+        }
+      })
+    },
+    toggleEdit: function() {
+      this.isEditing = true
+      this.editFlora = JSON.parse(JSON.stringify(this.gutFlora))
+    },
+    cancelEdit: function() {
+      this.isEditing = false
+      this.editFlora = []
+    },
+    saveEdit: function() {
+      var self = this
+      editHealthReport(self.reportId, { gutFlora: self.editFlora }, 0).then(function(res) {
+        if (res.code === 200) {
+          uni.showToast({ title: '已保存', icon: 'success' })
+          self.isEditing = false
+          self.loadData()
+        } else {
+          uni.showToast({ title: res.message || '保存失败', icon: 'none' })
+        }
+      })
+    },
+    floraStatusIndex: function(status) {
+      var idx = this.floraStatuses.indexOf(status)
+      return idx >= 0 ? idx : 0
+    },
+    onFloraStatusChange: function(e, item) {
+      item.status = this.floraStatuses[e.detail.value]
+    },
+    showKnowledge: function(type, name) {
+      var self = this
+      // 优先使用 KB v3 查询菌属功能
+      queryBacteriaKnowledge(name).then(function(res) {
+        if (res.code === 200 && res.data) {
+          var v3 = res.data
+          var high = v3['偏高影响'] || ''
+          var low = v3['偏低影响'] || ''
+          var direction = v3['调整方向'] || ''
+          var suggestion = ''
+          if (high) suggestion += '偏高影响:' + high + '\n'
+          if (low) suggestion += '偏低影响:' + low + '\n'
+          if (direction) suggestion += '调整方向:' + direction
+          self.knowledgeData = {
+            itemName: v3['学名'] || name,
+            category: (v3['中文名'] ? v3['中文名'] + ' ' : '') + (v3['分组'] || ''),
+            description: v3['功能说明'] || '',
+            suggestion: suggestion.trim()
+          }
+          self.knowledgeVisible = true
+        } else {
+          self.queryOldKnowledgeBase(type, name)
+        }
+      }).catch(function() {
+        self.queryOldKnowledgeBase(type, name)
+      })
+    },
+    queryOldKnowledgeBase: function(type, name) {
+      var self = this
+      queryKnowledgeBase(type, name).then(function(res) {
+        if (res.code === 200 && res.data) {
+          self.knowledgeData = res.data
+          self.knowledgeVisible = true
+        } else {
+          self.knowledgeData = { itemName: name }
+          self.knowledgeVisible = true
+        }
+      })
+    },
+    closeKnowledge: function() {
+      this.knowledgeVisible = false
+      this.knowledgeData = {}
+    }
+  }
+}
+</script>
+
+<style scoped>
+.page { min-height: 100vh; background: #f8f8f8; }
+.nav-bar { display: flex; align-items: center; padding: 20rpx 30rpx; background: #fff; position: relative; }
+.nav-back { padding: 10rpx 0; }
+.back-text { font-size: 28rpx; color: #4A9BD7; }
+.nav-title { flex: 1; text-align: center; font-size: 32rpx; font-weight: 600; }
+.nav-edit { font-size: 28rpx; color: #4A9BD7; padding: 10rpx 0; }
+.tabs { background: #fff; padding: 10rpx 20rpx; white-space: nowrap; border-bottom: 1rpx solid #eee; }
+.tab-item { display: inline-block; padding: 12rpx 24rpx; margin: 0 6rpx; border-radius: 30rpx; font-size: 24rpx; background: #f0f0f0; color: #666; }
+.tab-active { background: #4A9BD7; color: #fff; }
+.content { padding: 20rpx 30rpx; height: calc(100vh - 180rpx); }
+.flora-card { background: #fff; border-radius: 16rpx; padding: 24rpx; margin-bottom: 16rpx; }
+.flora-header { display: flex; align-items: center; margin-bottom: 10rpx; }
+.flora-name { font-size: 28rpx; font-weight: 600; color: #333; flex: 1; }
+.flora-name.status-偏高 { color: #C62828; }
+.flora-name.status-过多 { color: #C62828; }
+.flora-name.status-偏低 { color: #E65100; }
+.flora-name.status-缺乏 { color: #E65100; }
+.flora-name.status-不足 { color: #E65100; }
+.arrow-up { color: #C62828; font-size: 22rpx; }
+.arrow-down { color: #E65100; font-size: 22rpx; }
+.flora-level-tag { padding: 2rpx 12rpx; background: #E3F2FD; border-radius: 16rpx; font-size: 20rpx; color: #4A9BD7; }
+.detail-text { font-size: 24rpx; color: #999; display: block; line-height: 1.8; }
+.flora-edit-row { display: flex; align-items: center; gap: 12rpx; flex-wrap: wrap; }
+.edit-label { font-size: 26rpx; color: #666; }
+.edit-input { border: 1rpx solid #ddd; border-radius: 8rpx; padding: 8rpx 12rpx; font-size: 26rpx; width: 140rpx; }
+.edit-picker { border: 1rpx solid #ddd; border-radius: 8rpx; padding: 8rpx 12rpx; font-size: 26rpx; color: #333; }
+.empty-hint { text-align: center; color: #ccc; padding: 60rpx 0; font-size: 28rpx; }
+.bottom-bar { position: fixed; bottom: 0; left: 0; right: 0; display: flex; padding: 20rpx 30rpx; background: #fff; border-top: 1rpx solid #eee; gap: 20rpx; }
+.btn-cancel { flex: 1; padding: 20rpx; border: 1rpx solid #ddd; border-radius: 12rpx; text-align: center; font-size: 28rpx; color: #666; }
+.btn-save { flex: 1; padding: 20rpx; background: #4A9BD7; border-radius: 12rpx; text-align: center; font-size: 28rpx; color: #fff; }
+.bottom-spacer { height: 40rpx; }
+</style>

+ 361 - 0
cfc-frontend/pages/health/physical-exam-detail.vue

@@ -0,0 +1,361 @@
+<template>
+  <view class="detail-container">
+    <!-- 导航栏 -->
+    <view class="nav-bar">
+      <text class="nav-back" @click="goBack">‹ 返回</text>
+      <text class="nav-title">体检报告详情</text>
+      <view class="nav-placeholder"></view>
+    </view>
+
+    <!-- 加载状态 -->
+    <view class="loading-wrap" v-if="loading">
+      <text class="loading-text">加载中...</text>
+    </view>
+
+    <template v-else>
+      <!-- 报告摘要卡片 -->
+      <view class="summary-card">
+        <view class="summary-header">
+          <text class="summary-icon">🏥</text>
+          <text class="summary-title">体检报告</text>
+        </view>
+        <view class="summary-body">
+          <view class="summary-row">
+            <text class="summary-label">报告日期</text>
+            <text class="summary-value">{{ report.reportDate || '--' }}</text>
+          </view>
+          <view class="summary-row">
+            <text class="summary-label">综合评分</text>
+            <text class="summary-score" :class="scoreClass">{{ report.overallScore || '--' }}<text class="score-unit">分</text></text>
+          </view>
+          <view class="summary-row">
+            <text class="summary-label">报告编号</text>
+            <text class="summary-value">{{ report.reportNumber || '--' }}</text>
+          </view>
+          <view class="summary-row">
+            <text class="summary-label">备注</text>
+            <text class="summary-value">{{ report.remark || '无' }}</text>
+          </view>
+        </view>
+      </view>
+
+      <!-- 指标分类列表 -->
+      <view class="indicator-section" v-for="(group, groupName) in groupedIndicators" :key="groupName">
+        <view class="group-header">
+          <text class="group-icon">{{ getCategoryIcon(groupName) }}</text>
+          <text class="group-title">{{ groupName }}</text>
+          <text class="group-count">{{ group.length }}项</text>
+        </view>
+
+        <view class="indicator-list">
+          <view class="indicator-item" v-for="ind in group" :key="ind.id || ind.indicatorName">
+            <view class="indicator-left">
+              <text class="indicator-name">{{ ind.indicatorName }}</text>
+              <text class="indicator-range" v-if="ind.refRange">参考值: {{ ind.refRange }}</text>
+            </view>
+            <view class="indicator-right">
+              <text class="indicator-value" :class="getStatusClass(ind)">{{ ind.indicatorValue }}</text>
+              <text class="indicator-unit" v-if="ind.unit">{{ ind.unit }}</text>
+              <text class="indicator-status" :class="getStatusClass(ind)">{{ ind.status || '--' }}</text>
+            </view>
+          </view>
+        </view>
+      </view>
+
+      <!-- 空状态 -->
+      <view class="empty-wrap" v-if="!loading && indicatorGroups.length === 0">
+        <text class="empty-icon">📋</text>
+        <text class="empty-text">暂无指标数据</text>
+      </view>
+    </template>
+
+<view class="bottom-spacer"></view>
+
+<!-- AI 解读入口 -->
+<view class="ai-fab" @click="goAIChat" v-if="report && reportId">
+  <text class="fab-icon">🤖</text>
+  <text class="fab-text">AI 解读报告</text>
+</view>
+</view>
+</template>
+
+<script>
+import { getReportDetail } from '../../utils/api.js'
+
+export default {
+  data() {
+    return {
+      reportId: null,
+      report: {},
+      indicators: [],
+      loading: false
+    }
+  },
+  computed: {
+    groupedIndicators: function() {
+      var groups = {}
+      var self = this
+      self.indicators.forEach(function(ind) {
+        var cat = ind.category || '其他指标'
+        if (!groups[cat]) {
+          groups[cat] = []
+        }
+        groups[cat].push(ind)
+      })
+      // 按分类排序,常用分类在前
+      var priority = ['血常规', '肝功能', '肾功能', '血脂', '血糖', '尿常规', '便常规',
+        '甲状腺功能', '肿瘤标志物', '维生素', '微量元素', '营养状况', '炎症指标',
+        '免疫指标', '其他指标']
+      var sorted = {}
+      priority.forEach(function(p) {
+        if (groups[p]) {
+          sorted[p] = groups[p]
+          delete groups[p]
+        }
+      })
+      // 剩余分类保持原序
+      Object.keys(groups).forEach(function(k) {
+        sorted[k] = groups[k]
+      })
+      return sorted
+    },
+    scoreClass: function() {
+      var s = parseInt(this.report.overallScore)
+      if (isNaN(s)) return ''
+      if (s >= 80) return 'score-good'
+      if (s >= 60) return 'score-warn'
+      return 'score-bad'
+    }
+  },
+  onLoad: function(options) {
+    this.reportId = options.reportId ? parseInt(options.reportId) : null
+    this.loadData()
+  },
+  methods: {
+    loadData: function() {
+      var self = this
+      if (!self.reportId) {
+        uni.showToast({ title: '参数错误', icon: 'none' })
+        return
+      }
+      self.loading = true
+      getReportDetail(self.reportId).then(function(res) {
+        if (res.code === 200 && res.data) {
+          var data = res.data
+          self.report = data.report || data
+          // 指标可能来自 indicators 字段或直接是 report 的一部分
+          if (data.indicators) {
+            self.indicators = data.indicators
+          } else if (data.indicatorList) {
+            self.indicators = data.indicatorList
+          } else {
+            self.indicators = []
+          }
+        } else {
+          uni.showToast({ title: res.message || '加载失败', icon: 'none' })
+        }
+      }).catch(function(e) {
+        console.log('获取报告详情失败', e)
+        uni.showToast({ title: '加载失败', icon: 'none' })
+      }).finally(function() {
+        self.loading = false
+      })
+    },
+    getCategoryIcon: function(cat) {
+      var icons = {
+        '血常规': '🩸',
+        '肝功能': '🫁',
+        '肾功能': '🫘',
+        '血脂': '🫧',
+        '血糖': '🍬',
+        '尿常规': '💧',
+        '便常规': '💩',
+        '甲状腺功能': '🦋',
+        '肿瘤标志物': '🔬',
+        '维生素': '🍊',
+        '微量元素': '⚗️',
+        '营养状况': '🥗',
+        '炎症指标': '🔥',
+        '免疫指标': '🛡️',
+      }
+      return icons[cat] || '📊'
+    },
+    getStatusClass: function(ind) {
+      var status = (ind.status || '').toLowerCase()
+      if (status.indexOf('偏高') !== -1 || status.indexOf('高') !== -1 || status.indexOf('过多') !== -1) {
+        return 'status-high'
+      }
+      if (status.indexOf('偏低') !== -1 || status.indexOf('低') !== -1 || status.indexOf('缺乏') !== -1) {
+        return 'status-low'
+      }
+      if (status.indexOf('注意') !== -1 || status.indexOf('风险') !== -1) {
+        return 'status-warn'
+      }
+      if (status.indexOf('正常') !== -1 || status.indexOf('未检出') !== -1) {
+        return 'status-normal'
+      }
+      return ''
+    },
+goAIChat: function() {
+  if (!this.reportId) return
+  uni.navigateTo({
+    url: '/pages/ai/chat?mode=nutrition&reportId=' + this.reportId + '&firstMessage=' + encodeURIComponent('请根据这份体检报告,分析我孩子的健康状况并提出建议')
+  })
+},
+goBack: function() {
+  uni.navigateBack()
+}
+  }
+}
+</script>
+
+<style scoped>
+.detail-container {
+  min-height: 100vh;
+  background: #F5F7FA;
+}
+.nav-bar {
+  position: sticky;
+  top: 0;
+  background: #fff;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: space-between;
+  padding: 20rpx 30rpx;
+  box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.06);
+  z-index: 100;
+}
+.nav-back { font-size: 32rpx; color: #5B9BD5; }
+.nav-title { font-size: 32rpx; font-weight: bold; color: #333; }
+.nav-placeholder { width: 80rpx; }
+
+.loading-wrap {
+  display: flex;
+  justify-content: center;
+  padding: 80rpx 0;
+}
+.loading-text { font-size: 28rpx; color: #999; }
+
+/* 摘要卡片 */
+.summary-card {
+  background: linear-gradient(135deg, #E3F2FD, #BBDEFB);
+  border-radius: 20rpx;
+  margin: 20rpx 30rpx;
+  padding: 28rpx 24rpx;
+}
+.summary-header {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  margin-bottom: 20rpx;
+}
+.summary-icon { font-size: 40rpx; margin-right: 12rpx; }
+.summary-title { font-size: 32rpx; font-weight: bold; color: #1565C0; }
+.summary-body { display: flex; flex-direction: column; gap: 14rpx; }
+.summary-row {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: space-between;
+}
+.summary-label { font-size: 26rpx; color: #555; }
+.summary-value { font-size: 26rpx; color: #333; font-weight: 500; }
+.summary-score { font-size: 40rpx; font-weight: bold; }
+.score-unit { font-size: 22rpx; font-weight: normal; }
+.score-good { color: #2E7D32; }
+.score-warn { color: #E65100; }
+.score-bad { color: #C62828; }
+
+/* 指标分组 */
+.indicator-section {
+  margin: 0 30rpx 20rpx;
+}
+.group-header {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  padding: 16rpx 20rpx;
+  background: #fff;
+  border-radius: 16rpx 16rpx 0 0;
+  border-bottom: 2rpx solid #E2E8F0;
+}
+.group-icon { font-size: 28rpx; margin-right: 8rpx; }
+.group-title { font-size: 28rpx; font-weight: bold; color: #333; flex: 1; }
+.group-count { font-size: 22rpx; color: #999; }
+
+.indicator-list {
+  background: #fff;
+  border-radius: 0 0 16rpx 16rpx;
+  overflow: hidden;
+}
+.indicator-item {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: space-between;
+  padding: 18rpx 20rpx;
+  border-bottom: 1rpx solid #F0F0F0;
+}
+.indicator-item:last-child { border-bottom: none; }
+.indicator-left {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  gap: 4rpx;
+}
+.indicator-name { font-size: 28rpx; color: #333; font-weight: 500; }
+.indicator-range { font-size: 22rpx; color: #999; }
+.indicator-right {
+  display: flex;
+  flex-direction: column;
+  align-items: flex-end;
+  gap: 4rpx;
+  margin-left: 20rpx;
+  min-width: 120rpx;
+}
+.indicator-value { font-size: 32rpx; font-weight: bold; }
+.indicator-unit { font-size: 22rpx; color: #999; }
+.indicator-status { font-size: 20rpx; padding: 2rpx 10rpx; border-radius: 10rpx; }
+
+/* 状态颜色 */
+.status-high { color: #C62828; }
+.status-low { color: #E65100; }
+.status-warn { color: #F57F17; }
+.status-normal { color: #2E7D32; }
+
+/* 空状态 */
+.empty-wrap {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  padding: 100rpx 0;
+}
+.empty-icon { font-size: 80rpx; margin-bottom: 20rpx; }
+.empty-text { font-size: 28rpx; color: #999; }
+
+.bottom-spacer { height: 60rpx; }
+
+.ai-fab {
+  position: fixed;
+  right: 30rpx;
+  bottom: 100rpx;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  background: linear-gradient(135deg, #6366F1, #8B5CF6);
+  border-radius: 40rpx;
+  padding: 16rpx 28rpx;
+  box-shadow: 0 4rpx 16rpx rgba(99, 102, 241, 0.4);
+  z-index: 100;
+}
+.ai-fab .fab-icon {
+  font-size: 32rpx;
+  margin-right: 12rpx;
+}
+.ai-fab .fab-text {
+  font-size: 26rpx;
+  color: #fff;
+  font-weight: 500;
+}
+</style>

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است