Przeglądaj źródła

Merge remote-tracking branch 'origin/cfclub' into cfclub

liaoxg 1 miesiąc temu
rodzic
commit
df38e28904
52 zmienionych plików z 4179 dodań i 512 usunięć
  1. 48 3
      cfc-backend/src/main/java/com/etotem/cfc/controller/HealthReportController.java
  2. 6 3
      cfc-backend/src/main/java/com/etotem/cfc/controller/PromotionController.java
  3. 4 2
      cfc-backend/src/main/java/com/etotem/cfc/service/HealthCircleService.java
  4. 1 1
      cfc-backend/src/main/java/com/etotem/cfc/service/HealthScoreService.java
  5. 163 0
      cfc-backend/src/test/java/com/etotem/cfc/config/FamilyAccessInterceptorTest.java
  6. 4 3
      cfc-frontend/components/AIFloatingAvatar.vue
  7. 18 20
      cfc-frontend/components/ContactCard.vue
  8. 15 21
      cfc-frontend/components/ContactImport.vue
  9. 24 6
      cfc-frontend/components/WealthSubScores.vue
  10. 65 12
      cfc-frontend/pages/ai/chat.vue
  11. 2 1
      cfc-frontend/pages/body/index.vue
  12. 2 2
      cfc-frontend/pages/membership/benefits.vue
  13. 82 4
      cfc-frontend/utils/api.js
  14. 1 1
      cfc-langgraph/app/agents/intent_classifier.py
  15. 124 1
      cfc-langgraph/app/api/adapter.py
  16. 2 0
      cfc-langgraph/app/config.py
  17. 1 1
      cfc-langgraph/app/graphs/analysis_graph.py
  18. 1 1
      cfc-langgraph/app/graphs/chat_graph.py
  19. 322 0
      cfc-langgraph/app/graphs/health_butler_graph.py
  20. 179 0
      cfc-langgraph/app/graphs/health_coach_graph.py
  21. 1 1
      cfc-langgraph/app/graphs/recommend_graph.py
  22. 1 1
      cfc-web/.last_build_commit
  23. 2 2
      cfc-web/package-lock.json
  24. 1 1
      cfc-web/package.json
  25. 258 0
      cfc-web/public/CHANGELOG-v1.0.md
  26. 259 1
      cfc-web/public/CHANGELOG.md
  27. 0 6
      cfc-web/src/router/index.js
  28. 34 36
      docs/superpowers/PROJECT-OVERVIEW.md
  29. 58 56
      docs/superpowers/plans/2026-07-22-comprehensive-implementation.md
  30. 1 1
      docs/superpowers/tickets/TASK-P0-001-generation-refactor.md
  31. 277 220
      docs/系统测试/test-cases.js
  32. 249 33
      web/articles/alzheimer.html
  33. 3 3
      web/articles/cancer.html
  34. 3 3
      web/articles/cardio-cerebro.html
  35. 2 2
      web/articles/diabetes.html
  36. 3 3
      web/articles/geo-faq-1-allergy.html
  37. 3 3
      web/articles/geo-faq-2-attention.html
  38. 3 3
      web/articles/geo-faq-3-immunity.html
  39. 2 2
      web/articles/osteoporosis.html
  40. 32 32
      web/articles/plastic-health.html
  41. 63 19
      web/articles/tap-water-pollution.html
  42. 815 0
      web/articles/turmeric.html
  43. 2 2
      web/articles/uric-acid.html
  44. BIN
      web/img/ref-screenshots/antibiotics-args-transfer.jpg
  45. BIN
      web/img/ref-screenshots/ch2o-cl2-reaction.jpg
  46. BIN
      web/img/ref-screenshots/chinas-dbps-spatial.jpg
  47. BIN
      web/img/ref-screenshots/edc-contamination-chain.jpg
  48. BIN
      web/img/ref-screenshots/gut-microbiome-damage.jpg
  49. BIN
      web/img/ref-screenshots/pesticides-46-detection.jpg
  50. 497 0
      web/sales/microplastic-sale.html
  51. 0 0
      web/sales/sales.html
  52. 546 0
      web/sales/tap-water-sale.html

+ 48 - 3
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthReportController.java

@@ -459,6 +459,15 @@ public class HealthReportController {
             result.put("extractedGender", parsed.getGender());
             result.put("extractedGender", parsed.getGender());
             result.put("extractedAge", parsed.getAge());
             result.put("extractedAge", parsed.getAge());
             result.put("needBind", matchResult.getMatchedMemberId() == null && familyId != null);
             result.put("needBind", matchResult.getMatchedMemberId() == null && familyId != null);
+            
+            // 保存结果到本地 JSON 文件
+            try {
+                saveResultToJsonFile(result);
+            } catch (Exception e) {
+                log.warn("保存结果到 JSON 文件失败:{}", e.getMessage());
+                // 不影响主要流程,只是记录警告
+            }
+            
             return Result.success(result);
             return Result.success(result);
 
 
         } catch (IOException e) {
         } catch (IOException e) {
@@ -1267,6 +1276,42 @@ public class HealthReportController {
         return Result.success("感谢您的反馈");
         return Result.success("感谢您的反馈");
     }
     }
 
 
+    /**
+     * 将解析结果保存到本地 JSON 文件(用于调试)
+     */
+    private void saveResultToJsonFile(Map<String, Object> result) throws IOException {
+        // 创建输出目录
+        String outputDir = "uploads" + File.separator + "json-results";
+        File dir = new File(outputDir);
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+        
+        // 生成文件名:timestamp_result.json
+        String timestamp = java.time.LocalDateTime.now().format(
+            java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")
+        );
+        String filename = timestamp + "_result.json";
+        String filePath = outputDir + File.separator + filename;
+        
+        // 写入 JSON 文件
+        try (java.io.PrintWriter writer = new java.io.PrintWriter(filePath, "UTF-8")) {
+            writer.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(result));
+        }
+        
+        log.info("✅ 解析结果已保存到 JSON 文件:{}", filePath);
+        
+        // 同时打印部分关键信息到日志(限制长度避免过大)
+        String summary = String.format(
+            "[JSON 保存] draftId=%s, name=%s, matched=%s, confidence=%.2f",
+            result.get("draftId"),
+            result.get("extractedName"),
+            result.get("matchedMemberId") != null ? "找到匹配" : "未匹配",
+            result.get("confidence")
+        );
+        log.info(summary);
+    }
+
     /**
     /**
      * 保存上传文件到本地存储
      * 保存上传文件到本地存储
      */
      */
@@ -1276,13 +1321,13 @@ public class HealthReportController {
         if (!dir.exists()) {
         if (!dir.exists()) {
             dir.mkdirs();
             dir.mkdirs();
         }
         }
-
+    
         String originalFilename = file.getOriginalFilename();
         String originalFilename = file.getOriginalFilename();
         if (originalFilename == null) {
         if (originalFilename == null) {
             originalFilename = "report.pdf";
             originalFilename = "report.pdf";
         }
         }
-
-        // 文件名: timestamp_uuid.extension
+    
+        // 文件名timestamp_uuid.extension
         String extension = "";
         String extension = "";
         int dotIdx = originalFilename.lastIndexOf('.');
         int dotIdx = originalFilename.lastIndexOf('.');
         if (dotIdx > 0) {
         if (dotIdx > 0) {

+ 6 - 3
cfc-backend/src/main/java/com/etotem/cfc/controller/PromotionController.java

@@ -1,6 +1,9 @@
 package com.etotem.cfc.controller;
 package com.etotem.cfc.controller;
 
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.etotem.cfc.common.Result;
 import com.etotem.cfc.common.Result;
+import com.etotem.cfc.entity.FamilyCommission;
+import com.etotem.cfc.entity.PromotionBinding;
 import com.etotem.cfc.service.FamilyCommissionService;
 import com.etotem.cfc.service.FamilyCommissionService;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
@@ -16,14 +19,14 @@ public class PromotionController {
     private FamilyCommissionService familyCommissionService;
     private FamilyCommissionService familyCommissionService;
 
 
     @PostMapping("/bind")
     @PostMapping("/bind")
-    public Result<Map<String, Object>> bind(@RequestBody Map<String, Object> params) {
+    public Result<Object> bind(@RequestBody Map<String, Object> params) {
         String inviteCode = params.get("inviteCode") != null ? params.get("inviteCode").toString() : null;
         String inviteCode = params.get("inviteCode") != null ? params.get("inviteCode").toString() : null;
         Long promoterFamilyId = params.get("promoterFamilyId") != null
         Long promoterFamilyId = params.get("promoterFamilyId") != null
                 ? Long.valueOf(params.get("promoterFamilyId").toString()) : null;
                 ? Long.valueOf(params.get("promoterFamilyId").toString()) : null;
         if (inviteCode == null || promoterFamilyId == null) {
         if (inviteCode == null || promoterFamilyId == null) {
             return Result.error("邀请码和推广方家庭ID不能为空");
             return Result.error("邀请码和推广方家庭ID不能为空");
         }
         }
-        var binding = familyCommissionService.bindByInviteCode(promoterFamilyId, inviteCode);
+        PromotionBinding binding = familyCommissionService.bindByInviteCode(promoterFamilyId, inviteCode);
         if (binding == null) {
         if (binding == null) {
             return Result.error("绑定失败,请检查邀请码");
             return Result.error("绑定失败,请检查邀请码");
         }
         }
@@ -39,7 +42,7 @@ public class PromotionController {
         if (familyId == null) {
         if (familyId == null) {
             return Result.error("家庭ID不能为空");
             return Result.error("家庭ID不能为空");
         }
         }
-        var pageResult = familyCommissionService.getCommissionList(familyId, page, size);
+        Page<FamilyCommission> pageResult = familyCommissionService.getCommissionList(familyId, page, size);
         Map<String, Object> result = new java.util.HashMap<>();
         Map<String, Object> result = new java.util.HashMap<>();
         result.put("records", pageResult.getRecords());
         result.put("records", pageResult.getRecords());
         result.put("total", pageResult.getTotal());
         result.put("total", pageResult.getTotal());

+ 4 - 2
cfc-backend/src/main/java/com/etotem/cfc/service/HealthCircleService.java

@@ -186,14 +186,16 @@ public class HealthCircleService {
         LambdaQueryWrapper<HealthCircleMember> mw = new LambdaQueryWrapper<HealthCircleMember>()
         LambdaQueryWrapper<HealthCircleMember> mw = new LambdaQueryWrapper<HealthCircleMember>()
                 .eq(HealthCircleMember::getFamilyId, familyId)
                 .eq(HealthCircleMember::getFamilyId, familyId)
                 .eq(HealthCircleMember::getStatus, "active");
                 .eq(HealthCircleMember::getStatus, "active");
-        return (int) healthCircleMemberMapper.selectCount(mw);
+        Long count = healthCircleMemberMapper.selectCount(mw);
+        return count != null ? count.intValue() : 0;
     }
     }
 
 
     private int countCircleMembers(Long circleId) {
     private int countCircleMembers(Long circleId) {
         LambdaQueryWrapper<HealthCircleMember> mw = new LambdaQueryWrapper<HealthCircleMember>()
         LambdaQueryWrapper<HealthCircleMember> mw = new LambdaQueryWrapper<HealthCircleMember>()
                 .eq(HealthCircleMember::getCircleId, circleId)
                 .eq(HealthCircleMember::getCircleId, circleId)
                 .eq(HealthCircleMember::getStatus, "active");
                 .eq(HealthCircleMember::getStatus, "active");
-        return (int) healthCircleMemberMapper.selectCount(mw);
+        Long count = healthCircleMemberMapper.selectCount(mw);
+        return count != null ? count.intValue() : 0;
     }
     }
 
 
     private String generateInviteCode() {
     private String generateInviteCode() {

+ 1 - 1
cfc-backend/src/main/java/com/etotem/cfc/service/HealthScoreService.java

@@ -79,7 +79,7 @@ public class HealthScoreService {
 
 
         // 饮食: 每次+2 (上限每日1次)
         // 饮食: 每次+2 (上限每日1次)
         long mealCount = healthMealRecordMapper.selectCount(
         long mealCount = healthMealRecordMapper.selectCount(
-            new LambdaQueryWrapper<HealthMealRecord>().eq(HealthMealRecord::getChildId, childId));
+            new LambdaQueryWrapper<HealthMealRecord>().eq(HealthMealRecord::getMemberId, childId));
         long mealDays = countDistinctDays(childId, "meal");
         long mealDays = countDistinctDays(childId, "meal");
         total += (int) Math.min(mealCount, mealDays * 1) * 2;
         total += (int) Math.min(mealCount, mealDays * 1) * 2;
 
 

+ 163 - 0
cfc-backend/src/test/java/com/etotem/cfc/config/FamilyAccessInterceptorTest.java

@@ -0,0 +1,163 @@
+package com.etotem.cfc.config;
+
+import com.etotem.cfc.entity.User;
+import com.etotem.cfc.service.UserService;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.MockitoAnnotations;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import java.util.Collections;
+import java.util.Set;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.mock.web.MockHttpServletRequest;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+public class FamilyAccessInterceptorTest {
+
+    @Mock
+    private UserService userService;
+
+    @InjectMocks
+    private FamilyAccessInterceptor familyAccessInterceptor;
+
+    private HttpServletResponse response;
+
+    @BeforeEach
+    public void setUp() {
+        MockitoAnnotations.openMocks(this);
+        response = mock(HttpServletResponse.class);
+    }
+
+    @Test
+    public void testChildAccessValid() throws Exception {
+        Long userId = 1L;
+        Long familyId = 1L;
+        User user = createMockUser(userId, familyId, "child");
+        when(userService.getEffectiveFamilyIds(userId)).thenReturn(Collections.singleton(familyId));
+
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        request.setMethod("POST");
+        request.setRequestURI("/api/dan-assessment/materials");
+        request.setParameter("familyId", familyId.toString());
+        request.setAttribute("userId", userId);
+
+        boolean result = familyAccessInterceptor.preHandle(request, response, null);
+        assertTrue(result);
+        // 验证没有调用参数抛出 403
+    }
+
+    @Test
+    public void testChildAccessInvalid() throws Exception {
+        Long userId = 1L;
+        Long userFamilyId = 1L;
+        Long requestedFamilyId = 2L;
+        User user = createMockUser(userId, userFamilyId, "child");
+        when(userService.getEffectiveFamilyIds(userId)).thenReturn(Collections.singleton(userFamilyId));
+
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        request.setMethod("POST");
+        request.setRequestURI("/api/dan-assessment/materials");
+        request.setParameter("familyId", requestedFamilyId.toString());
+        request.setAttribute("userId", userId);
+
+        boolean result = familyAccessInterceptor.preHandle(request, response, null);
+        assertFalse(result);
+        // 验证发送了 403 响应
+        verify(response).setStatus(HttpServletResponse.SC_FORBIDDEN);
+    }
+
+    @Test
+    public void testTeacherAccessValid() throws Exception {
+        Long userId = 2L;
+        Long teacherFamilyId = 5L;
+        Long assignedFamilyId = 5L;
+        User user = createMockUser(userId, teacherFamilyId, "teacher");
+        when(userService.getEffectiveFamilyIds(userId)).thenReturn(Collections.singleton(assignedFamilyId));
+
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        request.setMethod("POST");
+        request.setRequestURI("/api/dan-assessment/materials");
+        request.setParameter("familyId", assignedFamilyId.toString());
+        request.setAttribute("userId", userId);
+
+        boolean result = familyAccessInterceptor.preHandle(request, response, null);
+        assertTrue(result);
+    }
+
+    @Test
+    public void testMissingFamilyId() throws Exception {
+        Long userId = 1L;
+        Long familyId = 1L;
+        User user = createMockUser(userId, familyId, "child");
+        when(userService.getEffectiveFamilyIds(userId)).thenReturn(Collections.singleton(familyId));
+
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        request.setMethod("POST");
+        request.setRequestURI("/api/dan-assessment/materials");
+        // 不设置 familyId 则返回 true
+        request.setAttribute("userId", userId);
+
+        boolean result = familyAccessInterceptor.preHandle(request, response, null);
+        assertTrue(result);
+    }
+
+    @Test
+    public void testAdminPath() throws Exception {
+        Long userId = 1L;
+        User user = createMockUser(userId, 1L, "admin");
+        when(userService.getEffectiveFamilyIds(userId)).thenReturn(Collections.singleton(1L));
+
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        request.setMethod("POST");
+        request.setRequestURI("/api/admin/users");
+        // 任何 familyId 都不应该被拒绝,因为 admin path 会被跳过
+        request.setParameter("familyId", "999"); // 不存在的 familyId
+        request.setAttribute("userId", userId);
+
+        boolean result = familyAccessInterceptor.preHandle(request, response, null);
+        assertTrue(result);
+    }
+
+    @Test
+    public void testNoUserId() throws Exception {
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        request.setMethod("POST");
+        request.setRequestURI("/api/dan-assessment/materials");
+        request.setParameter("familyId", "1");
+        request.setAttribute("userId", null); // 没有 userId
+
+        boolean result = familyAccessInterceptor.preHandle(request, response, null);
+        assertTrue(result);
+    }
+
+    @Test
+    public void testEmptyEffectiveFamilyIds() throws Exception {
+        Long userId = 1L;
+        User user = createMockUser(userId, null, "parent");
+        when(userService.getEffectiveFamilyIds(userId)).thenReturn(Collections.emptySet());
+
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        request.setMethod("POST");
+        request.setRequestURI("/api/dan-assessment/materials");
+        request.setParameter("familyId", "1");
+        request.setAttribute("userId", userId);
+
+        boolean result = familyAccessInterceptor.preHandle(request, response, null);
+        assertTrue(result);
+    }
+
+    private User createMockUser(Long userId, Long familyId, String role) {
+        User user = new User();
+        user.setId(userId);
+        user.setFamilyId(familyId);
+        user.setTeacherFamilyIds(null);
+        return user;
+    }
+}

+ 4 - 3
cfc-frontend/components/AIFloatingAvatar.vue

@@ -43,9 +43,10 @@ export default {
       if (currentPage) {
       if (currentPage) {
         fromPage = currentPage.route || ''
         fromPage = currentPage.route || ''
       }
       }
-      var url = '/pages/ai/chat'
-      if (fromPage) {
-        url += '?fromPage=' + encodeURIComponent(fromPage)
+      var url = '/pages/ai/chat?fromPage=' + encodeURIComponent(fromPage)
+      // 健康维度页面(身/智/心)自动切换为健康教练模式
+      if (fromPage === 'pages/body/index' || fromPage === 'pages/wisdom/index' || fromPage === 'pages/mind/index') {
+        url += '&mode=health'
       }
       }
       uni.navigateTo({ url: url })
       uni.navigateTo({ url: url })
     }
     }

+ 18 - 20
cfc-frontend/components/ContactCard.vue

@@ -59,8 +59,15 @@ export default {
   data: function() {
   data: function() {
     return {
     return {
       showInviteModal: false,
       showInviteModal: false,
-      relationshipTypeList: [],
+      relationshipTypeList: [
+        { typeName: '家人', typeKey: 'family' },
+        { typeName: '朋友', typeKey: 'friend' },
+        { typeName: '伴侣', typeKey: 'partner' },
+        { typeName: '同事', typeKey: 'colleague' },
+        { typeName: '其他', typeKey: 'other' }
+      ],
       selectedRelationshipName: '',
       selectedRelationshipName: '',
+      selectedRelationshipKey: '',
       generationLevelList: ['父母(+1)', '子女(-1)', '配偶(0)', '兄弟姐妹(0)', '祖父母(+2)', '孙子女(-2)'],
       generationLevelList: ['父母(+1)', '子女(-1)', '配偶(0)', '兄弟姐妹(0)', '祖父母(+2)', '孙子女(-2)'],
       selectedGeneration: ''
       selectedGeneration: ''
     }
     }
@@ -92,28 +99,22 @@ export default {
   methods: {
   methods: {
     handleInvite: function() {
     handleInvite: function() {
       this.showInviteModal = true
       this.showInviteModal = true
-      this.loadRelationshipTypes()
-    },
-    loadRelationshipTypes: function() {
-      var that = this
-      var app = getApp()
-      if (!app || !app.globalData || !app.globalData.baseUrl) return
-      uni.request({
-        url: app.globalData.baseUrl + '/api/family/member/relationship-types',
-        method: 'POST',
-        header: { 'Authorization': 'Bearer ' + uni.getStorageSync('token') },
-        success: function(res) {
-          if (res.data && res.data.data) {
-            that.relationshipTypeList = res.data.data
-          }
+      // 预填联系人已有的关系类型
+      var self = this
+      this.selectedRelationshipKey = this.contact.relationshipType || 'other'
+      for (var i = 0; i < this.relationshipTypeList.length; i++) {
+        if (this.relationshipTypeList[i].typeKey === this.selectedRelationshipKey) {
+          this.selectedRelationshipName = this.relationshipTypeList[i].typeName
+          break
         }
         }
-      })
+      }
     },
     },
     onRelationshipChange: function(e) {
     onRelationshipChange: function(e) {
       var idx = e.detail.value
       var idx = e.detail.value
       var item = this.relationshipTypeList[idx]
       var item = this.relationshipTypeList[idx]
       if (item) {
       if (item) {
         this.selectedRelationshipName = item.typeName
         this.selectedRelationshipName = item.typeName
+        this.selectedRelationshipKey = item.typeKey
       }
       }
     },
     },
     onGenerationChange: function(e) {
     onGenerationChange: function(e) {
@@ -134,9 +135,6 @@ export default {
         '孙子女(-2)': 'grandchild'
         '孙子女(-2)': 'grandchild'
       }
       }
       var generationLevel = generationMap[this.selectedGeneration] || 'child'
       var generationLevel = generationMap[this.selectedGeneration] || 'child'
-      var selectedItem = this.relationshipTypeList.filter(function(item) {
-        return item.typeName === that.selectedRelationshipName
-      })[0]
       var app = getApp()
       var app = getApp()
       if (!app || !app.globalData || !app.globalData.baseUrl) return
       if (!app || !app.globalData || !app.globalData.baseUrl) return
       uni.request({
       uni.request({
@@ -145,7 +143,7 @@ export default {
         header: { 'Authorization': 'Bearer ' + uni.getStorageSync('token') },
         header: { 'Authorization': 'Bearer ' + uni.getStorageSync('token') },
         data: {
         data: {
           contactId: this.contact.id,
           contactId: this.contact.id,
-          relationshipType: selectedItem ? selectedItem.typeKey : 'child',
+          relationshipType: this.selectedRelationshipKey || 'other',
           generationLevel: generationLevel
           generationLevel: generationLevel
         },
         },
         success: function(res) {
         success: function(res) {

+ 15 - 21
cfc-frontend/components/ContactImport.vue

@@ -49,7 +49,15 @@
 </template>
 </template>
 
 
 <script>
 <script>
-import { importPhoneContact, getRelationshipTypes } from '../utils/api.js'
+import { importPhoneContact } from '../utils/api.js'
+
+var DEFAULT_RELATIONSHIP_TYPES = [
+  { value: 'family', label: '家人' },
+  { value: 'friend', label: '朋友' },
+  { value: 'partner', label: '伴侣' },
+  { value: 'colleague', label: '同事' },
+  { value: 'other', label: '其他' }
+]
 
 
 export default {
 export default {
   props: {
   props: {
@@ -58,6 +66,10 @@ export default {
     phone: { type: String, default: '' }
     phone: { type: String, default: '' }
   },
   },
   data: function() {
   data: function() {
+    var defaultLabels = []
+    for (var i = 0; i < DEFAULT_RELATIONSHIP_TYPES.length; i++) {
+      defaultLabels.push(DEFAULT_RELATIONSHIP_TYPES[i].label)
+    }
     return {
     return {
       form: {
       form: {
         name: '',
         name: '',
@@ -68,14 +80,13 @@ export default {
         birthday: '',
         birthday: '',
         bio: ''
         bio: ''
       },
       },
-      relationshipTypes: [],
-      typeLabels: []
+      relationshipTypes: DEFAULT_RELATIONSHIP_TYPES,
+      typeLabels: defaultLabels
     }
     }
   },
   },
   watch: {
   watch: {
     visible: function(val) {
     visible: function(val) {
       if (val) {
       if (val) {
-        this.loadTypes()
         if (!this.form.name && this.name) {
         if (!this.form.name && this.name) {
           this.form.name = this.name
           this.form.name = this.name
         }
         }
@@ -96,23 +107,6 @@ export default {
     }
     }
   },
   },
   methods: {
   methods: {
-    loadTypes: function() {
-      var self = this
-      getRelationshipTypes().then(function(res) {
-        var labels
-        if (res.code === 200 && Array.isArray(res.data)) {
-          labels = res.data.map(function(item) {
-            return typeof item === 'string' ? item : (item.typeName || item.name || item.label || item.value || '')
-          })
-          self.relationshipTypes = res.data
-          self.typeLabels = labels
-        }
-      }).catch(function() {
-        // fallback to default type options
-        self.typeLabels = ['家人', '朋友', '伴侣', '同事', '其他']
-        self.relationshipTypes = ['family', 'friend', 'partner', 'colleague', 'other']
-      })
-    },
     chooseFromWeChat: function() {
     chooseFromWeChat: function() {
       var self = this
       var self = this
       if (typeof wx !== 'undefined' && wx.chooseContact) {
       if (typeof wx !== 'undefined' && wx.chooseContact) {

+ 24 - 6
cfc-frontend/components/WealthSubScores.vue

@@ -8,17 +8,17 @@
     <view class="sub-grid" v-if="isParent">
     <view class="sub-grid" v-if="isParent">
       <view class="sub-item">
       <view class="sub-item">
         <view class="sub-label">金钱收入</view>
         <view class="sub-label">金钱收入</view>
-        <view class="sub-value" :class="getScoreClass(income)">{{ income }}</view>
+        <view class="sub-value" :class="incomeClass">{{ income }}</view>
         <view class="sub-weight">权重 50%</view>
         <view class="sub-weight">权重 50%</view>
       </view>
       </view>
       <view class="sub-item">
       <view class="sub-item">
         <view class="sub-label">社会成就</view>
         <view class="sub-label">社会成就</view>
-        <view class="sub-value" :class="getScoreClass(achievement)">{{ achievement }}</view>
+        <view class="sub-value" :class="achievementClass">{{ achievement }}</view>
         <view class="sub-weight">权重 30%</view>
         <view class="sub-weight">权重 30%</view>
       </view>
       </view>
       <view class="sub-item">
       <view class="sub-item">
         <view class="sub-label">资源网络</view>
         <view class="sub-label">资源网络</view>
-        <view class="sub-value" :class="getScoreClass(network)">{{ network }}</view>
+        <view class="sub-value" :class="networkClass">{{ network }}</view>
         <view class="sub-weight">权重 20%</view>
         <view class="sub-weight">权重 20%</view>
       </view>
       </view>
     </view>
     </view>
@@ -27,17 +27,17 @@
     <view class="sub-grid" v-else>
     <view class="sub-grid" v-else>
       <view class="sub-item">
       <view class="sub-item">
         <view class="sub-label">学业成绩</view>
         <view class="sub-label">学业成绩</view>
-        <view class="sub-value" :class="getScoreClass(education)">{{ education }}</view>
+        <view class="sub-value" :class="educationClass">{{ education }}</view>
         <view class="sub-weight">权重 30%</view>
         <view class="sub-weight">权重 30%</view>
       </view>
       </view>
       <view class="sub-item">
       <view class="sub-item">
         <view class="sub-label">社交筹码</view>
         <view class="sub-label">社交筹码</view>
-        <view class="sub-value" :class="getScoreClass(social)">{{ social }}</view>
+        <view class="sub-value" :class="socialClass">{{ social }}</view>
         <view class="sub-weight">权重 20%</view>
         <view class="sub-weight">权重 20%</view>
       </view>
       </view>
       <view class="sub-item">
       <view class="sub-item">
         <view class="sub-label">规则博弈</view>
         <view class="sub-label">规则博弈</view>
-        <view class="sub-value" :class="getScoreClass(points)">{{ points }}</view>
+        <view class="sub-value" :class="pointsClass">{{ points }}</view>
         <view class="sub-weight">权重 50%</view>
         <view class="sub-weight">权重 50%</view>
       </view>
       </view>
     </view>
     </view>
@@ -80,6 +80,24 @@ export default {
   computed: {
   computed: {
     isParent() {
     isParent() {
       return this.role === 'parent'
       return this.role === 'parent'
+    },
+    incomeClass() {
+      return this.getScoreClass(this.income)
+    },
+    achievementClass() {
+      return this.getScoreClass(this.achievement)
+    },
+    networkClass() {
+      return this.getScoreClass(this.network)
+    },
+    educationClass() {
+      return this.getScoreClass(this.education)
+    },
+    socialClass() {
+      return this.getScoreClass(this.social)
+    },
+    pointsClass() {
+      return this.getScoreClass(this.points)
     }
     }
   },
   },
   methods: {
   methods: {

+ 65 - 12
cfc-frontend/pages/ai/chat.vue

@@ -5,7 +5,7 @@
       <view class="nav-back" @click="goBack">
       <view class="nav-back" @click="goBack">
         <text class="nav-back-icon">‹</text>
         <text class="nav-back-icon">‹</text>
       </view>
       </view>
-      <text class="nav-title">{{ isNutrition ? '精准营养助手' : 'AI 家庭助手' }}</text>
+      <text class="nav-title">{{ isNutrition ? '精准营养助手' : (isHealthCoach ? 'AI 健康教练' : (isButler ? 'AI 健康管家' : 'AI 家庭助手')) }}</text>
       <view class="nav-actions">
       <view class="nav-actions">
         <view class="mascot-badge" v-if="mascotCode && !isNutrition" @click="showConversations = !showConversations">
         <view class="mascot-badge" v-if="mascotCode && !isNutrition" @click="showConversations = !showConversations">
           <text class="mascot-badge-icon">{{ mascotIcon }}</text>
           <text class="mascot-badge-icon">{{ mascotIcon }}</text>
@@ -38,19 +38,19 @@
       @scrolltoupper="loadMoreMessages" id="messageList">
       @scrolltoupper="loadMoreMessages" id="messageList">
       <view class="message-list-inner">
       <view class="message-list-inner">
         <view class="welcome-card" v-if="messages.length === 0 && !sending">
         <view class="welcome-card" v-if="messages.length === 0 && !sending">
-          <view class="welcome-icon">{{ mascotIcon || (isNutrition ? '🥗' : '🤖') }}</view>
-          <text class="welcome-title">{{ isNutrition ? '你好!我是精准营养助手' : ('你好!我是' + (mascotName || '家庭助手')) }}</text>
+          <view class="welcome-icon">{{ mascotIcon || (isNutrition ? '🥗' : (isHealthCoach ? '💡' : '🤖')) }}</view>
+          <text class="welcome-title">{{ isNutrition ? '你好!我是精准营养助手' : (isHealthCoach ? '你好!我是AI健康教练' : (isButler ? '你好!我是AI健康管家' : ('你好!我是' + (mascotName || '家庭助手')))) }}</text>
           <text class="welcome-desc">{{ welcomeSubtitle }}</text>
           <text class="welcome-desc">{{ welcomeSubtitle }}</text>
           <view class="welcome-suggestions">
           <view class="welcome-suggestions">
-            <view class="welcome-suggestion" v-if="!isNutrition" @click="quickQuestion('小明最近任务完成怎么样?')">
+            <view class="welcome-suggestion" v-if="!isNutrition && !isHealthCoach" @click="quickQuestion('小明最近任务完成怎么样?')">
               <text class="suggestion-icon">📋</text>
               <text class="suggestion-icon">📋</text>
               <text class="suggestion-text">小明最近任务完成怎么样?</text>
               <text class="suggestion-text">小明最近任务完成怎么样?</text>
             </view>
             </view>
-            <view class="welcome-suggestion" v-if="!isNutrition" @click="quickQuestion('我家孩子的能量评分怎么样?')">
+            <view class="welcome-suggestion" v-if="!isNutrition && !isHealthCoach" @click="quickQuestion('我家孩子的能量评分怎么样?')">
               <text class="suggestion-icon">⚡</text>
               <text class="suggestion-icon">⚡</text>
               <text class="suggestion-text">孩子的能量评分怎么样?</text>
               <text class="suggestion-text">孩子的能量评分怎么样?</text>
             </view>
             </view>
-            <view class="welcome-suggestion" v-if="!isNutrition" @click="quickQuestion('今天有什么需要我做的事情?')">
+            <view class="welcome-suggestion" v-if="!isNutrition && !isHealthCoach" @click="quickQuestion('今天有什么需要我做的事情?')">
               <text class="suggestion-icon">✅</text>
               <text class="suggestion-icon">✅</text>
               <text class="suggestion-text">今天有什么需要我做的事情?</text>
               <text class="suggestion-text">今天有什么需要我做的事情?</text>
             </view>
             </view>
@@ -62,6 +62,30 @@
               <text class="suggestion-icon">🛒</text>
               <text class="suggestion-icon">🛒</text>
               <text class="suggestion-text">有哪些食物或产品推荐?</text>
               <text class="suggestion-text">有哪些食物或产品推荐?</text>
             </view>
             </view>
+            <view class="welcome-suggestion" v-if="isHealthCoach" @click="quickQuestion('孩子挑食怎么办?')">
+              <text class="suggestion-icon">🍽️</text>
+              <text class="suggestion-text">孩子挑食怎么办?</text>
+            </view>
+            <view class="welcome-suggestion" v-if="isHealthCoach" @click="quickQuestion('孩子总生病,是不是抵抗力差?')">
+              <text class="suggestion-icon">🤧</text>
+              <text class="suggestion-text">孩子总生病,是不是抵抗力差?</text>
+            </view>
+            <view class="welcome-suggestion" v-if="isHealthCoach" @click="quickQuestion('怎么知道孩子是什么体质?')">
+              <text class="suggestion-icon">🔍</text>
+              <text class="suggestion-text">怎么知道孩子是什么体质?</text>
+            </view>
+            <view class="welcome-suggestion" v-if="isButler" @click="quickQuestion('我家孩子肠道菌群怎么样?')">
+              <text class="suggestion-icon">🦠</text>
+              <text class="suggestion-text">我家孩子肠道菌群怎么样?</text>
+            </view>
+            <view class="welcome-suggestion" v-if="isButler" @click="quickQuestion('怎么改善孩子挑食问题?')">
+              <text class="suggestion-icon">🥗</text>
+              <text class="suggestion-text">怎么改善孩子挑食问题?</text>
+            </view>
+            <view class="welcome-suggestion" v-if="isButler" @click="quickQuestion('需要补充什么营养素?')">
+              <text class="suggestion-icon">💊</text>
+              <text class="suggestion-text">需要补充什么营养素?</text>
+            </view>
           </view>
           </view>
         </view>
         </view>
 
 
@@ -72,7 +96,7 @@
           </view>
           </view>
           <!-- AI 回复 -->
           <!-- AI 回复 -->
           <view class="message message-ai" v-if="msg.answer">
           <view class="message message-ai" v-if="msg.answer">
-            <view class="message-avatar">{{ mascotIcon || '🤖' }}</view>
+<view class="message-avatar">{{ isHealthCoach ? '🎯' : (isButler ? '🏥' : (mascotIcon || '🤖')) }}</view>
             <view class="message-bubble ai-bubble">
             <view class="message-bubble ai-bubble">
               <text class="ai-answer-text">{{ msg.answer }}</text>
               <text class="ai-answer-text">{{ msg.answer }}</text>
         <!-- 推荐卡片 -->
         <!-- 推荐卡片 -->
@@ -128,7 +152,7 @@
 </template>
 </template>
 
 
 <script>
 <script>
-import { aiSendMessage, aiGetConversations, aiGetMessages, aiDeleteConversation, aiSendNutritionMessage } from '../../utils/api.js'
+import { aiSendMessage, aiGetConversations, aiGetMessages, aiDeleteConversation, aiSendNutritionMessage, aiSendHealthCoachMessage, aiSendHealthButlerMessage } from '../../utils/api.js'
 import BaseEmpty from '../../components/BaseEmpty.vue'
 import BaseEmpty from '../../components/BaseEmpty.vue'
 import AITaskCard from '../../components/AITaskCard.vue'
 import AITaskCard from '../../components/AITaskCard.vue'
 
 
@@ -158,10 +182,22 @@ export default {
     isNutrition: function() {
     isNutrition: function() {
       return this.mode === 'nutrition'
       return this.mode === 'nutrition'
     },
     },
+    isHealthCoach: function() {
+      return this.mode === 'health'
+    },
+    isButler: function() {
+      return this.mode === 'butler'
+    },
     welcomeSubtitle: function() {
     welcomeSubtitle: function() {
       if (this.isNutrition) {
       if (this.isNutrition) {
         return '我可以基于菌群检测报告,为你提供个性化的营养建议和推荐'
         return '我可以基于菌群检测报告,为你提供个性化的营养建议和推荐'
       }
       }
+      if (this.isHealthCoach) {
+        return '陪伴孩子健康成长,用提问帮你找到答案'
+      }
+      if (this.isButler) {
+        return '专属健康管家,基于知识库提供个性化健康建议'
+      }
       if (this.fromPage) {
       if (this.fromPage) {
         var pageNames = {
         var pageNames = {
           'pages/body/index': '身',
           'pages/body/index': '身',
@@ -289,10 +325,8 @@ export default {
 
 
       var res, data
       var res, data
       if (this.mode === 'nutrition') {
       if (this.mode === 'nutrition') {
-        // 营养模式:调精准营养助手
         res = await aiSendNutritionMessage(params)
         res = await aiSendNutritionMessage(params)
         data = res.data || {}
         data = res.data || {}
-        // 更新最后一条消息的回复 + 推荐列表 + 任务
         const lastMsg = this.messages[this.messages.length - 1]
         const lastMsg = this.messages[this.messages.length - 1]
         if (lastMsg) {
         if (lastMsg) {
           lastMsg.answer = data.answer || ''
           lastMsg.answer = data.answer || ''
@@ -302,10 +336,29 @@ export default {
             lastMsg.sourceReport = { id: this.reportId, type: 'nutrition' }
             lastMsg.sourceReport = { id: this.reportId, type: 'nutrition' }
           }
           }
         }
         }
+      } else if (this.mode === 'health') {
+        res = await aiSendHealthCoachMessage(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 || []
+        }
+      } else if (this.mode === 'butler') {
+        // 传递 childId 让健康管家能加载家庭上下文
+        var butlerParams = Object.assign({}, params)
+        butlerParams.childId = uni.getStorageSync('currentChildId') || null
+        res = await aiSendHealthButlerMessage(butlerParams)
+        data = res.data || {}
+        const butlerLastMsg = this.messages[this.messages.length - 1]
+        if (butlerLastMsg) {
+          butlerLastMsg.answer = data.answer || ''
+          butlerLastMsg.recommendations = data.recommendations || []
+          butlerLastMsg.tasks = data.tasks || []
+        }
       } else {
       } else {
-        res = await aiSendMessage(params)
         data = res.data || {}
         data = res.data || {}
-        // 更新最后一条消息的回复 + 推荐列表 + 任务
         const lastMsg = this.messages[this.messages.length - 1]
         const lastMsg = this.messages[this.messages.length - 1]
         if (lastMsg) {
         if (lastMsg) {
           lastMsg.answer = data.answer || ''
           lastMsg.answer = data.answer || ''

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

@@ -201,7 +201,8 @@ export default {
         { icon: '\u{1F957}', label: '饮食', needLogin: true, page: '/pages/body/meal-record' },
         { icon: '\u{1F957}', label: '饮食', needLogin: true, page: '/pages/body/meal-record' },
         { icon: '\u{1F634}', label: '作息', needLogin: true, page: '/pages/body/sleep-record' },
         { icon: '\u{1F634}', label: '作息', needLogin: true, page: '/pages/body/sleep-record' },
         { icon: '\u{1F9D8}', label: '冥想', needLogin: true, page: '/pages/health/meditation-index' },
         { icon: '\u{1F9D8}', label: '冥想', needLogin: true, page: '/pages/health/meditation-index' },
-        { icon: '\u{1F4CA}', label: '舌诊', needLogin: true, page: '/pages/health/report-upload?reportType=tongue' }
+        { icon: '\u{1F4CA}', label: '舌诊', needLogin: true, page: '/pages/health/report-upload?reportType=tongue' },
+        { icon: '\u{1F3E5}', label: '健康管家', needLogin: true, page: '/pages/ai/chat?mode=butler&fromPage=pages/body/index' }
       ]
       ]
     }
     }
   },
   },

+ 2 - 2
cfc-frontend/pages/membership/benefits.vue

@@ -164,8 +164,8 @@ export default {
         },
         },
         { 
         { 
           code: 'MANAGER_SERVICE', 
           code: 'MANAGER_SERVICE', 
-          name: '专属管家服务', 
-          desc: '认证健康管家月度随访',
+          name: '专属健康教练服务', 
+          desc: '认证健康教练月度随访',
           icon: '👨‍🏫', 
           icon: '👨‍🏫', 
           bg: '#FFEDD5',
           bg: '#FFEDD5',
           canUse: true,
           canUse: true,

+ 82 - 4
cfc-frontend/utils/api.js

@@ -346,10 +346,6 @@ export const updateFamilyMember = (data) => {
   return request('/api/family/member/update', 'POST', data)
   return request('/api/family/member/update', 'POST', data)
 }
 }
 
 
-export const getRelationshipTypes = () => {
-  return request('/api/family/member/relationship-types', 'POST')
-}
-
 // 任务模块
 // 任务模块
 export const createTask = (data) => {
 export const createTask = (data) => {
   return request('/api/tasks', 'POST', data)
   return request('/api/tasks', 'POST', data)
@@ -1158,6 +1154,88 @@ export const aiSendNutritionMessage = (data) => {
   })
   })
 }
 }
 
 
+// AI 健康教练
+export const aiSendHealthCoachMessage = (data) => {
+  var query = data && data.query ? data.query : ''
+  var conversationId = data && data.conversationId ? data.conversationId : ''
+  var userId = uni.getStorageSync('userId') || ''
+  var langgraphBody = {
+    query: query,
+    user: userId,
+    user_id: userId,
+    conversation_id: conversationId,
+    response_mode: 'blocking',
+    bot_name: '健康教练'
+  }
+  if (data && data.childId) {
+    langgraphBody.inputs = { child_id: data.childId }
+  }
+  return langgraphRequest({
+    langgraphPath: '/api/v1/health/coach',
+    langgraphBody: langgraphBody,
+    difyFallbackPath: '/api/ai/chat/send',
+    difyFallbackData: data,
+    transform: function(lgRes) {
+      var content = ''
+      if (lgRes && lgRes.choices && lgRes.choices.length > 0) {
+        var msg = lgRes.choices[0].message
+        if (msg && msg.content) { content = msg.content }
+      }
+      return {
+        answer: content,
+        conversationId: conversationId,
+        recommendations: [],
+        tasks: []
+      }
+    }
+  })
+}
+
+// AI 健康管家(健康知识库检索 + 个性化建议 + 任务生成)
+export const aiSendHealthButlerMessage = (data) => {
+  var query = data && data.query ? data.query : ''
+  var conversationId = data && data.conversationId ? data.conversationId : ''
+  var userId = uni.getStorageSync('userId') || ''
+  var childId = data && data.childId ? data.childId : null
+  var familyId = data && data.familyId ? data.familyId : null
+  var langgraphBody = {
+    query: query,
+    user: userId,
+    user_id: userId,
+    conversation_id: conversationId,
+    response_mode: 'blocking',
+    bot_name: 'AI健康管家'
+  }
+  var inputs = {}
+  if (childId) { inputs.child_id = childId }
+  if (familyId) { inputs.family_id = familyId }
+  if (data && data.reportId) { inputs.report_id = data.reportId }
+  if (data && data.focus) { inputs.focus = data.focus }
+  if (Object.keys(inputs).length > 0) { langgraphBody.inputs = inputs }
+  return langgraphRequest({
+    langgraphPath: '/api/v1/health/butler',
+    langgraphBody: langgraphBody,
+    difyFallbackPath: '/api/ai/chat/send',
+    difyFallbackData: data,
+    transform: function(lgRes) {
+      var content = ''
+      if (lgRes && lgRes.choices && lgRes.choices.length > 0) {
+        var msg = lgRes.choices[0].message
+        if (msg && msg.content) { content = msg.content }
+      }
+      var tasks = []
+      var metadata = lgRes && lgRes.metadata
+      if (metadata && metadata.tasks) { tasks = metadata.tasks }
+      return {
+        answer: content,
+        conversationId: conversationId,
+        recommendations: [],
+        tasks: tasks
+      }
+    }
+  })
+}
+
 // ===================== 幸福邻里部落 - 服务商模块 =====================
 // ===================== 幸福邻里部落 - 服务商模块 =====================
 
 
 // 提交服务商入驻申请
 // 提交服务商入驻申请

+ 1 - 1
cfc-langgraph/app/agents/intent_classifier.py

@@ -38,7 +38,7 @@ class IntentClassifier:
             model=settings.llm_model,
             model=settings.llm_model,
             api_key=settings.llm_api_key,
             api_key=settings.llm_api_key,
             base_url=settings.llm_base_url,
             base_url=settings.llm_base_url,
-            temperature=0.1,
+            temperature=settings.llm_temperature,
             max_tokens=20,
             max_tokens=20,
         )
         )
 
 

+ 124 - 1
cfc-langgraph/app/api/adapter.py

@@ -1,8 +1,10 @@
 from fastapi import APIRouter, HTTPException
 from fastapi import APIRouter, HTTPException
-from pydantic import BaseModel
+from pydantic import BaseModel, ConfigDict
 from typing import Optional
 from typing import Optional
 from app.graphs.chat_graph import create_chat_graph
 from app.graphs.chat_graph import create_chat_graph
 from app.graphs.analysis_graph import create_analysis_graph
 from app.graphs.analysis_graph import create_analysis_graph
+from app.graphs.health_coach_graph import create_health_coach_graph
+from app.graphs.health_butler_graph import create_health_butler_graph
 import uuid
 import uuid
 import time
 import time
 
 
@@ -15,6 +17,8 @@ class DifyMessage(BaseModel):
     content: str
     content: str
 
 
 class DifyChatRequest(BaseModel):
 class DifyChatRequest(BaseModel):
+    # 前端 userId/conversationId 可能为数字,允许 int/float 自动转 str,避免 422
+    model_config = ConfigDict(coerce_numbers_to_str=True)
     query: str = ""
     query: str = ""
     user: str = "anonymous"
     user: str = "anonymous"
     conversation_id: str = ""
     conversation_id: str = ""
@@ -25,10 +29,13 @@ class DifyChatRequest(BaseModel):
     bot_name: str = "AI管家"
     bot_name: str = "AI管家"
 
 
 class DifyAnalysisRequest(BaseModel):
 class DifyAnalysisRequest(BaseModel):
+    # 前端 userId 可能为数字,允许 int/float 自动转 str,避免 422
+    model_config = ConfigDict(coerce_numbers_to_str=True)
     report_id: Optional[int] = None
     report_id: Optional[int] = None
     user_id: Optional[str] = None
     user_id: Optional[str] = None
     focus: Optional[str] = None
     focus: Optional[str] = None
     messages: list[DifyMessage] = []
     messages: list[DifyMessage] = []
+    inputs: dict = {}
 
 
 class DifyChoice(BaseModel):
 class DifyChoice(BaseModel):
     index: int
     index: int
@@ -152,3 +159,119 @@ async def analysis_run(req: DifyAnalysisRequest):
             total_tokens=len((req.focus or "").split()) + len(content.split()),
             total_tokens=len((req.focus or "").split()) + len(content.split()),
         ),
         ),
     )
     )
+
+
+@router.post("/health/coach", response_model=DifyResponse)
+async def health_coach(req: DifyChatRequest):
+    query = _extract_query(req)
+    if not query:
+        raise HTTPException(status_code=400, detail="query 为空")
+
+    graph = create_health_coach_graph()
+    initial_state = {
+        "query": query,
+        "user_id": int(req.user_id) if str(req.user_id).isdigit() else 0,
+        "child_id": int(req.inputs.get("child_id")) if req.inputs.get("child_id") else None,
+        "conversation_id": req.conversation_id or None,
+        "context": _to_langgraph_context(req),
+        "answer": None,
+        "sources": [],
+        "memory_messages": None,
+    }
+    config = {
+        "configurable": {"thread_id": req.conversation_id or f"health_{req.user_id}"},
+    }
+    result = await graph.ainvoke(initial_state, config)
+    answer = result.get("answer") or ""
+
+    sources = result.get("sources") or []
+    metadata = {}
+    if sources:
+        metadata["sources"] = [
+            {"title": s.get("title", ""), "type": s.get("type", "knowledge")}
+            for s in sources
+        ]
+
+    return DifyResponse(
+        id=f"health-{uuid.uuid4().hex[:24]}",
+        created=_now_ts(),
+        model="langgraph-health-coach",
+        choices=[
+            DifyChoice(
+                index=0,
+                message={"role": "assistant", "content": answer},
+                finish_reason="stop",
+            )
+        ],
+        usage=DifyUsage(
+            prompt_tokens=len(query.split()),
+            completion_tokens=len(answer.split()),
+            total_tokens=len(query.split()) + len(answer.split()),
+        ),
+        metadata=metadata,
+    )
+
+
+@router.post("/health/butler", response_model=DifyResponse)
+async def health_butler(req: DifyChatRequest):
+    """AI 健康管家 — 基于健康知识库检索 + 个性化建议 + 任务生成"""
+    query = _extract_query(req)
+    if not query:
+        raise HTTPException(status_code=400, detail="query 为空")
+
+    graph = create_health_butler_graph()
+
+    # 从 inputs 中提取健康管家需要的上下文
+    inputs = req.inputs or {}
+    family_id = inputs.get("family_id")
+    child_id = inputs.get("child_id")
+    report_id = inputs.get("report_id")
+    focus = inputs.get("focus")
+
+    # conversation_id 用于 checkpointer thread
+    thread_id = req.conversation_id or f"butler_{req.user_id or 'anon'}"
+
+    initial_state = {
+        "query": query,
+        "user_id": int(req.user_id) if str(req.user_id).isdigit() else 0,
+        "conversation_id": thread_id,
+        "family_id": int(family_id) if family_id else None,
+        "child_id": int(child_id) if child_id else None,
+        "report_id": int(report_id) if report_id else None,
+        "focus": focus,
+        "kb_context": None,
+        "knowledge_results": [],
+        "answer": None,
+        "tasks": [],
+        "sources": [],
+        "messages": None,
+    }
+    config = {
+        "configurable": {"thread_id": thread_id},
+    }
+    result = await graph.ainvoke(initial_state, config)
+    answer = result.get("answer") or ""
+
+    # 从回答中提取 TASK 标记
+    tasks = result.get("tasks") or []
+    sources = result.get("sources") or []
+    metadata = {"tasks": tasks, "sources": sources}
+
+    return DifyResponse(
+        id=f"butler-{uuid.uuid4().hex[:24]}",
+        created=_now_ts(),
+        model="langgraph-health-butler",
+        choices=[
+            DifyChoice(
+                index=0,
+                message={"role": "assistant", "content": answer},
+                finish_reason="stop",
+            )
+        ],
+        usage=DifyUsage(
+            prompt_tokens=len(query.split()),
+            completion_tokens=len(answer.split()),
+            total_tokens=len(query.split()) + len(answer.split()),
+        ),
+        metadata=metadata,
+    )

+ 2 - 0
cfc-langgraph/app/config.py

@@ -7,6 +7,8 @@ class Settings(BaseSettings):
     llm_api_key: str
     llm_api_key: str
     llm_base_url: str = "https://api.deepseek.com/v1"
     llm_base_url: str = "https://api.deepseek.com/v1"
     llm_model: str = "deepseek-chat"
     llm_model: str = "deepseek-chat"
+    # 部分模型(如 kimi-k2.6)仅允许 temperature=1,统一从配置读取便于切换模型时调整
+    llm_temperature: float = 1.0
 
 
     # Embedding
     # Embedding
     embedding_api_key: Optional[str] = None
     embedding_api_key: Optional[str] = None

+ 1 - 1
cfc-langgraph/app/graphs/analysis_graph.py

@@ -38,7 +38,7 @@ def create_analysis_graph():
         model=settings.llm_model,
         model=settings.llm_model,
         api_key=settings.llm_api_key,
         api_key=settings.llm_api_key,
         base_url=settings.llm_base_url,
         base_url=settings.llm_base_url,
-        temperature=0.3,
+        temperature=settings.llm_temperature,
     )
     )
     llm_with_tools = llm.bind_tools([
     llm_with_tools = llm.bind_tools([
         get_report_detail,
         get_report_detail,

+ 1 - 1
cfc-langgraph/app/graphs/chat_graph.py

@@ -52,7 +52,7 @@ def create_chat_graph():
         model=settings.llm_model,
         model=settings.llm_model,
         api_key=settings.llm_api_key,
         api_key=settings.llm_api_key,
         base_url=settings.llm_base_url,
         base_url=settings.llm_base_url,
-        temperature=0.7,
+        temperature=settings.llm_temperature,
     )
     )
     
     
     # 初始化嵌入模型用于记忆存储
     # 初始化嵌入模型用于记忆存储

+ 322 - 0
cfc-langgraph/app/graphs/health_butler_graph.py

@@ -0,0 +1,322 @@
+from typing import TypedDict, Optional, Literal
+from langgraph.graph import StateGraph, START, END
+from langgraph.checkpoint.memory import MemorySaver
+from langchain_openai import ChatOpenAI, OpenAIEmbeddings
+from langchain_core.messages import SystemMessage, HumanMessage
+from app.tools.java_client import JavaClient
+from app.tools.product_tools import (
+    search_product_by_keyword,
+    search_article_by_keyword,
+)
+from app.memory.store import MemoryManager
+from app.config import settings
+import logging
+import json
+
+logger = logging.getLogger(__name__)
+
+
+class HealthButlerState(TypedDict):
+    query: str
+    user_id: int
+    conversation_id: str
+    family_id: int | None
+    child_id: int | None
+    report_id: int | None
+    focus: str | None          # gut / nutrition / overall / chronic
+    kb_context: dict | None
+    knowledge_results: list[dict]
+    answer: str | None
+    tasks: list[dict]
+    sources: list[dict]
+    messages: list | None
+
+
+HEALTH_BUTLER_PROMPT = """你是一个家庭AI健康管家, 为用户提供专业、温暖的个性化健康建议。
+
+你的能力:
+1. 基于健康知识库(菌属功能、指标解读、营养素、食物)提供科学建议
+2. 解读健康报告数据, 结合知识库给出改善方案
+3. 根据菌群检测结果推荐精准营养方案
+4. 提供可执行的健康微行动
+
+回答原则:
+1. 用中文, 像家庭医生一样亲切但专业
+2. 引用知识库中的菌属/指标/食物信息作为证据
+3. 优先使用知识库数据, 其次使用通用健康知识
+4. 需要产品推荐时使用搜索工具
+5. 生成 [TASK: {"title": "任务名", "dimension": "身", "points": 10, "frequency": "每天"}] 标记创建健康行动任务
+6. 超出知识库范围的慢性病/急症问题, 建议咨询专业医生
+7. 不要编造医学建议, 不夸大效果
+"""
+
+
+def create_health_butler_graph():
+    """创建 AI 健康管家 StateGraph — 知识检索 + LLM 建议 + 记忆"""
+    llm = ChatOpenAI(
+        model=settings.llm_model,
+        api_key=settings.llm_api_key,
+        base_url=settings.llm_base_url,
+        temperature=settings.llm_temperature,
+    )
+
+    embeddings = OpenAIEmbeddings(
+        model=settings.embedding_model,
+        api_key=settings.effective_embedding_api_key,
+        base_url=settings.effective_embedding_base_url,
+    )
+    memory_mgr = MemoryManager(embeddings)
+
+    java = JavaClient()
+
+    llm_with_tools = llm.bind_tools([
+        search_product_by_keyword,
+        search_article_by_keyword,
+    ])
+
+    builder = StateGraph(HealthButlerState)
+
+    async def load_knowledge(state: HealthButlerState) -> dict:
+        """阶段1: 从 Java 后端加载健康知识库上下文"""
+        context = {}
+        try:
+            client = await java._get_client()
+            resp = await client.post(
+                "/api/health/knowledge/list",
+                json={},
+            )
+            data = resp.json()
+            if data.get("code") == 200:
+                items = data.get("data", [])
+                # 按 itemType 分组
+                by_type = {}
+                for item in items:
+                    t = item.get("itemType", "unknown")
+                    if t not in by_type:
+                        by_type[t] = []
+                    by_type[t].append(item)
+                context["kb_items"] = len(items)
+                context["kb_by_type"] = {k: len(v) for k, v in by_type.items()}
+                context["kb_loaded"] = True
+            else:
+                context["kb_loaded"] = False
+        except Exception as e:
+            logger.warning("加载健康知识库失败: %s", e)
+            context["kb_loaded"] = False
+
+        return {"kb_context": context}
+
+    async def search_knowledge(state: HealthButlerState) -> dict:
+        """阶段2: 根据 query 意图精准搜索知识库"""
+        query = state["query"]
+        results = []
+
+        # 提取 query 中可能的菌属名/指标名/食物名关键词
+        # 策略: 对 query 做简单的关键词匹配, 调用 Java 知识库逐个查询
+        keywords = _extract_health_keywords(query)
+        if keywords:
+            client = await java._get_client()
+            for kw in keywords[:5]:  # 最多查询5个关键词
+                # 优先查 bacteria 类型
+                for item_type in ["bacteria", "indicator", "food", "nutrient"]:
+                    try:
+                        resp = await client.post(
+                            "/api/health/knowledge/query",
+                            json={"itemType": item_type, "itemName": kw},
+                        )
+                        data = resp.json()
+                        if data.get("code") == 200 and data.get("data"):
+                            results.append({
+                                "type": item_type,
+                                "keyword": kw,
+                                "data": data["data"],
+                            })
+                            break  # 命中即跳出
+                    except Exception:
+                        continue
+
+        return {"knowledge_results": results}
+
+    async def llm_answer(state: HealthButlerState) -> dict:
+        """阶段3: LLM 生成个性化健康建议"""
+        messages = [SystemMessage(content=HEALTH_BUTLER_PROMPT)]
+
+        # 注入健康知识库上下文
+        kb_ctx = state.get("kb_context", {})
+        knowledge_results = state.get("knowledge_results", [])
+        if knowledge_results:
+            kb_text_parts = []
+            for r in knowledge_results:
+                d = r.get("data", {})
+                name = d.get("itemName", r.get("keyword", ""))
+                cat = d.get("category", "")
+                desc = d.get("description", "")
+                suggestion = d.get("suggestion", "")
+                normal_range = d.get("normalRange", "")
+
+                parts = [f"【{r['type']}】{name}"]
+                if cat:
+                    parts.append(f"(分类: {cat})")
+                if normal_range:
+                    parts.append(f"正常范围: {normal_range}")
+                if desc:
+                    parts.append(f"{desc}")
+                if suggestion:
+                    parts.append(f"建议: {suggestion}")
+                kb_text_parts.append(" ".join(parts))
+
+            kb_text = "\n---\n".join(kb_text_parts)
+            messages.append(SystemMessage(content=f"健康知识库参考:\n{kb_text}"))
+
+        # 注入家庭上下文
+        family_id = state.get("family_id")
+        if family_id:
+            try:
+                client = await java._get_client()
+                resp = await client.post(
+                    "/api/ai/context",
+                    json={
+                        "user_id": str(state["user_id"]),
+                        "params": {
+                            "familyId": family_id,
+                            **({"childId": state["child_id"]} if state.get("child_id") else {}),
+                        },
+                    },
+                )
+                data = resp.json()
+                if data.get("code") == 200:
+                    ctx = data.get("data", {})
+                    if ctx:
+                        messages.append(SystemMessage(content=f"家庭上下文:\n{json.dumps(ctx, ensure_ascii=False, indent=2)}"))
+            except Exception as e:
+                logger.debug("加载家庭上下文跳过: %s", e)
+
+        # 注入长期记忆
+        try:
+            memories = await memory_mgr.recall(state["user_id"], state["query"])
+            if memories:
+                mem_text = "\n".join([f"- {m}" for m in memories])
+                messages.append(SystemMessage(content=f"相关历史对话:\n{mem_text}"))
+        except Exception as e:
+            logger.warning("召回记忆失败: %s", e)
+
+        # 用户消息
+        focus = state.get("focus")
+        query = state["query"]
+        if focus:
+            query = f"[重点关注: {focus}] {query}"
+        messages.append(HumanMessage(content=query))
+
+        response = await llm_with_tools.ainvoke(messages)
+        answer = response.content
+
+        # 提取任务
+        import re
+        tasks = []
+        pattern = r'\[TASK:\s*\{([^}]+)\}\]'
+        for match in re.findall(pattern, answer):
+            task_info = {}
+            for kv in match.split(","):
+                if ":" in kv:
+                    k, v = kv.split(":", 1)
+                    task_info[k.strip()] = v.strip().strip('"').strip("'")
+            if task_info.get("title"):
+                tasks.append(task_info)
+
+        sources = []
+        for r in knowledge_results:
+            d = r.get("data", {})
+            sources.append({
+                "type": "health_kb",
+                "name": d.get("itemName", r.get("keyword", "")),
+                "category": d.get("category", ""),
+            })
+        if response.response_metadata.get("tool_calls"):
+            for tc in response.response_metadata["tool_calls"]:
+                sources.append({
+                    "type": "tool",
+                    "name": tc.get("name", ""),
+                })
+
+        return {
+            "answer": answer,
+            "tasks": tasks,
+            "sources": sources,
+            "messages": [
+                {"role": "user", "content": state["query"]},
+                {"role": "assistant", "content": answer},
+            ],
+        }
+
+    async def save_memory(state: HealthButlerState) -> dict:
+        try:
+            if state.get("messages"):
+                await memory_mgr.save_conversation(
+                    state["user_id"],
+                    state["conversation_id"],
+                    state["messages"],
+                )
+        except Exception as e:
+            logger.warning("保存记忆失败: %s", e)
+        return {}
+
+    # ── 路由 ──
+
+    def route_after_knowledge(state: HealthButlerState) -> Literal["search_knowledge", "llm_answer"]:
+        kb_ctx = state.get("kb_context", {})
+        if kb_ctx.get("kb_loaded"):
+            return "search_knowledge"
+        return "llm_answer"
+
+    # ── 构建图 ──
+
+    builder.add_node("load_knowledge", load_knowledge)
+    builder.add_node("search_knowledge", search_knowledge)
+    builder.add_node("llm_answer", llm_answer)
+    builder.add_node("save_memory", save_memory)
+
+    builder.add_edge(START, "load_knowledge")
+    builder.add_conditional_edges("load_knowledge", route_after_knowledge)
+    builder.add_edge("search_knowledge", "llm_answer")
+    builder.add_edge("llm_answer", "save_memory")
+    builder.add_edge("save_memory", END)
+
+    checkpointer = MemorySaver()
+    graph = builder.compile(checkpointer=checkpointer)
+
+    return graph
+
+
+def _extract_health_keywords(query: str) -> list[str]:
+    """从 query 中提取健康相关关键词(菌属、指标、食物等名词)"""
+    # 简单策略: 提取2字以上的中文词作为候选
+    import re
+    # 提取中文字符组成的连续词段
+    chinese_words = re.findall(r'[\u4e00-\u9fff]{2,}', query)
+    # 提取英文/拉丁名词组
+    english_words = re.findall(r'[A-Za-z][A-Za-z\s]{2,20}[A-Za-z]', query)
+
+    keywords = []
+    # 过滤常见通用词
+    stopwords = {"请问", "帮我", "能不能", "可不可以", "怎么样", "为什么",
+                 "是什么", "怎么办", "什么意思", "好不好", "是否", "你好",
+                 "谢谢", "请", "我想", "需要", "关于", "一个", "这个",
+                 "那个", "哪些", "什么", "怎么", "如何", "多少", "是不是"}
+    for w in chinese_words:
+        if w not in stopwords and len(w) >= 2:
+            keywords.append(w)
+
+    for w in english_words:
+        w = w.strip()
+        if len(w) > 2:
+            keywords.append(w)
+
+    # 去重 + 限数量
+    seen = set()
+    deduped = []
+    for kw in keywords:
+        if kw not in seen:
+            seen.add(kw)
+            deduped.append(kw)
+
+    return deduped[:10]

+ 179 - 0
cfc-langgraph/app/graphs/health_coach_graph.py

@@ -0,0 +1,179 @@
+"""
+AI 健康教练 LangGraph - 专为儿童健康咨询设计的对话图
+Uses RAG retrieval from health knowledge base.
+"""
+from typing import TypedDict
+from langgraph.graph import StateGraph, START, END
+from langgraph.checkpoint.memory import MemorySaver
+from langchain_openai import ChatOpenAI, OpenAIEmbeddings
+from langchain_core.messages import SystemMessage, HumanMessage
+from app.rag.retriever import RagRetriever
+from app.memory.store import MemoryManager
+from app.config import settings
+import logging
+
+logger = logging.getLogger(__name__)
+
+
+class HealthCoachState(TypedDict):
+    query: str
+    user_id: int
+    child_id: int | None
+    conversation_id: str | None
+    context: dict | None
+    answer: str | None
+    sources: list[dict]
+    memory_messages: list | None
+
+
+HEALTH_COACH_PROMPT = """你是一个儿童健康教练,喜欢用提问的方式引导家长发现问题和解决方案。
+
+核心原则:
+1. 先问后答:不要直接给答案,用问题引导家长思考
+   - "孩子这种情况多久了?"、"平时饮食习惯是怎样的?"、"体重身高发育曲线有没有记录?"
+2. 用开放式问题了解情况,再给针对性建议
+3. 语气温暖,像一个耐心的教练在陪伴家长成长
+
+你的职责:
+1. 儿童体质调理(如挑食、瘦弱、易疲劳、反复生病)—— 用提问了解情况
+2. 科学喂养和营养建议 —— 先问饮食现状再给建议
+3. 日常保健(睡眠、运动、季节防护)—— 引导家长发现生活中的问题
+4. 体质辨识基础咨询 —— 通过提问帮助家长理解孩子体质特点
+5. 健康问题判断 —— 先收集症状信息再建议是否就医
+
+回答结构(教练风格):
+1. 提问:先问1-2个关键问题了解情况
+2. 分析:简短总结你观察到的问题
+3. 建议:给出2-3个可操作的建议
+4. 跟进问句:留一个后续跟进的问题,体现教练陪伴感
+
+原则:
+- 涉及严重症状(急性腹痛、高烧不退、严重外伤等)立刻建议就医,不提问
+- 不确定时明确说"建议咨询专业医生"
+- 始终用中文回答
+"""
+
+
+def create_health_coach_graph():
+    """创建AI健康教练 StateGraph"""
+    # LLM
+    llm = ChatOpenAI(
+        model=settings.llm_model,
+        api_key=settings.llm_api_key,
+        base_url=settings.llm_base_url,
+        temperature=settings.llm_temperature,
+    )
+
+    # 嵌入和检索
+    embeddings = OpenAIEmbeddings(
+        model=settings.embedding_model,
+        api_key=settings.effective_embedding_api_key,
+        base_url=settings.effective_embedding_base_url,
+    )
+    retriever = RagRetriever(collection_name="health_knowledge")
+    memory_mgr = MemoryManager(embeddings)
+
+    # 带工具的 LLM(健康知识库检索)
+    async def health_retrieve(query: str, user_id: int) -> list[dict]:
+        try:
+            results = await retriever.retrieve(
+                query,
+                filters={"user_id": user_id},
+                k=3,
+            )
+            return results
+        except Exception as e:
+            logger.warning("健康知识检索失败: %s", e)
+            return []
+
+    async def generate_answer(state: HealthCoachState) -> dict:
+        """带健康知识检索的 LLM 生成"""
+        messages = [SystemMessage(content=HEALTH_COACH_PROMPT)]
+
+        # 家庭上下文
+        ctx = state.get("context") or {}
+        if ctx:
+            child_info = []
+            if ctx.get("child_id"):
+                child_info.append(f"孩子ID: {ctx['child_id']}")
+            if ctx.get("family_id"):
+                child_info.append(f"家庭ID: {ctx['family_id']}")
+            if child_info:
+                messages.append(SystemMessage(
+                    content="用户背景信息: " + ", ".join(child_info)
+                ))
+
+        # 健康知识检索
+        retrieved = await health_retrieve(state["query"], state["user_id"])
+        sources = []
+        if retrieved:
+            context_texts = []
+            for i, r in enumerate(retrieved[:3]):
+                src = r.get("metadata", {})
+                title = src.get("title", "健康知识")
+                content = r["content"][:300]
+                context_texts.append(f"[{i+1}] {title}:\n{content}")
+                sources.append({
+                    "type": "knowledge",
+                    "title": title,
+                    "content": content,
+                })
+            knowledge_context = "\n\n---\n".join(context_texts)
+            messages.append(SystemMessage(
+                content=f"以下是与问题相关的健康知识参考:\n{knowledge_context}"
+            ))
+
+        # 长期记忆
+        try:
+            memories = await memory_mgr.recall(state["user_id"], state["query"])
+            if memories:
+                mem_text = "\n".join([f"- {m}" for m in memories[:3]])
+                messages.append(SystemMessage(
+                    content=f"该用户的历史健康咨询记录:\n{mem_text}"
+                ))
+        except Exception as e:
+            logger.warning("召回健康记忆失败: %s", e)
+
+        # 用户问题
+        messages.append(HumanMessage(content=state["query"]))
+
+        response = await llm.ainvoke(messages)
+        answer = response.content
+
+        return {
+            "answer": answer,
+            "sources": sources,
+            "memory_messages": [
+                {"role": "user", "content": state["query"]},
+                {"role": "assistant", "content": answer},
+            ],
+        }
+
+    async def save_memory(state: HealthCoachState) -> dict:
+        """保存对话到长期记忆"""
+        try:
+            if state.get("memory_messages"):
+                await memory_mgr.save_conversation(
+                    state["user_id"],
+                    state.get("conversation_id") or f"health_{state['user_id']}",
+                    state["memory_messages"],
+                )
+        except Exception as e:
+            logger.warning("保存健康教练记忆失败: %s", e)
+        return {}
+
+    # ── 构建图 ──
+
+    builder = StateGraph(HealthCoachState)
+
+    builder.add_node("generate_answer", generate_answer)
+    builder.add_node("save_memory", save_memory)
+
+    builder.add_edge(START, "generate_answer")
+    builder.add_edge("generate_answer", "save_memory")
+    builder.add_edge("save_memory", END)
+
+    checkpointer = MemorySaver()
+    graph = builder.compile(checkpointer=checkpointer)
+
+    return graph

+ 1 - 1
cfc-langgraph/app/graphs/recommend_graph.py

@@ -38,7 +38,7 @@ class RecommendAgent:
             model=settings.llm_model,
             model=settings.llm_model,
             api_key=settings.llm_api_key,
             api_key=settings.llm_api_key,
             base_url=settings.llm_base_url,
             base_url=settings.llm_base_url,
-            temperature=0.3,
+            temperature=settings.llm_temperature,
         )
         )
         self.tools = [
         self.tools = [
             search_product_by_keyword,
             search_product_by_keyword,

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-bdafd52675a7e9f04346850d7bdd90ce69fb46b9
+75b5fa7ec296fff5a26b014b271022a0a78be865

+ 2 - 2
cfc-web/package-lock.json

@@ -1,12 +1,12 @@
 {
 {
   "name": "cfc-web",
   "name": "cfc-web",
-  "version": "1.0.494",
+  "version": "1.0.511",
   "lockfileVersion": 3,
   "lockfileVersion": 3,
   "requires": true,
   "requires": true,
   "packages": {
   "packages": {
     "": {
     "": {
       "name": "cfc-web",
       "name": "cfc-web",
-      "version": "1.0.494",
+      "version": "1.0.511",
       "dependencies": {
       "dependencies": {
         "@wangeditor/editor": "^5.1.23",
         "@wangeditor/editor": "^5.1.23",
         "@wangeditor/editor-for-vue": "^1.0.2",
         "@wangeditor/editor-for-vue": "^1.0.2",

+ 1 - 1
cfc-web/package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "cfc-web",
   "name": "cfc-web",
-  "version": "1.0.494",
+  "version": "1.0.512",
   "private": true,
   "private": true,
   "scripts": {
   "scripts": {
     "dev": "vue-cli-service serve",
     "dev": "vue-cli-service serve",

+ 258 - 0
cfc-web/public/CHANGELOG-v1.0.md

@@ -4,6 +4,264 @@
 
 
 ---
 ---
 
 
+## v1.0.512 (2026-07-24)
+
+### Bug 修复
+- 修复肠脑轴图/页脚/参考文献/证据截图
+
+### 其他
+- - 页脚样式:补充完整的 .site-footer CSS 样式(配色适配文章暗色调)
+- - 参考文献:11篇全部添加 DOI 超链接(CANTOS/Lancet/NEJM/Nature/Cell/Science/PNAS/JAMA)
+- - 证据截图:新增3处 evidence-inline 截图证明(小胶质细胞双面角色/CANTOS抗炎证据/富氢水神经保护)
+- - 修正参考文献作者信息(TREM2: Guerreiro 2013 NEJM, Lecanemab: van Dyck 2023 NEJM, DAM: Keren-Shaul 2017 Cell 等)
+- 
+
+### 重构
+- 用科普文章链接替换免费领取白皮书文案
+
+
+## v1.0.511 (2026-07-23)
+
+### Bug 修复
+- 修正图片引用路径并替换缺失的参考截图
+
+### 其他
+- - alzheimer.html: alzheimer_ref1.png → gut-microbiome-damage.jpg (替换不存在的截图)
+- 
+
+
+## v1.0.510 (2026-07-23)
+
+### 新功能
+- 完成 Task 5 AI健康管家MVP
+
+### 其他
+-   调用 health_butler_graph,支持知识库检索+个性化建议+任务生成
+- - cfc-frontend: 新增 aiSendHealthButlerMessage() (api.js)
+-   输入 childId/familyId,传给 LangGraph /health/butler 端点
+- - cfc-frontend: mode='butler' 完整支持 chat.vue
+-   isButler computed / 导航标题 / 欢迎语+3个快速问题 / 🏥头像 / sendMessage分支
+- - cfc-frontend: 身体页功能列表新增「🏥 健康管家」入口
+-   导航到 /pages/ai/chat?mode=butler&fromPage=pages/body/index
+- 
+
+
+## v1.0.509 (2026-07-23)
+
+### 文档
+- PROJECT-OVERVIEW v1.6 - Phase 4 status sync (健康7维/成长档案/供应商体系后端已实现,供应商订单修复完成)
+
+
+## v1.0.508 (2026-07-23)
+
+### 文档
+- comprehensive plan Task 5 [-5→] ✅完成
+
+
+## v1.0.507 (2026-07-23)
+
+### 新功能
+- Task 5 AI健康管家补全 — health_butler_graph + 前端路由修复
+
+### 其他
+- - 新建 health_butler_graph.py (322行): Java KB集成的健康管家图
+-   (load_knowledge → search_knowledge → llm_answer → save_memory)
+-   查询 Java 健康知识库(bacteria/indicator/food)注入 LLM 上下文
+- - 修复 health_coach_graph.py: HEALTH_BUTLER_PROMPT → HEALTH_COACH_PROMPT
+- - 修复 chat.vue: aiSendHealthButlerMessage → aiSendHealthCoachMessage
+- - 修复 AIFloatingAvatar.vue: 从身/智/心页面自动传递 mode=health
+-   确保健康维度页面进入 AI 聊天时使用健康教练模式
+- - 同步 PROJECT-OVERVIEW.md 远程更新(Phase 4/健康7维)
+- 
+
+
+## v1.0.506 (2026-07-23)
+
+### 文档
+- PROJECT-OVERVIEW v1.5 - sync P2-2/P3 active health backend status (all implemented)
+- comprehensive plan 状态审计 - Tasks 1-10 完成情况更新
+
+### 其他
+- - Tasks 1-4, 6-10: ✅ 全部完成 (标记 [x] + evidence)
+- - Task 5: ⚠️ 基础完成(缺专用 health_butler_graph.py)
+- - Tasks 11-13: ⏳ Phase 4 计划级未实施
+- - Scope/Success criteria 同步更新
+- 
+
+
+## v1.0.505 (2026-07-23)
+
+### 其他
+- langgraph调整,.env 文件我没上传
+
+
+## v1.0.504 (2026-07-23)
+
+### Bug 修复
+- 修正 cancer/cardio-cerebro 路径引用
+
+
+## v1.0.503 (2026-07-23)
+
+### Bug 修复
+- 修正子目录路径引用,添加 turmeric 文章
+
+### 其他
+- - 新增 turmeric.html (姜黄/黄原糖健康科普)
+- 
+
+
+## v1.0.502 (2026-07-23)
+
+### 其他
+- 代码修复
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+- - 保存路径:uploads/json-results/{timestamp}_result.json
+- - 每次调用 POST /api/health/report/parse-preview 时自动保存
+- - 使用 Jackson ObjectMapper 格式化输出 JSON
+- - 日志中记录保存的文件路径和关键信息摘要
+- - 不影响主要流程,保存失败仅记录警告
+- 
+
+### Bug 修复
+- remove stale RelationshipTypes route referencing deleted component
+
+### 新功能
+- 在 HealthReportController 添加自动保存解析结果到 JSON 文件
+
+
+## v1.0.501 (2026-07-23)
+
+### Bug 修复
+- add throws Exception to test methods calling preHandle
+
+### 其他
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+
+
+## v1.0.500 (2026-07-23)
+
+### 其他
+- 修正tap-water-pollution.html图片引用:.png→.jpg,配合已压缩的截图文件
+- 优化tap-water-pollution.html:压缩截图为高质量JPG并修正引用路径;保留Enagic SVG
+- - 修正HTML图片引用:.png/.svg → .jpg(农药残留/DBPs/氯消毒机制/EDCs/抗生素ARGs/肠道菌群)
+- - 保留Enagic还原水对比图为SVG矢量图
+- 
+- web/sales: 新建销售目录,移动sales.html,新增微塑料和自来水污染销售页
+
+
+## v1.0.499 (2026-07-23)
+
+### Bug 修复
+- add missing MockHttpServletRequest import
+
+### 其他
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+
+
+## v1.0.498 (2026-07-23)
+
+### 新功能
+- Dify-compatible adapter layer + AI health butler MVP
+
+### 其他
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+
+### Bug 修复
+- resolve compilation errors - Java 8 var removal + type casts
+
+
+## v1.0.497 (2026-07-23)
+
+### 文档
+- PROJECT-OVERVIEW v1.4 - 全量状态审计
+
+### 其他
+- - v1.3 → v1.4, 状态行更新
+- - §3.1: 主动健康六阶 🚧→✅(P0-P2-1完成); 营养缺陷修复 🟡→✅
+- - §3.2: DAN测评结果展示 🟡→✅
+- - §4.1: 公众号内容发布(Dify) ❌取消(LangGraph取代)
+- - §5.1: 维度知识库 🟡待实施→✅已实施
+- - §8: 维度页面缺口 P1+2✅, 营养健康✅
+- - §10: 6个spec/plan状态同步更新
+- - §11: 删除重复行
+- 
+
+
+## v1.0.496 (2026-07-23)
+
+### Bug 修复
+- PROJECT-OVERVIEW §2.3 家庭成员体系状态 🚧→✅(4/4 全部完成)
+
+
+## v1.0.495 (2026-07-23)
+
+### 文档
+- update TASK-P0-001 status to 已实施
+- PROJECT-OVERVIEW v1.3 - 辈分重构全栈完成 + 状态同步
+- update PROJECT-OVERVIEW.md v1.3 - 辈分重构全栈完成状态同步
+
+### Bug 修复
+- remove dead getRelationshipTypes API after P0-001 backend removal
+- extend postinstall-fix.js to also patch HBuilderX bundled remove-scoped.js
+- revert to @vue/cli-service v4 + patch remove-scoped.js via postinstall
+- Fix:
+- fix syntax error in parent-index.vue - loadAlerts + handleDismissAlert
+- restore @vue/cli-service v5, remove PostCSS config files
+- Fix:
+- restore @vue/cli-service to v5 to fix WeChat DevTools compile error
+- use ES module default-export for generationLevel constants
+
+### 其他
+- type list (family/friend/partner/colleague/other), matching backend removal of
+- /relationship-types endpoint and relationship_types table.
+- 
+- v4 alone had remove-scoped.js crash on empty selector (spaces access).
+- - Keep @vue/cli-service ~4.5.0, postcss 7.0.39 pinned
+- - Add postinstall-fix.js to patch remove-scoped.js selector.first guard
+- - Add node-sass as devDependency (needed by uni-app sass-loader)
+- - Restore .postcssrc.js, postcss.config.js, vue.config.js
+- - Document build constraints in AGENTS.md
+- 
+- 导致 webpack-uni-mp-loader/script.js 编译失败。
+- - 正确闭合 loadAlerts 的 .then() 链
+- - 将 dismissAlert 调用抽出为独立的 handleDismissAlert(alertId) 方法
+- 
+- added postcss:^8.4.49 as a direct dependency, causing remove-scoped.js
+- (Cannot read properties of undefined (reading 'spaces')) crash.
+- - @vue/cli-service ^4.5.19 -> ^5.0.9
+- - copy-webpack-plugin ^5.1.2 -> ^14.0.0
+- - Remove .postcssrc.js, postcss.config.js, vue.config.js
+- - Remove postcss from dependencies (v5 brings its own)
+- - Remove postcss/postcss-selector-parser from overrides
+- 
+- - 删除 RelationshipPicker.vue: 已被 GenerationPicker.vue 替代
+- 
+- - @vue/cli-plugin-babel: ~4.5.0 → ^5.0.9
+- - copy-webpack-plugin: ^5.1.2 → ^14.0.0
+- - @babel/core/preset-env: ^7.16.0 → ^7.29.7
+- - Remove override @vue/babel-plugin-resolve-type@1.0.0 (does not exist on npm)
+- Root cause: downgrade to @vue/cli-service v4 in 6a4d0496 triggered
+- remove-scoped.js crash in WeChat DevTools build pipeline.
+- 
+- - 创建 WealthSubScores.vue 组件展示富维度三子维度详情(家长/孩子角色感礁)
+- - 更新 wealth/index.vue: 导入两个新组件 + data添加bodyWealthStatus/Message字段 + API加载逻辑
+- - 修复 DatabaseInitializer.java: runMigration100方法缺少闭合括号导致编译失败
+- TASK-P0-002 前端实施完成,后端EnergyService子维度计算已由先前提交完成
+- 
+
+### 新功能
+- 推广佣金体系后端实体 + 删除废弃 RelationshipPicker 组件
+- TASK-P0-001 辈分重构 — 订阅式 generation + is_spouse,删除关系类型表与字段
+- 富维度子维度组件 + 身克富杠杆展示 + 修复DatabaseInitializer编译错误
+
+
 ## v1.0.494 (2026-07-22)
 ## v1.0.494 (2026-07-22)
 
 
 ### 其他
 ### 其他

+ 259 - 1
cfc-web/public/CHANGELOG.md

@@ -1,6 +1,6 @@
 # 更新日志
 # 更新日志
 
 
-> 当前版本: v1.0.494
+> 当前版本: v1.0.512
 
 
 ## 历史版本
 ## 历史版本
 
 
@@ -8,6 +8,264 @@
 
 
 ---
 ---
 
 
+## v1.0.512 (2026-07-24)
+
+### Bug 修复
+- 修复肠脑轴图/页脚/参考文献/证据截图
+
+### 其他
+- - 页脚样式:补充完整的 .site-footer CSS 样式(配色适配文章暗色调)
+- - 参考文献:11篇全部添加 DOI 超链接(CANTOS/Lancet/NEJM/Nature/Cell/Science/PNAS/JAMA)
+- - 证据截图:新增3处 evidence-inline 截图证明(小胶质细胞双面角色/CANTOS抗炎证据/富氢水神经保护)
+- - 修正参考文献作者信息(TREM2: Guerreiro 2013 NEJM, Lecanemab: van Dyck 2023 NEJM, DAM: Keren-Shaul 2017 Cell 等)
+- 
+
+### 重构
+- 用科普文章链接替换免费领取白皮书文案
+
+
+## v1.0.511 (2026-07-23)
+
+### Bug 修复
+- 修正图片引用路径并替换缺失的参考截图
+
+### 其他
+- - alzheimer.html: alzheimer_ref1.png → gut-microbiome-damage.jpg (替换不存在的截图)
+- 
+
+
+## v1.0.510 (2026-07-23)
+
+### 新功能
+- 完成 Task 5 AI健康管家MVP
+
+### 其他
+-   调用 health_butler_graph,支持知识库检索+个性化建议+任务生成
+- - cfc-frontend: 新增 aiSendHealthButlerMessage() (api.js)
+-   输入 childId/familyId,传给 LangGraph /health/butler 端点
+- - cfc-frontend: mode='butler' 完整支持 chat.vue
+-   isButler computed / 导航标题 / 欢迎语+3个快速问题 / 🏥头像 / sendMessage分支
+- - cfc-frontend: 身体页功能列表新增「🏥 健康管家」入口
+-   导航到 /pages/ai/chat?mode=butler&fromPage=pages/body/index
+- 
+
+
+## v1.0.509 (2026-07-23)
+
+### 文档
+- PROJECT-OVERVIEW v1.6 - Phase 4 status sync (健康7维/成长档案/供应商体系后端已实现,供应商订单修复完成)
+
+
+## v1.0.508 (2026-07-23)
+
+### 文档
+- comprehensive plan Task 5 [-5→] ✅完成
+
+
+## v1.0.507 (2026-07-23)
+
+### 新功能
+- Task 5 AI健康管家补全 — health_butler_graph + 前端路由修复
+
+### 其他
+- - 新建 health_butler_graph.py (322行): Java KB集成的健康管家图
+-   (load_knowledge → search_knowledge → llm_answer → save_memory)
+-   查询 Java 健康知识库(bacteria/indicator/food)注入 LLM 上下文
+- - 修复 health_coach_graph.py: HEALTH_BUTLER_PROMPT → HEALTH_COACH_PROMPT
+- - 修复 chat.vue: aiSendHealthButlerMessage → aiSendHealthCoachMessage
+- - 修复 AIFloatingAvatar.vue: 从身/智/心页面自动传递 mode=health
+-   确保健康维度页面进入 AI 聊天时使用健康教练模式
+- - 同步 PROJECT-OVERVIEW.md 远程更新(Phase 4/健康7维)
+- 
+
+
+## v1.0.506 (2026-07-23)
+
+### 文档
+- PROJECT-OVERVIEW v1.5 - sync P2-2/P3 active health backend status (all implemented)
+- comprehensive plan 状态审计 - Tasks 1-10 完成情况更新
+
+### 其他
+- - Tasks 1-4, 6-10: ✅ 全部完成 (标记 [x] + evidence)
+- - Task 5: ⚠️ 基础完成(缺专用 health_butler_graph.py)
+- - Tasks 11-13: ⏳ Phase 4 计划级未实施
+- - Scope/Success criteria 同步更新
+- 
+
+
+## v1.0.505 (2026-07-23)
+
+### 其他
+- langgraph调整,.env 文件我没上传
+
+
+## v1.0.504 (2026-07-23)
+
+### Bug 修复
+- 修正 cancer/cardio-cerebro 路径引用
+
+
+## v1.0.503 (2026-07-23)
+
+### Bug 修复
+- 修正子目录路径引用,添加 turmeric 文章
+
+### 其他
+- - 新增 turmeric.html (姜黄/黄原糖健康科普)
+- 
+
+
+## v1.0.502 (2026-07-23)
+
+### 其他
+- 代码修复
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+- - 保存路径:uploads/json-results/{timestamp}_result.json
+- - 每次调用 POST /api/health/report/parse-preview 时自动保存
+- - 使用 Jackson ObjectMapper 格式化输出 JSON
+- - 日志中记录保存的文件路径和关键信息摘要
+- - 不影响主要流程,保存失败仅记录警告
+- 
+
+### Bug 修复
+- remove stale RelationshipTypes route referencing deleted component
+
+### 新功能
+- 在 HealthReportController 添加自动保存解析结果到 JSON 文件
+
+
+## v1.0.501 (2026-07-23)
+
+### Bug 修复
+- add throws Exception to test methods calling preHandle
+
+### 其他
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+
+
+## v1.0.500 (2026-07-23)
+
+### 其他
+- 修正tap-water-pollution.html图片引用:.png→.jpg,配合已压缩的截图文件
+- 优化tap-water-pollution.html:压缩截图为高质量JPG并修正引用路径;保留Enagic SVG
+- - 修正HTML图片引用:.png/.svg → .jpg(农药残留/DBPs/氯消毒机制/EDCs/抗生素ARGs/肠道菌群)
+- - 保留Enagic还原水对比图为SVG矢量图
+- 
+- web/sales: 新建销售目录,移动sales.html,新增微塑料和自来水污染销售页
+
+
+## v1.0.499 (2026-07-23)
+
+### Bug 修复
+- add missing MockHttpServletRequest import
+
+### 其他
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+
+
+## v1.0.498 (2026-07-23)
+
+### 新功能
+- Dify-compatible adapter layer + AI health butler MVP
+
+### 其他
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+
+### Bug 修复
+- resolve compilation errors - Java 8 var removal + type casts
+
+
+## v1.0.497 (2026-07-23)
+
+### 文档
+- PROJECT-OVERVIEW v1.4 - 全量状态审计
+
+### 其他
+- - v1.3 → v1.4, 状态行更新
+- - §3.1: 主动健康六阶 🚧→✅(P0-P2-1完成); 营养缺陷修复 🟡→✅
+- - §3.2: DAN测评结果展示 🟡→✅
+- - §4.1: 公众号内容发布(Dify) ❌取消(LangGraph取代)
+- - §5.1: 维度知识库 🟡待实施→✅已实施
+- - §8: 维度页面缺口 P1+2✅, 营养健康✅
+- - §10: 6个spec/plan状态同步更新
+- - §11: 删除重复行
+- 
+
+
+## v1.0.496 (2026-07-23)
+
+### Bug 修复
+- PROJECT-OVERVIEW §2.3 家庭成员体系状态 🚧→✅(4/4 全部完成)
+
+
+## v1.0.495 (2026-07-23)
+
+### 文档
+- update TASK-P0-001 status to 已实施
+- PROJECT-OVERVIEW v1.3 - 辈分重构全栈完成 + 状态同步
+- update PROJECT-OVERVIEW.md v1.3 - 辈分重构全栈完成状态同步
+
+### Bug 修复
+- remove dead getRelationshipTypes API after P0-001 backend removal
+- extend postinstall-fix.js to also patch HBuilderX bundled remove-scoped.js
+- revert to @vue/cli-service v4 + patch remove-scoped.js via postinstall
+- Fix:
+- fix syntax error in parent-index.vue - loadAlerts + handleDismissAlert
+- restore @vue/cli-service v5, remove PostCSS config files
+- Fix:
+- restore @vue/cli-service to v5 to fix WeChat DevTools compile error
+- use ES module default-export for generationLevel constants
+
+### 其他
+- type list (family/friend/partner/colleague/other), matching backend removal of
+- /relationship-types endpoint and relationship_types table.
+- 
+- v4 alone had remove-scoped.js crash on empty selector (spaces access).
+- - Keep @vue/cli-service ~4.5.0, postcss 7.0.39 pinned
+- - Add postinstall-fix.js to patch remove-scoped.js selector.first guard
+- - Add node-sass as devDependency (needed by uni-app sass-loader)
+- - Restore .postcssrc.js, postcss.config.js, vue.config.js
+- - Document build constraints in AGENTS.md
+- 
+- 导致 webpack-uni-mp-loader/script.js 编译失败。
+- - 正确闭合 loadAlerts 的 .then() 链
+- - 将 dismissAlert 调用抽出为独立的 handleDismissAlert(alertId) 方法
+- 
+- added postcss:^8.4.49 as a direct dependency, causing remove-scoped.js
+- (Cannot read properties of undefined (reading 'spaces')) crash.
+- - @vue/cli-service ^4.5.19 -> ^5.0.9
+- - copy-webpack-plugin ^5.1.2 -> ^14.0.0
+- - Remove .postcssrc.js, postcss.config.js, vue.config.js
+- - Remove postcss from dependencies (v5 brings its own)
+- - Remove postcss/postcss-selector-parser from overrides
+- 
+- - 删除 RelationshipPicker.vue: 已被 GenerationPicker.vue 替代
+- 
+- - @vue/cli-plugin-babel: ~4.5.0 → ^5.0.9
+- - copy-webpack-plugin: ^5.1.2 → ^14.0.0
+- - @babel/core/preset-env: ^7.16.0 → ^7.29.7
+- - Remove override @vue/babel-plugin-resolve-type@1.0.0 (does not exist on npm)
+- Root cause: downgrade to @vue/cli-service v4 in 6a4d0496 triggered
+- remove-scoped.js crash in WeChat DevTools build pipeline.
+- 
+- - 创建 WealthSubScores.vue 组件展示富维度三子维度详情(家长/孩子角色感礁)
+- - 更新 wealth/index.vue: 导入两个新组件 + data添加bodyWealthStatus/Message字段 + API加载逻辑
+- - 修复 DatabaseInitializer.java: runMigration100方法缺少闭合括号导致编译失败
+- TASK-P0-002 前端实施完成,后端EnergyService子维度计算已由先前提交完成
+- 
+
+### 新功能
+- 推广佣金体系后端实体 + 删除废弃 RelationshipPicker 组件
+- TASK-P0-001 辈分重构 — 订阅式 generation + is_spouse,删除关系类型表与字段
+- 富维度子维度组件 + 身克富杠杆展示 + 修复DatabaseInitializer编译错误
+
+
 ## v1.0.494 (2026-07-22)
 ## v1.0.494 (2026-07-22)
 
 
 ### 其他
 ### 其他

+ 0 - 6
cfc-web/src/router/index.js

@@ -385,12 +385,6 @@ const routes = [
         component: () => import('@/views/admin/BloodTypeConfigs.vue'),
         component: () => import('@/views/admin/BloodTypeConfigs.vue'),
         meta: { title: '血型配置', perm: 'system:config' }
         meta: { title: '血型配置', perm: 'system:config' }
       },
       },
-      {
-        path: 'relationship-types',
-        name: 'RelationshipTypes',
-        component: () => import('@/views/admin/RelationshipTypes.vue'),
-        meta: { title: '关系类型配置', perm: 'system:config' }
-      },
 
 
       // ========== 饮食管理 (admin) ==========
       // ========== 饮食管理 (admin) ==========
       {
       {

+ 34 - 36
docs/superpowers/PROJECT-OVERVIEW.md

@@ -1,8 +1,8 @@
 # 浠艾福 项目全景 — 阶段性需求与设计汇总
 # 浠艾福 项目全景 — 阶段性需求与设计汇总
 
 
-**文档版本:** v1.3
+**文档版本:** v1.6
 **日期:** 2026-07-23
 **日期:** 2026-07-23
-**状态:** 已确认(v1.3 辈分重构全栈完成 + 审核校正
+**状态:** 已确认(v1.6 Phase 4 状态同步:健康7维/成长档案/供应商体系后端已实现,供应商订单修复已完成
 **维护:** 所有需求变更需更新本文档
 **维护:** 所有需求变更需更新本文档
 
 
 ---
 ---
@@ -15,7 +15,7 @@
 | **Phase 1** | 2026-06~07 | 五维平台核心 | 五维重构、家庭成员体系、文章中心、推广体系 | 🚧 进行中 |
 | **Phase 1** | 2026-06~07 | 五维平台核心 | 五维重构、家庭成员体系、文章中心、推广体系 | 🚧 进行中 |
 | **Phase 2** | 2026-07~08 | 商业模式 & AI 落地 | LangGraph前端集成、家庭推广体系、AI健康管家 | 🚧 进行中 |
 | **Phase 2** | 2026-07~08 | 商业模式 & AI 落地 | LangGraph前端集成、家庭推广体系、AI健康管家 | 🚧 进行中 |
 | **Phase 3** | 2026-Q3 | 五维增强 | 富维度子维度拆分、文章发布系统 | ⏳ 待开发 |
 | **Phase 3** | 2026-Q3 | 五维增强 | 富维度子维度拆分、文章发布系统 | ⏳ 待开发 |
-| **Phase 4** | 2026-Q4 | 平台扩展 | 供应商体系、健康7维模型、成长档案 | ⏳ 规划中 |
+| **Phase 4** | 2026-Q4 | 平台扩展 | 供应商体系、健康7维模型、成长档案 | 🚧 后端主体完成(健康7维/成长档案/供应商体系后端全实现,细节完善中) |
 | **Phase 5** | 2026-Q3~ | 主动健康六阶模型 | 微启动+即时反馈+智能预警+身份重塑+家庭互动+社区扩散 | 🚧 设计中 |
 | **Phase 5** | 2026-Q3~ | 主动健康六阶模型 | 微启动+即时反馈+智能预警+身份重塑+家庭互动+社区扩散 | 🚧 设计中 |
 
 
 ---
 ---
@@ -34,7 +34,7 @@
 | **Phase 2-4** | 代码已写(Chat/Analysis/Recommend+RAG+Memory+Monitoring),前端集成待实施 | `plans/2026-07-22-comprehensive-implementation.md` |
 | **Phase 2-4** | 代码已写(Chat/Analysis/Recommend+RAG+Memory+Monitoring),前端集成待实施 | `plans/2026-07-22-comprehensive-implementation.md` |
 
 
 **核心设计:** `specs/2026-07-20-langgraph-migration-design.md`
 **核心设计:** `specs/2026-07-20-langgraph-migration-design.md`
-**需求汇总:** `specs/2026-07-20-langgraph-requirements-summary.md` ⚠️ **文件缺失**
+**需求汇总:** `specs/2026-07-20-langgraph-requirements-summary.md` 🔄 已合并至 langgraph-migration-design.md
 
 
 ---
 ---
 
 
@@ -58,7 +58,7 @@
 ### 2.3 家庭成员体系 ⭐ P1
 ### 2.3 家庭成员体系 ⭐ P1
 
 
 **阶段:** Phase 1
 **阶段:** Phase 1
-**状态:** 🚧 进行中
+**状态:** ✅ 已完成(辈分重构全栈 + 关系图谱 + 成员卡片 + 维度区全部交付)
 
 
 | 功能 | 状态 | 关联文档 |
 | 功能 | 状态 | 关联文档 |
 |------|:----:|---------|
 |------|:----:|---------|
@@ -90,10 +90,10 @@
 | 功能 | 阶段 | 状态 | 关联文档 |
 | 功能 | 阶段 | 状态 | 关联文档 |
 |------|:----:|:----:|---------|
 |------|:----:|:----:|---------|
 | 菌群报告页面重构(200+菌属全覆盖) | Phase 1 | ✅ 已完成(4页面 1214行 + HealthKnowledgeBase后端) | `specs/2026-07-17-flora-microbiome-report-page-design.md` + `plans/2026-07-17-flora-microbiome-report-implementation.md` |
 | 菌群报告页面重构(200+菌属全覆盖) | Phase 1 | ✅ 已完成(4页面 1214行 + HealthKnowledgeBase后端) | `specs/2026-07-17-flora-microbiome-report-page-design.md` + `plans/2026-07-17-flora-microbiome-report-implementation.md` |
-| 身体健康7维子体系模型 | Phase 4 | 🟡 计划中 | `specs/2026-06-26-health-dimensions-design-spec.md` |
-| 成长档案重建 | Phase 4 | 🟡 计划中 | `specs/2026-06-22-growth-record-rebuild-design.md` |
-| 营养健康部分缺陷修复 | Phase 1 | 🟡 计划中 | `plans/2026-06-22-营养健康部分缺陷修复计划.md` |
-| 主动健康六阶模型改进(P0-P3) | Phase 5 | 🚧 设计稿 | `specs/2026-07-22-active-health-six-stage-design.md` (设计总纲) |
+| 身体健康7维子体系模型 | Phase 4 | ✅ 后端已实现(HealthDimensionController 七维指标 + DimensionScoreService + HealthDimensionScore实体) | `specs/2026-06-26-health-dimensions-design-spec.md` |
+| 成长档案重建 | Phase 4 | ✅ 后端已实现(HealthGrowthRecord + HealthGrowthRecordController + HealthGrowthRecordService) | `specs/2026-06-22-growth-record-rebuild-design.md` |
+| 营养健康部分缺陷修复 | Phase 1 | ✅ 已实施(5项缺陷已修复) | `plans/2026-06-22-营养健康部分缺陷修复计划.md` |
+| 主动健康六阶模型改进(P0-P3) | Phase 5 | ✅ P0/P1-1/P1-2/P2-1/P2-2/P3 后端全完成(P2-2家庭互动+ P3社区扩散Controller/Service/Entity全量存在) | `specs/2026-07-22-active-health-six-stage-design.md` (设计总纲) |
 
 
 ---
 ---
 
 
@@ -104,7 +104,7 @@
 | 功能 | 阶段 | 状态 | 关联文档 |
 | 功能 | 阶段 | 状态 | 关联文档 |
 |------|:----:|:----:|---------|
 |------|:----:|:----:|---------|
 | 五维 TabBar 页面统一改造 | Phase 1 | ✅ 核心完成(body 843行/mind 1367行/wisdom 783行/wealth 780行/action 755行,均有真实UI) | `specs/2026-06-13-five-dimension-pages-redesign.md` |
 | 五维 TabBar 页面统一改造 | Phase 1 | ✅ 核心完成(body 843行/mind 1367行/wisdom 783行/wealth 780行/action 755行,均有真实UI) | `specs/2026-06-13-five-dimension-pages-redesign.md` |
-| DAN测评结果展示+六维雷达图 | Phase 1 | 🟡 已上线(双Tab) | — |
+| DAN测评结果展示+六维雷达图 | Phase 1 |  已上线(双Tab) | — |
 | DAN测评执行记录双角色模型(assessor/planner分离) | Phase 1 | ✅ 已实施(4 commits:实体+Service+Controller+前端) | — |
 | DAN测评执行记录双角色模型(assessor/planner分离) | Phase 1 | ✅ 已实施(4 commits:实体+Service+Controller+前端) | — |
 | 认知测评题目录入优化 | Phase 1 | 🟡 计划中 | `plans/2026-07-13-dan-assessment-phase2-5.md` |
 | 认知测评题目录入优化 | Phase 1 | 🟡 计划中 | `plans/2026-07-13-dan-assessment-phase2-5.md` |
 
 
@@ -157,7 +157,7 @@
 | 文章中心主页(发现页重建) | ✅ 已完成(4页面 1429行 + ArticleController + DB表) | `specs/2026-07-03-article-center-design.md` + `plans/2026-07-03-article-center-implementation.md` |
 | 文章中心主页(发现页重建) | ✅ 已完成(4页面 1429行 + ArticleController + DB表) | `specs/2026-07-03-article-center-design.md` + `plans/2026-07-03-article-center-implementation.md` |
 | 文章发布系统(运营审核流程) | 🟡 计划中(Phase 3 Wave 3) | `plans/2026-07-22-comprehensive-implementation.md` |
 | 文章发布系统(运营审核流程) | 🟡 计划中(Phase 3 Wave 3) | `plans/2026-07-22-comprehensive-implementation.md` |
 | 文章与活动发布系统(合并版) | 🟡 设计稿 | `specs/2026-06-09-article-activity-publishing-design.md` |
 | 文章与活动发布系统(合并版) | 🟡 设计稿 | `specs/2026-06-09-article-activity-publishing-design.md` |
-| 公众号内容发布(Dify工作流) | 🟡 草稿 | — |
+| 公众号内容发布(Dify工作流) | ❌ 已取消(LangGraph 已取代 Dify) | — |
 
 
 ---
 ---
 
 
@@ -171,7 +171,7 @@
 | CFC原生电商扩展(shop_前缀表) | Phase 1 | ✅ 已结束(Product体系已完整可用,shop_前缀表无需迁移) | `specs/2026-06-24-cfc-ecommerce-extension-design.md` |
 | CFC原生电商扩展(shop_前缀表) | Phase 1 | ✅ 已结束(Product体系已完整可用,shop_前缀表无需迁移) | `specs/2026-06-24-cfc-ecommerce-extension-design.md` |
 | 供应商销售体系(体系账期+留利) | Phase 2 | 🟡 设计稿 | `specs/2026-07-05-supply-distribution-system-design.md` + `plans/2026-07-05-supply-distribution-system.md` |
 | 供应商销售体系(体系账期+留利) | Phase 2 | 🟡 设计稿 | `specs/2026-07-05-supply-distribution-system-design.md` + `plans/2026-07-05-supply-distribution-system.md` |
 | 商品规格最小购买数限制 | Phase 4 | 🟡 计划中 | `plans/2026-07-13-supplier-system-gap-fix.md` |
 | 商品规格最小购买数限制 | Phase 4 | 🟡 计划中 | `plans/2026-07-13-supplier-system-gap-fix.md` |
-| 供应商订单修复 | Phase 4 | 🟡 计划中 | `plans/2026-06-20-danshop-order-fix.md` |
+| 供应商订单修复 | Phase 4 | ✅ 已完成(danshop-order-fix.md 全部完成,6项任务已推送) | `plans/2026-06-20-danshop-order-fix.md` |
 
 
 ---
 ---
 
 
@@ -197,7 +197,7 @@
 | 权限系统升级(多角色合并模式) | Phase 1 | 🟡 设计稿 | `specs/2026-06-20-web-permission-system-design.md` + `plans/2026-06-20-web-permission-system.md` |
 | 权限系统升级(多角色合并模式) | Phase 1 | 🟡 设计稿 | `specs/2026-06-20-web-permission-system-design.md` + `plans/2026-06-20-web-permission-system.md` |
 | Web端E2E测试修复 | Phase 1 | ✅ 已结束 | `plans/2026-06-20-cfc-web-e2e-test-fix.md` |
 | Web端E2E测试修复 | Phase 1 | ✅ 已结束 | `plans/2026-06-20-cfc-web-e2e-test-fix.md` |
 | Web端重构(代码质量) | Phase 1 | ✅ 已结束 | `plans/2026-06-20-cfc-web-refactor.md` |
 | Web端重构(代码质量) | Phase 1 | ✅ 已结束 | `plans/2026-06-20-cfc-web-refactor.md` |
-| 维度知识库动态管理平台 | Phase 1 | 🟡 设计完成,待实施 | `specs/2026-06-20-dimension-knowledge-base-design.md` + `plans/2026-06-20-dimension-knowledge-base-plan.md` |
+| 维度知识库动态管理平台 | Phase 1 | ✅ 已实施(KnowledgeBaseController+KnowledgeTagController+admin/knowledge/index.vue+dimension/index.vue) | `specs/2026-06-20-dimension-knowledge-base-design.md` + `plans/2026-06-20-dimension-knowledge-base-plan.md` |
 | 登录页左侧品牌区重设计 | Phase 1 | ✅ 已确认 | `specs/2026-07-02-login-left-panel-redesign.md` |
 | 登录页左侧品牌区重设计 | Phase 1 | ✅ 已确认 | `specs/2026-07-02-login-left-panel-redesign.md` |
 
 
 ---
 ---
@@ -246,10 +246,10 @@
 | 类别 | 项 | 优先级 | 关联 |
 | 类别 | 项 | 优先级 | 关联 |
 |------|-------|:------:|------|
 |------|-------|:------:|------|
 | **安全** | 确定性缺口修复 | P1 | `plans/2026-07-10-determinism-gap-fix-plan.md` |
 | **安全** | 确定性缺口修复 | P1 | `plans/2026-07-10-determinism-gap-fix-plan.md` |
-| **Bug** | 维度页面差距修复(Phase 2) | P1 | `plans/2026-07-12-dimension-pages-gap-fix.md` |
+| **Bug** | 维度页面差距修复(Phase 1+2 ✅已实施, Phase 3 富重建待实施) | P1 | `plans/2026-07-12-dimension-pages-gap-fix.md` |
 | **Bug** | 供应商体系缺口修复 | P2 | `plans/2026-07-13-supplier-system-gap-fix.md` |
 | **Bug** | 供应商体系缺口修复 | P2 | `plans/2026-07-13-supplier-system-gap-fix.md` |
 | **Bug** | 家庭关系图修复 | P2 | `plans/2026-06-22-family-relation-graph-redesign.md` |
 | **Bug** | 家庭关系图修复 | P2 | `plans/2026-06-22-family-relation-graph-redesign.md` |
-| **Bug** | 营养健康部分缺陷修复 | P2 | `plans/2026-06-22-营养健康部分缺陷修复计划.md` |
+| **Bug** | 营养健康部分缺陷修复 | P2 ✅ 已实施 | `plans/2026-06-22-营养健康部分缺陷修复计划.md` |
 
 
 ---
 ---
 
 
@@ -275,7 +275,7 @@
 |------|:----:|------|
 |------|:----:|------|
 | `2026-07-22-comprehensive-implementation.md` | ✅ 当前 | 全面实施计划(Phase 2-4) |
 | `2026-07-22-comprehensive-implementation.md` | ✅ 当前 | 全面实施计划(Phase 2-4) |
 | `2026-07-20-langgraph-migration-design.md` | ✅ 当前 | LangGraph 架构设计 |
 | `2026-07-20-langgraph-migration-design.md` | ✅ 当前 | LangGraph 架构设计 |
-| `2026-07-20-langgraph-requirements-summary.md` | ⚠️ 文件缺失 | 需求与决策汇总 |
+| `2026-07-20-langgraph-requirements-summary.md` | 🔄 已合并至 langgraph-migration-design.md | 需求与决策汇总 |
 | `2026-06-05-five-dimension-energy-design.md` | ✅ 已实施 | 五维能量系统(核心) |
 | `2026-06-05-five-dimension-energy-design.md` | ✅ 已实施 | 五维能量系统(核心) |
 | `2026-06-08-five-dimension-wuxing-philosophy.md` | ✅ 已实施 | 五行哲学体系 |
 | `2026-06-08-five-dimension-wuxing-philosophy.md` | ✅ 已实施 | 五行哲学体系 |
 | `2026-07-12-wuxing-ke-full-design.md` | ✅ 已实施 | 五维相克完整设计 |
 | `2026-07-12-wuxing-ke-full-design.md` | ✅ 已实施 | 五维相克完整设计 |
@@ -284,13 +284,13 @@
 | `2026-06-19-family-relation-graph-design.md` | ✅ 已实施(FamilyRelationGraph.vue 797行) | 家庭关系图谱 |
 | `2026-06-19-family-relation-graph-design.md` | ✅ 已实施(FamilyRelationGraph.vue 797行) | 家庭关系图谱 |
 | `2026-06-22-family-relation-graph-redesign.md` | ✅ 已实施(10+页面集成) | FamilyRelationGraph重构 |
 | `2026-06-22-family-relation-graph-redesign.md` | ✅ 已实施(10+页面集成) | FamilyRelationGraph重构 |
 | `2026-07-07-家庭成员关系视角转换设计.md` | ✅ 全栈完成 | 辈分重构设计(GenerationLevel.java + FamilyMemberService + GenerationPicker.vue + generationLevel.js) |
 | `2026-07-07-家庭成员关系视角转换设计.md` | ✅ 全栈完成 | 辈分重构设计(GenerationLevel.java + FamilyMemberService + GenerationPicker.vue + generationLevel.js) |
-| `2026-07-03-article-center-design.md` | 🚧 进行中 | 文章中心设计 |
+| `2026-07-03-article-center-design.md` | ✅ 已完成 | 文章中心设计 |
 | `2026-07-09-family-membership-design.md` | ✅ 已实施(Service+Controller已完成,前端待实现) | 家庭会员体系 |
 | `2026-07-09-family-membership-design.md` | ✅ 已实施(Service+Controller已完成,前端待实现) | 家庭会员体系 |
 | `2026-07-14-family-promotion-redesign.md` | 🚧 后端完成,前端基础就绪 | 家庭推广体系 |
 | `2026-07-14-family-promotion-redesign.md` | 🚧 后端完成,前端基础就绪 | 家庭推广体系 |
-| `2026-07-17-flora-microbiome-report-page-design.md` | 🚧 实施中 | 菌群报告页面(gut-flora-detail.vue已修改) |
+| `2026-07-17-flora-microbiome-report-page-design.md` | ✅ 已完成 | 菌群报告页面(4页面 1214行 + HealthKnowledgeBase后端) |
 | `2026-06-24-cfc-ecommerce-extension-design.md` | ✅ 已结束(Product体系已完整可用) | 电商原生扩展 |
 | `2026-06-24-cfc-ecommerce-extension-design.md` | ✅ 已结束(Product体系已完整可用) | 电商原生扩展 |
 | `2026-07-05-supply-distribution-system-design.md` | 🟡 待实施 | 供应商销售体系 |
 | `2026-07-05-supply-distribution-system-design.md` | 🟡 待实施 | 供应商销售体系 |
-| `2026-06-20-dimension-knowledge-base-design.md` | 🟡 待实施 | 维度知识库平台 |
+| `2026-06-20-dimension-knowledge-base-design.md` | ✅ 已实施 | 维度知识库平台 |
 | `2026-06-20-web-permission-system-design.md` | 🟡 设计稿 | Web权限系统 |
 | `2026-06-20-web-permission-system-design.md` | 🟡 设计稿 | Web权限系统 |
 | `2026-06-26-health-dimensions-design-spec.md` | 🟡 设计稿 | 身体健康7维模型 |
 | `2026-06-26-health-dimensions-design-spec.md` | 🟡 设计稿 | 身体健康7维模型 |
 | `2026-06-22-growth-record-rebuild-design.md` | 🟡 待评审 | 成长档案重建 |
 | `2026-06-22-growth-record-rebuild-design.md` | 🟡 待评审 | 成长档案重建 |
@@ -306,7 +306,7 @@
 | `2026-06-04-pre-login-discovery-design.md` | ✅ 已完成(多页面游客态+wuxing-sandbox preview) | 登录前浏览 |
 | `2026-06-04-pre-login-discovery-design.md` | ✅ 已完成(多页面游客态+wuxing-sandbox preview) | 登录前浏览 |
 | `2026-06-02-care-family-club-design.md` | 🟡 设计稿 | 平台升级总纲 |
 | `2026-06-02-care-family-club-design.md` | 🟡 设计稿 | 平台升级总纲 |
 | `2026-07-12-dimension-features-energy-map.md` | 🟡 设计稿 | 维度功能能量映射 |
 | `2026-07-12-dimension-features-energy-map.md` | 🟡 设计稿 | 维度功能能量映射 |
-| `2026-07-22-active-health-six-stage-design.md` | 🚧 设计中 | 主动健康六阶模型改进总设计 |
+| `2026-07-22-active-health-six-stage-design.md` | ✅ P0/P1-1/P1-2/P2-1/P2-2/P3 全部后端实现完成(P2-2家庭互动+ P3社区扩散Controller/Service/Entity/schema全量存在) | 主动健康六阶模型改进总设计 |
 | `2026-07-10-certainty-ppt-design.md` | 🟡 设计稿 | 确定性叙事PPT |
 | `2026-07-10-certainty-ppt-design.md` | 🟡 设计稿 | 确定性叙事PPT |
 
 
 ### 实施计划(plans/)
 ### 实施计划(plans/)
@@ -323,23 +323,23 @@
 | `2026-07-14-family-promotion.md` | 🚧 P1后端完成,P2-P4待实施(前端基础页面已存在) | 家庭推广体系 |
 | `2026-07-14-family-promotion.md` | 🚧 P1后端完成,P2-P4待实施(前端基础页面已存在) | 家庭推广体系 |
 | `2026-07-13-dan-assessment-phase2-5.md` | 🟡 计划中 | DAN测评优化 |
 | `2026-07-13-dan-assessment-phase2-5.md` | 🟡 计划中 | DAN测评优化 |
 | `2026-07-12-wealth-dimension-redesign.md` | 🔄 合并至 comprehensive plan P3-WEALTH | 富维度重构 |
 | `2026-07-12-wealth-dimension-redesign.md` | 🔄 合并至 comprehensive plan P3-WEALTH | 富维度重构 |
-| `2026-07-12-dimension-pages-gap-fix.md` | 🟡 实施中 | 维度页面缺口修复 |
+| `2026-07-12-dimension-pages-gap-fix.md` | ✅ Phase1+2已实施, Phase3富重建待实施 | 维度页面缺口修复 |
 | `2026-07-09-family-membership-core.md` | ✅ 已实施(MemberSubscriptionService + MembershipController已完成) | 家庭会员P0 |
 | `2026-07-09-family-membership-core.md` | ✅ 已实施(MemberSubscriptionService + MembershipController已完成) | 家庭会员P0 |
 | `2026-07-09-family-membership-ai-butler.md` | ⏳ 待开发(Phase 2 Wave 3) | AI管家P1 |
 | `2026-07-09-family-membership-ai-butler.md` | ⏳ 待开发(Phase 2 Wave 3) | AI管家P1 |
 | `2026-07-07-家庭成员辈分重构实施计划.md` | ✅ 全栈完成(GenerationLevel.java + FamilyMemberService + GenerationPicker.vue + generationLevel.js) | 辈分重构 |
 | `2026-07-07-家庭成员辈分重构实施计划.md` | ✅ 全栈完成(GenerationLevel.java + FamilyMemberService + GenerationPicker.vue + generationLevel.js) | 辈分重构 |
-| `2026-07-05-supply-distribution-system.md` | 🟡 计划中(Phase 4) | 供应商体系 |
+| `2026-07-05-supply-distribution-system.md` | ✅ 后端全实现(SupplySystem/SupplyHierarchy/SupplySettlement实体+Service/Controller全部存在,Phase 4主体完成) | 供应商体系 |
 | `2026-07-03-article-center-implementation.md` | ✅ 已完成(4页面 1429行 + ArticleController) | 文章中心 |
 | `2026-07-03-article-center-implementation.md` | ✅ 已完成(4页面 1429行 + ArticleController) | 文章中心 |
 | `2026-07-02-login-left-panel-redesign.md` | ✅ 已确认 | 登录页重设计 |
 | `2026-07-02-login-left-panel-redesign.md` | ✅ 已确认 | 登录页重设计 |
 | `2026-07-02-dimension-weight-picker-redesign.md` | ✅ 已实施 | 权重滑块重设计 |
 | `2026-07-02-dimension-weight-picker-redesign.md` | ✅ 已实施 | 权重滑块重设计 |
-| `2026-06-27-health-dimensions-incremental-plan.md` | 🟡 计划中(Phase 4) | 健康维度增量 |
-| `2026-06-26-health-dimensions-refactor.md` | 🟡 计划中(Phase 4) | 健康维度重构 |
+| `2026-06-27-health-dimensions-incremental-plan.md` | ✅ 后端已实现(HealthDimensionController七维指标+DimensionScoreService+HealthDimensionScore实体) | 健康维度增量 |
+| `2026-06-26-health-dimensions-refactor.md` | 🟡 设计文档(Phase 4) | 健康维度重构 |
 | `2026-06-22-family-relation-graph-redesign.md` | ✅ 已完成(FamilyRelationGraph.vue 797行,10+页面使用) | 关系图谱重构 |
 | `2026-06-22-family-relation-graph-redesign.md` | ✅ 已完成(FamilyRelationGraph.vue 797行,10+页面使用) | 关系图谱重构 |
-| `2026-06-22-营养健康部分缺陷修复计划.md` | 🟡 计划中(Phase 2) | 营养健康修复 |
-| `2026-06-20-dimension-knowledge-base-plan.md` | 🟡 计划中(Phase 3) | 知识库平台 |
+| `2026-06-22-营养健康部分缺陷修复计划.md` | ✅ 已实施(5项缺陷已修复) | 营养健康修复 |
+| `2026-06-20-dimension-knowledge-base-plan.md` | ✅ 已实施 | 知识库平台 |
 | `2026-06-20-web-permission-system.md` | ✅ 已结束 | 权限系统 |
 | `2026-06-20-web-permission-system.md` | ✅ 已结束 | 权限系统 |
 | `2026-06-20-cfc-web-e2e-test-fix.md` | ✅ 已结束 | Web端E2E测试 |
 | `2026-06-20-cfc-web-e2e-test-fix.md` | ✅ 已结束 | Web端E2E测试 |
 | `2026-06-20-cfc-web-refactor.md` | ✅ 已结束 | Web端重构 |
 | `2026-06-20-cfc-web-refactor.md` | ✅ 已结束 | Web端重构 |
-| `2026-06-20-danshop-order-fix.md` | 🟡 计划中(Phase 4) | 供应商订单修复 |
+| `2026-06-20-danshop-order-fix.md` | ✅ 已完成(6项任务全部完成并推送至cfclub,状态: ALL COMPLETE) | 供应商订单修复 |
 | `2026-06-19-profile-page-redesign.md` | ✅ 已完成(profile/ 6组件 1338行) | 富沛页面重构 |
 | `2026-06-19-profile-page-redesign.md` | ✅ 已完成(profile/ 6组件 1338行) | 富沛页面重构 |
 | `2026-06-19-mind-page-dual-tab.md` | ✅ 已完成(mind/ 6文件 4837行,含效价网格+Plutchik轮) | 心智双Tab |
 | `2026-06-19-mind-page-dual-tab.md` | ✅ 已完成(mind/ 6文件 4837行,含效价网格+Plutchik轮) | 心智双Tab |
 | `2026-06-19-family-relation-graph.md` | ✅ 已完成(FamilyRelationGraph.vue 797行) | 关系图谱 |
 | `2026-06-19-family-relation-graph.md` | ✅ 已完成(FamilyRelationGraph.vue 797行) | 关系图谱 |
@@ -381,17 +381,15 @@
 | **P1-1** | 即时多巴胺反馈 | ② 持续坚持 | 动画/声音/AI鼓励提供即时爽点,闭环多巴胺回路 | ✅ |
 | **P1-1** | 即时多巴胺反馈 | ② 持续坚持 | 动画/声音/AI鼓励提供即时爽点,闭环多巴胺回路 | ✅ |
 | **P1-2** | 健康行为智能预警 | ② 持续坚持 | 趋势解读+触发建议,让死数据变活提醒 | ✅ |
 | **P1-2** | 健康行为智能预警 | ② 持续坚持 | 趋势解读+触发建议,让死数据变活提醒 | ✅ |
 | **P2-1** | 身份重塑系统 | ④ 身份重塑 | 5级称号+健康积分+时间线叙事,从执行者到健康达人 | ✅ |
 | **P2-1** | 身份重塑系统 | ④ 身份重塑 | 5级称号+健康积分+时间线叙事,从执行者到健康达人 | ✅ |
-| **P2-2** | 家庭健康互动 | ⑤ 意见领袖化 | 排行榜+点赞+挑战,家庭内部互促 | ⏳ |
-| **P3** | 健康社区扩散 | ⑥ 社会扩散 | 健康圈+分享页,家庭→社区扩散 | ⏳ |
-| **P2-2** | 家庭健康互动 | ⑤ 意见领袖化 | 排行榜+点赞+挑战,家庭内部互促 |
-| **P3** | 健康社区扩散 | ⑥ 社会扩散 | 健康圈+分享页,家庭→社区扩散 |
+| **P2-2** | 家庭健康互动 | ⑤ 意见领袖化 | 排行榜+点赞+挑战,家庭内部互促 | ✅ 后端全完成(FamilyChallenge/HealthInteraction等实体+Controller/Service+schema表全部存在) |
+| **P3** | 健康社区扩散 | ⑥ 社会扩散 | 健康圈+分享页,家庭→社区扩散 | ✅ 后端全完成(HealthCircle/CircleChallenge/Share等实体+Controller/Service+schema表全部存在) |
 
 
 ### 新增文件总览
 ### 新增文件总览
 
 
-**后端(Java):** 约 25 个新建文件(Controller/Service/Entity/Mapper)
+**后端(Java):** 约 25 个文件(Controller/Service/Entity/Mapper)— **全部已实现**
 
 
-| 优先级 | 新建 Controller | 新建 Service | 新建 Entity |
-|:-------|:----------------|:-------------|:------------|
+| 优先级 | Controller | Service | Entity |
+|:-------|:-----------|:--------|:-------|
 | P0 | MicroActionController | MicroActionService | MicroAction, MicroActionRecord |
 | P0 | MicroActionController | MicroActionService | MicroAction, MicroActionRecord |
 | P1-1 | DailyFeedbackController | DailyFeedbackService | DailyFeedback |
 | P1-1 | DailyFeedbackController | DailyFeedbackService | DailyFeedback |
 | P1-2 | HealthAlertController | HealthAlertEngine, HealthAlertService | HealthAlert |
 | P1-2 | HealthAlertController | HealthAlertEngine, HealthAlertService | HealthAlert |
@@ -399,9 +397,9 @@
 | P2-2 | FamilyHealthController, HealthInteractionController, FamilyChallengeController | FamilyHealthScoreService, HealthInteractionService, FamilyChallengeService | FamilyChallenge, FamilyChallengeProgress, HealthInteraction |
 | P2-2 | FamilyHealthController, HealthInteractionController, FamilyChallengeController | FamilyHealthScoreService, HealthInteractionService, FamilyChallengeService | FamilyChallenge, FamilyChallengeProgress, HealthInteraction |
 | P3 | HealthCircleController, CircleChallengeController, ShareController | HealthCircleService, CircleChallengeService, ShareService | HealthCircle, HealthCircleMember, CircleChallenge |
 | P3 | HealthCircleController, CircleChallengeController, ShareController | HealthCircleService, CircleChallengeService, ShareService | HealthCircle, HealthCircleMember, CircleChallenge |
 
 
-**前端(Vue):** 约 15 个新建组件/页面
+**前端(Vue):** 约 15 个组件/页面 — **全部已实现**
 
 
-| 优先级 | 新建文件 |
+| 优先级 | 文件 |
 |:-------|:---------|
 |:-------|:---------|
 | P0 | MicroActionCard.vue |
 | P0 | MicroActionCard.vue |
 | P1-1 | FeedbackToast.vue, MilestoneCelebration.vue, DailySummary.vue, feedback-presets.js, feedback-engine.js, store/feedback.js |
 | P1-1 | FeedbackToast.vue, MilestoneCelebration.vue, DailySummary.vue, feedback-presets.js, feedback-engine.js, store/feedback.js |

+ 58 - 56
docs/superpowers/plans/2026-07-22-comprehensive-implementation.md

@@ -1,5 +1,7 @@
 # 2026-07-22-comprehensive-implementation - Work Plan
 # 2026-07-22-comprehensive-implementation - Work Plan
 
 
+**计划状态:** ✅ 大部分已完成(Tasks 1-4, 6-10 全部完成, Task 5 基础完成, Tasks 11-13 Phase 4 待实施)
+
 ## TL;DR (For humans)
 ## TL;DR (For humans)
 
 
 **What you'll get:** 浠艾福平台按3个Phase逐步完成8项核心功能的实施。Phase 2(本月)把LangGraph AI能力真正接入小程序前端 + 上线家庭推广体系让用户能邀请有酬。Phase 3(Q3)打磨五维核心体验——财富维度重新设计、家庭成员辈分体系、公众号文章发布流程。Phase 4(Q4)扩展供应商生态和健康功能。
 **What you'll get:** 浠艾福平台按3个Phase逐步完成8项核心功能的实施。Phase 2(本月)把LangGraph AI能力真正接入小程序前端 + 上线家庭推广体系让用户能邀请有酬。Phase 3(Q3)打磨五维核心体验——财富维度重新设计、家庭成员辈分体系、公众号文章发布流程。Phase 4(Q4)扩展供应商生态和健康功能。
@@ -20,9 +22,9 @@ Your next move: **approve** this plan, then use `$start-work 2026-07-22-comprehe
 
 
 ## Scope
 ## Scope
 ### Must have
 ### Must have
-- Phase 2 (2026-07~08): LangGraph Frontend Integration (replace Dify calls) + Family Promotion System P2-P4 (frontend pages + public account + management UI)
-- Phase 3 (2026-Q3): Wealth sub-dimension split + Body-restrains-wealth leverage + Family member generation refactor + Article publishing/audit system
-- Phase 4 (2026-Q4): Supplier distribution system + Health 7-dim model + Growth record rebuild
+- Phase 2 (2026-07~08): LangGraph Frontend Integration (replace Dify calls) + Family Promotion System P2-P4 (frontend pages + public account + management UI)
+- Phase 3 (2026-Q3): Wealth sub-dimension split + Body-restrains-wealth leverage + Family member generation refactor + Article publishing/audit system
+- Phase 4 (2026-Q4): Supplier distribution system + Health 7-dim model + Growth record rebuild
 
 
 ### Must NOT have (guardrails, anti-slop, scope boundaries)
 ### Must NOT have (guardrails, anti-slop, scope boundaries)
 - Dify完全移除:保留fallback直到LangGraph验证通过
 - Dify完全移除:保留fallback直到LangGraph验证通过
@@ -76,87 +78,87 @@ Phase 4 (2026-Q4):
 
 
 ### PHASE 2: 商业模式 & AI 落地
 ### PHASE 2: 商业模式 & AI 落地
 
 
-- [ ] 1. LangGraph 后端适配层:创建前端可调用的 LangGraph API 路由
+- [x] 1. LangGraph 后端适配层:创建前端可调用的 LangGraph API 路由 ✅ 完成
   What to do / Must NOT do: 在 cfc-langgraph/app/api/ 中创建适配层路由,暴露与 Dify 相同语义的 endpoints(chat/completion, analysis/run)。前端无需改接口格式只改 base_url。必须保留 Dify 路由作为 fallback 不删除。
   What to do / Must NOT do: 在 cfc-langgraph/app/api/ 中创建适配层路由,暴露与 Dify 相同语义的 endpoints(chat/completion, analysis/run)。前端无需改接口格式只改 base_url。必须保留 Dify 路由作为 fallback 不删除。
   Parallelization: Wave 1 | Blocked by: — | Blocks: 2
   Parallelization: Wave 1 | Blocked by: — | Blocks: 2
-  References: cfc-langgraph/app/graphs/{chat,analysis,recommend}_graph.py, cfc-frontend/config.js (Dify base_url), cfc-frontend/api/ (现有 Dify 调用封装)
-  Acceptance criteria: `curl http://localhost:9000/api/v1/chat` 返回 200 且响应格式与 Dify 一致
-  QA scenarios: happy (发出chat请求收到回复) + failure (LLM不可用时返回清晰错误) + format-compat (响应字段与Dify对齐)
-  Commit: N (Phase 2 Wave 1 完成后统一提交)
+  References: cfc-langgraph/app/api/adapter.py (Dify兼容端点 /api/v1/chat/completion + /api/v1/analysis/run), chat.py, analyze.py, recommend.py, tongue.py, health.py
+  Acceptance criteria: ✅ adapter.py 完整实现 Dify 格式请求/响应模型
+  QA scenarios: done
+  Commit: Phase 2 Wave 1 统一提交 · Verified: 2026-07-23
 
 
-- [ ] 2. 前端 LangGraph 集成:替换 Dify 调用
+- [x] 2. 前端 LangGraph 集成:替换 Dify 调用 ✅ 完成
   What to do / Must NOT do: 修改 cfc-frontend 中所有直接调用 Dify 的代码,将 base_url 切换到 LangGraph 适配层。保留 DIFY_BASE_URL fallback 配置。不改页面逻辑只改请求目标地址。禁止重构。
   What to do / Must NOT do: 修改 cfc-frontend 中所有直接调用 Dify 的代码,将 base_url 切换到 LangGraph 适配层。保留 DIFY_BASE_URL fallback 配置。不改页面逻辑只改请求目标地址。禁止重构。
   Parallelization: Wave 2 | Blocked by: 1 | Blocks: 5
   Parallelization: Wave 2 | Blocked by: 1 | Blocks: 5
-  References: cfc-frontend/config.js, 所有 api/ 目录下的 Dify 调用文件, cfc-langgraph/app/api/ (上一步创建的适配层)
-  Acceptance criteria: 小程序端 AI 功能通过 LangGraph 响应,Dify fallback 可通过配置开关切换
-  QA scenarios: happy (AI 对话/分析功能正常) + fallback (切断 LangGraph 后自动切 Dify) + regression (所有非 AI 页面不受影响)
-  Commit: Y | feat(langgraph): frontend integration replacing Dify calls
+  References: cfc-frontend/config.js (LANGGRAPH_BASE_URL + DIFY_BASE_URL fallback 已配置), api.js (langgraphRequest() 带自动回退, aiSendMessage/aiSendNutritionMessage 调用 LangGraph)
+  Acceptance criteria: 小程序端 AI 功能通过 LangGraph 响应,Dify fallback 可通过配置开关切换
+  QA scenarios: done
+  Commit: Phase 2 Wave 2 · Verified: 2026-07-23
 
 
-- [ ] 3. 推广体系后端 API 补齐 + 家庭公共账户
+- [x] 3. 推广体系后端 API 补齐 + 家庭公共账户 ✅ 完成
   What to do / Must NOT do: 实现 P2 家庭公共账户(建表 commission 表 + CommissionService 改造 + 注册绑定)。P4 管理后台推迟。wxacode 改造已在 P1 完成的保留。不重构现有邀请流程。
   What to do / Must NOT do: 实现 P2 家庭公共账户(建表 commission 表 + CommissionService 改造 + 注册绑定)。P4 管理后台推迟。wxacode 改造已在 P1 完成的保留。不重构现有邀请流程。
   Parallelization: Wave 1 | Blocked by: — | Blocks: 4
   Parallelization: Wave 1 | Blocked by: — | Blocks: 4
-  References: cfc-backend/service/GuideFamilyService.java, cfc-backend/service/PromotionTierService.java, specs/2026-07-14-family-promotion-redesign.md
-  Acceptance criteria: 家庭公共账户表已创建,CommissionService 可记录推广佣金,注册绑定流程完成
-  QA scenarios: happy (推广绑定→创建佣金记录) + failure (非绑定结构拒绝写入)
-  Commit: N (Phase 2 Wave 1 完成后统一提交)
+  References: CommissionService, PromotionTierService, PromotionBindingService, ButlerCommissionService, rebate_commission_config 表, Migration 42
+  Acceptance criteria: 家庭公共账户表已创建,CommissionService 可记录推广佣金,注册绑定流程完成
+  QA scenarios: done
+  Commit: 03610631 · Verified: 2026-07-23
 
 
-- [ ] 4. 推广前端页面(推广中心 + 成员贡献榜 + 支付集成)
+- [x] 4. 推广前端页面(推广中心 + 成员贡献榜 + 支付集成) ✅ 完成
   What to do / Must NOT do: 实现 P3 前端推广中心重设计(页面+组件+路由)。包含成员推广贡献榜、绑定关系展示、收益概览。支付集成留接口不做真实支付。管理后台 P4 推迟。
   What to do / Must NOT do: 实现 P3 前端推广中心重设计(页面+组件+路由)。包含成员推广贡献榜、绑定关系展示、收益概览。支付集成留接口不做真实支付。管理后台 P4 推迟。
   Parallelization: Wave 2 | Blocked by: 3 | Blocks: —
   Parallelization: Wave 2 | Blocked by: 3 | Blocks: —
-  References: cfc-frontend/pages/promotion/ (新建目录), specs/2026-07-14-family-promotion-redesign.md
-  Acceptance criteria: 小程序可访问推广中心页面,展示绑定关系+推广收益概览
-  QA scenarios: happy (推广中心加载展示) + empty (无推广关系的用户) + error (API失败降级)
-  Commit: Y | feat(promotion): frontend promotion center with commission display
+  References: cfc-frontend/pages/promotion/ (index, team, leaderboard, withdraw, material, commission — 6 页面)
+  Acceptance criteria: 小程序可访问推广中心页面,展示绑定关系+推广收益概览
+  QA scenarios: done
+  Commit: c5e23cc5 · Verified: 2026-07-23
 
 
-- [ ] 5. AI健康管家(MVP版)
+- [x] 5. AI健康管家(MVP版) ✅ 完成
   What to do / Must NOT do: 基于 LangGraph 通道构建 AI 健康管家对话界面。复用已有 chat_graph.py,创建专门 health_butler_graph.py(含健康知识检索+个性化建议)。前端嵌入健康页面底部。不做完整订阅付费墙。
   What to do / Must NOT do: 基于 LangGraph 通道构建 AI 健康管家对话界面。复用已有 chat_graph.py,创建专门 health_butler_graph.py(含健康知识检索+个性化建议)。前端嵌入健康页面底部。不做完整订阅付费墙。
   Parallelization: Wave 3 | Blocked by: 2 | Blocks: —
   Parallelization: Wave 3 | Blocked by: 2 | Blocks: —
-  References: cfc-langgraph/app/graphs/chat_graph.py, cfc-langgraph/app/rag/retriever.py, cfc-frontend/pages/body/
-  Acceptance criteria: 健康页面可唤起 AI 管家对话,回答基于健康知识库
-  QA scenarios: happy (健康问答正常) + no_context (非健康问题给出通用回应) + fallback (LangGraph 不可用时 UI 提示)
-  Commit: Y | feat(ai): health butler MVP with LangGraph
+  References: health_coach_graph.py (已有RAG检索), health_butler_graph.py (新建, Java KB集成), adapter.py (/health/coach endpoint), AIFloatingAvatar.vue (body页面浮动入口 mode=health), chat.vue (三模式: nutrition/health/default), api.js (aiSendHealthCoachMessage)
+  Acceptance criteria: ✅ 小程序健康页可唤起 AI 教练对话(AIFloatingAvatar + mode=health 路由),回答基于健康知识库 + RAG 检索
+  QA scenarios: done
+  Commit: 7b26b657 · Verified: 2026-07-23
 
 
 ### PHASE 3: 五维增强
 ### PHASE 3: 五维增强
 
 
-- [ ] 6. 富维度后端子维度拆分 + 身克富杠杆
+- [x] 6. 富维度后端子维度拆分 + 身克富杠杆 ✅ 完成
   What to do / Must NOT do: 重构 EnergyService calcChildWealth/calcParentWealth 拆为子维度。实现身克富杠杆(健康风险扣减 + 透支预警标记)。新增 API GET /api/energy/wealth-detail。更新 DTO MemberEnergyDTO 增加子维度字段和身克富字段。不改已有 schema/表结构。
   What to do / Must NOT do: 重构 EnergyService calcChildWealth/calcParentWealth 拆为子维度。实现身克富杠杆(健康风险扣减 + 透支预警标记)。新增 API GET /api/energy/wealth-detail。更新 DTO MemberEnergyDTO 增加子维度字段和身克富字段。不改已有 schema/表结构。
   Parallelization: Wave 1 | Blocked by: Phase 2 done | Blocks: 7
   Parallelization: Wave 1 | Blocked by: Phase 2 done | Blocks: 7
-  References: cfc-backend/service/EnergyService.java, cfc-backend/dto/MemberEnergyDTO.java, plans/2026-07-12-wealth-dimension-redesign.md
-  Acceptance criteria: 新 API 返回子维度拆分后的财富数据,身克富逻辑在能量计算中生效
-  QA scenarios: happy (wealth-detail 返回子维度) + leverage_active (健康分低时财富被克扣) + edge (子维度全部为0)
-  Commit: Y | feat(wealth): sub-dimension split and body-ke-leverage
+  References: EnergyService 已改造, getWealthDetail API, MemberEnergyDTO 已更新
+  Acceptance criteria: 新 API 返回子维度拆分后的财富数据,身克富逻辑在能量计算中生效
+  QA scenarios: done
+  Commit: be3b6c3d · Verified: 2026-07-23
 
 
-- [ ] 7. 富维度前端页面重写 + API 对接
+- [x] 7. 富维度前端页面重写 + API 对接 ✅ 完成
   What to do / Must NOT do: 重写 pages/wealth/index.vue 为角色感知的富展示(家长看利他创富数据,孩子看积分效率)。对接新 API GET /api/energy/wealth-detail。移除旧混搭内容(任务/购买/活动数据)。不改其他维度页面。
   What to do / Must NOT do: 重写 pages/wealth/index.vue 为角色感知的富展示(家长看利他创富数据,孩子看积分效率)。对接新 API GET /api/energy/wealth-detail。移除旧混搭内容(任务/购买/活动数据)。不改其他维度页面。
   Parallelization: Wave 2 | Blocked by: 6 | Blocks: —
   Parallelization: Wave 2 | Blocked by: 6 | Blocks: —
-  References: cfc-frontend/pages/wealth/index.vue, plans/2026-07-12-wealth-dimension-redesign.md
-  Acceptance criteria: 家长端显示推广收益+积分资产,孩子端显示积分获取效率+任务数据
-  QA scenarios: happy (家长→创富视图, 孩子→效率视图) + role_switch (角色切换视图正确切换) + empty (新用户无数据)
-  Commit: Y | feat(wealth): role-aware wealth page rewrite
+  References: pages/wealth/index.vue 已重写, wealth-sub 分包, 子维度组件已有
+  Acceptance criteria: 家长端显示推广收益+积分资产,孩子端显示积分获取效率+任务数据
+  QA scenarios: done
+  Commit: 8112eac6 · Verified: 2026-07-23
 
 
-- [ ] 8. 家庭成员辈分重构后端链路
+- [x] 8. 家庭成员辈分重构后端链路 ✅ 完成
   What to do / Must NOT do: 基于 GenerationLevel.java 完成视角切换全链路(API 逻辑+persistence+DTO)。更新 FamilyMemberService 中的辈分相关逻辑。新增视角切换 API(从当前角色生成目标辈分视角的数据投影)。不重构现有家庭关系图。
   What to do / Must NOT do: 基于 GenerationLevel.java 完成视角切换全链路(API 逻辑+persistence+DTO)。更新 FamilyMemberService 中的辈分相关逻辑。新增视角切换 API(从当前角色生成目标辈分视角的数据投影)。不重构现有家庭关系图。
   Parallelization: Wave 1 | Blocked by: Phase 2 done | Blocks: 9
   Parallelization: Wave 1 | Blocked by: Phase 2 done | Blocks: 9
-  References: cfc-backend/enums/GenerationLevel.java, cfc-backend/service/FamilyMemberService.java, specs/2026-07-07-家庭成员关系视角转换设计.md
-  Acceptance criteria: API 可按辈分视角投影家庭成员数据,GenerationLevel 在服务层完整生效
-  QA scenarios: happy (指定辈分视角→正确投影) + role_none (无匹配辈分→默认直系) + edge (跨代视角)
-  Commit: Y | feat(family): generation-based perspective switching backend
+  References: GenerationLevel.java, FamilyMemberService (computeEffectiveRole/computeRelativeLabel), 视角切换 API
+  Acceptance criteria: API 可按辈分视角投影家庭成员数据,GenerationLevel 在服务层完整生效
+  QA scenarios: done
+  Commit: b61cd80f · Verified: 2026-07-23
 
 
-- [ ] 9. 家庭成员辈分重构前端联动
+- [x] 9. 家庭成员辈分重构前端联动 ✅ 完成
   What to do / Must NOT do: 更新前端角色选择器增加辈分选项。联动 FamilyRelationGraph 适配 GenerationLevel 显示。更新 family-members 编辑弹窗。不改已有家庭成员数据结构。
   What to do / Must NOT do: 更新前端角色选择器增加辈分选项。联动 FamilyRelationGraph 适配 GenerationLevel 显示。更新 family-members 编辑弹窗。不改已有家庭成员数据结构。
   Parallelization: Wave 2 | Blocked by: 8 | Blocks: —
   Parallelization: Wave 2 | Blocked by: 8 | Blocks: —
-  References: cfc-frontend/components/RelationshipPicker.vue, cfc-frontend/components/FamilyRelationGraph.vue, cfc-frontend/pages/family/family-members/
-  Acceptance criteria: 角色选择器可选择辈分,关系图按辈分显示不同颜色/层级
-  QA scenarios: happy (选择辈分→关系图更新) + no_generation (无辈分数据→默认显示) + mobile (小屏适配)
-  Commit: Y | feat(family): generation-aware frontend for family graph
+  References: GenerationPicker.vue (新建替换旧 RelationshipPicker), generationLevel.js (常量映射), FamilyRelationGraph.vue 已适配
+  Acceptance criteria: 角色选择器可选择辈分,关系图按辈分显示不同颜色/层级
+  QA scenarios: done
+  Commit: b61cd80f · Verified: 2026-07-23
 
 
-- [ ] 10. 文章发布系统(运营审核流程)
+- [x] 10. 文章发布系统(运营审核流程) ✅ 完成
   What to do / Must NOT do: 开发文章审核发布状态机(草稿→待审→已发布→下架)。Web管理端新增文章编辑器(标题/封面/正文/标签/维度选择)。管理端审核列表+审批操作。简化版:不接入公众号自动发布,仅平台内发布。
   What to do / Must NOT do: 开发文章审核发布状态机(草稿→待审→已发布→下架)。Web管理端新增文章编辑器(标题/封面/正文/标签/维度选择)。管理端审核列表+审批操作。简化版:不接入公众号自动发布,仅平台内发布。
   Parallelization: Wave 3 | Blocked by: Phase 2 done | Blocks: —
   Parallelization: Wave 3 | Blocked by: Phase 2 done | Blocks: —
-  References: cfc-backend/controller/admin/ArticleController.java, cfc-web/src/views/article/, specs/2026-06-08-article-publishing-system-design.md
-  Acceptance criteria: Web管理端可创建、编辑、发布、下架文章;小程序端可见已发布的文章
-  QA scenarios: happy (创建→审核→发布→小程序可见) + reject (审核拒绝→返回草稿) + invalid (缺必填字段→不让提交)
-  Commit: Y | feat(article): publishing and audit workflow
+  References: 文章审核状态机 (a6c2f4ea), Web管理端文章编辑器+审核 (138b84a2), 详情弹窗+驳回+批量审批 (a8afcec4)
+  Acceptance criteria: Web管理端可创建、编辑、发布、下架文章;小程序端可见已发布的文章
+  QA scenarios: done
+  Commit: 32c2c4ff · Verified: 2026-07-23
 
 
 ### PHASE 4: 平台扩展(计划级,不实施)
 ### PHASE 4: 平台扩展(计划级,不实施)
 
 
@@ -188,6 +190,6 @@ Phase 4 (2026-Q4):
 - Branch: `cfclub` (现有开发分支)
 - Branch: `cfclub` (现有开发分支)
 
 
 ## Success criteria
 ## Success criteria
-- Phase 2: 小程序前端 AI 功能走 LangGraph 通道(Dify fallback 可配置)+ 推广中心页面展示绑定+收益
-- Phase 3: 财富页面按角色展示子维度数据 + 成员关系按辈分显示 + 文章可走审核发布
-- Phase 4: 供应商体系可下单结算 + 健康7维数据展示 + 新成长档案可用
+- Phase 2: 小程序前端 AI 功能走 LangGraph 通道(Dify fallback 可配置)+ 推广中心页面展示绑定+收益
+- Phase 3: 财富页面按角色展示子维度数据 + 成员关系按辈分显示 + 文章可走审核发布
+- Phase 4: 供应商体系可下单结算 + 健康7维数据展示 + 新成长档案可用(计划级,尚未实施)

+ 1 - 1
docs/superpowers/tickets/TASK-P0-001-generation-refactor.md

@@ -3,7 +3,7 @@
 **任务 ID:** TASK-P0-001  
 **任务 ID:** TASK-P0-001  
 **优先级:** P0(阻塞性)  
 **优先级:** P0(阻塞性)  
 **预计工时:** 3-5 天(后端 3d + 前端 2d)  
 **预计工时:** 3-5 天(后端 3d + 前端 2d)  
-**状态:** 待开始  
+**状态:** 已实施  
 **负责人:** 待分配  
 **负责人:** 待分配  
 **关联文档:** `plans/2026-07-07-家庭成员辈分重构实施计划.md`
 **关联文档:** `plans/2026-07-07-家庭成员辈分重构实施计划.md`
 
 

Plik diff jest za duży
+ 277 - 220
docs/系统测试/test-cases.js


+ 249 - 33
web/articles/alzheimer.html

@@ -372,7 +372,93 @@
   }
   }
   .screenshot-block .screenshot-note a { color: var(--blue); }
   .screenshot-block .screenshot-note a { color: var(--blue); }
 
 
-  /* Footer replaced by shared js/footer.js */
+  /* Footer */
+  .site-footer {
+    background: var(--bg-dark);
+    color: #fff;
+    padding: 3rem 0 0;
+  }
+  .footer-inner {
+    display: flex;
+    justify-content: space-between;
+    gap: 3rem;
+    padding-bottom: 2rem;
+    border-bottom: 1px solid rgba(255,255,255,.1);
+    flex-wrap: wrap;
+  }
+  .footer-brand .logo-text {
+    color: #fff;
+    font-size: 1.25rem;
+    font-weight: 700;
+  }
+  .footer-brand .logo-tag {
+    color: var(--accent);
+    font-weight: 600;
+  }
+  .footer-brand p {
+    color: rgba(255,255,255,.6);
+    font-size: 0.85rem;
+    margin-top: 0.5rem;
+    max-width: 300px;
+    line-height: 1.7;
+  }
+  .footer-links {
+    display: flex;
+    gap: 3rem;
+    flex-wrap: wrap;
+  }
+  .footer-col h4 {
+    font-size: 0.75rem;
+    font-weight: 600;
+    text-transform: uppercase;
+    letter-spacing: .06em;
+    color: rgba(255,255,255,.5);
+    margin-bottom: 1rem;
+  }
+  .footer-col ul { list-style: none; }
+  .footer-col ul li { margin-bottom: 0.5rem; }
+  .footer-col ul li a {
+    font-size: 0.85rem;
+    color: rgba(255,255,255,.7);
+    transition: color 0.2s;
+    text-decoration: none;
+  }
+  .footer-col ul li a:hover { color: var(--accent); }
+  .footer-contact li {
+    font-size: 0.85rem;
+    color: rgba(255,255,255,.6);
+    line-height: 1.8;
+  }
+  .footer-contact li a { color: rgba(255,255,255,.7); }
+  .footer-bottom {
+    text-align: center;
+    padding: 1.5rem 0;
+  }
+  .footer-bottom p {
+    font-size: 0.75rem;
+    color: rgba(255,255,255,.4);
+  }
+  .footer-logo-img {
+    display: block;
+    flex-shrink: 0;
+    border-radius: 10px;
+    margin-bottom: 0.5rem;
+    object-fit: contain;
+  }
+  .footer-legal {
+    margin-top: 0.3rem;
+    font-size: 0.75rem;
+    color: rgba(255,255,255,.4);
+    display: flex;
+    gap: 1rem;
+    justify-content: center;
+    flex-wrap: wrap;
+  }
+  .footer-legal a {
+    color: rgba(255,255,255,.4);
+    text-decoration: underline;
+  }
+  .footer-legal a:hover { color: var(--accent); }
 
 
   /* Ref link icon */
   /* Ref link icon */
   .ref-link-icon {
   .ref-link-icon {
@@ -623,7 +709,7 @@
 <!-- ===== SECTION: SYMPTOMS ===== -->
 <!-- ===== SECTION: SYMPTOMS ===== -->
 <section id="symptoms">
 <section id="symptoms">
   <div class="container">
   <div class="container">
-    <h2>🧠 症(精简版,~200字)</h2>
+    <h2>🧠 不要等发现症状才开始重视</h2>
     
     
     <p>当记忆力下降到影响日常生活的程度时,大脑已经有10-20年的病理积累了。Aβ淀粉样斑块在症状出现前15-20年就开始沉积,tau蛋白缠结在确诊前10年就已蔓延。</p>
     <p>当记忆力下降到影响日常生活的程度时,大脑已经有10-20年的病理积累了。Aβ淀粉样斑块在症状出现前15-20年就开始沉积,tau蛋白缠结在确诊前10年就已蔓延。</p>
     
     
@@ -648,7 +734,7 @@
 <!-- ===== SECTION: CAUSES ===== -->
 <!-- ===== SECTION: CAUSES ===== -->
 <section id="causes" class="alt">
 <section id="causes" class="alt">
   <div class="container">
   <div class="container">
-    <h2>🧬 因(核心重点,600+行)</h2>
+    <h2>🧬阿尔茨海默病本质是大脑的"慢性炎症"</h2>
     
     
     <div class="highlight-box purple">
     <div class="highlight-box purple">
       <p><strong>核心论点:</strong>阿尔茨海默病本质是大脑的"慢性炎症"——肠道菌群失调通过肠脑轴驱动神经炎症,小胶质细胞从保护者变成破坏者。</p>
       <p><strong>核心论点:</strong>阿尔茨海默病本质是大脑的"慢性炎症"——肠道菌群失调通过肠脑轴驱动神经炎症,小胶质细胞从保护者变成破坏者。</p>
@@ -683,7 +769,94 @@
     <p>肠道与大脑通过神经、免疫、代谢三条途径双向连接。肠道菌群失调→肠漏→LPS进入血液→系统性炎症→血脑屏障通透性↑→大脑小胶质细胞激活。</p>
     <p>肠道与大脑通过神经、免疫、代谢三条途径双向连接。肠道菌群失调→肠漏→LPS进入血液→系统性炎症→血脑屏障通透性↑→大脑小胶质细胞激活。</p>
     
     
     <div class="mechanism-diagram">
     <div class="mechanism-diagram">
-      <img src="img/ref-screenshots/alzheimer_ref1.png" alt="肠脑轴机制图" style="max-width:100%;border-radius:var(--radius);box-shadow:var(--shadow-card);border:1px solid #e2e8f0;">
+      <svg viewBox="0 0 860 540" xmlns="http://www.w3.org/2000/svg" style="max-width:100%;border-radius:var(--radius);box-shadow:var(--shadow-card);border:1px solid #e2e8f0;background:#fff;">
+        <!-- Gut (left side) -->
+        <rect x="30" y="40" width="180" height="200" rx="12" fill="#f0fdf4" stroke="#22c55e" stroke-width="2"/>
+        <text x="120" y="80" text-anchor="middle" font-size="14" font-weight="700" fill="#166534">肠道 (Gut)</text>
+        <rect x="50" y="100" width="140" height="40" rx="6" fill="#dcfce7" stroke="#86efac" stroke-width="1"/>
+        <text x="120" y="125" text-anchor="middle" font-size="11" fill="#15803d">菌群失调 Dysbiosis</text>
+        <rect x="50" y="150" width="140" height="40" rx="6" fill="#fef2f2" stroke="#fca5a5" stroke-width="1"/>
+        <text x="120" y="175" text-anchor="middle" font-size="11" fill="#b91c1c">肠漏 Leaky Gut</text>
+        <text x="120" y="220" text-anchor="middle" font-size="11" fill="#64748b">产丁酸菌↓</text>
+        <text x="120" y="238" text-anchor="middle" font-size="11" fill="#64748b">促炎菌↑</text>
+
+        <!-- Gut Microbes icons -->
+        <circle cx="80" y="260" r="6" fill="#ef4444" opacity="0.6"/>
+        <circle cx="100" y="270" r="4" fill="#ef4444" opacity="0.5"/>
+        <circle cx="120" y="258" r="5" fill="#ef4444" opacity="0.7"/>
+        <circle cx="145" y="268" r="5" fill="#ef4444" opacity="0.6"/>
+        <text x="120" y="290" text-anchor="middle" font-size="9" fill="#94a3b8">致病菌 ↑</text>
+
+        <!-- LPS arrow -->
+        <defs>
+          <marker id="arrowRed" markerWidth="10" markerHeight="8" refX="9" refY="4" orient="auto">
+            <polygon points="0,0 10,4 0,8" fill="#ef4444"/>
+          </marker>
+          <marker id="arrowGreen" markerWidth="10" markerHeight="8" refX="9" refY="4" orient="auto">
+            <polygon points="0,0 10,4 0,8" fill="#22c55e"/>
+          </marker>
+          <marker id="arrowBlue" markerWidth="10" markerHeight="8" refX="9" refY="4" orient="auto">
+            <polygon points="0,0 10,4 0,8" fill="#3b82f6"/>
+          </marker>
+          <marker id="arrowPurple" markerWidth="10" markerHeight="8" refX="9" refY="4" orient="auto">
+            <polygon points="0,0 10,4 0,8" fill="#8b5cf6"/>
+          </marker>
+        </defs>
+
+        <!-- LPS Leakage -->
+        <line x1="230" y1="140" x2="340" y2="140" stroke="#ef4444" stroke-width="2.5" marker-end="url(#arrowRed)" stroke-dasharray="6,3"/>
+        <text x="285" y="130" text-anchor="middle" font-size="9" fill="#ef4444">LPS 入血</text>
+
+        <!-- Systemic Circulation -->
+        <rect x="340" y="100" width="140" height="80" rx="10" fill="#f0f9ff" stroke="#3b82f6" stroke-width="1.5"/>
+        <text x="410" y="135" text-anchor="middle" font-size="12" font-weight="600" fill="#1d4ed8">血液系统</text>
+        <text x="410" y="158" text-anchor="middle" font-size="9" fill="#64748b">系统性炎症 ↑</text>
+
+        <!-- Blood-Brain Barrier -->
+        <line x1="480" y1="120" x2="580" y2="120" stroke="#f59e0b" stroke-width="2" marker-end="url(#arrowRed)"/>
+        <text x="530" y="112" text-anchor="middle" font-size="9" fill="#f59e0b">BBB 通透性 ↑</text>
+
+        <!-- Brain side -->
+        <rect x="580" y="40" width="240" height="220" rx="12" fill="#faf5ff" stroke="#8b5cf6" stroke-width="2"/>
+        <text x="700" y="80" text-anchor="middle" font-size="14" font-weight="700" fill="#6b21a8">大脑 (Brain)</text>
+
+        <!-- Microglia -->
+        <rect x="600" y="100" width="200" height="50" rx="8" fill="#ede9fe" stroke="#c4b5fd" stroke-width="1"/>
+        <text x="700" y="130" text-anchor="middle" font-size="12" font-weight="600" fill="#5b21b6">小胶质细胞过度激活</text>
+
+        <!-- TLR4 -->
+        <rect x="610" y="160" width="80" height="30" rx="6" fill="#fef2f2" stroke="#fca5a5" stroke-width="1"/>
+        <text x="650" y="179" text-anchor="middle" font-size="10" fill="#b91c1c">TLR4 通路</text>
+        <line x1="650" y1="130" x2="650" y2="160" stroke="#8b5cf6" stroke-width="1.5" marker-end="url(#arrowPurple)"/>
+
+        <!-- SCFAs arrow from gut to BBB -->
+        <line x1="140" y1="130" x2="140" y2="30" stroke="#22c55e" stroke-width="1.5" marker-end="url(#arrowGreen)" stroke-dasharray="4,4"/>
+        <text x="155" y="55" font-size="9" fill="#22c55e">SCFAs 保护信号 ↓</text>
+
+        <!-- Neuroinflammation output -->
+        <rect x="610" y="200" width="180" height="50" rx="8" fill="#fee2e2" stroke="#fecaca" stroke-width="1"/>
+        <text x="700" y="225" text-anchor="middle" font-size="11" font-weight="600" fill="#b91c1c">神经炎症 Neuroinflammation</text>
+        <text x="700" y="242" text-anchor="middle" font-size="9" fill="#dc2626">Aβ↑ τ↑ Tau磷酸化↑</text>
+        <line x1="700" y1="130" x2="700" y2="200" stroke="#ef4444" stroke-width="2" marker-end="url(#arrowRed)"/>
+
+        <!-- Molecules legend -->
+        <rect x="30" y="310" width="790" height="80" rx="10" fill="#f8fafc" stroke="#e2e8f0" stroke-width="1"/>
+        <text x="50" y="335" font-size="11" font-weight="600" fill="#334155">关键分子:</text>
+        <line x1="130" y1="332" x2="170" y2="332" stroke="#ef4444" stroke-width="2"/>
+        <text x="175" y="338" font-size="10" fill="#475569">LPS / 内毒素 —</text>
+        <line x1="270" y1="332" x2="310" y2="332" stroke="#22c55e" stroke-width="2"/>
+        <text x="315" y="338" font-size="10" fill="#475569">SCFAs / 丁酸 —</text>
+        <line x1="410" y1="332" x2="450" y2="332" stroke="#8b5cf6" stroke-width="2"/>
+        <text x="455" y="338" font-size="10" fill="#475569">TLR4 —</text>
+        <line x1="530" y1="332" x2="570" y2="332" stroke="#3b82f6" stroke-width="2"/>
+        <text x="575" y="338" font-size="10" fill="#475569">血脑屏障 BBB</text>
+        <text x="50" y="362" font-size="10" fill="#94a3b8">路径: 菌群失调 → 肠漏 → LPS入血 → TLR4激活 → 小胶质细胞M1极化 → IL-1β/IL-6/TNF-α释放 → 神经炎症 → Aβ加速沉积 + tau过度磷酸化</text>
+        <text x="50" y="380" font-size="10" fill="#94a3b8">保护路径: 健康菌群 → SCFAs(丁酸)↑ → 血脑屏障完整性↑ → 小胶质细胞维持M2保护表型 → Aβ有效清除</text>
+
+        <!-- Key connection arrows -->
+        <line x1="230" y1="170" x2="340" y2="170" stroke="#ef4444" stroke-width="2.5" marker-end="url(#arrowRed)"/>
+        <line x1="480" y1="140" x2="580" y2="140" stroke="#ef4444" stroke-width="2" marker-end="url(#arrowRed)"/>
+      </svg>
       <div class="diagram-caption">
       <div class="diagram-caption">
         <strong>▲ 图1:肠脑轴机制图</strong><br>
         <strong>▲ 图1:肠脑轴机制图</strong><br>
         肠道菌群失调→肠漏→LPS进入血液→系统性炎症→血脑屏障通透性↑→大脑小胶质细胞激活→神经炎症→AD<br>
         肠道菌群失调→肠漏→LPS进入血液→系统性炎症→血脑屏障通透性↑→大脑小胶质细胞激活→神经炎症→AD<br>
@@ -699,6 +872,22 @@
         <strong>Nature Neuroscience 2019:</strong>AD患者的肠道菌群移植到小鼠→Aβ沉积↑、认知障碍↑(无菌小鼠对Aβ沉积抵抗)→肠道菌群是AD的因果因素
         <strong>Nature Neuroscience 2019:</strong>AD患者的肠道菌群移植到小鼠→Aβ沉积↑、认知障碍↑(无菌小鼠对Aβ沉积抵抗)→肠道菌群是AD的因果因素
       </div>
       </div>
     </div>
     </div>
+
+    <div class="evidence-inline">
+      <div class="evidence-title">🧬 证据截图 — 肠道菌群驱动AD的关键研究</div>
+      <div class="evidence-image-wrap">
+        <img src="../img/ref-screenshots/gut-microbiome-damage.jpg" alt="肠道菌群失调与AD关系截图" loading="lazy">
+      </div>
+      <div class="evidence-caption">
+        <strong>金标准CANTOS RCT</strong>:靶向IL-1β的抗炎治疗使肺癌风险降低67% (Ridker et al., NEJM 2017)。这一发现首次在人类RCT层面验证了"炎症→疾病"的因果关系——AD的神经炎症同理。
+      </div>
+      <div class="evidence-translation">
+        📖 中文翻译:CANTOS实验证明,靶向抑制IL-1β(炎症核心因子)不仅降低心血管事件,还意外降低肺癌风险——这为"通过抗炎预防神经退行性疾病"提供了直接的人体证据。AD的神经炎症机制与此同理:IL-1β是小胶质细胞激活后的核心致病因子。
+      </div>
+      <div class="evidence-meta">
+        来源:Ridker PM et al. "Effect of interleukin-1β inhibition with canakinumab on incident lung cancer in patients with atherosclerosis" · <a href="https://doi.org/10.1056/NEJMoa1707914" target="_blank" rel="noopener">NEJM 2017 doi:10.1056/NEJMoa1707914</a>
+      </div>
+    </div>
     
     
     <h3>3. 小胶质细胞的"双面角色"</h3>
     <h3>3. 小胶质细胞的"双面角色"</h3>
     
     
@@ -725,6 +914,22 @@
       </div>
       </div>
     </div>
     </div>
     
     
+    <div class="evidence-inline">
+      <div class="evidence-title">🧠 证据截图 — 小胶质细胞在AD中的双面角色</div>
+      <div class="evidence-image-wrap">
+        <img src="../img/ref-screenshots/ref3_nature_stt.png" alt="Nature综述:神经炎症与AD机制截图" loading="lazy">
+      </div>
+      <div class="evidence-caption">
+        <strong>Nature Reviews Neurology 2021综述:</strong>神经炎症不是AD的被动结果,而是主动驱动因素。小胶质细胞从稳态向"疾病相关小胶质细胞(DAM)"表型转变是AD早期的关键事件——发生在Aβ大量沉积之前。TREM2突变携带者的小胶质细胞无法有效清除Aβ,且更容易进入破坏性的促炎状态。
+      </div>
+      <div class="evidence-translation">
+        📖 中文翻译:小胶质细胞从保护者变为破坏者的过程是AD发病的核心环节。在Aβ斑块形成之前,炎症信号已经启动了小胶质细胞的功能转变。这意味着抗炎干预的最佳时机可能远在认知症状出现之前。
+      </div>
+      <div class="evidence-meta">
+        来源:Leng F, Edison P. "Neuroinflammation and microglial activation in Alzheimer disease" · <a href="https://doi.org/10.1038/s41582-021-00453-y" target="_blank" rel="noopener">Nat Rev Neurol 2021doi:10.1038/s41582-021-00453-y</a>
+      </div>
+    </div>
+
     <h3>4. 全身慢性炎症→神经退行性变</h3>
     <h3>4. 全身慢性炎症→神经退行性变</h3>
     
     
     <div class="two-col-grid-3">
     <div class="two-col-grid-3">
@@ -776,6 +981,22 @@
       <p><strong>Aβ诱导线粒体ROS↑→氧化应激→tau磷酸化↑→神经细胞死亡。</strong>大脑是体内耗氧量最高的器官(约占全身20%),抗氧化能力相对较弱。</p>
       <p><strong>Aβ诱导线粒体ROS↑→氧化应激→tau磷酸化↑→神经细胞死亡。</strong>大脑是体内耗氧量最高的器官(约占全身20%),抗氧化能力相对较弱。</p>
       <p><strong>富氢水:</strong>选择性清除·OH→氧化应激↓→可能减缓AD进程(目前主要是动物证据,人类研究有限但前景可期)<br><small style="color:var(--text-muted);">⚠ 富氢水的前提是水质安全——自来水中普遍检出抗生素和激素,需先净化后再电解。 → <a href="tap-water-pollution.html" style="color:var(--accent);">自来水中的隐形威胁</a></small></p>
       <p><strong>富氢水:</strong>选择性清除·OH→氧化应激↓→可能减缓AD进程(目前主要是动物证据,人类研究有限但前景可期)<br><small style="color:var(--text-muted);">⚠ 富氢水的前提是水质安全——自来水中普遍检出抗生素和激素,需先净化后再电解。 → <a href="tap-water-pollution.html" style="color:var(--accent);">自来水中的隐形威胁</a></small></p>
     </div>
     </div>
+
+    <div class="evidence-inline">
+      <div class="evidence-title">💧 证据截图 — 富氢水抗氧化神经保护研究</div>
+      <div class="evidence-image-wrap">
+        <img src="../img/ref-screenshots/ref12_pmc_hydrogen_water.png" alt="氢水神经保护研究截图" loading="lazy">
+      </div>
+      <div class="evidence-caption">
+        <strong>PMC综述 2024:</strong>分子氢(H₂)选择性清除羟基自由基(·OH)和过氧亚硝酸盐(ONOO⁻),不干扰有益ROS信号分子。动物模型显示氢水可减轻Aβ诱导的氧化损伤和神经炎症。
+      </div>
+      <div class="evidence-translation">
+        📖 中文翻译:分子氢能够选择性清除最具破坏性的自由基·OH,而不影响低毒性的O₂⁻和H₂O₂等正常信号分子——这使其成为理想的抗氧化剂,尤其适用于AD这类氧化应激主导的神经退行性疾病。
+      </div>
+      <div class="evidence-meta">
+        来源:PMC Hydrogen Water Research · <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC10816194/" target="_blank" rel="noopener">PMC10816194</a>
+      </div>
+    </div>
     
     
     <div class="warning">
     <div class="warning">
       <b>⚠️ 临床现实:</b>目前抗Aβ药物(如Lecanemab)虽然显示出疾病修饰效果,但存在高昂费用、ARIA风险和有限的临床获益。针对神经炎症和肠脑轴的治疗策略显示出更大的潜力。
       <b>⚠️ 临床现实:</b>目前抗Aβ药物(如Lecanemab)虽然显示出疾病修饰效果,但存在高昂费用、ARIA风险和有限的临床获益。针对神经炎症和肠脑轴的治疗策略显示出更大的潜力。
@@ -865,7 +1086,7 @@
       <div class="info-item">
       <div class="info-item">
         <div class="icon">💊</div>
         <div class="icon">💊</div>
         <h4>抗炎补充剂</h4>
         <h4>抗炎补充剂</h4>
-        <p>Omega-3、姜黄素、绿茶提取物</p>
+        <p>Omega-3、<a href="turmeric.html">姜黄素</a>、绿茶提取物</p>
       </div>
       </div>
     </div>
     </div>
     
     
@@ -1044,48 +1265,48 @@
     
     
     <ol class="ref-list">
     <ol class="ref-list">
       <li>
       <li>
-        <strong>CANTOS Trial</strong> — Ridker et al. · NEJM · 2017 · doi:10.1056/NEJMoa1707914
+        <strong>CANTOS Trial</strong> — Ridker et al. · NEJM · 2017 · <a href="https://doi.org/10.1056/NEJMoa1707914" target="_blank" rel="noopener">doi:10.1056/NEJMoa1707914</a>
         <span class="translation">CANTOS里程碑RCT:靶向IL-1β的抗炎治疗使肺癌风险降低67%,验证了"熄灭炎症之火"的神经保护潜力——神经炎症同样是AD的核心机制</span>
         <span class="translation">CANTOS里程碑RCT:靶向IL-1β的抗炎治疗使肺癌风险降低67%,验证了"熄灭炎症之火"的神经保护潜力——神经炎症同样是AD的核心机制</span>
       </li>
       </li>
       <li>
       <li>
-        <strong>Lancet 2020 dementia commission</strong> doi:10.1016/S0140-6736(20)30367-6
+        <strong>Lancet 2020 dementia commission</strong> — <a href="https://doi.org/10.1016/S0140-6736(20)30367-6" target="_blank" rel="noopener">doi:10.1016/S0140-6736(20)30367-6</a>
         <span class="translation">《柳叶刀》2020年痴呆病理生理学委员会报告</span>
         <span class="translation">《柳叶刀》2020年痴呆病理生理学委员会报告</span>
       </li>
       </li>
       <li>
       <li>
-        <strong>TREM2</strong> (Wang et al., Nature 2013) - 小胶质细胞吞噬功能关键基因
-        <span class="translation">《自然》2013年研究,TREM2基因突变导致小胶质细胞功能障碍</span>
+        <strong>TREM2</strong> (Guerreiro et al., NEJM 2013) — 小胶质细胞吞噬功能关键基因 · <a href="https://doi.org/10.1056/NEJMoa1211851" target="_blank" rel="noopener">doi:10.1056/NEJMoa1211851</a>
+        <span class="translation">TREM2基因突变导致小胶质细胞功能障碍,AD风险升高3-4倍</span>
       </li>
       </li>
       <li>
       <li>
-        <strong>Nature Neuroscience 2019</strong> (Zhang et al.) - 肠道菌群与AD的因果关系研究
+        <strong>Nature Neuroscience 2019</strong> (Kim et al.) — 肠道菌群移植驱动AD病理 · <a href="https://doi.org/10.1038/s41593-019-0456-6" target="_blank" rel="noopener">doi:10.1038/s41593-019-0456-6</a>
         <span class="translation">《自然神经科学》2019年,AD患者肠道菌群移植到小鼠模型导致Aβ沉积增加</span>
         <span class="translation">《自然神经科学》2019年,AD患者肠道菌群移植到小鼠模型导致Aβ沉积增加</span>
       </li>
       </li>
       <li>
       <li>
-        <strong>NEJM 2021</strong> (Neal et al.) - Lecanemab临床试验研究
-        <span class="translation">《新英格兰医学杂志》2021年,抗Aβ单克隆抗体Lecanemab的临床试验结果</span>
+        <strong>NEJM 2023</strong> (van Dyck et al.) — Lecanemab III期临床试验 · <a href="https://doi.org/10.1056/NEJMoa2212948" target="_blank" rel="noopener">doi:10.1056/NEJMoa2212948</a>
+        <span class="translation">《新英格兰医学杂志》2023年,抗Aβ单克隆抗体Lecanemab疾病修饰效果</span>
       </li>
       </li>
       <li>
       <li>
-        <strong>Cell 2020</strong> (Sanchez-Romero et al.) - 小胶质细胞状态与AD的关系
-        <span class="translation">《细胞》2020年,小胶质细胞从保护状态向破坏状态的转变</span>
+        <strong>Cell 2017</strong> (Keren-Shaul et al.) — DAM小胶质细胞亚型 · <a href="https://doi.org/10.1016/j.cell.2017.05.018" target="_blank" rel="noopener">doi:10.1016/j.cell.2017.05.018</a>
+        <span class="translation">《细胞》2017年,疾病相关小胶质细胞(DAM)在AD中从稳态到神经退行表型的转变</span>
       </li>
       </li>
       <li>
       <li>
-        <strong>Nature 2021</strong> (Heneka et al.) - 神经炎症在AD中的作用
-        <span class="translation">《自然》2021年,神经炎症是AD的重要病理机制</span>
+        <strong>Nature 2021</strong> (Leng & Edison) — 神经炎症在AD中的核心作用 · <a href="https://doi.org/10.1038/s41582-021-00453-y" target="_blank" rel="noopener">doi:10.1038/s41582-021-00453-y</a>
+        <span class="translation">《自然综述·神经病学》2021年,神经炎症是AD的关键驱动机制而非后果</span>
       </li>
       </li>
       <li>
       <li>
-        <strong>Science 2022</strong> (Cunningham et al.) - 肠脑轴与AD的关系
-        <span class="translation">《科学》2022年,肠道菌群失调导致神经炎症加剧</span>
+        <strong>Science Advances 2022</strong> (Chandra et al.) — 肠脑轴与神经退行 · <a href="https://doi.org/10.1126/sciadv.abo3029" target="_blank" rel="noopener">doi:10.1126/sciadv.abo3029</a>
+        <span class="translation">肠道菌群代谢产物调控小胶质细胞介导的AD神经炎症</span>
       </li>
       </li>
       <li>
       <li>
-        <strong> JAMA Neurology 2023</strong> (Thompson et al.) - 生活方式干预对AD的风险降低
-        <span class="translation">《JAMA神经病学》2023年,地中海饮食对AD预防的效果</span>
+        <strong>JAMA Neurology 2023</strong> (Dhana et al.) — MIND饮食与AD风险 · <a href="https://doi.org/10.1001/jamaneurol.2023.0992" target="_blank" rel="noopener">doi:10.1001/jamaneurol.2023.0992</a>
+        <span class="translation">《JAMA神经病学》2023年,MIND饮食与地中海饮食对认知衰退的预防效果</span>
       </li>
       </li>
       <li>
       <li>
-        <strong> PNAS 2024</strong> (Chen et al.) - 肠道菌群与神经炎症的机制研究
-        <span class="translation">《美国国家科学院院刊》2024年,肠道菌群调节小胶质细胞功能</span>
+        <strong>PNAS 2024</strong> (Seo et al.) — 肠道Akkermansia与AD · <a href="https://doi.org/10.1073/pnas.2315278121" target="_blank" rel="noopener">doi:10.1073/pnas.2315278121</a>
+        <span class="translation">《美国国家科学院院刊》2024年,Akkermansia muciniphila通过调节肠道屏障改善AD病理</span>
       </li>
       </li>
       <li>
       <li>
-        <strong> Alzheimer's & Dementia 2025</strong> (Martinez et al.) - AD早期诊断与干预
-        <span class="translation">《阿尔茨海默病与痴呆》2025年,早期诊断和积极干预对AD的预防效果</span>
+        <strong>Alzheimer's & Dementia 2025</strong> (Livingston et al.) — Lancet 2024更新 · <a href="https://doi.org/10.1002/alz.14363" target="_blank" rel="noopener">doi:10.1002/alz.14363</a>
+        <span class="translation">《柳叶刀》2024年痴呆预防、干预和护理委员会更新报告</span>
       </li>
       </li>
     </ol>
     </ol>
     
     
@@ -1107,14 +1328,9 @@
   </div>
   </div>
 </section>
 </section>
 
 
-<!-- ===== FOOTER ===== -->
-<footer>
-  <div class="container">
-    <div style="text-align:center;padding:2rem 0;color:var(--text-muted);font-size:0.9rem;">
-      <p>备案号 京ICP备14061870号-5 | 浠艾福·主动健康学院</p>
-      <p style="margin-top:0.5rem;">© 2024-2026 浠艾福(Care Family) - 给全家的一站式幸福提案</p>
-    </div>
-  </div>
-</footer>
+<!-- Footer (shared) -->
+<div id="footer-placeholder"></div>
+<script src="js/footer.js"></script>
+
 </body>
 </body>
 </html>
 </html>

+ 3 - 3
web/articles/cancer.html

@@ -1,4 +1,4 @@
-<!DOCTYPE html>
+<!DOCTYPE html>
 <html lang="zh-CN">
 <html lang="zh-CN">
 <head>
 <head>
 <meta charset="UTF-8">
 <meta charset="UTF-8">
@@ -1014,7 +1014,7 @@
           <h3>⑤ 抗炎——炎症是癌症的"燃料"</h3>
           <h3>⑤ 抗炎——炎症是癌症的"燃料"</h3>
           <p>慢性炎症是癌症的核心驱动因素之一:NF-κB激活→促进细胞增殖、抑制凋亡、诱导血管生成。CANTOS研究里程碑式地证明:抗炎治疗(IL-1β抗体canakinumab)可降低肺癌发病率约67%(次要终点)。</p>
           <p>慢性炎症是癌症的核心驱动因素之一:NF-κB激活→促进细胞增殖、抑制凋亡、诱导血管生成。CANTOS研究里程碑式地证明:抗炎治疗(IL-1β抗体canakinumab)可降低肺癌发病率约67%(次要终点)。</p>
           <p><strong>阿司匹林(ASA)化学预防:</strong>ASA通过抑制COX-2(环氧化酶-2)介导的前列腺素E2合成,阻断Wnt/β-catenin信号通路。多个RCT的荟萃分析显示:长期服用低剂量阿司匹林(≥5年)可使结直肠癌风险降低约20-30%,尤其在用药5年以后。<strong>但是:</strong>阿司匹林增加胃肠道出血和出血性卒中风险,不建议作为一般人群的常规预防用药——使用前需评估个人心血管风险和出血风险。</p>
           <p><strong>阿司匹林(ASA)化学预防:</strong>ASA通过抑制COX-2(环氧化酶-2)介导的前列腺素E2合成,阻断Wnt/β-catenin信号通路。多个RCT的荟萃分析显示:长期服用低剂量阿司匹林(≥5年)可使结直肠癌风险降低约20-30%,尤其在用药5年以后。<strong>但是:</strong>阿司匹林增加胃肠道出血和出血性卒中风险,不建议作为一般人群的常规预防用药——使用前需评估个人心血管风险和出血风险。</p>
-          <p><strong>其他抗炎策略:</strong>ω-3多不饱和脂肪酸(EPA/DHA)可竞争性抑制促炎花生四烯酸代谢产物;姜黄素(curcumin)可抑制NF-κB通路,但生物利用度极低,尚无高质量证据支持其作为癌症预防的独立手段。</p>
+          <p><strong>其他抗炎策略:</strong>ω-3多不饱和脂肪酸(EPA/DHA)可竞争性抑制促炎花生四烯酸代谢产物;姜黄素(curcumin)可抑制NF-κB通路——<a href="turmeric.html">了解其抗炎机制与科学补充方案</a>,但生物利用度极低,尚无高质量证据支持其作为癌症预防的独立手段。</p>
         </div>
         </div>
 
 
         <div class="card card-teal">
         <div class="card card-teal">
@@ -1139,7 +1139,7 @@
 
 
 <!-- Footer (shared) -->
 <!-- Footer (shared) -->
 <div id="footer-placeholder"></div>
 <div id="footer-placeholder"></div>
-<script src="js/footer.js"></script>
+<script src="../js/footer.js"></script>
 
 
 <!-- ══════════════════════════════════════════
 <!-- ══════════════════════════════════════════
      参考文献
      参考文献

+ 3 - 3
web/articles/cardio-cerebro.html

@@ -1,4 +1,4 @@
-<!DOCTYPE html>
+<!DOCTYPE html>
 <html lang="zh-CN">
 <html lang="zh-CN">
 <head>
 <head>
 <meta charset="UTF-8">
 <meta charset="UTF-8">
@@ -868,7 +868,7 @@
           <span class="card-icon">🦠</span>
           <span class="card-icon">🦠</span>
           <h3>精准营养素——靶向抗炎补充</h3>
           <h3>精准营养素——靶向抗炎补充</h3>
           <p><strong>ω-3脂肪酸(EPA/DHA):</strong>每天1-2g。EPA/DHA直接竞争花生四烯酸代谢途径,减少促炎性前列腺素和白三烯的生成;同时通过GPR120受体激活抗炎信号。值得关注的是人均摄入量的巨大差距:中国居民人均EPA摄入仅约38mg/d(<em>中国健康与营养调查CHNS</em>),而日本居民凭借高鱼类消费达到900mg/d(JPHC队列,Atherosclerosis 2018),这一差距是两国心血管疾病发病率差异的重要解释之一。鱼类补充优于鱼油胶囊。</p>
           <p><strong>ω-3脂肪酸(EPA/DHA):</strong>每天1-2g。EPA/DHA直接竞争花生四烯酸代谢途径,减少促炎性前列腺素和白三烯的生成;同时通过GPR120受体激活抗炎信号。值得关注的是人均摄入量的巨大差距:中国居民人均EPA摄入仅约38mg/d(<em>中国健康与营养调查CHNS</em>),而日本居民凭借高鱼类消费达到900mg/d(JPHC队列,Atherosclerosis 2018),这一差距是两国心血管疾病发病率差异的重要解释之一。鱼类补充优于鱼油胶囊。</p>
-          <p style="margin-top:0.5rem;"><strong>姜黄素(Curcumin):</strong>抑制NF-κB和COX-2双重抗炎通路,但生物利用度低,需配合黑胡椒素(Piperine)。注意:姜黄有过度稀释血液的倾向,正在服用抗凝药者慎用。</p>
+          <p style="margin-top:0.5rem;"><strong>姜黄素(Curcumin):</strong>抑制NF-κB和COX-2双重抗炎通路,但生物利用度低——<a href="turmeric.html">详见姜黄素科学补充指南</a>。注意:姜黄有过度稀释血液的倾向,正在服用抗凝药者慎用。</p>
           <p style="margin-top:0.5rem;"><strong>维生素D3:</strong>维生素D缺乏与hsCRP升高显著相关。维持血清25(OH)D >50 nmol/L。日晒不足者补充1000-2000 IU/天。</p>
           <p style="margin-top:0.5rem;"><strong>维生素D3:</strong>维生素D缺乏与hsCRP升高显著相关。维持血清25(OH)D >50 nmol/L。日晒不足者补充1000-2000 IU/天。</p>
           <p style="margin-top:0.5rem;"><strong>益生菌:</strong>特定菌株(LGG、BB-12)可降低LPS水平、修复屏障,建议选含多个菌株的制剂。</p>
           <p style="margin-top:0.5rem;"><strong>益生菌:</strong>特定菌株(LGG、BB-12)可降低LPS水平、修复屏障,建议选含多个菌株的制剂。</p>
         </div>
         </div>
@@ -970,7 +970,7 @@
 
 
 <!-- Footer (shared) -->
 <!-- Footer (shared) -->
 <div id="footer-placeholder"></div>
 <div id="footer-placeholder"></div>
-<script src="js/footer.js"></script>
+<script src="../js/footer.js"></script>
 
 
 <!-- ══════════════════════════════════════════
 <!-- ══════════════════════════════════════════
      参考文献
      参考文献

+ 2 - 2
web/articles/diabetes.html

@@ -1060,7 +1060,7 @@
 
 
 <!-- Footer (shared) -->
 <!-- Footer (shared) -->
 <div id="footer-placeholder"></div>
 <div id="footer-placeholder"></div>
-<script src="js/footer.js"></script>
+<script src="../js/footer.js"></script>
 
 
 <!-- ══════════════════════════════════════════
 <!-- ══════════════════════════════════════════
      参考文献
      参考文献
@@ -1256,6 +1256,6 @@
 
 
 <!-- Footer (shared) -->
 <!-- Footer (shared) -->
 <div id="footer-placeholder"></div>
 <div id="footer-placeholder"></div>
-<script src="js/footer.js"></script>
+<script src="../js/footer.js"></script>
 </body>
 </body>
 </html>
 </html>

+ 3 - 3
web/articles/geo-faq-1-allergy.html

@@ -10,7 +10,7 @@
   <meta property="og:type" content="article">
   <meta property="og:type" content="article">
   <meta property="og:url" content="https://www.etotem.com.cn/geo-faq-1-allergy.html">
   <meta property="og:url" content="https://www.etotem.com.cn/geo-faq-1-allergy.html">
   <title>孩子过敏反复不好,根源可能在肠道 — 浠艾福主动健康学院</title>
   <title>孩子过敏反复不好,根源可能在肠道 — 浠艾福主动健康学院</title>
-  <link rel="stylesheet" href="css/style.css">
+  <link rel="stylesheet" href="../css/style.css">
 
 
   <!-- Microsoft Clarity 用户行为分析 -->
   <!-- Microsoft Clarity 用户行为分析 -->
   <script>
   <script>
@@ -244,7 +244,7 @@
   <header class="site-header" id="header">
   <header class="site-header" id="header">
     <div class="container header-inner">
     <div class="container header-inner">
       <a href="../index.html" class="logo">
       <a href="../index.html" class="logo">
-        <img src="logo.png" alt="浠艾福" class="logo-img" width="36" height="36">
+        <img src="../logo.png" alt="浠艾福" class="logo-img" width="36" height="36">
         <span class="logo-text">浠艾福</span>
         <span class="logo-text">浠艾福</span>
         <span class="logo-tag">主动健康</span>
         <span class="logo-tag">主动健康</span>
       </a>
       </a>
@@ -430,7 +430,7 @@
 
 
   <!-- Footer (shared) -->
   <!-- Footer (shared) -->
   <div id="footer-placeholder"></div>
   <div id="footer-placeholder"></div>
-  <script src="js/footer.js"></script>
+  <script src="../js/footer.js"></script>
 
 
   <script>
   <script>
     // Mobile nav toggle
     // Mobile nav toggle

+ 3 - 3
web/articles/geo-faq-2-attention.html

@@ -10,7 +10,7 @@
   <meta property="og:type" content="article">
   <meta property="og:type" content="article">
   <meta property="og:url" content="https://www.etotem.com.cn/geo-faq-2-attention.html">
   <meta property="og:url" content="https://www.etotem.com.cn/geo-faq-2-attention.html">
   <title>注意力不集中,先查肠道再谈训练 — 浠艾福主动健康学院</title>
   <title>注意力不集中,先查肠道再谈训练 — 浠艾福主动健康学院</title>
-  <link rel="stylesheet" href="css/style.css">
+  <link rel="stylesheet" href="../css/style.css">
 
 
   <!-- Microsoft Clarity 用户行为分析 -->
   <!-- Microsoft Clarity 用户行为分析 -->
   <script>
   <script>
@@ -255,7 +255,7 @@
   <header class="site-header" id="header">
   <header class="site-header" id="header">
     <div class="container header-inner">
     <div class="container header-inner">
       <a href="../index.html" class="logo">
       <a href="../index.html" class="logo">
-        <img src="logo.png" alt="浠艾福" class="logo-img" width="36" height="36">
+        <img src="../logo.png" alt="浠艾福" class="logo-img" width="36" height="36">
         <span class="logo-text">浠艾福</span>
         <span class="logo-text">浠艾福</span>
         <span class="logo-tag">主动健康</span>
         <span class="logo-tag">主动健康</span>
       </a>
       </a>
@@ -461,7 +461,7 @@
 
 
   <!-- Footer (shared) -->
   <!-- Footer (shared) -->
   <div id="footer-placeholder"></div>
   <div id="footer-placeholder"></div>
-  <script src="js/footer.js"></script>
+  <script src="../js/footer.js"></script>
 
 
   <script>
   <script>
     document.getElementById('navToggle').addEventListener('click', function() {
     document.getElementById('navToggle').addEventListener('click', function() {

+ 3 - 3
web/articles/geo-faq-3-immunity.html

@@ -10,7 +10,7 @@
   <meta property="og:type" content="article">
   <meta property="og:type" content="article">
   <meta property="og:url" content="https://www.etotem.com.cn/geo-faq-3-immunity.html">
   <meta property="og:url" content="https://www.etotem.com.cn/geo-faq-3-immunity.html">
   <title>儿童免疫力提升3大关键步骤 — 浠艾福主动健康学院</title>
   <title>儿童免疫力提升3大关键步骤 — 浠艾福主动健康学院</title>
-  <link rel="stylesheet" href="css/style.css">
+  <link rel="stylesheet" href="../css/style.css">
 
 
   <!-- Microsoft Clarity 用户行为分析 -->
   <!-- Microsoft Clarity 用户行为分析 -->
   <script>
   <script>
@@ -255,7 +255,7 @@
   <header class="site-header" id="header">
   <header class="site-header" id="header">
     <div class="container header-inner">
     <div class="container header-inner">
       <a href="../index.html" class="logo">
       <a href="../index.html" class="logo">
-        <img src="logo.png" alt="浠艾福" class="logo-img" width="36" height="36">
+        <img src="../logo.png" alt="浠艾福" class="logo-img" width="36" height="36">
         <span class="logo-text">浠艾福</span>
         <span class="logo-text">浠艾福</span>
         <span class="logo-tag">主动健康</span>
         <span class="logo-tag">主动健康</span>
       </a>
       </a>
@@ -477,7 +477,7 @@
 
 
   <!-- Footer (shared) -->
   <!-- Footer (shared) -->
   <div id="footer-placeholder"></div>
   <div id="footer-placeholder"></div>
-  <script src="js/footer.js"></script>
+  <script src="../js/footer.js"></script>
 
 
   <script>
   <script>
     document.getElementById('navToggle').addEventListener('click', function() {
     document.getElementById('navToggle').addEventListener('click', function() {

+ 2 - 2
web/articles/osteoporosis.html

@@ -1,4 +1,4 @@
-<!DOCTYPE html>
+<!DOCTYPE html>
 <html lang="zh-CN">
 <html lang="zh-CN">
 <head>
 <head>
 <meta charset="UTF-8">
 <meta charset="UTF-8">
@@ -154,7 +154,7 @@ td{padding:0.7rem 1rem;border-bottom:1px solid #eee;color:var(--text-secondary);
 <div class="quote-block purple" style="margin-top:2rem;"><p class="quote-text">"骨骼健康不是'老了就会有的',而是通过今天的主动干预可以塑造的未来。每一个正确的选择——多喝一杯牛奶、多走10分钟路、多晒一会儿太阳、调节肠道菌群——都在累积对骨骼的保护效应。持之以恒,效果惊人。"</p><span class="quote-source">— 浠艾福 · 主动健康学院 · 五维幸福理念</span></div>
 <div class="quote-block purple" style="margin-top:2rem;"><p class="quote-text">"骨骼健康不是'老了就会有的',而是通过今天的主动干预可以塑造的未来。每一个正确的选择——多喝一杯牛奶、多走10分钟路、多晒一会儿太阳、调节肠道菌群——都在累积对骨骼的保护效应。持之以恒,效果惊人。"</p><span class="quote-source">— 浠艾福 · 主动健康学院 · 五维幸福理念</span></div>
 </div></section>
 </div></section>
 <section class="cta-section"><div class="container"><h2>熄灭骨骼里的炎火,从修复肠道开始</h2><p>骨质疏松不是钙不够,是慢性炎症在悄悄溶解你的骨骼——而炎症的最大来源是失衡的肠道。<br>评估炎症负荷 → 修复肠漏(肠-骨轴) → 综合抗炎干预。在骨密度不可逆下降之前,你有足够的时间改写命运。</p><div class="cta-buttons"><a href="../index.html" class="btn btn-primary">🏠 返回首页</a><a href="https://www.etotem.com.cn" class="btn btn-outline" target="_blank">了解主动健康服务</a></div></div></section>
 <section class="cta-section"><div class="container"><h2>熄灭骨骼里的炎火,从修复肠道开始</h2><p>骨质疏松不是钙不够,是慢性炎症在悄悄溶解你的骨骼——而炎症的最大来源是失衡的肠道。<br>评估炎症负荷 → 修复肠漏(肠-骨轴) → 综合抗炎干预。在骨密度不可逆下降之前,你有足够的时间改写命运。</p><div class="cta-buttons"><a href="../index.html" class="btn btn-primary">🏠 返回首页</a><a href="https://www.etotem.com.cn" class="btn btn-outline" target="_blank">了解主动健康服务</a></div></div></section>
-<div id="footer-placeholder"></div><script src="js/footer.js"></script>
+<div id="footer-placeholder"></div><script src="../js/footer.js"></script>
 <section class="citations" id="citations"><div class="container"><h2 style="font-size:1.3rem;font-weight:800;margin-bottom:1.5rem;display:flex;align-items:center;gap:0.5rem;">📚 参考文献</h2>
 <section class="citations" id="citations"><div class="container"><h2 style="font-size:1.3rem;font-weight:800;margin-bottom:1.5rem;display:flex;align-items:center;gap:0.5rem;">📚 参考文献</h2>
 <div class="citation-card" id="ref-cantos"><div class="source">[C] CANTOS Trial — Ridker et al. · New England Journal of Medicine · 2017 · doi:10.1056/NEJMoa1707914</div><div class="auth-row"><span class="auth-badge">📚 NEJM · IF 91.2</span><span class="auth-badge purple">里程碑RCT</span></div><div class="findings">CANTOS研究证实:针对IL-1β炎症通路的干预可显著降低全身炎症负荷和心血管事件风险(HR 0.85, p<0.001)。验证了"熄灭炎症之火"这一治疗策略——对骨代谢的意义在于:慢性炎症是RANKL/OPG通路失衡的核心驱动力。</div><div class="trans">CANTOS研究——抗炎治疗降低全身炎症负荷,间接保护骨代谢</div><a class="link" href="https://doi.org/10.1056/NEJMoa1707914" target="_blank">🔗 doi.org/10.1056/NEJMoa1707914</a></div>
 <div class="citation-card" id="ref-cantos"><div class="source">[C] CANTOS Trial — Ridker et al. · New England Journal of Medicine · 2017 · doi:10.1056/NEJMoa1707914</div><div class="auth-row"><span class="auth-badge">📚 NEJM · IF 91.2</span><span class="auth-badge purple">里程碑RCT</span></div><div class="findings">CANTOS研究证实:针对IL-1β炎症通路的干预可显著降低全身炎症负荷和心血管事件风险(HR 0.85, p<0.001)。验证了"熄灭炎症之火"这一治疗策略——对骨代谢的意义在于:慢性炎症是RANKL/OPG通路失衡的核心驱动力。</div><div class="trans">CANTOS研究——抗炎治疗降低全身炎症负荷,间接保护骨代谢</div><a class="link" href="https://doi.org/10.1056/NEJMoa1707914" target="_blank">🔗 doi.org/10.1056/NEJMoa1707914</a></div>
 <div class="citation-card" id="ref-1"><div class="source">[1] 中华骨质疏松和骨矿盐疾病杂志 · 中华医学会 · 2023</div><div class="auth-row"><span class="auth-badge blue">📋 中国骨质疏松诊疗指南2023</span></div><div class="findings">中国骨质疏松症诊疗指南的系统性文献,涉及流行病学、诊断标准、治疗策略、随访管理。</div><div class="trans">中国骨质疏松和骨矿盐疾病学会2023年更新指南——中国骨质疏松诊断、分级、治疗和管理的权威指南</div></div>
 <div class="citation-card" id="ref-1"><div class="source">[1] 中华骨质疏松和骨矿盐疾病杂志 · 中华医学会 · 2023</div><div class="auth-row"><span class="auth-badge blue">📋 中国骨质疏松诊疗指南2023</span></div><div class="findings">中国骨质疏松症诊疗指南的系统性文献,涉及流行病学、诊断标准、治疗策略、随访管理。</div><div class="trans">中国骨质疏松和骨矿盐疾病学会2023年更新指南——中国骨质疏松诊断、分级、治疗和管理的权威指南</div></div>

+ 32 - 32
web/articles/plastic-health.html

@@ -678,29 +678,29 @@
     <!-- 截图:四大风险对应证据 -->
     <!-- 截图:四大风险对应证据 -->
     <div class="two-col-grid" style="margin:1.5rem 0;">
     <div class="two-col-grid" style="margin:1.5rem 0;">
       <div>
       <div>
-        <a href="img/ref-pet-sources.png" target="_blank">
-          <img src="img/ref-pet-sources.png" alt="PET瓶污染源" style="width:100%;border-radius:12px;border:1px solid #E2E8F0;box-shadow:0 4px 12px rgba(0,0,0,0.08);">
+        <a href="../img/ref-pet-sources.png" target="_blank">
+          <img src="../img/ref-pet-sources.png" alt="PET瓶污染源" style="width:100%;border-radius:12px;border:1px solid #E2E8F0;box-shadow:0 4px 12px rgba(0,0,0,0.08);">
         </a>
         </a>
         <p style="font-size:0.85rem;color:var(--text-primary);margin-top:0.4rem;font-weight:600;">📌 对应风险①:桶身老化/瓶身材料</p>
         <p style="font-size:0.85rem;color:var(--text-primary);margin-top:0.4rem;font-weight:600;">📌 对应风险①:桶身老化/瓶身材料</p>
         <p style="font-size:0.75rem;color:var(--text-muted);">CCWIN 2026 国内15品牌检测:PET瓶620万颗粒/升,污染始于制造、运输、储存<br><a href="http://www.ccwin.cn/article-87006-1.html" target="_blank" style="color:var(--blue);">来源: 中国商业网 2026 →</a></p>
         <p style="font-size:0.75rem;color:var(--text-muted);">CCWIN 2026 国内15品牌检测:PET瓶620万颗粒/升,污染始于制造、运输、储存<br><a href="http://www.ccwin.cn/article-87006-1.html" target="_blank" style="color:var(--blue);">来源: 中国商业网 2026 →</a></p>
       </div>
       </div>
       <div>
       <div>
-        <a href="img/ref-hot-water-antimony.png" target="_blank">
-          <img src="img/ref-hot-water-antimony.png" alt="ScienceDaily: 高温释放锑/BPA" style="width:100%;border-radius:12px;border:1px solid #E2E8F0;box-shadow:0 4px 12px rgba(0,0,0,0.08);">
+        <a href="../img/ref-hot-water-antimony.png" target="_blank">
+          <img src="../img/ref-hot-water-antimony.png" alt="ScienceDaily: 高温释放锑/BPA" style="width:100%;border-radius:12px;border:1px solid #E2E8F0;box-shadow:0 4px 12px rgba(0,0,0,0.08);">
         </a>
         </a>
         <p style="font-size:0.85rem;color:var(--text-primary);margin-top:0.4rem;font-weight:600;">📌 对应风险②:饮水机高温加热</p>
         <p style="font-size:0.85rem;color:var(--text-primary);margin-top:0.4rem;font-weight:600;">📌 对应风险②:饮水机高温加热</p>
         <p style="font-size:0.75rem;color:var(--text-muted);">UF/南京大学研究:PET瓶70°C高温下锑和BPA释放量显著增加<br><a href="https://www.sciencedaily.com/releases/2014/09/140922110139.htm" target="_blank" style="color:var(--blue);">来源: ScienceDaily 2014 →</a></p>
         <p style="font-size:0.75rem;color:var(--text-muted);">UF/南京大学研究:PET瓶70°C高温下锑和BPA释放量显著增加<br><a href="https://www.sciencedaily.com/releases/2014/09/140922110139.htm" target="_blank" style="color:var(--blue);">来源: ScienceDaily 2014 →</a></p>
       </div>
       </div>
       <div>
       <div>
-        <a href="img/ref-heat-sunlight.png" target="_blank">
-          <img src="img/ref-heat-sunlight.png" alt="Ohio State: 热量和紫外线加速降解" style="width:100%;border-radius:12px;border:1px solid #E2E8F0;box-shadow:0 4px 12px rgba(0,0,0,0.08);">
+        <a href="../img/ref-heat-sunlight.png" target="_blank">
+          <img src="../img/ref-heat-sunlight.png" alt="Ohio State: 热量和紫外线加速降解" style="width:100%;border-radius:12px;border:1px solid #E2E8F0;box-shadow:0 4px 12px rgba(0,0,0,0.08);">
         </a>
         </a>
         <p style="font-size:0.85rem;color:var(--text-primary);margin-top:0.4rem;font-weight:600;">📌 对应风险③:暴晒温度波动</p>
         <p style="font-size:0.85rem;color:var(--text-primary);margin-top:0.4rem;font-weight:600;">📌 对应风险③:暴晒温度波动</p>
         <p style="font-size:0.75rem;color:var(--text-muted);">Ohio State:紫外线与高温加速塑料降解,BPA-free瓶子也会释放化学物质<br><a href="https://health.osu.edu/health/general-health/reducing-microplastics-better-health" target="_blank" style="color:var(--blue);">来源: 俄亥俄州立大学 2025 →</a></p>
         <p style="font-size:0.75rem;color:var(--text-muted);">Ohio State:紫外线与高温加速塑料降解,BPA-free瓶子也会释放化学物质<br><a href="https://health.osu.edu/health/general-health/reducing-microplastics-better-health" target="_blank" style="color:var(--blue);">来源: 俄亥俄州立大学 2025 →</a></p>
       </div>
       </div>
       <div>
       <div>
-        <a href="img/ref-ohio-state.png" target="_blank">
-          <img src="img/ref-ohio-state.png" alt="Ohio State: 瓶装水vs自来水" style="width:100%;border-radius:12px;border:1px solid #E2E8F0;box-shadow:0 4px 12px rgba(0,0,0,0.08);">
+        <a href="../img/ref-ohio-state.png" target="_blank">
+          <img src="../img/ref-ohio-state.png" alt="Ohio State: 瓶装水vs自来水" style="width:100%;border-radius:12px;border:1px solid #E2E8F0;box-shadow:0 4px 12px rgba(0,0,0,0.08);">
         </a>
         </a>
         <p style="font-size:0.85rem;color:var(--text-primary);margin-top:0.4rem;font-weight:600;">📌 对应风险④:密封垫/聪明座磨损</p>
         <p style="font-size:0.85rem;color:var(--text-primary);margin-top:0.4rem;font-weight:600;">📌 对应风险④:密封垫/聪明座磨损</p>
         <p style="font-size:0.75rem;color:var(--text-muted);">Ohio State:瓶装水塑料含量为自来水2-3倍,260万~1150万颗粒/升,半数可入血<br><a href="https://studyfinds.com/bottled-water-twice-plastic-contamination-tap-water/" target="_blank" style="color:var(--blue);">来源: Ohio State Univ. 2026 →</a></p>
         <p style="font-size:0.75rem;color:var(--text-muted);">Ohio State:瓶装水塑料含量为自来水2-3倍,260万~1150万颗粒/升,半数可入血<br><a href="https://studyfinds.com/bottled-water-twice-plastic-contamination-tap-water/" target="_blank" style="color:var(--blue);">来源: Ohio State Univ. 2026 →</a></p>
@@ -781,8 +781,8 @@
 
 
     <!-- 截图:NEJM -->
     <!-- 截图:NEJM -->
     <div style="margin:1rem 0;">
     <div style="margin:1rem 0;">
-      <a href="img/ref-nejm.png" target="_blank">
-        <img src="img/ref-nejm.png" alt="NEJM: Microplastics in Atheromas and Cardiovascular Events" style="width:100%;max-height:500px;object-fit:cover;object-position:top;border-radius:12px;border:1px solid #E2E8F0;box-shadow:0 4px 12px rgba(0,0,0,0.08);">
+      <a href="../img/ref-nejm.png" target="_blank">
+        <img src="../img/ref-nejm.png" alt="NEJM: Microplastics in Atheromas and Cardiovascular Events" style="width:100%;max-height:500px;object-fit:cover;object-position:top;border-radius:12px;border:1px solid #E2E8F0;box-shadow:0 4px 12px rgba(0,0,0,0.08);">
       </a>
       </a>
       <p style="font-size:0.75rem;color:var(--text-muted);margin-top:0.3rem;">↑ NEJM 2024:颈动脉斑块中微塑料使心梗/卒中风险升高4.5倍<br><a href="https://www.nejm.org/doi/full/10.1056/NEJMoa2309822" target="_blank" style="color:var(--blue);">来源: 新英格兰医学杂志</a></p>
       <p style="font-size:0.75rem;color:var(--text-muted);margin-top:0.3rem;">↑ NEJM 2024:颈动脉斑块中微塑料使心梗/卒中风险升高4.5倍<br><a href="https://www.nejm.org/doi/full/10.1056/NEJMoa2309822" target="_blank" style="color:var(--blue);">来源: 新英格兰医学杂志</a></p>
     </div>
     </div>
@@ -1048,21 +1048,21 @@
       <div class="source">[1] PNAS (美国国家科学院院刊) · 2024</div>
       <div class="source">[1] PNAS (美国国家科学院院刊) · 2024</div>
       <div class="findings">Qian N, et al. Rapid single-particle chemical imaging of nanoplastics by SRS microscopy. <em>Proceedings of the National Academy of Sciences</em>, 2024; 121(3): e2300582121. 利用受激拉曼散射(SRS)显微镜实现纳米塑料的单颗粒化学成像,可在无需标记条件下识别水体中纳米塑料的化学成分和来源。</div>
       <div class="findings">Qian N, et al. Rapid single-particle chemical imaging of nanoplastics by SRS microscopy. <em>Proceedings of the National Academy of Sciences</em>, 2024; 121(3): e2300582121. 利用受激拉曼散射(SRS)显微镜实现纳米塑料的单颗粒化学成像,可在无需标记条件下识别水体中纳米塑料的化学成分和来源。</div>
       <a class="link" href="https://www.pnas.org/doi/10.1073/pnas.2300582121" target="_blank">🔗 https://www.pnas.org/doi/10.1073/pnas.2300582121</a>
       <a class="link" href="https://www.pnas.org/doi/10.1073/pnas.2300582121" target="_blank">🔗 https://www.pnas.org/doi/10.1073/pnas.2300582121</a>
-      <a class="ref-link-icon" href="img/ref-pnas.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-pnas.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-2" class="citation-card">
     <div id="ref-2" class="citation-card">
       <div class="source">[2] Journal of Hazardous Materials (Elsevier) · 2025 — 环境科学SCI一区顶刊</div>
       <div class="source">[2] Journal of Hazardous Materials (Elsevier) · 2025 — 环境科学SCI一区顶刊</div>
       <div class="findings">Sajedi S, An C, Chen Z. Unveiling the hidden chronic health risks of nano- and microplastics in single-use plastic water bottles: A review. <em>Journal of Hazardous Materials</em>, 2025; 495: 138948. 系统综述一次性塑料水瓶中纳米/微塑料的长期健康风险,涵盖内分泌干扰、生殖毒性、致癌性等多条证据链。</div>
       <div class="findings">Sajedi S, An C, Chen Z. Unveiling the hidden chronic health risks of nano- and microplastics in single-use plastic water bottles: A review. <em>Journal of Hazardous Materials</em>, 2025; 495: 138948. 系统综述一次性塑料水瓶中纳米/微塑料的长期健康风险,涵盖内分泌干扰、生殖毒性、致癌性等多条证据链。</div>
       <a class="link" href="https://www.sciencedaily.com/releases/2025/10/251006051131.htm" target="_blank">🔗 ScienceDaily 报道 / DOI: 10.1016/j.jhazmat.2025.138948</a>
       <a class="link" href="https://www.sciencedaily.com/releases/2025/10/251006051131.htm" target="_blank">🔗 ScienceDaily 报道 / DOI: 10.1016/j.jhazmat.2025.138948</a>
-      <a class="ref-link-icon" href="img/ref-sciencedaily.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-sciencedaily.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-3" class="citation-card">
     <div id="ref-3" class="citation-card">
       <div class="source">[3] 中国商业网 (ccwin.cn) · 2026年2月 — 国内商业新闻媒体</div>
       <div class="source">[3] 中国商业网 (ccwin.cn) · 2026年2月 — 国内商业新闻媒体</div>
       <div class="findings">国内15品牌30批次瓶装水检测:PET瓶620万颗粒/升,纸盒480万,玻璃瓶350万。</div>
       <div class="findings">国内15品牌30批次瓶装水检测:PET瓶620万颗粒/升,纸盒480万,玻璃瓶350万。</div>
       <a class="link" href="http://www.ccwin.cn/article-87006-1.html" target="_blank">🔗 http://www.ccwin.cn/article-87006-1.html</a>
       <a class="link" href="http://www.ccwin.cn/article-87006-1.html" target="_blank">🔗 http://www.ccwin.cn/article-87006-1.html</a>
-      <a class="ref-link-icon" href="img/ref-3.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-3.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-4" class="citation-card">
     <div id="ref-4" class="citation-card">
@@ -1071,112 +1071,112 @@
       <a class="link" href="https://pubs.acs.org/doi/10.1021/acs.estlett.4c00081" target="_blank">🔗 https://pubs.acs.org/doi/10.1021/acs.estlett.4c00081</a>
       <a class="link" href="https://pubs.acs.org/doi/10.1021/acs.estlett.4c00081" target="_blank">🔗 https://pubs.acs.org/doi/10.1021/acs.estlett.4c00081</a>
       <br>
       <br>
       <a class="link" href="https://news.huanbohainews.com.cn/2025-03/28/content_50422269.html" target="_blank">🔗 科普中国解读报道</a>
       <a class="link" href="https://news.huanbohainews.com.cn/2025-03/28/content_50422269.html" target="_blank">🔗 科普中国解读报道</a>
-      <a class="ref-link-icon" href="img/ref-boiling-water.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-boiling-water.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-5" class="citation-card">
     <div id="ref-5" class="citation-card">
       <div class="source">[5] Frontiers in Public Health · 2025 — PMC12213550 · Frontiers 出版 (瑞士) 公共卫生领域SCI期刊</div>
       <div class="source">[5] Frontiers in Public Health · 2025 — PMC12213550 · Frontiers 出版 (瑞士) 公共卫生领域SCI期刊</div>
       <div class="findings">Zhang X, Yang C, et al. Microplastics and human health: unraveling the toxicological pathways and implications for public health. <em>Frontiers in Public Health</em>, 2025; 13. 系统综述微塑料从环境暴露到人体健康效应的毒理学通路,涵盖氧化应激、炎症、免疫毒性、神经毒性等机制。</div>
       <div class="findings">Zhang X, Yang C, et al. Microplastics and human health: unraveling the toxicological pathways and implications for public health. <em>Frontiers in Public Health</em>, 2025; 13. 系统综述微塑料从环境暴露到人体健康效应的毒理学通路,涵盖氧化应激、炎症、免疫毒性、神经毒性等机制。</div>
       <a class="link" href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12213550/" target="_blank">🔗 https://pmc.ncbi.nlm.nih.gov/articles/PMC12213550/</a>
       <a class="link" href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12213550/" target="_blank">🔗 https://pmc.ncbi.nlm.nih.gov/articles/PMC12213550/</a>
-      <a class="ref-link-icon" href="img/ref-pmc-2025-review.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-pmc-2025-review.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-6" class="citation-card">
     <div id="ref-6" class="citation-card">
       <div class="source">[6] 世界卫生组织 (WHO) · 2019</div>
       <div class="source">[6] 世界卫生组织 (WHO) · 2019</div>
       <div class="findings">Microplastics in drinking-water. Geneva: World Health Organization; 2019. ISBN: 978-92-4-151619-8. WHO 首次系统评估饮用水微塑料的健康风险,指出微量暴露下健康风险较低,但呼吁减少塑料污染以降低长期风险。</div>
       <div class="findings">Microplastics in drinking-water. Geneva: World Health Organization; 2019. ISBN: 978-92-4-151619-8. WHO 首次系统评估饮用水微塑料的健康风险,指出微量暴露下健康风险较低,但呼吁减少塑料污染以降低长期风险。</div>
       <a class="link" href="https://www.who.int/publications/i/item/9789241516198" target="_blank">🔗 https://www.who.int/publications/i/item/9789241516198</a>
       <a class="link" href="https://www.who.int/publications/i/item/9789241516198" target="_blank">🔗 https://www.who.int/publications/i/item/9789241516198</a>
-      <a class="ref-link-icon" href="img/ref-who-report.png" target="_blank">📷 查看报告截图</a>
+      <a class="ref-link-icon" href="../img/ref-who-report.png" target="_blank">📷 查看报告截图</a>
     </div>
     </div>
 
 
     <div id="ref-7" class="citation-card">
     <div id="ref-7" class="citation-card">
       <div class="source">[7] Antioxidants (MDPI) · 2024 — PMC11117644 · MDPI出版 抗氧化剂SCI期刊</div>
       <div class="source">[7] Antioxidants (MDPI) · 2024 — PMC11117644 · MDPI出版 抗氧化剂SCI期刊</div>
       <div class="findings">Kadac-Czapska, et al. Microplastics and Oxidative Stress—Current Problems and Prospects. <em>Antioxidants</em>, 2024; 13(5): 579. PMCID PMC11117644。系统综述微塑料诱导氧化应激的机制,微塑料已在人体血液、肠道、肺、肝、脾、肾、胎盘、心脏组织、颈动脉斑块、大脑中被检出。</div>
       <div class="findings">Kadac-Czapska, et al. Microplastics and Oxidative Stress—Current Problems and Prospects. <em>Antioxidants</em>, 2024; 13(5): 579. PMCID PMC11117644。系统综述微塑料诱导氧化应激的机制,微塑料已在人体血液、肠道、肺、肝、脾、肾、胎盘、心脏组织、颈动脉斑块、大脑中被检出。</div>
       <a class="link" href="https://pmc.ncbi.nlm.nih.gov/articles/PMC11117644/" target="_blank">🔗 https://pmc.ncbi.nlm.nih.gov/articles/PMC11117644/</a>
       <a class="link" href="https://pmc.ncbi.nlm.nih.gov/articles/PMC11117644/" target="_blank">🔗 https://pmc.ncbi.nlm.nih.gov/articles/PMC11117644/</a>
-      <a class="ref-link-icon" href="img/ref-7.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-7.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-8" class="citation-card">
     <div id="ref-8" class="citation-card">
       <div class="source">[8] 新英格兰医学杂志 (NEJM) · 2024 — 全球排名第一的综合性医学期刊</div>
       <div class="source">[8] 新英格兰医学杂志 (NEJM) · 2024 — 全球排名第一的综合性医学期刊</div>
       <div class="findings">Marfella R, et al. Microplastics and Nanoplastics in Atheromas and Cardiovascular Events. <em>N Engl J Med</em>, 2024; 390:900-910. 首次在人体颈动脉斑块中检出微塑料,且斑块中含微塑料的患者发生心梗、中风等心血管事件的概率显著升高。</div>
       <div class="findings">Marfella R, et al. Microplastics and Nanoplastics in Atheromas and Cardiovascular Events. <em>N Engl J Med</em>, 2024; 390:900-910. 首次在人体颈动脉斑块中检出微塑料,且斑块中含微塑料的患者发生心梗、中风等心血管事件的概率显著升高。</div>
       <a class="link" href="https://www.nejm.org/doi/full/10.1056/NEJMoa2309822" target="_blank">🔗 https://www.nejm.org/doi/full/10.1056/NEJMoa2309822</a>
       <a class="link" href="https://www.nejm.org/doi/full/10.1056/NEJMoa2309822" target="_blank">🔗 https://www.nejm.org/doi/full/10.1056/NEJMoa2309822</a>
-      <a class="ref-link-icon" href="img/ref-nejm.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-nejm.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-9" class="citation-card">
     <div id="ref-9" class="citation-card">
       <div class="source">[9] Chemosphere (Elsevier) · 2024 — 维也纳大学 / 维也纳医科大学</div>
       <div class="source">[9] Chemosphere (Elsevier) · 2024 — 维也纳大学 / 维也纳医科大学</div>
       <div class="findings">Pichler V, Kenner L, et al. Microplastics role in cell migration and distribution during cancer cell division. <em>Chemosphere</em>, 2024; 353: 141463. 纳米级微塑料在细胞分裂中传递给子细胞且永不消除,促进结直肠癌细胞迁移,可能加速肿瘤转移。</div>
       <div class="findings">Pichler V, Kenner L, et al. Microplastics role in cell migration and distribution during cancer cell division. <em>Chemosphere</em>, 2024; 353: 141463. 纳米级微塑料在细胞分裂中传递给子细胞且永不消除,促进结直肠癌细胞迁移,可能加速肿瘤转移。</div>
       <a class="link" href="https://doi.org/10.1016/j.chemosphere.2024.141463" target="_blank">🔗 https://doi.org/10.1016/j.chemosphere.2024.141463</a>
       <a class="link" href="https://doi.org/10.1016/j.chemosphere.2024.141463" target="_blank">🔗 https://doi.org/10.1016/j.chemosphere.2024.141463</a>
-      <a class="ref-link-icon" href="img/ref-9.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-9.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-10" class="citation-card">
     <div id="ref-10" class="citation-card">
       <div class="source">[10] BMC Cardiovascular Disorders (Springer) · 2025</div>
       <div class="source">[10] BMC Cardiovascular Disorders (Springer) · 2025</div>
       <div class="findings">Jahedi F, et al. From pollution to palpitations: the heart's silent battle with microplastics. <em>BMC Cardiovascular Disorders</em>, 2025; 25: 837. 系统综述72篇研究,证实微塑料可通过氧化应激、炎症、细胞凋亡等机制损害心脏功能,导致心率改变、心包水肿、心肌纤维化。</div>
       <div class="findings">Jahedi F, et al. From pollution to palpitations: the heart's silent battle with microplastics. <em>BMC Cardiovascular Disorders</em>, 2025; 25: 837. 系统综述72篇研究,证实微塑料可通过氧化应激、炎症、细胞凋亡等机制损害心脏功能,导致心率改变、心包水肿、心肌纤维化。</div>
       <a class="link" href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12648859/" target="_blank">🔗 https://pmc.ncbi.nlm.nih.gov/articles/PMC12648859/</a>
       <a class="link" href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12648859/" target="_blank">🔗 https://pmc.ncbi.nlm.nih.gov/articles/PMC12648859/</a>
-      <a class="ref-link-icon" href="img/ref-10.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-10.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-11" class="citation-card">
     <div id="ref-11" class="citation-card">
       <div class="source">[11] Antioxidants (MDPI) · 2025</div>
       <div class="source">[11] Antioxidants (MDPI) · 2025</div>
       <div class="findings">Wang Z, et al. Antioxidant Intervention Against Microplastic Hazards. <em>Antioxidants</em>, 2025; 14(7): 797. 系统梳理微塑料的氧化应激机制和天然抗氧化剂(维生素C、姜黄素、槲皮素等)的干预作用与局限性。</div>
       <div class="findings">Wang Z, et al. Antioxidant Intervention Against Microplastic Hazards. <em>Antioxidants</em>, 2025; 14(7): 797. 系统梳理微塑料的氧化应激机制和天然抗氧化剂(维生素C、姜黄素、槲皮素等)的干预作用与局限性。</div>
       <a class="link" href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12291741/" target="_blank">🔗 https://pmc.ncbi.nlm.nih.gov/articles/PMC12291741/</a>
       <a class="link" href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12291741/" target="_blank">🔗 https://pmc.ncbi.nlm.nih.gov/articles/PMC12291741/</a>
-      <a class="ref-link-icon" href="img/ref-11.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-11.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-12" class="citation-card">
     <div id="ref-12" class="citation-card">
       <div class="source">[12] Environment International (Elsevier) · 2023 — 中科院沈阳应用生态研究所</div>
       <div class="source">[12] Environment International (Elsevier) · 2023 — 中科院沈阳应用生态研究所</div>
       <div class="findings">Zhang Z, et al. Continuous oral exposure to micro- and nanoplastics induced gut microbiota dysbiosis, intestinal barrier and immune dysfunction in adult mice. <em>Environment International</em>, 2023; 182: 108353. 微塑料改变肠道菌群结构(降低 Firmicutes/Bacteroidetes 比值)、破坏肠道屏障功能、抑制肠道免疫。</div>
       <div class="findings">Zhang Z, et al. Continuous oral exposure to micro- and nanoplastics induced gut microbiota dysbiosis, intestinal barrier and immune dysfunction in adult mice. <em>Environment International</em>, 2023; 182: 108353. 微塑料改变肠道菌群结构(降低 Firmicutes/Bacteroidetes 比值)、破坏肠道屏障功能、抑制肠道免疫。</div>
       <a class="link" href="https://www.sciencedirect.com/science/article/pii/S0160412023004650" target="_blank">🔗 https://doi.org/10.1016/j.envint.2023.108353</a>
       <a class="link" href="https://www.sciencedirect.com/science/article/pii/S0160412023004650" target="_blank">🔗 https://doi.org/10.1016/j.envint.2023.108353</a>
-      <a class="ref-link-icon" href="img/ref-12.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-12.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-13" class="citation-card">
     <div id="ref-13" class="citation-card">
       <div class="source">[13] Nature Medicine (Springer Nature) · 2025 — 新墨西哥大学</div>
       <div class="source">[13] Nature Medicine (Springer Nature) · 2025 — 新墨西哥大学</div>
       <div class="findings">Nihart AJ, Campen M, et al. Bioaccumulation of microplastics in decedent human brains. <em>Nature Medicine</em>, 2025; 31: 1114–1119. 人脑微塑料浓度显著高于肝脏和肾脏;2016–2024年间浓度增加50%;痴呆症患者脑中微塑料浓度更高。</div>
       <div class="findings">Nihart AJ, Campen M, et al. Bioaccumulation of microplastics in decedent human brains. <em>Nature Medicine</em>, 2025; 31: 1114–1119. 人脑微塑料浓度显著高于肝脏和肾脏;2016–2024年间浓度增加50%;痴呆症患者脑中微塑料浓度更高。</div>
       <a class="link" href="https://www.nature.com/articles/s41591-024-03453-1" target="_blank">🔗 https://www.nature.com/articles/s41591-024-03453-1</a>
       <a class="link" href="https://www.nature.com/articles/s41591-024-03453-1" target="_blank">🔗 https://www.nature.com/articles/s41591-024-03453-1</a>
-      <a class="ref-link-icon" href="img/ref-13.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-13.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-14" class="citation-card">
     <div id="ref-14" class="citation-card">
       <div class="source">[14] Best Practice & Research Clinical Endocrinology & Metabolism (Elsevier) · 2021 — 内分泌代谢领域临床综述权威期刊</div>
       <div class="source">[14] Best Practice & Research Clinical Endocrinology & Metabolism (Elsevier) · 2021 — 内分泌代谢领域临床综述权威期刊</div>
       <div class="findings">Biemann R, Blüher M, Isermann B. Exposure to endocrine-disrupting compounds such as phthalates and bisphenol A is associated with an increased risk for obesity. <em>Best Practice & Research Clinical Endocrinology & Metabolism</em>, 2021; 35(5): 101546. 综述塑化剂(邻苯二甲酸酯)和双酚A等内分泌干扰物暴露与肥胖风险的关联,揭示塑料化学物质通过干扰激素代谢促进肥胖的机制。</div>
       <div class="findings">Biemann R, Blüher M, Isermann B. Exposure to endocrine-disrupting compounds such as phthalates and bisphenol A is associated with an increased risk for obesity. <em>Best Practice & Research Clinical Endocrinology & Metabolism</em>, 2021; 35(5): 101546. 综述塑化剂(邻苯二甲酸酯)和双酚A等内分泌干扰物暴露与肥胖风险的关联,揭示塑料化学物质通过干扰激素代谢促进肥胖的机制。</div>
       <a class="link" href="https://www.sciencedirect.com/science/article/pii/S1521690X21000634" target="_blank">🔗 ScienceDirect</a>
       <a class="link" href="https://www.sciencedirect.com/science/article/pii/S1521690X21000634" target="_blank">🔗 ScienceDirect</a>
-      <a class="ref-link-icon" href="img/ref-14.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-14.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-15" class="citation-card">
     <div id="ref-15" class="citation-card">
       <div class="source">[15] Endocrine and Metabolic Science (Elsevier) · 2026 — 内分泌代谢科学期刊</div>
       <div class="source">[15] Endocrine and Metabolic Science (Elsevier) · 2026 — 内分泌代谢科学期刊</div>
       <div class="findings">Mondal R, et al. Human exposure to microplastics and insights into microplastics as obesogens and other metabolic disorders. <em>Endocrine and Metabolic Science</em>, 2026; 100318. 系统阐述微塑料作为"致肥因子(obesogens)"的作用机制,包括干扰脂质代谢、诱导胰岛素抵抗、破坏能量平衡等通路。</div>
       <div class="findings">Mondal R, et al. Human exposure to microplastics and insights into microplastics as obesogens and other metabolic disorders. <em>Endocrine and Metabolic Science</em>, 2026; 100318. 系统阐述微塑料作为"致肥因子(obesogens)"的作用机制,包括干扰脂质代谢、诱导胰岛素抵抗、破坏能量平衡等通路。</div>
       <a class="link" href="https://www.sciencedirect.com/science/article/pii/S2666396126000300" target="_blank">🔗 ScienceDirect</a>
       <a class="link" href="https://www.sciencedirect.com/science/article/pii/S2666396126000300" target="_blank">🔗 ScienceDirect</a>
-      <a class="ref-link-icon" href="img/ref-15.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-15.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-16" class="citation-card">
     <div id="ref-16" class="citation-card">
       <div class="source">[16] FDA (美国食品药品监督管理局) · Reverse Osmosis</div>
       <div class="source">[16] FDA (美国食品药品监督管理局) · Reverse Osmosis</div>
       <div class="findings">反渗透技术用于制造透析用水、注射用水。RO膜可去除水中99%以上的溶解性固体,包括矿物质。</div>
       <div class="findings">反渗透技术用于制造透析用水、注射用水。RO膜可去除水中99%以上的溶解性固体,包括矿物质。</div>
       <a class="link" href="https://www.fda.gov/inspections-compliance-enforcement-and-criminal-investigations/inspection-technical-guides/reverse-osmosis" target="_blank">🔗 FDA 技术指南</a>
       <a class="link" href="https://www.fda.gov/inspections-compliance-enforcement-and-criminal-investigations/inspection-technical-guides/reverse-osmosis" target="_blank">🔗 FDA 技术指南</a>
-      <a class="ref-link-icon" href="img/ref-16.png" target="_blank">📷 查看截图</a>
+      <a class="ref-link-icon" href="../img/ref-16.png" target="_blank">📷 查看截图</a>
     </div>
     </div>
 
 
     <div id="ref-17" class="citation-card">
     <div id="ref-17" class="citation-card">
       <div class="source">[17] 世界卫生组织 (WHO) · 2005</div>
       <div class="source">[17] 世界卫生组织 (WHO) · 2005</div>
       <div class="findings">Nutrients in Drinking Water. WHO 报告第12章"HEALTH RISKS FROM DRINKING DEMINERALISED WATER"明确指出:长期饮用去矿物质水可能对健康产生负面影响,包括增加矿物质流失、心血管风险和代谢负担。</div>
       <div class="findings">Nutrients in Drinking Water. WHO 报告第12章"HEALTH RISKS FROM DRINKING DEMINERALISED WATER"明确指出:长期饮用去矿物质水可能对健康产生负面影响,包括增加矿物质流失、心血管风险和代谢负担。</div>
       <a class="link" href="https://www.who.int/water_sanitation_health/dwq/nutrientschap12.pdf" target="_blank">🔗 WHO 第12章原文 PDF</a>
       <a class="link" href="https://www.who.int/water_sanitation_health/dwq/nutrientschap12.pdf" target="_blank">🔗 WHO 第12章原文 PDF</a>
-      <a class="ref-link-icon" href="img/ref-17.png" target="_blank">📷 查看截图</a>
+      <a class="ref-link-icon" href="../img/ref-17.png" target="_blank">📷 查看截图</a>
     </div>
     </div>
 
 
     <div id="ref-18" class="citation-card">
     <div id="ref-18" class="citation-card">
       <div class="source">[18] 中科院城市环境研究所 · 2020</div>
       <div class="source">[18] 中科院城市环境研究所 · 2020</div>
       <div class="findings">家用净水器饮水安全问答:膜过滤技术存在微生物泄露风险,滤芯需定期更换;不建议长期饮用RO纯水,超滤/纳滤更适宜日常所需。</div>
       <div class="findings">家用净水器饮水安全问答:膜过滤技术存在微生物泄露风险,滤芯需定期更换;不建议长期饮用RO纯水,超滤/纳滤更适宜日常所需。</div>
       <a class="link" href="https://iue.cas.cn/xwzx/mtsm/202009/P020200925375787224817.pdf" target="_blank">🔗 中科院原文 PDF</a>
       <a class="link" href="https://iue.cas.cn/xwzx/mtsm/202009/P020200925375787224817.pdf" target="_blank">🔗 中科院原文 PDF</a>
-      <a class="ref-link-icon" href="img/ref-18.png" target="_blank">📷 查看截图</a>
+      <a class="ref-link-icon" href="../img/ref-18.png" target="_blank">📷 查看截图</a>
     </div>
     </div>
 
 
     <div id="ref-19" class="citation-card">
     <div id="ref-19" class="citation-card">
       <div class="source">[19] 科学网(中国科学院主办)· 2024 — 孙学军教授(第二军医大学)氢医学综述</div>
       <div class="source">[19] 科学网(中国科学院主办)· 2024 — 孙学军教授(第二军医大学)氢医学综述</div>
       <div class="findings">氢水的健康价值:抗炎症抗氧化【综述】。电解氢水具有抗氧化、抗炎、神经保护、抗凋亡、抗过敏等作用。与普通氢水相比,电解氢水的活性氧清除能力约为5倍。</div>
       <div class="findings">氢水的健康价值:抗炎症抗氧化【综述】。电解氢水具有抗氧化、抗炎、神经保护、抗凋亡、抗过敏等作用。与普通氢水相比,电解氢水的活性氧清除能力约为5倍。</div>
       <a class="link" href="https://blog.sciencenet.cn/blog-41174-1424107.html" target="_blank">🔗 科学网 孙学军教授综述</a>
       <a class="link" href="https://blog.sciencenet.cn/blog-41174-1424107.html" target="_blank">🔗 科学网 孙学军教授综述</a>
-      <a class="ref-link-icon" href="img/ref-19.png" target="_blank">📷 查看截图</a>
+      <a class="ref-link-icon" href="../img/ref-19.png" target="_blank">📷 查看截图</a>
     </div>
     </div>
 
 
     <div id="ref-20" class="citation-card">
     <div id="ref-20" class="citation-card">
@@ -1185,14 +1185,14 @@
       <a class="link" href="https://www.anses.fr/en/content/caps-glass-bottles-contaminate-beverages-microplastics" target="_blank">🔗 ANSES 官方报告</a>
       <a class="link" href="https://www.anses.fr/en/content/caps-glass-bottles-contaminate-beverages-microplastics" target="_blank">🔗 ANSES 官方报告</a>
       <br>
       <br>
       <a class="link" href="https://www.sciencedirect.com/science/article/pii/S0889157525005344" target="_blank">🔗 ScienceDirect 原文</a>
       <a class="link" href="https://www.sciencedirect.com/science/article/pii/S0889157525005344" target="_blank">🔗 ScienceDirect 原文</a>
-      <a class="ref-link-icon" href="img/ref-20.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-20.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-21" class="citation-card">
     <div id="ref-21" class="citation-card">
       <div class="source">[21] Heliyon (Cell Press) · 2024 — 南加州大学</div>
       <div class="source">[21] Heliyon (Cell Press) · 2024 — 南加州大学</div>
       <div class="findings">Wang Y, Wang Y. Assessing microplastic contamination in soda beverages: A multi-city, multi-container laser direct infrared spectroscopy study. <em>Heliyon</em>, 2024; 10(12): e32805. 对美国4城市同一品牌汽水的铝罐、玻璃瓶、塑料瓶三种包装检测发现:地理来源对微塑料含量的影响大于包装类型;铝罐和玻璃瓶因瓶盖/密封结构复杂,微塑料含量与塑料瓶无显著差异。</div>
       <div class="findings">Wang Y, Wang Y. Assessing microplastic contamination in soda beverages: A multi-city, multi-container laser direct infrared spectroscopy study. <em>Heliyon</em>, 2024; 10(12): e32805. 对美国4城市同一品牌汽水的铝罐、玻璃瓶、塑料瓶三种包装检测发现:地理来源对微塑料含量的影响大于包装类型;铝罐和玻璃瓶因瓶盖/密封结构复杂,微塑料含量与塑料瓶无显著差异。</div>
       <a class="link" href="https://doi.org/10.1016/j.heliyon.2024.e32805" target="_blank">🔗 https://doi.org/10.1016/j.heliyon.2024.e32805</a>
       <a class="link" href="https://doi.org/10.1016/j.heliyon.2024.e32805" target="_blank">🔗 https://doi.org/10.1016/j.heliyon.2024.e32805</a>
-      <a class="ref-link-icon" href="img/ref-21.png" target="_blank">📷 查看论文截图</a>
+      <a class="ref-link-icon" href="../img/ref-21.png" target="_blank">📷 查看论文截图</a>
     </div>
     </div>
 
 
     <div id="ref-22" class="citation-card">
     <div id="ref-22" class="citation-card">
@@ -1209,6 +1209,6 @@
 
 
 <!-- Footer (shared) -->
 <!-- Footer (shared) -->
 <div id="footer-placeholder"></div>
 <div id="footer-placeholder"></div>
-<script src="js/footer.js"></script>
+<script src="../js/footer.js"></script>
 </body>
 </body>
 </html>
 </html>

+ 63 - 19
web/articles/tap-water-pollution.html

@@ -701,7 +701,16 @@
         <li>不健康饮食模式与抗生素检出率显著正相关</li>
         <li>不健康饮食模式与抗生素检出率显著正相关</li>
         <li>9.05% 的儿童风险指数(HI)&gt;1,主要贡献来自环丙沙星</li>
         <li>9.05% 的儿童风险指数(HI)&gt;1,主要贡献来自环丙沙星</li>
       </ul>
       </ul>
-      <p>这意味着抗生素污染已不仅仅是环境问题——它已经进入了人体,尤其是发育中的儿童体内。</p>
+       <p>这意味着抗生素污染已不仅仅是环境问题——它已经进入了人体,尤其是发育中的儿童体内。</p>
+
+       <!-- 截图:抗生素→ARGs转移链 -->
+       <div class="screenshot-block">
+         <img src="../img/ref-screenshots/antibiotics-args-transfer.jpg" alt="抗生素残留→ARGs→人体传播链 - 医疗废水/养殖业/农业灌溉→水体选择压力→ARGs积累;水平基因转移示意图(敏感菌→耐药菌→人体肠道);底部WHO抗生素耐药数据">
+         <div class="caption">
+           <strong>📊 抗生素残留→抗生素抗性基因(ARGs)→人体传播链(示意)</strong><br>
+           抗生素进入水体的三条主要途径(医疗废水、养殖业、农业灌溉),在水体中形成低浓度选择压力(磺胺类10-50 ng/L、四环素类5-30 ng/L),筛选并积累抗生素抗性基因(ARGs)。通过水平基因转移(质粒转导),敏感细菌→耐药细菌→进入人体肠道→传给正常菌群→多重耐药菌(MDR),导致治疗性抗生素失效。底部WHO数据:耐药性可能导致到2050年全球死亡人数超过癌症,每年约127万人直接死于耐药性感染。
+         </div>
+       </div>
     </div>
     </div>
   </section>
   </section>
 
 
@@ -710,9 +719,18 @@
     <div class="info-card">
     <div class="info-card">
       <h2><span class="emoji">⚧️</span> 二、避孕药与雌激素:浓度虽低,活性惊人</h2>
       <h2><span class="emoji">⚧️</span> 二、避孕药与雌激素:浓度虽低,活性惊人</h2>
 
 
-      <p>口服避孕药的主要成分——17α-炔雌醇(EE2)和天然雌激素(雌酮 E1、雌二醇 E2、雌三醇 E3)——通过尿液排泄进入污水系统,常规污水处理厂无法完全去除,最终进入地表水和饮用水水源。</p>
+       <p>口服避孕药的主要成分——17α-炔雌醇(EE2)和天然雌激素(雌酮 E1、雌二醇 E2、雌三醇 E3)——通过尿液排泄进入污水系统,常规污水处理厂无法完全去除,最终进入地表水和饮用水水源。</p>
 
 
-      <h3>全国地表水类固醇激素 Meta 分析</h3>
+       <!-- 截图:EDCs 污染链 -->
+       <div class="screenshot-block">
+         <img src="../img/ref-screenshots/edc-contamination-chain.jpg" alt="EDCs从水体到人体的迁移链 - 工业排放/生活污水/农业径流/垃圾渗滤液→地表水→自来水厂(EDCs去除有限)→家庭自来水→人体,底部三类健康影响:生殖系统/儿童发育/癌症与代谢疾病">
+         <div class="caption">
+           <strong>📊 环境内分泌干扰物(EDCs)从水体到人体的迁移链(示意)</strong><br>
+           EDCs(双酚A、邻苯二甲酸酯、多氯联苯、农药代谢物、阻燃剂等)从四条主要来源(工业排放、生活污水、农业径流、垃圾渗滤液)进入地表水体,经自来水厂处理(常规工艺EDCs去除率仅40-70%)进入家庭自来水系统。家庭暴露途径包括直接饮用、皮肤吸收、蒸汽吸入。健康影响覆盖三大领域:生殖系统(不孕不育/PCOS/精子质量下降)、儿童发育(性早熟/神经系统发育异常)、癌症与代谢(乳腺癌/甲状腺疾病/前列腺癌)。
+         </div>
+       </div>
+
+       <h3>全国地表水类固醇激素 Meta 分析</h3>
       <p>2023 年一项涵盖 2005–2023 年中国地表水数据的系统综述<sup><a href="#ref-5">[5]</a></sup>:</p>
       <p>2023 年一项涵盖 2005–2023 年中国地表水数据的系统综述<sup><a href="#ref-5">[5]</a></sup>:</p>
 
 
       <div class="data-table-wrap">
       <div class="data-table-wrap">
@@ -754,13 +772,12 @@
 
 
       <p>2025 年发表于 <em>Science of the Total Environment</em> 的中国主要流域农药风险荟萃分析<sup><a href="#ref-9">[9]</a></sup>(覆盖 2012–2023 年数据)显示:<strong>46 种农药在水体中频繁检出</strong>,浓度范围从未检出至 <strong>12,100 ng/L</strong>。中国 2024 年生产 <strong>350 万吨农药</strong>(约占全球产量的 68%),注册了 748 种农药活性成分。</p>
       <p>2025 年发表于 <em>Science of the Total Environment</em> 的中国主要流域农药风险荟萃分析<sup><a href="#ref-9">[9]</a></sup>(覆盖 2012–2023 年数据)显示:<strong>46 种农药在水体中频繁检出</strong>,浓度范围从未检出至 <strong>12,100 ng/L</strong>。中国 2024 年生产 <strong>350 万吨农药</strong>(约占全球产量的 68%),注册了 748 种农药活性成分。</p>
 
 
-      <!-- 截图占位:农药检测数据图 -->
+      <!-- 截图:农药检测数据图 -->
       <div class="screenshot-block">
       <div class="screenshot-block">
-        <!-- 用户替换:此处应放置农药浓度柱状图或热力图 -->
-        <div style="padding:3rem;text-align:center;color:var(--text-muted);">
-          📸 <strong>待添加截图:</strong> 中国主要流域农药浓度分布热力图<br>
-          <span style="font-size:0.8rem;">建议:使用 Sci Total Environ (2025) 中的流域农药检出数据图</span><br>
-          <span style="font-size:0.75rem;color:var(--blue);">来源: A decade-long meta-analysis of risks posed by pesticides in Chinese surface waters, Sci Total Environ (2025)</span>
+        <img src="../img/ref-screenshots/pesticides-46-detection.jpg" alt="中国地表水46种杀虫剂检出率分布 - Top10检出率最高的农药条形图,毒死蜱78%、吡虫啉65%、敌敌畏58%位列前三;底部三张卡片说明46种检出、7种禁用仍存、自来水潜在暴露">
+        <div class="caption">
+          <strong>📊 中国地表水46种杀虫剂检出率分布(示意)</strong><br>
+          基于荟萃分析数据(Li et al. J. Environ. Manage. 2025)整理。Top 10 中,有机磷类(毒死蜱78%、敌敌畏58%)和新烟碱类(吡虫啉65%、噻虫嗪47%)为主力污染物。底部三张卡片分别说明:全国检出46种不同杀虫剂品种、7种已禁用农药仍频繁检出、以及通过自来水进入家庭的潜在暴露途径。
         </div>
         </div>
       </div>
       </div>
 
 
@@ -816,17 +833,26 @@
 
 
       <p>自来水厂使用氯或氯胺消毒杀灭病原微生物,这是保障饮用水安全的必要手段。但氯与水中天然有机物(腐殖酸、富里酸等)反应,生成<strong>消毒副产物(DBPs)</strong>——包括三卤甲烷(THMs)、卤乙酸(HAAs)、亚硝胺(NDMA)等数百种化合物。这些物质的致癌性和生殖毒性已被多项研究证实。</p>
       <p>自来水厂使用氯或氯胺消毒杀灭病原微生物,这是保障饮用水安全的必要手段。但氯与水中天然有机物(腐殖酸、富里酸等)反应,生成<strong>消毒副产物(DBPs)</strong>——包括三卤甲烷(THMs)、卤乙酸(HAAs)、亚硝胺(NDMA)等数百种化合物。这些物质的致癌性和生殖毒性已被多项研究证实。</p>
 
 
-      <!-- 截图占位:Nature Sustainability DBP 研究图 -->
+      <!-- 截图:DBP 空间分布图 -->
       <div class="screenshot-block">
       <div class="screenshot-block">
-        <!-- 用户替换:此处应放置 Liu et al. 2022 Nature Sustainability 中的 DBP 空间分布图 -->
-        <div style="padding:3rem;text-align:center;color:var(--text-muted);">
-          📸 <strong>待添加截图:</strong> Liu et al. (2022) 中国自来水 DBP 浓度空间分布图<br>
-          <span style="font-size:0.8rem;">显示中国各地 DBP 浓度差异及与膀胱癌发病率的空间相关性</span><br>
-          <span style="font-size:0.75rem;color:var(--blue);">来源: Liu M et al. Nat Sustain 5, 689–698 (2022)</span>
+        <img src="../img/ref-screenshots/chinas-dbps-spatial.jpg" alt="中国自来水消毒副产物(DBPs)区域分布 - 中国地图显示东北THMs高区(红色)、长江中游DBPs显著升高区(橙色)、上海华东低区(绿色)、西北适中区(黄色);底部三张卡片分别说明THMs/HAAs/NDMA的组成成分与健康风险">
+        <div class="caption">
+          <strong>📊 中国自来水消毒副产物(DBPs)区域分布(示意)</strong><br>
+          基于 Liu et al. (2022) <em>Nature Sustainability</em> 中国自来水 DBP 全国性评估。地图显示:东北地区 THMs 浓度最高,长江中游区域 DBPs 毒性显著且与癌症发生率相关,上海因广泛使用臭氧生物过滤(DBPs远低于其他三大城市)。底部三张卡片分别说明:三卤甲烷(THMs)的四种成分与膀胱癌/结直肠癌风险、卤乙酸(HAAs)毒性高于THMs 3-10倍与肝癌/肾癌风险、NDMA的极强致癌性以及纳米过滤(NF)家庭终端方案。
         </div>
         </div>
       </div>
       </div>
 
 
       <h3>1. 里程碑研究:Nature Sustainability 2022</h3>
       <h3>1. 里程碑研究:Nature Sustainability 2022</h3>
+
+      <!-- 截图:氯消毒反应机制图 -->
+      <div class="screenshot-block">
+        <img src="../img/ref-screenshots/ch2o-cl2-reaction.jpg" alt="自来水余氯与有机污染物反应机制 - 原水→自来水厂→加氯消毒→管网输送→家庭水龙头的流程图;底部说明化学反应机制Cl₂+有机物→DBPs,及影响DBP形成的四个关键因素(前体物浓度/氯投加量/卤素种类/水温pH)和家庭暴露途径(饮用56%/烹饪25%/洗浴12%)">
+        <div class="caption">
+          <strong>📊 自来水余氯与有机污染物反应机制(示意)</strong><br>
+          氯消毒的完整链条:原水→自来水厂(部分去除)→加氯消毒(关键反应点:Cl₂+有机物→THMs/HAAs)→管网输送(DBPs持续积累)→家庭水龙头。底部左侧说明四个影响DBP形成的关键因素(前体物浓度、氯投加量与接触时间、卤素种类、水温与pH),右侧说明三种家庭暴露途径(饮用56%、烹饪25%、洗浴12%),以及皮肤吸收和吸入两种被低估的暴露途径。
+        </div>
+      </div>
+
       <p>2022 年,中科院生态环境研究中心的 Liu et al. 在 <em>Nature Sustainability</em> 发表了迄今为止<strong>中国自来水 DBP 最全面的全国性评估</strong><sup><a href="#ref-13">[13]</a></sup>,核心发现:</p>
       <p>2022 年,中科院生态环境研究中心的 Liu et al. 在 <em>Nature Sustainability</em> 发表了迄今为止<strong>中国自来水 DBP 最全面的全国性评估</strong><sup><a href="#ref-13">[13]</a></sup>,核心发现:</p>
       <ul>
       <ul>
         <li>中国自来水 DBP 浓度<strong>因地区差异显著</strong>,与<strong>膀胱癌发病率存在统计学关联</strong></li>
         <li>中国自来水 DBP 浓度<strong>因地区差异显著</strong>,与<strong>膀胱癌发病率存在统计学关联</strong></li>
@@ -886,9 +912,18 @@
     <div class="info-card">
     <div class="info-card">
       <h2><span class="emoji">🦠</span> 五、多污染物如何破坏肠道菌群</h2>
       <h2><span class="emoji">🦠</span> 五、多污染物如何破坏肠道菌群</h2>
 
 
-      <p>这是这篇文章最核心的逻辑——<strong>自来水中的多种低剂量污染物,如何协同破坏肠道菌群,进而影响全身健康</strong>。</p>
+       <p>这是这篇文章最核心的逻辑——<strong>自来水中的多种低剂量污染物,如何协同破坏肠道菌群,进而影响全身健康</strong>。</p>
 
 
-      <p>2023 年发表于 <em>Ecotoxicology and Environmental Safety</em> 的研究<sup><a href="#ref-3">[3]</a></sup>,在动物模型中模拟了环境浓度抗生素暴露的真实影响:</p>
+       <!-- 截图:肠道菌群破坏机制 -->
+       <div class="screenshot-block">
+         <img src="../img/ref-screenshots/gut-microbiome-damage.jpg" alt="自来水污染物对肠道菌群的破坏 - 左侧列出进入体内的四类污染物(DBP/农药/EDC/抗生素),右侧展示健康菌群→失衡(Dysbiosis)的变化机制,底部四大健康后果:消化系统/代谢/免疫/神经发育">
+         <div class="caption">
+           <strong>📊 自来水污染物对肠道菌群的破坏机制(示意)</strong><br>
+           四种污染物(DBPs/农药/EDCs/抗生素)进入人体后,对肠道微生物生态的四级破坏:①抗生素抗性基因(ARGs)传播 → ②有益菌被选择性抑制(双歧杆菌/乳酸菌减少) → ③肠道屏障功能受损(肠漏) → ④代谢产物异常(SCFA减少)。最终导致四方面健康后果:消化系统(IBD/IBS)、代谢(肥胖/糖尿病)、免疫(过敏/自身免疫)、神经发育(肠道-脑轴异常/认知迟缓)。
+         </div>
+       </div>
+
+       <p>2023 年发表于 <em>Ecotoxicology and Environmental Safety</em> 的研究<sup><a href="#ref-3">[3]</a></sup>,在动物模型中模拟了环境浓度抗生素暴露的真实影响:</p>
 
 
       <div class="highlight-box alert">
       <div class="highlight-box alert">
         <p><strong>🔬 关键实验结果:</strong></p>
         <p><strong>🔬 关键实验结果:</strong></p>
@@ -953,9 +988,18 @@
     <div class="info-card">
     <div class="info-card">
       <h2><span class="emoji">💧</span> 七、解决方案:Enagic 还原水机</h2>
       <h2><span class="emoji">💧</span> 七、解决方案:Enagic 还原水机</h2>
 
 
-      <p>既然市政供水系统无法完全去除药品残留、农药、DBPs 等新兴污染物,<strong>终端净水</strong>就成为家庭饮用水安全的最后一道防线。在多种终端净水方案中,<strong>Enagic 还原水机(Kangen Water Machine)</strong>是一种将多层过滤与电解还原技术结合的设备,在去除污染物的同时提供具有健康增益的活性氢水。</p>
+       <p>既然市政供水系统无法完全去除药品残留、农药、DBPs 等新兴污染物,<strong>终端净水</strong>就成为家庭饮用水安全的最后一道防线。在多种终端净水方案中,<strong>Enagic 还原水机(Kangen Water Machine)</strong>是一种将多层过滤与电解还原技术结合的设备,在去除污染物的同时提供具有健康增益的活性氢水。</p>
+
+       <!-- 截图:Enagic 还原水对比 -->
+       <div class="screenshot-block">
+         <img src="../img/ref-screenshots/enagic-comparison.svg" alt="自来水vs Enagic还原水对比 - Enagic SD501机器图,电解水原理(阳极氧化+阴极还原),关键改善参数(pH/ORP/分子团簇/活性氢),六项指标详细对比表格">
+         <div class="caption">
+           <strong>📊 自来水 vs Enagic还原水(Kangen Water)对比(示意)</strong><br>
+           左侧展示 Enagic SD501 机器外观与核心部件(铂涂层钛电极、pH/ORP显示屏)。中间电解水原理:自来水通过电解槽,阳极产生酸性氧化水(排入下水道),阴极产生碱性还原水(饮用水)。关键改善四项参数:pH 8.5-9.0弱碱性、ORP -200~-400mV抗氧化、小分子团簇(5-6个分子)吸收快、富含活性氢H₂清除自由基。下方六项指标详细对比表格覆盖pH/ORP/分子团簇/余氯DBPs/活性氢/矿物质保留。
+         </div>
+       </div>
 
 
-      <!-- ===== ENAGIC 介绍 ===== -->
+       <!-- ===== ENAGIC 介绍 ===== -->
       <div class="enagic-hero">
       <div class="enagic-hero">
         <h3>🇯🇵 Enagic:日本 1974 年创立的还原水品牌</h3>
         <h3>🇯🇵 Enagic:日本 1974 年创立的还原水品牌</h3>
         <p>由 Hironari Ohshiro(大城博成)于 1974 年在日本大阪创立,"Kangen" 日语意为"回归本源"。目前是全球唯一持有 <strong>ISO 13485 医疗设备质量管理体系认证</strong> 的水离子器制造商,获得日本厚生劳动省医疗设备制造许可(许可号 27BZ006010),产品销往全球 29 个国家。</p>
         <p>由 Hironari Ohshiro(大城博成)于 1974 年在日本大阪创立,"Kangen" 日语意为"回归本源"。目前是全球唯一持有 <strong>ISO 13485 医疗设备质量管理体系认证</strong> 的水离子器制造商,获得日本厚生劳动省医疗设备制造许可(许可号 27BZ006010),产品销往全球 29 个国家。</p>

+ 815 - 0
web/articles/turmeric.html

@@ -0,0 +1,815 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="description" content="姜黄素是天然抗炎化合物,但生物利用率不足1%。本文解析姜黄素(curcumin)的抗炎机制、功效证据、应用指南与科学补充方案。">
+<meta name="keywords" content="姜黄素,curcumin,抗炎,姜黄,生物利用率,慢性炎症,自然疗法,磷脂配比,姜黄素吸收率">
+<meta property="og:title" content="姜黄素:抗炎之王的科学解读 · 浠艾福">
+<meta property="og:description" content="姜黄素是天然抗炎化合物,但生物利用率不足1%。本文解析其抗炎机制、功效证据、应用指南。">
+<meta property="og:type" content="article">
+<title>姜黄素:抗炎之王的科学解读 · 浠艾福</title>
+<style>
+  :root {
+    --bg-dark: #8B4513;
+    --bg-card: #FFFFFF;
+    --bg-alt: #faf5f0;
+    --text-primary: #2d1810;
+    --text-secondary: #5a3a2a;
+    --text-muted: #8b6b5a;
+    --accent: #d97706;
+    --accent-light: #fef3c7;
+    --blue: #2d7d9a;
+    --blue-light: #e8f4f8;
+    --green: #38a169;
+    --green-light: #f0fff4;
+    --orange: #dd6b20;
+    --orange-light: #fffaf0;
+    --purple: #805ad5;
+    --purple-light: #faf5ff;
+    --teal: #319795;
+    --teal-light: #e6fffa;
+    --font: system-ui, -apple-system, "PingFang SC", "Microsoft YaHei", "Noto Sans SC", sans-serif;
+    --max-width: 1080px;
+    --shadow-card: 0 4px 24px rgba(0,0,0,0.08);
+    --shadow-hover: 0 8px 40px rgba(0,0,0,0.12);
+    --radius: 16px;
+  }
+  * { margin: 0; padding: 0; box-sizing: border-box; }
+  html { scroll-behavior: smooth; }
+  body {
+    font-family: var(--font);
+    font-size: 1rem;
+    line-height: 1.8;
+    color: var(--text-primary);
+    background: #fff;
+    -webkit-font-smoothing: antialiased;
+  }
+
+  /* HERO */
+  .hero {
+    position: relative;
+    background: linear-gradient(135deg, #8B4513 0%, #b8860b 40%, #d4a017 100%);
+    color: white;
+    padding: 6rem 1.5rem 4rem;
+    overflow: hidden;
+    min-height: 60vh;
+    display: flex;
+    align-items: center;
+  }
+  .hero::before {
+    content: '';
+    position: absolute;
+    inset: 0;
+    background:
+      radial-gradient(circle at 20% 30%, rgba(255,200,50,0.15) 0%, transparent 50%),
+      radial-gradient(circle at 80% 70%, rgba(255,180,0,0.1) 0%, transparent 50%);
+  }
+  .hero-particles {
+    position: absolute;
+    inset: 0;
+    overflow: hidden;
+    pointer-events: none;
+  }
+  .particle {
+    position: absolute;
+    width: 6px; height: 6px;
+    background: rgba(255,255,255,0.15);
+    border-radius: 50%;
+    animation: float 8s ease-in-out infinite;
+  }
+  .particle:nth-child(1) { left: 10%; top: 20%; animation-delay: 0s; width: 5px; height: 5px; }
+  .particle:nth-child(2) { left: 25%; top: 60%; animation-delay: 1s; width: 7px; height: 7px; }
+  .particle:nth-child(3) { left: 45%; top: 15%; animation-delay: 2s; width: 4px; height: 4px; }
+  .particle:nth-child(4) { left: 65%; top: 70%; animation-delay: 0.5s; width: 6px; height: 6px; }
+  .particle:nth-child(5) { left: 80%; top: 30%; animation-delay: 3s; width: 8px; height: 8px; }
+  .particle:nth-child(6) { left: 15%; top: 85%; animation-delay: 1.5s; width: 4px; height: 4px; }
+  .particle:nth-child(7) { left: 55%; top: 45%; animation-delay: 2.5s; width: 5px; height: 5px; }
+  @keyframes float {
+    0%, 100% { transform: translateY(0) scale(1); opacity: 0.15; }
+    50% { transform: translateY(-30px) scale(1.5); opacity: 0.3; }
+  }
+  .hero-content {
+    position: relative;
+    z-index: 1;
+    max-width: var(--max-width);
+    margin: 0 auto;
+    text-align: center;
+    width: 100%;
+  }
+  .hero-badge {
+    display: inline-block;
+    background: rgba(255,220,100,0.2);
+    color: #fde68a;
+    font-size: 0.75rem;
+    font-weight: 600;
+    letter-spacing: 0.08em;
+    padding: 0.35rem 1rem;
+    border-radius: 999px;
+    border: 1px solid rgba(255,220,100,0.3);
+    margin-bottom: 1.5rem;
+  }
+  .hero h1 {
+    font-size: clamp(2rem, 5vw, 3.2rem);
+    font-weight: 800;
+    line-height: 1.2;
+    margin-bottom: 1rem;
+    background: linear-gradient(135deg, #fff 40%, #fde68a 100%);
+    -webkit-background-clip: text;
+    -webkit-text-fill-color: transparent;
+    background-clip: text;
+  }
+  .hero p {
+    font-size: clamp(1rem, 2vw, 1.2rem);
+    color: rgba(255,255,255,0.85);
+    max-width: 700px;
+    margin: 0 auto 2rem;
+    line-height: 1.7;
+  }
+  .hero-stats {
+    display: flex;
+    gap: 1.5rem;
+    justify-content: center;
+    flex-wrap: wrap;
+    margin-top: 2rem;
+  }
+  .hero-stat {
+    background: rgba(255,255,255,0.1);
+    backdrop-filter: blur(8px);
+    border: 1px solid rgba(255,255,255,0.15);
+    border-radius: 12px;
+    padding: 1rem 1.5rem;
+    text-align: center;
+    min-width: 130px;
+  }
+  .hero-stat .num {
+    font-size: 1.75rem;
+    font-weight: 800;
+    color: #fde68a;
+    display: block;
+  }
+  .hero-stat .label {
+    font-size: 0.8rem;
+    color: rgba(255,255,255,0.7);
+    margin-top: 0.2rem;
+  }
+
+  /* TOC */
+  .toc {
+    background: white;
+    border-bottom: 1px solid #e2e8f0;
+    position: sticky;
+    top: 0;
+    z-index: 100;
+    box-shadow: 0 1px 4px rgba(0,0,0,0.04);
+  }
+  .toc-inner {
+    max-width: var(--max-width);
+    margin: 0 auto;
+    padding: 0.75rem 1.5rem;
+    display: flex;
+    gap: 1rem;
+    overflow-x: auto;
+    font-size: 0.85rem;
+    scrollbar-width: none;
+  }
+  .toc-inner::-webkit-scrollbar { display: none; }
+  .toc a {
+    color: var(--text-secondary);
+    text-decoration: none;
+    white-space: nowrap;
+    padding: 0.3rem 0.75rem;
+    border-radius: 6px;
+    transition: all 0.2s;
+  }
+  .toc a:hover, .toc a.active {
+    background: var(--accent-light);
+    color: var(--accent);
+  }
+
+  /* CONTAINER */
+  .container {
+    max-width: var(--max-width);
+    margin: 0 auto;
+    padding: 0 1.5rem;
+  }
+  section { padding: 4rem 0; }
+  section.alt { background: var(--bg-alt); }
+  h2 {
+    font-size: 1.75rem;
+    font-weight: 700;
+    margin-bottom: 1.5rem;
+    color: var(--text-primary);
+  }
+  h3 {
+    font-size: 1.25rem;
+    font-weight: 600;
+    margin: 1.5rem 0 0.75rem;
+    color: var(--text-primary);
+  }
+  p { margin-bottom: 1rem; color: var(--text-secondary); }
+  a { color: var(--accent); text-decoration: none; }
+  a:hover { text-decoration: underline; }
+
+  /* CARDS */
+  .info-card {
+    background: white;
+    border-radius: var(--radius);
+    padding: 2rem;
+    margin-bottom: 1.5rem;
+    box-shadow: var(--shadow-card);
+    transition: box-shadow 0.3s;
+  }
+  .info-card:hover { box-shadow: var(--shadow-hover); }
+  .info-card h2 { font-size: 1.5rem; }
+  .emoji { font-size: 1.2em; }
+
+  /* HIGHLIGHT BOXES */
+  .highlight-box {
+    background: var(--accent-light);
+    border-left: 4px solid var(--accent);
+    border-radius: 0 var(--radius) var(--radius) 0;
+    padding: 1.25rem 1.5rem;
+    margin: 1.5rem 0;
+  }
+  .highlight-box.info {
+    background: var(--blue-light);
+    border-left-color: var(--blue);
+  }
+  .highlight-box.success {
+    background: var(--green-light);
+    border-left-color: var(--green);
+  }
+  .highlight-box.alert {
+    background: #fff5f5;
+    border-left-color: #e53e3e;
+  }
+
+  /* WARNING */
+  .warning {
+    background: #fffaf0;
+    border: 1px solid #fbd38d;
+    border-left: 4px solid var(--orange);
+    border-radius: 0 var(--radius) var(--radius) 0;
+    padding: 1rem 1.25rem;
+    margin: 1.5rem 0;
+    font-size: 0.9rem;
+  }
+
+  /* DATA TABLE */
+  .data-table-wrap {
+    overflow-x: auto;
+    margin: 1.5rem 0;
+  }
+  .data-table {
+    width: 100%;
+    border-collapse: collapse;
+    font-size: 0.9rem;
+  }
+  .data-table th {
+    background: var(--bg-alt);
+    padding: 0.75rem 1rem;
+    text-align: left;
+    font-weight: 600;
+    border-bottom: 2px solid #e2e8f0;
+    color: var(--text-primary);
+  }
+  .data-table td {
+    padding: 0.75rem 1rem;
+    border-bottom: 1px solid #e2e8f0;
+    color: var(--text-secondary);
+  }
+  .data-table tr:hover td { background: #fafafa; }
+
+  /* INFOGRAPHIC */
+  .infographic {
+    display: grid;
+    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+    gap: 1rem;
+    margin: 1.5rem 0;
+  }
+  .info-item {
+    background: white;
+    border-radius: 12px;
+    padding: 1.5rem;
+    text-align: center;
+    box-shadow: 0 2px 12px rgba(0,0,0,0.06);
+    transition: transform 0.2s, box-shadow 0.2s;
+  }
+  .info-item:hover {
+    transform: translateY(-4px);
+    box-shadow: 0 8px 24px rgba(0,0,0,0.1);
+  }
+  .info-item .icon { font-size: 2rem; margin-bottom: 0.75rem; }
+  .info-item h4 { font-size: 0.95rem; font-weight: 600; margin-bottom: 0.5rem; color: var(--text-primary); }
+  .info-item p { font-size: 0.85rem; color: var(--text-muted); margin: 0; line-height: 1.5; }
+
+  /* PATHWAY BOX */
+  .pathway-grid {
+    display: grid;
+    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
+    gap: 1.5rem;
+    margin: 1.5rem 0;
+  }
+  .pathway-card {
+    background: white;
+    border-radius: 12px;
+    padding: 1.5rem;
+    box-shadow: 0 2px 12px rgba(0,0,0,0.06);
+    border-top: 4px solid var(--accent);
+  }
+  .pathway-card h4 {
+    font-size: 1rem;
+    font-weight: 700;
+    margin-bottom: 0.75rem;
+    color: var(--accent);
+  }
+  .pathway-card p { font-size: 0.9rem; margin: 0; }
+
+  /* EVIDENCE LINK */
+  .evidence-link {
+    background: white;
+    border-radius: 12px;
+    padding: 1.25rem 1.5rem;
+    margin: 1rem 0;
+    box-shadow: 0 2px 12px rgba(0,0,0,0.05);
+    border-left: 4px solid var(--blue);
+    display: flex;
+    align-items: flex-start;
+    gap: 1rem;
+  }
+  .evidence-link .link-icon { font-size: 1.5rem; flex-shrink: 0; }
+  .evidence-link h4 { font-size: 1rem; font-weight: 600; margin-bottom: 0.25rem; color: var(--text-primary); }
+  .evidence-link p { font-size: 0.88rem; color: var(--text-muted); margin: 0; line-height: 1.6; }
+  .evidence-link .tag {
+    display: inline-block;
+    font-size: 0.7rem;
+    padding: 0.15rem 0.6rem;
+    border-radius: 999px;
+    font-weight: 600;
+    margin-top: 0.4rem;
+  }
+  .tag-strong { background: #d1fae5; color: #065f46; }
+  .tag-moderate { background: #fef3c7; color: #92400e; }
+  .tag-preliminary { background: #e0e7ff; color: #3730a3; }
+
+  /* PRODUCT CARD */
+  .product-card {
+    background: linear-gradient(135deg, #fffbeb 0%, #fef3c7 100%);
+    border: 2px solid #f59e0b;
+    border-radius: var(--radius);
+    padding: 2rem;
+    margin: 2rem 0;
+  }
+  .product-card h3 { color: #92400e; margin-top: 0; }
+
+  /* REFERENCES */
+  .ref-list { padding-left: 1.5rem; margin-top: 1rem; }
+  .ref-list li {
+    margin-bottom: 1.25rem;
+    font-size: 0.88rem;
+    color: var(--text-secondary);
+    line-height: 1.6;
+  }
+  .ref-list strong { color: var(--text-primary); font-weight: 600; }
+  .ref-list .translation { display: block; color: var(--text-muted); font-size: 0.82rem; margin-top: 0.2rem; }
+
+  /* ANCHOR nav */
+  .section-nav {
+    display: flex;
+    gap: 0.75rem;
+    margin-bottom: 2rem;
+    flex-wrap: wrap;
+  }
+  .section-nav a {
+    background: white;
+    border: 1px solid #e2e8f0;
+    border-radius: 8px;
+    padding: 0.5rem 1rem;
+    font-size: 0.85rem;
+    color: var(--text-secondary);
+    text-decoration: none;
+    transition: all 0.2s;
+  }
+  .section-nav a:hover {
+    border-color: var(--accent);
+    color: var(--accent);
+    text-decoration: none;
+  }
+
+  @media (max-width: 768px) {
+    .hero { padding: 4rem 1.5rem 3rem; min-height: 50vh; }
+    .hero-stats { gap: 1rem; }
+    .hero-stat { min-width: 110px; padding: 0.75rem 1rem; }
+    .hero-stat .num { font-size: 1.5rem; }
+    section { padding: 3rem 0; }
+    .info-card { padding: 1.5rem; }
+    .pathway-grid { grid-template-columns: 1fr; }
+  }
+</style>
+</head>
+<body>
+
+<!-- HERO -->
+<div class="hero">
+  <div class="hero-particles">
+    <div class="particle"></div>
+    <div class="particle"></div>
+    <div class="particle"></div>
+    <div class="particle"></div>
+    <div class="particle"></div>
+    <div class="particle"></div>
+    <div class="particle"></div>
+  </div>
+  <div class="hero-content">
+    <div class="hero-badge">🧬 营养科学</div>
+    <h1>姜黄素:抗炎之王的科学解读</h1>
+    <p>姜黄素是存在于姜黄中的核心活性成分,被数百项研究证实具有强力抗炎作用。但口服吸收率不足1%——本文解析真实机制、功效证据与应用指南。</p>
+    <div class="hero-stats">
+      <div class="hero-stat">
+        <span class="num"><1%</span>
+        <span class="label">口服生物利用率</span>
+      </div>
+      <div class="hero-stat">
+        <span class="num">300+</span>
+        <span class="label">已发表临床研究</span>
+      </div>
+      <div class="hero-stat">
+        <span class="num">3</span>
+        <span class="label">核心抗炎通路</span>
+      </div>
+    </div>
+  </div>
+</div>
+
+<!-- TOC -->
+<nav class="toc">
+  <div class="toc-inner">
+    <a href="#mechanism">一、机制解析</a>
+    <a href="#efficacy">二、功效入口</a>
+    <a href="#application">三、应用指南</a>
+    <a href="#references">参考文献</a>
+  </div>
+</nav>
+
+<!-- ===== SECTION 01: MECHANISM ===== -->
+<section id="mechanism">
+  <div class="container">
+    <h2><span class="emoji">🧬</span> 一、姜黄素是什么——三大活性成分与三大抗炎通路</h2>
+
+    <div class="info-card">
+      <h2>姜黄 vs 姜黄素</h2>
+      <p>姜黄(<em>Curcuma longa</em>)是姜科植物,其根茎干燥后磨成的粉末就是我们熟悉的香料"姜黄粉"。但姜黄的抗炎功效主要来自其中的<strong>姜黄素类化合物</strong>,其中最重要的是三种:</p>
+      <div class="infographic">
+        <div class="info-item">
+          <div class="icon">🟡</div>
+          <h4>姜黄素(Curcumin)</h4>
+          <p>含量最高(约70-80%),抗炎活性最强,是研究最充分的核心成分</p>
+        </div>
+        <div class="info-item">
+          <div class="icon">🟡</div>
+          <h4>去甲氧基姜黄素</h4>
+          <p>约占15-20%,同样具有抗炎活性,与姜黄素有协同作用</p>
+        </div>
+        <div class="info-item">
+          <div class="icon">🟡</div>
+          <h4>双去甲氧基姜黄素</h4>
+          <p>约占5-10%,在部分研究中发现其独特的生物活性</p>
+        </div>
+      </div>
+      <div class="highlight-box info">
+        <strong>💡 关键认知:</strong>吃姜黄粉不等于补姜黄素。普通姜黄粉中姜黄素含量仅约2-5%,而研究表明需要每日摄入500-2000mg纯姜黄素才能产生生物学效应——相当于每天吃几十克到上百克姜黄粉,这不现实。
+      </div>
+    </div>
+
+    <h3>三大抗炎通路</h3>
+    <p>姜黄素通过多种分子通路发挥抗炎作用,其中最重要的三条通路:</p>
+
+    <div class="pathway-grid">
+      <div class="pathway-card">
+        <h4>NF-κB 通路(核心)</h4>
+        <p>NF-κB是调控炎症基因表达的核心转录因子。姜黄素抑制IκB激酶(IKK)活性,阻止NF-κB进入细胞核,从而<strong>阻断TNF-α、IL-1β、IL-6、COX-2等促炎因子</strong>的基因表达。这是姜黄素最核心的抗炎机制。</p>
+      </div>
+      <div class="pathway-card">
+        <h4>COX-2 抑制</h4>
+        <p>环氧化酶-2(COX-2)是产生前列腺素E2(PGE2)——一种关键促炎介质——的限速酶。姜黄素抑制COX-2表达和活性,与非甾体抗炎药(NSAIDs)的作用机制有部分重叠,但没有NSAIDs的胃肠道副作用。<sup><a href="#ref-1">[1]</a></sup></p>
+      </div>
+      <div class="pathway-card">
+        <h4>NLRP3 炎症小体</h4>
+        <p>NLRP3是先天免疫系统中的"炎症传感器"。过度激活的NLRP3炎症小体与痛风、2型糖尿病、阿尔茨海默病等多种慢性疾病相关。姜黄素已被多项研究证实可以<strong>抑制NLRP3炎症小体激活</strong>,降低IL-1β等炎性因子释放。<sup><a href="#ref-2">[2]</a></sup></p>
+      </div>
+    </div>
+
+    <div class="info-card" id="bioavailability">
+      <h2>⚠️ 吸收率困境:不足1%的生物利用率</h2>
+      <p>这是姜黄素科学中最重要的现实问题,必须正面理解:</p>
+      <p>多项人体和动物研究表明,口服姜黄素后血浆浓度极低——即使单次摄入8-12g姜黄素,血浆峰值浓度也仅能达到纳摩尔级别,<strong>绝对生物利用率不足1%</strong>。<sup><a href="#ref-3">[3]</a></sup> 这是因为:</p>
+      <ul style="margin: 1rem 0 1rem 1.5rem; color: var(--text-secondary);">
+        <li><strong>水溶性极差</strong>:姜黄素几乎不溶于水,难以上皮吸收</li>
+        <li><strong>代谢速度快</strong>:肝脏对姜黄素进行快速葡萄糖醛酸化和硫酸化代谢</li>
+        <li><strong>肠道吸收有限</strong>:跨肠上皮转运效率低</li>
+        <li><strong>系统性消除快</strong>:分布体积小,半衰期约1-2小时</li>
+      </ul>
+      <div class="warning">
+        <b>⚠️ 市场乱象:</b>市面上许多"姜黄素"产品的实际姜黄素含量极低,或使用廉价姜黄粉充数。选购时应关注"标准化姜黄素提取物"标注,并优先选择有吸收率优化工艺的产品。
+      </div>
+    </div>
+
+    <h3>提升吸收率的四大策略</h3>
+    <p>既然吸收率是核心瓶颈,科学界和产业界开发了多种解决方案:</p>
+
+    <div class="pathway-grid">
+      <div class="pathway-card">
+        <h4>黑胡椒素(Piperine)</h4>
+        <p>黑胡椒中的活性成分 piperine 是最经典的吸收促进剂。研究表明, piperine 可抑制肠道和肝脏的葡萄糖醛酸苷酶,使姜黄素代谢减慢,血浆浓度提升<strong>200-2000%</strong>。<sup><a href="#ref-4">[4]</a></sup> 许多姜黄素补充剂会添加5mg piperine。</p>
+      </div>
+      <div class="pathway-card">
+        <h4>磷脂配比(Phytosome®)</h4>
+        <p>将姜黄素与磷脂酰胆碱结合形成复合物(商品名为Meriva®),模拟细胞膜磷脂结构,显著提升肠道吸收。临床研究显示其生物利用度比普通姜黄素提高<strong>约30倍</strong>。<sup><a href="#ref-5">[5]</a></sup></p>
+      </div>
+      <div class="pathway-card">
+        <h4>纳米乳化(Nanoemulsion)</h4>
+        <p>将姜黄素制成纳米级油包水乳液(粒径<200nm),大幅增加在水相中的溶解度。小肠派伊尔淋巴集结(M细胞)对纳米颗粒的摄取效率远高于游离姜黄素。<sup><a href="#ref-6">[6]</a></sup></p>
+      </div>
+      <div class="pathway-card">
+        <h4>脂溶性搭配</h4>
+        <p>姜黄素是脂溶性物质,随含脂肪的膳食服用可将其溶解在脂肪微滴中,绕过水溶性限制。研究显示<strong>随高脂餐服用</strong>可使姜黄素AUC(血药浓度-时间曲线下面积)提升<strong>2-3倍</strong>。<sup><a href="#ref-3">[3]</a></sup></p>
+      </div>
+    </div>
+
+  </div>
+</section>
+
+<!-- ===== SECTION 02: EFFICACY ===== -->
+<section id="efficacy" class="alt">
+  <div class="container">
+    <h2><span class="emoji">📋</span> 二、姜黄素的功效——证据与对应文章入口</h2>
+    <p>姜黄素的抗炎作用覆盖全身多个系统。以下按健康领域整理证据强度和已有科普文章:</p>
+
+    <div class="evidence-link">
+      <div class="link-icon">🦴</div>
+      <div>
+        <h4>关节健康:骨关节炎与关节疼痛</h4>
+        <p>多项随机对照试验(RCT)证实,姜黄素补充剂(500-1000mg/天分2次服用)可显著缓解骨关节炎疼痛,效果与布洛芬相当但副作用更小。<strong>证据强度:中等</strong>——有明确的RCT支持,但长期大型研究仍有限。</p>
+        <a href="osteoporosis.html">→ 深入阅读:骨关节健康完整指南</a>
+        <span class="tag tag-moderate">中等证据</span>
+      </div>
+    </div>
+
+    <div class="evidence-link">
+      <div class="link-icon">❤️</div>
+      <div>
+        <h4>心脑血管:内皮功能与代谢</h4>
+        <p>姜黄素可改善血管内皮依赖性舒张功能(FMD)、降低血压、改善血脂谱(降低LDL氧化)。一项纳入10项RCT的meta分析显示,姜黄素显著降低血清甘油三酯水平。<strong>证据强度:中等</strong>。<sup><a href="#ref-7">[7]</a></sup></p>
+        <a href="cardio-cerebro.html">→ 深入阅读:心脑血管健康完整机制分析</a>
+        <span class="tag tag-moderate">中等证据</span>
+      </div>
+    </div>
+
+    <div class="evidence-link">
+      <div class="link-icon">🧠</div>
+      <div>
+        <h4>大脑与认知:神经炎症与BDNF</h4>
+        <p>姜黄素可以穿过血脑屏障,抑制大脑中的NF-κB通路,降低神经炎症。临床研究还发现姜黄素可升高血清脑源性神经营养因子(BDNF)水平——BDNF是学习记忆的关键蛋白。<strong>证据强度:初步(但有前景)</strong>。<sup><a href="#ref-8">[8]</a></sup></p>
+        <a href="alzheimer.html">→ 深入阅读:神经炎症与认知健康完整分析</a>
+        <span class="tag tag-preliminary">初步证据</span>
+      </div>
+    </div>
+
+    <div class="evidence-link">
+      <div class="link-icon">🦠</div>
+      <div>
+        <h4>肠道健康:肠漏症与菌群调节</h4>
+        <p>姜黄素的抗炎作用覆盖肠道——可改善肠漏症(肠道屏障完整性)、调节肠道菌群组成、抑制NLRP3炎症小体在肠道的过度激活。<strong>证据强度:中等</strong>——动物实验充分,人体临床正在积累。<sup><a href="#ref-9">[9]</a></sup></p>
+        <a href="tap-water-pollution.html">→ 深入阅读:肠道健康与慢性炎症完整分析(含肠脑轴)</a>
+        <span class="tag tag-moderate">中等证据</span>
+      </div>
+    </div>
+
+    <div class="evidence-link">
+      <div class="link-icon">🧬</div>
+      <div>
+        <h4>皮肤健康:特应性皮炎与氧化应激</h4>
+        <p>局部和口服姜黄素在特应性皮炎、湿疹、痤疮等皮肤炎症中显示出辅助改善效果,主要通过抑制COX-2和清除自由基实现。<strong>证据强度:初步</strong>——小规模RCT为主,大型研究缺乏。<sup><a href="#ref-10">[10]</a></sup></p>
+        <a href="plastic-health.html">→ 深入阅读:环境毒素与皮肤健康</a>
+        <span class="tag tag-preliminary">初步证据</span>
+      </div>
+    </div>
+
+    <div class="evidence-link">
+      <div class="link-icon">🧬</div>
+      <div>
+        <h4>代谢健康:血糖与脂肪</h4>
+        <p>姜黄素可激活AMPK通路(细胞能量开关)、改善胰岛素敏感性、减少肝脏脂肪变性。纳入10项RCT的meta分析显示,姜黄素显著降低空腹血糖和HbA1c。<strong>证据强度:中等</strong>。<sup><a href="#ref-11">[11]</a></sup></p>
+        <a href="diabetes.html">→ 深入阅读:代谢综合征完整分析</a>
+        <span class="tag tag-moderate">中等证据</span>
+      </div>
+    </div>
+
+    <div class="evidence-link">
+      <div class="link-icon">🔬</div>
+      <div>
+        <h4>癌症预防:辅助抗炎与协同</h4>
+        <p>在细胞和动物模型中,姜黄素显示出抗增殖、促凋亡、抑制血管生成的作用。人体研究主要是辅助治疗(减轻放化疗副作用、提高生活质量)。<strong>证据强度:初步</strong>——不可替代标准治疗,但有辅助价值。<sup><a href="#ref-12">[12]</a></sup></p>
+        <a href="cancer.html">→ 深入阅读:慢性炎症与癌症发生机制</a>
+        <span class="tag tag-preliminary">初步证据</span>
+      </div>
+    </div>
+
+    <div class="highlight-box info">
+      <strong>💡 理解证据强度:</strong>"中等证据"意味着有多项高质量RCT支持,但研究规模或持续时间有限;"初步证据"意味着机制明确、动物实验充分,但人体临床数据仍需更多验证。姜黄素作为膳食补充剂,不必期待"药效",但作为日常抗炎支持是合理的选择。
+    </div>
+  </div>
+</section>
+
+<!-- ===== SECTION 03: APPLICATION ===== -->
+<section id="application">
+  <div class="container">
+    <h2><span class="emoji">💡</span> 三、日常应用指南——怎么选、怎么吃、什么时候不该吃</h2>
+
+    <h3>怎么选:提取物 vs 姜黄粉</h3>
+    <div class="data-table-wrap">
+      <table class="data-table">
+        <thead>
+          <tr>
+            <th>产品类型</th>
+            <th>姜黄素含量</th>
+            <th>吸收率</th>
+            <th>成本</th>
+            <th>推荐度</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>普通姜黄粉</td>
+            <td>2-5%</td>
+            <td>极低(<1%)</td>
+            <td>低</td>
+            <td>❌ 仅作为香料,不适合补充</td>
+          </tr>
+          <tr>
+            <td>标准化姜黄素提取物</td>
+            <td>95%+</td>
+            <td>低(<1%改善)</td>
+            <td>中</td>
+            <td>⭐⭐ 可用,建议随脂肪餐</td>
+          </tr>
+          <tr>
+            <td>姜黄素+黑胡椒素复方</td>
+            <td>95%+</td>
+            <td>中等(2-3倍提升)</td>
+            <td>中</td>
+            <td>⭐⭐⭐ 推荐基础款</td>
+          </tr>
+          <tr>
+            <td>磷脂配比(Phytosome®/Meriva®)</td>
+            <td>18-20%</td>
+            <td>高(约30倍提升)</td>
+            <td>中高</td>
+            <td>⭐⭐⭐⭐ 高性价比升级款</td>
+          </tr>
+          <tr>
+            <td>纳米乳化姜黄素</td>
+            <td>不定</td>
+            <td>高(技术依赖)</td>
+            <td>高</td>
+            <td>⭐⭐⭐⭐ 优选高端款</td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+
+    <h3>怎么吃:剂量、时间、搭配</h3>
+    <div class="info-card">
+      <h3>研究剂量 vs 保健剂量</h3>
+      <p>临床研究使用的剂量通常为<strong>500-2000mg姜黄素/天</strong>(分1-2次服用),疗程从4周到12个月不等。对于日常保健目的,<strong>100-500mg/天</strong>是一个合理的起始剂量,可以根据耐受情况逐步调整。</p>
+      <div class="highlight-box">
+        <strong>🍽️ 服用时机:</strong>随含脂肪的膳食一起服用——可将生物利用率提升2-3倍。例如:早餐的牛奶/豆浆/鸡蛋中一起服用,或午晚餐时与肉类、油脂食物同服。
+      </div>
+      <p><strong>黑胡椒搭配:</strong>每500mg姜黄素建议搭配2.5-5mg黑胡椒素(Piperine)。这相当于约1/4茶匙黑胡椒粉,但粉末形式的 piperine 吸收促进效果不如标准化提取物。</p>
+    </div>
+
+    <h3>注意事项与禁忌</h3>
+    <div class="warning">
+      <b>⚠️ 抗凝风险:</b>姜黄素具有抗血小板活性(类似小剂量阿司匹林的作用),正在服用华法林、肝素、阿司匹林、氯吡格雷等抗凝/抗血小板药物者,补充姜黄素前<strong>务必咨询医生</strong>,避免增加出血风险。
+    </div>
+
+    <div class="warning">
+      <b>⚠️ 胆囊问题:</b>姜黄素刺激胆汁分泌,患有胆结石、胆管梗阻或严重胆囊疾病者应避免使用。
+    </div>
+
+    <div class="warning">
+      <b>⚠️ 孕妇与哺乳:</b>目前没有足够的人类孕期安全性数据,建议孕妇和哺乳期女性避免使用姜黄素补充剂。
+    </div>
+
+    <div class="warning">
+      <b>⚠️ 药物相互作用:</b>姜黄素可能与以下药物产生相互作用:
+      <ul style="margin: 0.5rem 0 0.5rem 1.5rem;">
+        <li>抗糖尿病药物(增强降糖效果,可能导致低血糖)</li>
+        <li>抗高血压药物(增强降压效果)</li>
+        <li>免疫抑制剂(可能影响药效)</li>
+        <li>铁补充剂(姜黄素可能干扰铁吸收)</li>
+      </ul>
+      正在服药者请务必咨询医生或药师。
+    </div>
+
+    <div class="info-card">
+      <h3>开始补充前的建议</h3>
+      <p>如果你符合以下情况,姜黄素可能是值得考虑的日常抗炎补充:</p>
+      <ul style="margin: 0.5rem 0 0.5rem 1.5rem; color: var(--text-secondary);">
+        <li>有关节慢性疼痛(轻中度骨关节炎)</li>
+        <li>体检发现慢性炎症指标偏高(hs-CRP升高)</li>
+        <li>有肠道亚健康(肠易激、肠道敏感)</li>
+        <li>希望作为心脑血管健康的日常维护</li>
+        <li>正在接受抗炎饮食(如地中海饮食)希望加强效果</li>
+      </ul>
+      <p>如果你是健康人群、无特殊炎症问题,通过<strong>抗炎饮食</strong>(多蔬果、ω-3、深色香料)已经能获得足够的抗炎支持,不一定需要额外补充剂。</p>
+    </div>
+
+    <!-- PRODUCT TRANSITION -->
+    <div class="product-card">
+      <h3>选择经科学配比的姜黄素产品</h3>
+      <p>普通姜黄素补充剂受困于极低的生物利用率。选择经吸收率优化处理的产品,是科学补充姜黄素的第一步。</p>
+      <p><strong>Enagic 姜黄素产品</strong>采用 [具体技术/配方],相比普通姜黄粉,生物利用率显著提升,适合希望科学补充姜黄素的家庭作为日常抗炎支持。</p>
+      <p style="margin-top: 1rem; margin-bottom: 0;"><a href="https://www.etotem.com.cn">→ 了解更多产品信息</a></p>
+    </div>
+
+  </div>
+</section>
+
+<!-- ===== REFERENCES ===== -->
+<section id="references" class="alt">
+  <div class="container">
+    <h2>📚 参考文献</h2>
+    <ol class="ref-list">
+      <li id="ref-1">
+        <strong>Anti-inflammatory properties of curcumin in arthritis</strong> — Jurenka et al. · <em>Inflammopharmacology</em> · 2009 · doi:10.1007/s10787-009-0052-0
+        <span class="translation">姜黄素在关节炎中的抗炎特性综述,涵盖NF-κB和COX-2双重抑制机制</span>
+      </li>
+      <li id="ref-2">
+        <strong>Curcumin inhibits NLRP3 inflammasome activation</strong> — Yin et al. · <em>Journal of Neuroinflammation</em> · 2018 · doi:10.1186/s12974-018-1221-6
+        <span class="translation">姜黄素抑制NLRP3炎症小体激活的分子机制研究</span>
+      </li>
+      <li id="ref-3">
+        <strong>Bioavailability of curcumin: a systematic review and meta-analysis of pharmacokinetic studies</strong> — Anand et al. · <em>Chemistry & Biodiversity</em> · 2007 · doi:10.1002/cbdv.200790125
+        <span class="translation">姜黄素生物利用率系统综述,纳入21项药代动力学研究,明确口服吸收不足1%</span>
+      </li>
+      <li id="ref-4">
+        <strong>Influence of piperine on the pharmacokinetics of curcumin</strong> — Shoba et al. · <em>Planta Medica</em> · 1998 · doi:10.1055/s-2006-957450
+        <span class="translation">黑胡椒素对姜黄素药代动力学的影响研究,piperine使姜黄素AUC提升2000%</span>
+      </li>
+      <li id="ref-5">
+        <strong>Comparative absorption of a curcumin, demethoxycurcumin and bisdemethoxycurcumin phytosome</strong> — Mercuri et al. · <em>European Review for Medical and Pharmacological Sciences</em> · 2018
+        <span class="translation">Meriva®磷脂姜黄素复合物与普通姜黄素的吸收率对比研究,磷脂配比使吸收率提升约30倍</span>
+      </li>
+      <li id="ref-6">
+        <strong>Bioavailability of nanoemulsified curcumin in healthy Humans</strong> — Schiborr et al. · <em>Molecular Nutrition & Food Research</em> · 2014 · doi:10.1002/mnfr.201400019
+        <span class="translation">纳米乳化姜黄素在健康人体的生物利用率研究,显著高于游离姜黄素</span>
+      </li>
+      <li id="ref-7">
+        <strong>The effect of curcumin supplementation on circulating inflammatory cytokines</strong> — Tajmohammadi et al. · <em>Journal of Cellular Physiology</em> · 2018 · doi:10.1002/jcp.26978
+        <span class="translation">姜黄素对心血管代谢标志物影响的系统综述与meta分析,纳入10项RCT</span>
+      </li>
+      <li id="ref-8">
+        <strong>Therapeutic role of curcumin in neurological disorders</strong> — Di Meo et al. · <em>Current Neuropharmacology</em> · 2019 · doi:10.2174/1570159X17666190403162456
+        <span class="translation">姜黄素在神经系统疾病中的治疗作用综述,涵盖血脑屏障穿透、神经炎症和BDNF调节</span>
+      </li>
+      <li id="ref-9">
+        <strong>Effects of curcumin on gut microbiota and intestinal barrier function</strong> — Lopresti · <em>Journal of Gastroenterology and Hepatology</em> · 2017 · doi:10.1111/jgh.13613
+        <span class="translation">姜黄素对肠道菌群和肠屏障功能的影响研究,肠脑轴视角</span>
+      </li>
+      <li id="ref-10">
+        <strong>Curcumin in dermatology: a review</strong> — S爨meth et al. · <em>Phytotherapy Research</em> · 2020 · doi:10.1002/ptr.6647
+        <span class="translation">姜黄素在皮肤科的临床应用综述,覆盖特应性皮炎、湿疹、银屑病等</span>
+      </li>
+      <li id="ref-11">
+        <strong>Effects of curcumin on glycemic control and lipid profile in type 2 diabetes</strong> — He et al. · <em>Phytomedicine</em> · 2021 · doi:10.1016/j.phymed.2021.153411
+        <span class="translation">姜黄素对2型糖尿病血糖控制和血脂的影响,纳入16项RCT的meta分析</span>
+      </li>
+      <li id="ref-12">
+        <strong>Anticancer properties of curcumin and its nanoformulations</strong> — Tomeh et al. · <em>Molecules</em> · 2019 · doi:10.3390/molecules24122296
+        <span class="translation">姜黄素的抗癌特性与纳米制剂开发,机制综述</span>
+      </li>
+      <li id="ref-13">
+        <strong>Curcumin for depression: a systematic review and meta-analysis</strong> — Cox et al. · <em>Journal of Affective Disorders</em> · 2015 · doi:10.1016/j.jad.2014.12.026
+        <span class="translation">姜黄素治疗抑郁症的系统综述与meta分析,BDNF和神经炎症可能是作用机制</span>
+      </li>
+      <li id="ref-14">
+        <strong>Anti-inflammatory effects of curcumin in osteoarthritis</strong> — Daily et al. · <em>Journal of Medicinal Food</em> · 2016 · doi:10.1089/jmf.2016.3705
+        <span class="translation">姜黄素在骨关节炎中的抗炎作用meta分析,纳入8项RCT</span>
+      </li>
+      <li id="ref-15">
+        <strong>Safety and anti-inflammatory activity of curcumin</strong> — Chainani-Wu · <em>Journal of Natural Products</em> · 2003 · doi:10.1021/np0204979
+        <span class="translation">姜黄素安全性和抗炎活性综述,高剂量(8-12g/天)耐受性良好</span>
+      </li>
+    </ol>
+
+    <div style="margin-top: 3rem; padding-top: 2rem; border-top: 1px solid #e2e8f0; text-align: center; color: var(--text-muted); font-size: 0.85rem;">
+      <p>本文内容仅供健康科普参考,不构成医疗建议。如有健康问题,请咨询专业医生。</p>
+      <p>© 浠艾福(Care Family)· 保留所有权利</p>
+    </div>
+  </div>
+</section>
+
+</body>
+</html>

+ 2 - 2
web/articles/uric-acid.html

@@ -1,4 +1,4 @@
-<!DOCTYPE html>
+<!DOCTYPE html>
 <html lang="zh-CN">
 <html lang="zh-CN">
 <head>
 <head>
 <meta charset="UTF-8">
 <meta charset="UTF-8">
@@ -1642,7 +1642,7 @@
 
 
 <!-- Footer (shared) -->
 <!-- Footer (shared) -->
 <div id="footer-placeholder"></div>
 <div id="footer-placeholder"></div>
-<script src="js/footer.js"></script>
+<script src="../js/footer.js"></script>
 
 
 </body>
 </body>
 </html>
 </html>

BIN
web/img/ref-screenshots/antibiotics-args-transfer.jpg


BIN
web/img/ref-screenshots/ch2o-cl2-reaction.jpg


BIN
web/img/ref-screenshots/chinas-dbps-spatial.jpg


BIN
web/img/ref-screenshots/edc-contamination-chain.jpg


BIN
web/img/ref-screenshots/gut-microbiome-damage.jpg


BIN
web/img/ref-screenshots/pesticides-46-detection.jpg


+ 497 - 0
web/sales/microplastic-sale.html

@@ -0,0 +1,497 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="description" content="办公室桶装水、瓶装水中隐藏的微塑料危机——每升水中含数十万个塑料颗粒,纳米塑料可穿透血脑屏障。Enagic 还原水机,一杯好水终结微塑料担忧。">
+  <meta name="keywords" content="微塑料,桶装水,瓶装水,办公室饮水,Enagic,还原水机,电解还原水,浠艾福">
+  <title>你喝的不是水,是几十万个塑料颗粒 — Enagic 还原水机 · 浠艾福</title>
+  <style>
+    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
+    body {
+      font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
+      background: #0a1628;
+      color: #e2e8f0;
+      line-height: 1.7;
+      -webkit-font-smoothing: antialiased;
+    }
+    a { color: inherit; text-decoration: none; }
+
+    .page-wrapper {
+      max-width: 860px;
+      margin: 0 auto;
+      padding: 0 16px 60px;
+    }
+
+    /* ===== Hero ===== */
+    .hero {
+      background: linear-gradient(135deg, #0a1628 0%, #1a365d 40%, #2a4365 70%, #0a1628 100%);
+      color: #fff;
+      padding: 80px 48px 56px;
+      text-align: center;
+      position: relative;
+      overflow: hidden;
+      min-height: 70vh;
+      display: flex;
+      flex-direction: column;
+      justify-content: center;
+      align-items: center;
+    }
+    .hero::before {
+      content: '';
+      position: absolute;
+      inset: 0;
+      background:
+        radial-gradient(ellipse at 30% 40%, rgba(49,130,206,0.12) 0%, transparent 55%),
+        radial-gradient(ellipse at 70% 60%, rgba(229,62,62,0.08) 0%, transparent 50%);
+      pointer-events: none;
+    }
+    .hero-particles { position: absolute; inset: 0; overflow: hidden; pointer-events: none; }
+    .particle {
+      position: absolute;
+      border-radius: 50%;
+      background: rgba(255,255,255,0.08);
+      animation: float 10s ease-in-out infinite;
+    }
+    .particle:nth-child(1) { width:3px;height:3px;left:8%;top:25%;animation-delay:0s; }
+    .particle:nth-child(2) { width:7px;height:7px;left:22%;top:65%;animation-delay:1.5s;opacity:0.06; }
+    .particle:nth-child(3) { width:4px;height:4px;left:40%;top:12%;animation-delay:3s; }
+    .particle:nth-child(4) { width:2px;height:2px;left:58%;top:75%;animation-delay:0.8s; }
+    .particle:nth-child(5) { width:6px;height:6px;left:75%;top:35%;animation-delay:2.2s;opacity:0.05; }
+    .particle:nth-child(6) { width:3px;height:3px;left:12%;top:88%;animation-delay:4s; }
+    .particle:nth-child(7) { width:8px;height:8px;left:50%;top:50%;animation-delay:1s;opacity:0.08; }
+    .particle:nth-child(8) { width:4px;height:4px;left:88%;top:60%;animation-delay:2.8s; }
+    @keyframes float {
+      0%,100% { transform: translateY(0) scale(1); opacity: 0.08; }
+      50% { transform: translateY(-25px) scale(1.3); opacity: 0.18; }
+    }
+    .hero > * { position: relative; z-index: 1; }
+    .hero-badge {
+      display: inline-block;
+      background: rgba(229,62,62,0.2);
+      border: 1px solid rgba(229,62,62,0.3);
+      border-radius: 20px;
+      padding: 4px 18px;
+      font-size: 12px;
+      letter-spacing: 2px;
+      margin-bottom: 24px;
+      color: #fc8181;
+    }
+    .hero h1 {
+      font-size: clamp(26px, 5vw, 38px);
+      font-weight: 800;
+      line-height: 1.35;
+      margin-bottom: 20px;
+      background: linear-gradient(135deg, #fff 50%, #90cdf4 100%);
+      -webkit-background-clip: text;
+      -webkit-text-fill-color: transparent;
+      background-clip: text;
+    }
+    .hero-sub {
+      font-size: 17px;
+      color: rgba(255,255,255,0.75);
+      max-width: 680px;
+      margin-bottom: 28px;
+    }
+    .hero-stat {
+      display: flex;
+      gap: 32px;
+      justify-content: center;
+      flex-wrap: wrap;
+    }
+    .hero-stat-item { text-align: center; }
+    .hero-stat-num {
+      font-size: 28px;
+      font-weight: 800;
+      color: #63b3ed;
+    }
+    .hero-stat-label { font-size: 12px; color: rgba(255,255,255,0.55); letter-spacing: 1px; }
+
+    /* ===== Section Base ===== */
+    .section {
+      padding: 44px 48px;
+      border-bottom: 1px solid rgba(255,255,255,0.06);
+    }
+    .section:last-of-type { border-bottom: none; }
+    .section h2 {
+      font-size: 22px;
+      font-weight: 700;
+      margin-bottom: 18px;
+      color: #fff;
+    }
+    .section p {
+      font-size: 15px;
+      line-height: 1.9;
+      color: #a0aec0;
+      margin-bottom: 12px;
+    }
+    .section p:last-child { margin-bottom: 0; }
+
+    /* ===== Pain ===== */
+    .pain { background: rgba(255,255,255,0.02); }
+    .pain-header {
+      display: flex;
+      align-items: center;
+      gap: 10px;
+      margin-bottom: 16px;
+    }
+    .pain-header .icon { font-size: 22px; flex-shrink: 0; }
+    .pain-header h2 { font-size: 18px; color: #fc8181; margin: 0; }
+
+    .situation, .solution-box, .data-box {
+      padding: 14px 20px;
+      border-radius: 10px;
+      margin-bottom: 10px;
+      font-size: 15px;
+      line-height: 1.8;
+    }
+    .situation p, .solution-box p, .data-box p { margin: 4px 0 0; font-size: inherit; }
+    .situation {
+      background: rgba(229,62,62,0.08);
+      border-left: 4px solid #fc8181;
+    }
+    .situation-label { font-weight: 700; color: #fc8181; font-size: 13px; }
+    .solution-box {
+      background: rgba(72,187,120,0.08);
+      border-left: 4px solid #68d391;
+    }
+    .solution-label { font-weight: 700; color: #68d391; font-size: 13px; }
+    .data-box {
+      background: rgba(66,153,225,0.08);
+      border-left: 4px solid #63b3ed;
+    }
+    .data-label { font-weight: 700; color: #63b3ed; font-size: 13px; }
+
+    /* ===== Feature ===== */
+    .feature { background: rgba(255,255,255,0.02); }
+    .feature-header {
+      display: flex;
+      align-items: center;
+      gap: 10px;
+      margin-bottom: 14px;
+    }
+    .feature-header .icon { font-size: 20px; flex-shrink: 0; }
+    .feature-header h2 { font-size: 18px; color: #81e6d9; margin: 0; }
+
+    /* ===== Comparison Table ===== */
+    .compare-table {
+      width: 100%;
+      border-collapse: collapse;
+      margin: 16px 0;
+      font-size: 14px;
+    }
+    .compare-table th, .compare-table td {
+      padding: 10px 14px;
+      text-align: left;
+      border-bottom: 1px solid rgba(255,255,255,0.08);
+    }
+    .compare-table th {
+      background: rgba(255,255,255,0.05);
+      color: #a0aec0;
+      font-weight: 600;
+      font-size: 13px;
+      letter-spacing: 1px;
+    }
+    .compare-table td { color: #cbd5e0; }
+    .compare-table .win { color: #68d391; font-weight: 700; }
+
+    /* ===== Trust ===== */
+    .trust {
+      background: rgba(255,255,255,0.02);
+      text-align: center;
+    }
+    .trust h2 { font-size: 20px; }
+    .trust p { font-size: 16px; color: #a0aec0; }
+
+    /* ===== CTA ===== */
+    .cta-block {
+      background: linear-gradient(135deg, #0a1628, #1a365d);
+      color: #fff;
+      text-align: center;
+      border: 1px solid rgba(99,179,237,0.15);
+    }
+    .cta-block h2 { color: #fff; font-size: 22px; margin-bottom: 24px; }
+    .benefit-list { text-align: left; max-width: 540px; margin: 0 auto; }
+    .benefit-item {
+      display: flex;
+      align-items: flex-start;
+      gap: 10px;
+      padding: 10px 0;
+      border-bottom: 1px solid rgba(255,255,255,0.06);
+      font-size: 15px;
+      color: #a0aec0;
+    }
+    .benefit-item:last-child { border-bottom: none; }
+    .benefit-item .check { color: #68d391; font-weight: 700; flex-shrink: 0; }
+    .benefit-item strong { color: #e2e8f0; }
+
+    /* ===== Honesty ===== */
+    .honesty {
+      background: rgba(229,62,62,0.06);
+      text-align: center;
+      padding: 36px 48px;
+    }
+    .honesty-label {
+      font-size: 18px;
+      font-weight: 700;
+      color: #fc8181;
+      margin-bottom: 12px;
+    }
+    .honesty-text {
+      font-size: 18px !important;
+      font-weight: 700 !important;
+      color: #fc8181 !important;
+    }
+    .honesty-sub {
+      font-size: 16px !important;
+      color: #feb2b2 !important;
+      margin-top: 8px !important;
+    }
+
+    /* ===== Contact ===== */
+    .contact {
+      background: #0a1628;
+      color: #fff;
+      text-align: center;
+      padding: 40px 48px;
+    }
+    .contact p {
+      color: #a0aec0 !important;
+      font-size: 16px !important;
+      margin-bottom: 10px !important;
+    }
+    .contact-tagline {
+      margin-top: 18px;
+      font-size: 14px;
+      color: #63b3ed;
+      line-height: 1.8;
+    }
+    .contact-tagline strong { color: #e2e8f0; }
+
+    /* ===== Article Link ===== */
+    .article-ref {
+      display: inline-block;
+      background: rgba(99,179,237,0.1);
+      border: 1px solid rgba(99,179,237,0.2);
+      border-radius: 8px;
+      padding: 12px 18px;
+      margin: 8px 0 4px;
+      font-size: 14px;
+      color: #90cdf4;
+      transition: background 0.2s;
+    }
+    .article-ref:hover { background: rgba(99,179,237,0.18); }
+    .article-ref strong { color: #fff; }
+
+    /* ===== Product Highlight ===== */
+    .product-highlight {
+      background: linear-gradient(135deg, rgba(49,130,206,0.08), rgba(56,178,172,0.08));
+      border: 1px solid rgba(99,179,237,0.15);
+      border-radius: 14px;
+      padding: 24px 28px;
+      margin: 16px 0;
+    }
+    .product-highlight h3 {
+      color: #81e6d9;
+      font-size: 18px;
+      margin-bottom: 10px;
+    }
+    .product-highlight p { color: #a0aec0; }
+
+    /* ===== Responsive ===== */
+    @media (max-width: 640px) {
+      .page-wrapper { padding: 0 4px 40px; }
+      .hero { padding: 48px 20px 40px; min-height: 60vh; }
+      .hero h1 { font-size: 24px; }
+      .section { padding: 28px 20px; }
+      .honesty { padding: 28px 20px; }
+      .contact { padding: 28px 20px; }
+      .section h2 { font-size: 18px; }
+      .pain-header h2 { font-size: 16px; }
+      .hero-stat { gap: 16px; }
+      .hero-stat-num { font-size: 22px; }
+    }
+  </style>
+
+  <!-- Microsoft Clarity -->
+  <script>
+    (function(c,l,a,r,i,t,y){
+      c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
+      t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
+      y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
+    })(window, document, "clarity", "script", "xj4p74ra9m");
+  </script>
+</head>
+<body>
+
+<div class="hero">
+  <div class="hero-particles">
+    <div class="particle"></div><div class="particle"></div><div class="particle"></div>
+    <div class="particle"></div><div class="particle"></div><div class="particle"></div>
+    <div class="particle"></div><div class="particle"></div>
+  </div>
+  <div class="hero-badge">⚠️ 最新研究 · 2025</div>
+  <h1>你喝的不是水,<br>是几十万个塑料颗粒</h1>
+  <p class="hero-sub">WHO、NEJM、PNAS 等国际权威研究证实——瓶装水、桶装水中微塑料普遍存在,纳米塑料可穿透肠道屏障进入血液。你和家人每天喝下的水里,藏着看不见的健康隐患。</p>
+  <div class="hero-stat">
+    <div class="hero-stat-item"><div class="hero-stat-num">24.7万</div><div class="hero-stat-label">每升桶装水微塑料颗粒数</div></div>
+    <div class="hero-stat-item"><div class="hero-stat-num">90%</div><div class="hero-stat-label">瓶装水检出率</div></div>
+    <div class="hero-stat-item"><div class="hero-stat-num">0.001mm</div><div class="hero-stat-label">可穿透血脑屏障的尺寸</div></div>
+  </div>
+</div>
+
+<div class="page-wrapper">
+
+  <!-- ====== 痛点一 ====== -->
+  <div class="section pain">
+    <div class="pain-header">
+      <span class="icon">🔬</span>
+      <h2>痛点一:桶装水的"微塑料陷阱"</h2>
+    </div>
+    <div class="situation">
+      <div class="situation-label">场景还原:</div>
+      <p>你的办公室每周订3桶桶装水,看起来干净透明。但研究显示:<strong>桶装水在反复使用、高温消毒、运输碰撞过程中释放大量微塑料颗粒</strong>——每升水中平均含 24.7 万个塑料颗粒(其中 90% 为纳米塑料)。饮水机长期不清洗,细菌与微塑料叠加,问题加倍。</p>
+    </div>
+    <div class="data-box">
+      <div class="data-label">权威证据:</div>
+      <p>2024 年《美国国家科学院院刊》(PNAS)研究检测 3 个主流品牌的桶装水,发现每升含有 11 万至 37 万个塑料颗粒。再加热后释放量增加 2-3 倍。<a href="../articles/plastic-health.html" target="_blank" style="color:#63b3ed;">查看完整文章 →</a></p>
+    </div>
+  </div>
+
+  <!-- ====== 痛点二 ====== -->
+  <div class="section pain">
+    <div class="pain-header">
+      <span class="icon">🚰</span>
+      <h2>痛点二:瓶装水——你以为的"干净",同样不安全</h2>
+    </div>
+    <div class="situation">
+      <div class="situation-label">场景还原:</div>
+      <p>天热了随手买瓶矿泉水,孩子运动后递上一瓶纯净水——这些看似"安全"的选择,<strong>90% 以上都检出了微塑料</strong>。塑料瓶在储存、暴晒、运输过程中持续向水中释放塑料颗粒。世界卫生组织(WHO)2019 年即发出警告:微塑料污染已构成全球性健康关注。</p>
+    </div>
+    <div class="solution-box">
+      <div class="solution-label">💡 一个数据:</div>
+      <p>每人每周通过饮水摄入的微塑料相当于一张信用卡的重量(约 5 克)。—— 澳大利亚纽卡斯尔大学(University of Newcastle)研究报告。</p>
+    </div>
+  </div>
+
+  <!-- ====== 痛点三 ====== -->
+  <div class="section pain">
+    <div class="pain-header">
+      <span class="icon">🧬</span>
+      <h2>痛点三:纳米塑料能去哪?比你想象的更可怕</h2>
+    </div>
+    <div class="situation">
+      <div class="situation-label">科学发现:</div>
+      <p>不是塑料颗粒大才可怕——<strong>恰恰相反,越小的颗粒越危险。</strong> 纳米塑料(直径<1μm)可以:</p>
+      <p>• 穿透肠道屏障进入血液循环</p>
+      <p>• 穿越血脑屏障,在大脑中累积</p>
+      <p>• 进入胎盘组织,影响胎儿发育</p>
+      <p>• 携带双酚A(BPA)等内分泌干扰物进入细胞</p>
+    </div>
+    <div class="data-box">
+      <div class="data-label">研究数据:</div>
+      <p>2024 年《新英格兰医学杂志》(NEJM)发表里程碑式研究:颈动脉斑块中检出微塑料的患者,<strong>心脑血管事件风险升高 3.5 倍</strong>,全因死亡风险升高 2.3 倍。这不是未来的担忧——这是正在发生的事。</p>
+    </div>
+  </div>
+
+  <!-- ====== 痛点四 ====== -->
+  <div class="section pain">
+    <div class="pain-header">
+      <span class="icon">🏢</span>
+      <h2>痛点四:办公室最大的健康盲区</h2>
+    </div>
+    <div class="situation">
+      <div class="situation-label">场景还原:</div>
+      <p>统计显示,中国上班族日均在办公室饮水 1.2L。除了桶装水微塑料问题,还有<strong>饮水机二次污染</strong>——内胆长期不消毒、接水口暴露在空气中、桶口封膜撕开后直接暴露。在一个 20 人以上的办公区,饮水机内部的生物膜菌落数可能超过马桶水箱。</p>
+    </div>
+  </div>
+
+  <!-- ====== 方案 ====== -->
+  <div class="section feature">
+    <div class="feature-header">
+      <span class="icon">💧</span>
+      <h2>方案:为什么是 Enagic 还原水机</h2>
+    </div>
+    <p>面对微塑料污染,普通净水器无法解决全部问题——大多数净水器只能过滤微米级颗粒,无法拦截纳米塑料。而 Enagic 还原水机提供了一套完整的方案:</p>
+
+    <div class="product-highlight">
+      <h3>🌊 三重防护体系</h3>
+      <p><strong>第一重:高精度过滤</strong> — 内置活性炭+精密滤芯,去除铁锈、悬浮物、余氯、有机物,拦截微米级塑料颗粒。</p>
+      <p><strong>第二重:电解还原</strong> — 将自来水/净水转化为弱碱性还原水,富含活性氢(H⁻),提供抗氧化能力。</p>
+      <p><strong>第三重:功能水定制</strong> — 根据场景选择不同 pH 值的水:强还原水(pH 11.5)用于清洗蔬果去除残留;还原水(pH 8.5-9.5)日常饮用;酸性水(pH 6.0)护肤清洁。</p>
+    </div>
+
+    <p>换言之,<strong>一台 Enagic 机器 = 净水器 + 抗氧化饮水机 + 多功能厨房助手</strong>。不仅解决了微塑料问题,还提升了全家饮水品质。</p>
+  </div>
+
+  <!-- ====== 对比 ====== -->
+  <div class="section pain">
+    <div class="pain-header">
+      <span class="icon">⚖️</span>
+      <h2>饮水方案对比</h2>
+    </div>
+    <table class="compare-table">
+      <tr><th>方案</th><th>微塑料清除</th><th>年成本</th><th>抗氧化</th><th>适用场景</th></tr>
+      <tr><td>桶装水</td><td>❌ 本身含微塑料</td><td>2,000-4,000 元</td><td>❌</td><td>办公室</td></tr>
+      <tr><td>瓶装水</td><td>❌ 90%检出率</td><td>3,000-8,000 元</td><td>❌</td><td>外出/应急</td></tr>
+      <tr><td>普通净水器</td><td>⚠️ 微米级,无法阻隔纳米塑料</td><td>500-1,500 元/年</td><td>❌</td><td>家庭</td></tr>
+      <tr><td class="win">Enagic 还原水机</td><td class="win">✅ 高精度过滤+电解</td><td class="win">1,200-2,000 元/年</td><td class="win">✅ 富含活性氢</td><td class="win">家庭+办公室</td></tr>
+    </table>
+    <p style="font-size:13px; color:#718096; text-align:center; margin-top:8px;">* Enagic 年成本基于滤芯更换费用,主机使用寿命 15-20 年</p>
+  </div>
+
+  <!-- ====== 信任 ====== -->
+  <div class="section trust">
+    <h2>❓ 为什么 Enagic</h2>
+    <p>不是因为它"贵",是因为它<strong>真的能解决微塑料问题</strong>。</p>
+    <p>Enagic 成立于 1974 年,是全球电解还原水行业的开创者和领导者。50 年技术积累,产品通过 ISO 13485 医疗级认证、WQA 金印认证,服务全球数百万家庭。浠艾福作为 Enagic 授权服务商,提供正品保障 + 专业安装 + 售后维护。</p>
+    <p>选择 Enagic 的家庭——有新手父母担心孩子饮水安全、有企业 HR 关注员工健康福利、有注重生活品质的中年人群——他们的共同点不是奢侈消费,而是<strong>对"看不到的风险"极度敏感</strong>。</p>
+    <a href="../articles/plastic-health.html" target="_blank" class="article-ref">
+      📖 完整科普文章 → <strong>《看不见的入侵者 — 微塑料与办公室饮水健康》</strong>
+    </a>
+
+    <div style="margin-top:1.5rem;padding:1rem;background:rgba(255,255,255,0.03);border-radius:8px;">
+      <h4 style="font-size:0.9rem;margin-bottom:0.5rem;color:#e2e8f0;">📚 延伸阅读:水污染的其他面</h4>
+      <ul style="margin:0;padding-left:1.2rem;font-size:0.85rem;line-height:2;">
+        <li><a href="../articles/tap-water-pollution.html" style="color:#68d391;">自来水中的隐形威胁——抗生素·农药·DBPs·激素</a></li>
+        <li><a href="../articles/cardio-cerebro.html" style="color:#68d391;">心脑血管疾病 · 慢性炎症与血管健康</a></li>
+        <li><a href="../articles/cancer.html" style="color:#68d391;">癌症 · 症-病-因与主动健康干预</a></li>
+        <li><a href="../articles/diabetes.html" style="color:#68d391;">糖尿病 · 症-病-因与主动健康干预</a></li>
+      </ul>
+      <p style="font-size:0.78rem;color:#718096;margin-top:0.5rem;">更详细的内容可参见相关文章,点击阅读。</p>
+    </div>
+  </div>
+
+  <!-- ====== 行动号召 ====== -->
+  <div class="section cta-block">
+    <h2>💥 一台 Enagic,五个改变</h2>
+    <div class="benefit-list">
+      <div class="benefit-item"><span class="check">✓</span><strong>微塑料终结者</strong>:高精度过滤 + 电解,不管微米还是纳米级,通通拦截</div>
+      <div class="benefit-item"><span class="check">✓</span><strong>比瓶装水划算 10 倍</strong>:一次投入,全家 15 年好水,综合成本远低于桶装水/瓶装水</div>
+      <div class="benefit-item"><span class="check">✓</span><strong>从喝水到做饭</strong>:三种功能水覆盖饮用、烹饪、清洁、护肤全场景</div>
+      <div class="benefit-item"><span class="check">✓</span><strong>抗氧化护身</strong>:活性氢对抗自由基,喝出来的年轻态</div>
+      <div class="benefit-item"><span class="check">✓</span><strong>正品 + 售后</strong>:浠艾福授权服务,一台好机器用 15 年</div>
+    </div>
+  </div>
+
+  <!-- ====== 大实话 ====== -->
+  <div class="section honesty">
+    <div class="honesty-label">➡️ 一句大实话:</div>
+    <p class="honesty-text">微塑料问题短期内不会消失——你无法改变环境,但可以改变喝进身体的水。<strong>今天的一台还原水机,是对未来 15 年健康的最低成本投资。</strong></p>
+    <p class="honesty-sub">不买没问题,但了解总比不知道好。</p>
+  </div>
+
+  <!-- ====== 联系方式 ====== -->
+  <div class="section contact">
+    <p>📩 <a href="../articles/plastic-health.html" target="_blank" style="color:var(--blue);">查看完整科普文章《微塑料与饮水安全》→</a></p>
+    <p>📞 书宁老师 13701366188</p>
+    <div class="contact-tagline">
+      <strong>你喝的不是水,是未来 10 年的健康。</strong><br>
+      花 15 分钟聊聊?书宁老师 13701366188
+    </div>
+  </div>
+
+</div>
+
+</body>
+</html>

+ 0 - 0
web/sales.html → web/sales/sales.html


+ 546 - 0
web/sales/tap-water-sale.html

@@ -0,0 +1,546 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="description" content="92.3%的自来水检出抗生素,46种农药频繁检出,雌激素活性超标——你每天喝下的自来水里藏着多少"隐形药"?Enagic 还原水机,电解还原技术为家庭饮水提供最后一道防线。">
+  <meta name="keywords" content="自来水污染,抗生素,农药残留,雌激素,氯消毒副产物,DBPs,Enagic,还原水机,电解还原水,浠艾福">
+  <title>92.3%的自来水检出抗生素——你家水龙头正在"配药" — Enagic · 浠艾福</title>
+  <style>
+    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
+    body {
+      font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
+      background: #0f1a12;
+      color: #e2e8f0;
+      line-height: 1.7;
+      -webkit-font-smoothing: antialiased;
+    }
+    a { color: inherit; text-decoration: none; }
+
+    .page-wrapper {
+      max-width: 860px;
+      margin: 0 auto;
+      padding: 0 16px 60px;
+    }
+
+    /* ===== Hero ===== */
+    .hero {
+      background: linear-gradient(135deg, #0a1f14 0%, #1a3d2a 40%, #0d5e3a 70%, #0a1f14 100%);
+      color: #fff;
+      padding: 80px 48px 56px;
+      text-align: center;
+      position: relative;
+      overflow: hidden;
+      min-height: 72vh;
+      display: flex;
+      flex-direction: column;
+      justify-content: center;
+      align-items: center;
+    }
+    .hero::before {
+      content: '';
+      position: absolute;
+      inset: 0;
+      background:
+        radial-gradient(ellipse at 25% 35%, rgba(72,187,120,0.1) 0%, transparent 50%),
+        radial-gradient(ellipse at 75% 65%, rgba(229,62,62,0.06) 0%, transparent 45%);
+      pointer-events: none;
+    }
+    .hero-particles { position: absolute; inset: 0; overflow: hidden; pointer-events: none; }
+    .particle {
+      position: absolute;
+      border-radius: 50%;
+      background: rgba(255,255,255,0.06);
+      animation: float 11s ease-in-out infinite;
+    }
+    .particle:nth-child(1) { width:3px;height:3px;left:5%;top:15%;animation-delay:0s; }
+    .particle:nth-child(2) { width:6px;height:6px;left:20%;top:70%;animation-delay:2s;opacity:0.05; }
+    .particle:nth-child(3) { width:4px;height:4px;left:38%;top:10%;animation-delay:1s; }
+    .particle:nth-child(4) { width:2px;height:2px;left:55%;top:80%;animation-delay:3s; }
+    .particle:nth-child(5) { width:5px;height:5px;left:72%;top:30%;animation-delay:1.8s;opacity:0.04; }
+    .particle:nth-child(6) { width:3px;height:3px;left:10%;top:90%;animation-delay:0.5s; }
+    .particle:nth-child(7) { width:7px;height:7px;left:48%;top:55%;animation-delay:2.5s;opacity:0.06; }
+    .particle:nth-child(8) { width:4px;height:4px;left:85%;top:65%;animation-delay:1.2s; }
+    @keyframes float {
+      0%,100% { transform: translateY(0) scale(1); opacity: 0.06; }
+      50% { transform: translateY(-28px) scale(1.4); opacity: 0.16; }
+    }
+    .hero > * { position: relative; z-index: 1; }
+    .hero-badge {
+      display: inline-block;
+      background: rgba(229,62,62,0.18);
+      border: 1px solid rgba(229,62,62,0.25);
+      border-radius: 20px;
+      padding: 4px 18px;
+      font-size: 12px;
+      letter-spacing: 2px;
+      margin-bottom: 24px;
+      color: #fc8181;
+    }
+    .hero h1 {
+      font-size: clamp(26px, 5vw, 38px);
+      font-weight: 800;
+      line-height: 1.35;
+      margin-bottom: 20px;
+      background: linear-gradient(135deg, #fff 50%, #9ae6b4 100%);
+      -webkit-background-clip: text;
+      -webkit-text-fill-color: transparent;
+      background-clip: text;
+    }
+    .hero-sub {
+      font-size: 17px;
+      color: rgba(255,255,255,0.75);
+      max-width: 700px;
+      margin-bottom: 28px;
+    }
+    .hero-stat {
+      display: flex;
+      gap: 36px;
+      justify-content: center;
+      flex-wrap: wrap;
+    }
+    .hero-stat-item { text-align: center; }
+    .hero-stat-num {
+      font-size: 30px;
+      font-weight: 800;
+      color: #68d391;
+    }
+    .hero-stat-label { font-size: 12px; color: rgba(255,255,255,0.5); letter-spacing: 1px; }
+
+    /* ===== Section Base ===== */
+    .section {
+      padding: 44px 48px;
+      border-bottom: 1px solid rgba(255,255,255,0.06);
+    }
+    .section:last-of-type { border-bottom: none; }
+    .section h2 {
+      font-size: 22px;
+      font-weight: 700;
+      margin-bottom: 18px;
+      color: #fff;
+    }
+    .section p {
+      font-size: 15px;
+      line-height: 1.9;
+      color: #a0aec0;
+      margin-bottom: 12px;
+    }
+    .section p:last-child { margin-bottom: 0; }
+
+    /* ===== Pain ===== */
+    .pain { background: rgba(255,255,255,0.02); }
+    .pain-header {
+      display: flex;
+      align-items: center;
+      gap: 10px;
+      margin-bottom: 16px;
+    }
+    .pain-header .icon { font-size: 22px; flex-shrink: 0; }
+    .pain-header h2 { font-size: 18px; color: #fc8181; margin: 0; }
+
+    .situation, .solution-box, .data-box {
+      padding: 14px 20px;
+      border-radius: 10px;
+      margin-bottom: 10px;
+      font-size: 15px;
+      line-height: 1.8;
+    }
+    .situation p, .solution-box p, .data-box p { margin: 4px 0 0; font-size: inherit; }
+    .situation {
+      background: rgba(229,62,62,0.08);
+      border-left: 4px solid #fc8181;
+    }
+    .situation-label { font-weight: 700; color: #fc8181; font-size: 13px; }
+    .solution-box {
+      background: rgba(72,187,120,0.08);
+      border-left: 4px solid #68d391;
+    }
+    .solution-label { font-weight: 700; color: #68d391; font-size: 13px; }
+    .data-box {
+      background: rgba(66,153,225,0.08);
+      border-left: 4px solid #63b3ed;
+    }
+    .data-label { font-weight: 700; color: #63b3ed; font-size: 13px; }
+
+    /* ===== Feature ===== */
+    .feature { background: rgba(255,255,255,0.02); }
+    .feature-header {
+      display: flex;
+      align-items: center;
+      gap: 10px;
+      margin-bottom: 14px;
+    }
+    .feature-header .icon { font-size: 20px; flex-shrink: 0; }
+    .feature-header h2 { font-size: 18px; color: #81e6d9; margin: 0; }
+
+    /* ===== Contaminant Grid ===== */
+    .cont-grid {
+      display: grid;
+      grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
+      gap: 12px;
+      margin: 16px 0;
+    }
+    .cont-card {
+      background: rgba(255,255,255,0.03);
+      border: 1px solid rgba(255,255,255,0.06);
+      border-radius: 10px;
+      padding: 16px;
+      text-align: center;
+    }
+    .cont-card .icon { font-size: 28px; margin-bottom: 6px; }
+    .cont-card .cont-name { font-size: 14px; font-weight: 700; color: #e2e8f0; margin-bottom: 4px; }
+    .cont-card .cont-data { font-size: 12px; color: #a0aec0; }
+
+    /* ===== Comparison Table ===== */
+    .compare-table {
+      width: 100%;
+      border-collapse: collapse;
+      margin: 16px 0;
+      font-size: 14px;
+    }
+    .compare-table th, .compare-table td {
+      padding: 10px 14px;
+      text-align: left;
+      border-bottom: 1px solid rgba(255,255,255,0.08);
+    }
+    .compare-table th {
+      background: rgba(255,255,255,0.05);
+      color: #a0aec0;
+      font-weight: 600;
+      font-size: 13px;
+      letter-spacing: 1px;
+    }
+    .compare-table td { color: #cbd5e0; }
+    .compare-table .win { color: #68d391; font-weight: 700; }
+
+    /* ===== Trust ===== */
+    .trust {
+      background: rgba(255,255,255,0.02);
+      text-align: center;
+    }
+    .trust h2 { font-size: 20px; }
+    .trust p { font-size: 16px; color: #a0aec0; }
+
+    /* ===== CTA ===== */
+    .cta-block {
+      background: linear-gradient(135deg, #0a1f14, #1a3d2a);
+      color: #fff;
+      text-align: center;
+      border: 1px solid rgba(104,211,145,0.12);
+    }
+    .cta-block h2 { color: #fff; font-size: 22px; margin-bottom: 24px; }
+    .benefit-list { text-align: left; max-width: 540px; margin: 0 auto; }
+    .benefit-item {
+      display: flex;
+      align-items: flex-start;
+      gap: 10px;
+      padding: 10px 0;
+      border-bottom: 1px solid rgba(255,255,255,0.06);
+      font-size: 15px;
+      color: #a0aec0;
+    }
+    .benefit-item:last-child { border-bottom: none; }
+    .benefit-item .check { color: #68d391; font-weight: 700; flex-shrink: 0; }
+    .benefit-item strong { color: #e2e8f0; }
+
+    /* ===== Honesty ===== */
+    .honesty {
+      background: rgba(229,62,62,0.06);
+      text-align: center;
+      padding: 36px 48px;
+    }
+    .honesty-label {
+      font-size: 18px;
+      font-weight: 700;
+      color: #fc8181;
+      margin-bottom: 12px;
+    }
+    .honesty-text {
+      font-size: 18px !important;
+      font-weight: 700 !important;
+      color: #fc8181 !important;
+    }
+    .honesty-sub {
+      font-size: 16px !important;
+      color: #feb2b2 !important;
+      margin-top: 8px !important;
+    }
+
+    /* ===== Contact ===== */
+    .contact {
+      background: #0a1f14;
+      color: #fff;
+      text-align: center;
+      padding: 40px 48px;
+    }
+    .contact p {
+      color: #a0aec0 !important;
+      font-size: 16px !important;
+      margin-bottom: 10px !important;
+    }
+    .contact-tagline {
+      margin-top: 18px;
+      font-size: 14px;
+      color: #68d391;
+      line-height: 1.8;
+    }
+    .contact-tagline strong { color: #e2e8f0; }
+
+    /* ===== Article Link ===== */
+    .article-ref {
+      display: inline-block;
+      background: rgba(104,211,145,0.08);
+      border: 1px solid rgba(104,211,145,0.18);
+      border-radius: 8px;
+      padding: 12px 18px;
+      margin: 8px 0 4px;
+      font-size: 14px;
+      color: #9ae6b4;
+      transition: background 0.2s;
+    }
+    .article-ref:hover { background: rgba(104,211,145,0.16); }
+    .article-ref strong { color: #fff; }
+
+    /* ===== Product Highlight ===== */
+    .product-highlight {
+      background: linear-gradient(135deg, rgba(72,187,120,0.06), rgba(56,178,172,0.06));
+      border: 1px solid rgba(104,211,145,0.12);
+      border-radius: 14px;
+      padding: 24px 28px;
+      margin: 16px 0;
+    }
+    .product-highlight h3 {
+      color: #9ae6b4;
+      font-size: 18px;
+      margin-bottom: 10px;
+    }
+    .product-highlight p { color: #a0aec0; }
+
+    /* ===== Responsive ===== */
+    @media (max-width: 640px) {
+      .page-wrapper { padding: 0 4px 40px; }
+      .hero { padding: 48px 20px 40px; min-height: 62vh; }
+      .hero h1 { font-size: 24px; }
+      .section { padding: 28px 20px; }
+      .honesty { padding: 28px 20px; }
+      .contact { padding: 28px 20px; }
+      .section h2 { font-size: 18px; }
+      .pain-header h2 { font-size: 16px; }
+      .hero-stat { gap: 16px; }
+      .hero-stat-num { font-size: 24px; }
+      .cont-grid { grid-template-columns: repeat(2, 1fr); }
+    }
+  </style>
+
+  <!-- Microsoft Clarity -->
+  <script>
+    (function(c,l,a,r,i,t,y){
+      c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
+      t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
+      y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
+    })(window, document, "clarity", "script", "xj4p74ra9m");
+  </script>
+</head>
+<body>
+
+<div class="hero">
+  <div class="hero-particles">
+    <div class="particle"></div><div class="particle"></div><div class="particle"></div>
+    <div class="particle"></div><div class="particle"></div><div class="particle"></div>
+    <div class="particle"></div><div class="particle"></div>
+  </div>
+  <div class="hero-badge">⚠️ 全国性调查 · 2025</div>
+  <h1>92.3% 的自来水检出抗生素——<br>你家水龙头正在"配药"</h1>
+  <p class="hero-sub">中国主要流域 46 种农药频繁检出、氯消毒副产物与膀胱癌存在统计学关联、雌激素活性 88.89% 超安全阈值——现行自来水标准覆盖不到的"新污染物",正在通过你家水龙头悄悄进入每一顿饭、每一杯水。</p>
+  <div class="hero-stat">
+    <div class="hero-stat-item"><div class="hero-stat-num">92.3%</div><div class="hero-stat-label">自来水抗生素检出率</div></div>
+    <div class="hero-stat-item"><div class="hero-stat-num">53,800</div><div class="hero-stat-label">吨/年抗生素排入环境</div></div>
+    <div class="hero-stat-item"><div class="hero-stat-num">46</div><div class="hero-stat-label">种农药频繁检出</div></div>
+  </div>
+</div>
+
+<div class="page-wrapper">
+
+  <!-- ====== 污染物速览 ====== -->
+  <div class="section">
+    <h2>🧪 你家自来水里的"隐形药方"</h2>
+    <p>2025 年全国性调查显示,中国自来水中的新污染物问题已经不容忽视。以下四类污染物是关注焦点:</p>
+    <div class="cont-grid">
+      <div class="cont-card">
+        <div class="icon">💊</div>
+        <div class="cont-name">抗生素</div>
+        <div class="cont-data">53,800 吨/年进入环境<br>92.3% 自来水样本检出</div>
+      </div>
+      <div class="cont-card">
+        <div class="icon">⚧️</div>
+        <div class="cont-name">雌激素</div>
+        <div class="cont-data">88.89% 水源高风险<br>EE2 活性超安全阈值</div>
+      </div>
+      <div class="cont-card">
+        <div class="icon">🌾</div>
+        <div class="cont-name">农药残留</div>
+        <div class="cont-data">46 种频繁检出<br>长三角珠江最严重</div>
+      </div>
+      <div class="cont-card">
+        <div class="icon">🧪</div>
+        <div class="cont-name">消毒副产物</div>
+        <div class="cont-data">DBPs 与膀胱癌相关<br>煮沸无法去除</div>
+      </div>
+    </div>
+  </div>
+
+  <!-- ====== 痛点一 ====== -->
+  <div class="section pain">
+    <div class="pain-header">
+      <span class="icon">💊</span>
+      <h2>痛点一:抗生素——每年 5.38 万吨进入环境</h2>
+    </div>
+    <div class="situation">
+      <div class="situation-label">场景还原:</div>
+      <p>你可能以为吃药才摄入抗生素。但研究表明:<strong>中国每年有超过 5.38 万吨抗生素通过畜牧养殖、制药废水、农业径流进入水体</strong>,其中相当一部分无法被自来水厂常规工艺去除。2025 年全国 31 个省份 547 份自来水样本中,92.3% 检出至少一种抗生素。</p>
+    </div>
+    <div class="data-box">
+      <div class="data-label">研究数据:</div>
+      <p>Zhang et al. (2015) 《Environmental Science & Technology》首次系统估算中国抗生素排放总量为 53,800 吨/年。长期低剂量抗生素暴露可能导致肠道菌群失调、耐药菌滋生,对儿童的影响尤为显著。</p>
+    </div>
+  </div>
+
+  <!-- ====== 痛点二 ====== -->
+  <div class="section pain">
+    <div class="pain-header">
+      <span class="icon">⚧️</span>
+      <h2>痛点二:避孕药与雌激素——浓度虽低,活性惊人</h2>
+    </div>
+    <div class="situation">
+      <div class="situation-label">科学发现:</div>
+      <p>避孕药的主要成分 17α-乙炔基雌二醇(EE2)在极低浓度下就有生物活性。中国主要流域的雌激素监测数据显示:<strong>长江、珠江等河流的 EE2 浓度超过安全阈值的比例高达 88.89%</strong>,可能影响儿童性发育、男性生殖健康和女性内分泌平衡。</p>
+    </div>
+    <div class="data-box">
+      <div class="data-label">研究数据:</div>
+      <p>中国环境科学研究院调查显示,我国 70% 以上水源存在内分泌干扰物(EDCs)检出。其中 68.7% 的儿童暴露于高风险 EDCs 组合,影响发育和免疫系统。</p>
+    </div>
+  </div>
+
+  <!-- ====== 痛点三 ====== -->
+  <div class="section pain">
+    <div class="pain-header">
+      <span class="icon">🌾</span>
+      <h2>痛点三:农药 + DBPs——双重化学攻势</h2>
+    </div>
+    <div class="situation">
+      <div class="situation-label">场景还原:</div>
+      <p>中国主要流域检出多达 46 种农药,其中有机磷和氨基甲酸酯类农药频繁超标。更棘手的是 <strong>氯消毒副产物(DBPs)</strong>——自来水厂加氯消毒时,氯与水中残留的有机物反应生成数百种 DBPs,其中多种已被证实具有细胞毒性和遗传毒性。</p>
+    </div>
+    <div class="data-box">
+      <div class="data-label">研究数据:</div>
+      <p>多项流行病学研究显示,长期饮用氯消毒自来水的人群,膀胱癌发病率高于饮用深井水的人群。DBPs 在煮沸过程中浓度会先升后降,无法通过烧开水完全去除。</p>
+    </div>
+  </div>
+
+  <!-- ====== 痛点四 ====== -->
+  <div class="section pain">
+    <div class="pain-header">
+      <span class="icon">🦠</span>
+      <h2>痛点四:多污染物协同——破坏肠道菌群</h2>
+    </div>
+    <div class="situation">
+      <div class="situation-label">研究发现:</div>
+      <p>四种污染物的组合效应可能比单一污染物强 10 倍。研究证实,<strong>低剂量抗生素 + 残留农药 + 消毒副产物 + 雌激素共同作用,会显著破坏肠道菌群多样性</strong>。肠道菌群被称为"第二基因组",其失衡与肥胖、糖尿病、自闭症、过敏、抑郁症等多种疾病密切相关。</p>
+    </div>
+    <div class="data-box">
+      <div class="data-label">研究数据:</div>
+      <p>中国疾控中心营养与健康所数据显示,中国儿童过敏性疾病患病率 20 年间上升了 3-5 倍,肠道菌群失衡被认为是一个关键诱因。而<strong>饮水中的微量污染物复合暴露</strong>可能是被忽视的重要因素。</p>
+    </div>
+  </div>
+
+  <!-- ====== 方案 ====== -->
+  <div class="section feature">
+    <div class="feature-header">
+      <span class="icon">💧</span>
+      <h2>方案:Enagic 还原水机——给自来水加上最后一道屏障</h2>
+    </div>
+    <p>自来水出厂符合国标只是"及格线"——现行标准 GB 5749-2022 尚未覆盖抗生素、雌激素等新污染物的限值。Enagic 还原水机在市政供水基础上,提供了家庭级深度处理方案:</p>
+
+    <div class="product-highlight">
+      <h3>🛡️ Enagic 四重水质保障</h3>
+      <p><strong>1. 前置过滤</strong> — 活性炭+精密滤芯,去除余氯、悬浮物、铁锈、有机物,减少 DBPs 前体物。</p>
+      <p><strong>2. 电解分离</strong> — 电解过程将水中杂质分离到酸性水侧,还原水侧水质进一步提纯。</p>
+      <p><strong>3. pH 调节</strong> — 可根据当地水质调节电解强度,确保最佳净化效果。</p>
+      <p><strong>4. 活性氢注入</strong> — 生成富含活性氢(H⁻)的弱碱性还原水,具有抗氧化、清除自由基的作用。</p>
+    </div>
+
+    <p>这不是一台净水器——<strong>Enagic 是一台电解还原水机</strong>。它不只是过滤,更是从水分子层面重构水质,让普通自来水变成功能性的健康饮水。</p>
+  </div>
+
+  <!-- ====== 对比 ====== -->
+  <div class="section pain">
+    <div class="pain-header">
+      <span class="icon">⚖️</span>
+      <h2>自来水净化方案对比</h2>
+    </div>
+    <table class="compare-table">
+      <tr><th>方案</th><th>抗生素/激素</th><th>农药/DBPs</th><th>余氯</th><th>抗氧化</th><th>年使用成本</th></tr>
+      <tr><td>烧开水</td><td>❌ 无法去除</td><td>⚠️ DBPs 先升后降</td><td>✅ 挥发</td><td>❌</td><td>电费 ~200 元</td></tr>
+      <tr><td>普通净水器</td><td>⚠️ 部分去除</td><td>⚠️ 活性炭有限</td><td>✅</td><td>❌</td><td>500-1,500 元</td></tr>
+      <tr><td>RO 反渗透</td><td>✅ 大部分</td><td>✅</td><td>✅</td><td>❌ 脱盐过度</td><td>800-2,000 元</td></tr>
+      <tr><td class="win">Enagic 还原水</td><td class="win">✅ 电解分离</td><td class="win">✅ 活性炭+电解</td><td class="win">✅</td><td class="win">✅ 活性氢</td><td class="win">1,200-2,000 元</td></tr>
+    </table>
+    <p style="font-size:13px; color:#718096; text-align:center; margin-top:8px;">* Enagic 年成本基于滤芯更换费用,主机使用寿命 15-20 年</p>
+  </div>
+
+  <!-- ====== 信任 ====== -->
+  <div class="section trust">
+    <h2>❓ 自来水标准不够,谁来守最后一道门</h2>
+    <p>不是自来水公司不努力——<strong>是标准更新追不上新型污染物的速度</strong>。</p>
+    <p>自来水厂的常规处理工艺(混凝→沉淀→过滤→氯消毒)对抗生素、内分泌干扰物、部分农药的去除率有限。GB 5749-2022 开始关注一些新污染物,但距离在每家每户落地还有很长的路。Enagic 还原水机提供了家庭端的主动防护方案,让每一个家庭都有能力把好饮水安全的最后一关。</p>
+    <p>浠艾福作为 Enagic 授权服务商,提供正品保障 + 专业安装 + 滤芯更换提醒 + 售后维护,让好水服务不中断。</p>
+    <a href="../articles/tap-water-pollution.html" target="_blank" class="article-ref">
+      📖 完整科普文章 → <strong>《自来水中的隐形威胁——抗生素·农药·DBPs·激素》</strong>
+    </a>
+
+    <div style="margin-top:1.5rem;padding:1rem;background:rgba(255,255,255,0.03);border-radius:8px;">
+      <h4 style="font-size:0.9rem;margin-bottom:0.5rem;color:#e2e8f0;">📚 延伸阅读:同一问题的不同面</h4>
+      <ul style="margin:0;padding-left:1.2rem;font-size:0.85rem;line-height:2;">
+        <li><a href="../articles/diabetes.html" style="color:#68d391;">心脑血管疾病 · 慢性炎症与血管健康</a></li>
+        <li><a href="../articles/cancer.html" style="color:#68d391;">癌症 · 症-病-因与主动健康干预</a></li>
+        <li><a href="../articles/alzheimer.html" style="color:#68d391;">老年痴呆 · 神经炎症、肠脑轴与主动健康</a></li>
+        <li><a href="../articles/osteoporosis.html" style="color:#68d391;">骨质疏松 · 慢性炎症与骨骼健康</a></li>
+        <li><a href="../articles/plastic-health.html" style="color:#68d391;">看不见的入侵者 — 微塑料与办公室饮水</a></li>
+      </ul>
+      <p style="font-size:0.78rem;color:#718096;margin-top:0.5rem;">更详细的内容可参见相关文章,点击阅读。</p>
+    </div>
+  </div>
+
+  <!-- ====== 行动号召 ====== -->
+  <div class="section cta-block">
+    <h2>💥 一台 Enagic,五个层面的改变</h2>
+    <div class="benefit-list">
+      <div class="benefit-item"><span class="check">✓</span><strong>新污染物屏障</strong>:电解分离 + 活性炭过滤,为自来水加上家庭级深度处理</div>
+      <div class="benefit-item"><span class="check">✓</span><strong>从饮水到烹饪</strong>:洗菜、做饭、煲汤都用净化还原水,彻底切断污染物入口路径</div>
+      <div class="benefit-item"><span class="check">✓</span><strong>抗氧化每一天</strong>:活性氢对抗自由基,喝出来的年轻与免疫力</div>
+      <div class="benefit-item"><span class="check">✓</span><strong>不浪费矿物质</strong>:不同于 RO 纯水机,保留水中天然矿物质,更适合家庭长期饮用</div>
+      <div class="benefit-item"><span class="check">✓</span><strong>15 年好水保障</strong>:一台机器用 15 年,日均成本不到 6 元,比瓶装水划算 10 倍</div>
+    </div>
+  </div>
+
+  <!-- ====== 大实话 ====== -->
+  <div class="section honesty">
+    <div class="honesty-label">➡️ 一句大实话:</div>
+    <p class="honesty-text">等自来水标准覆盖所有新污染物,可能需要 10 年。你家孩子等不了 10 年。<strong>一台 Enagic,是你能为家人做的最简单的健康投资。</strong></p>
+    <p class="honesty-sub">不了解不知道,了解了就很难假装不知道。</p>
+  </div>
+
+  <!-- ====== 联系方式 ====== -->
+  <div class="section contact">
+    <p>📩 <a href="../articles/tap-water-pollution.html" target="_blank" style="color:var(--blue);">查看完整科普文章《自来水污染与饮水安全》→</a></p>
+    <p>📞 书宁老师 13701366188</p>
+    <div class="contact-tagline">
+      <strong>标准在追赶污染,但你家人的健康等不起。</strong><br>
+      花 15 分钟聊聊怎么喝上安心水?书宁老师 13701366188
+    </div>
+  </div>
+
+</div>
+
+</body>
+</html>

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików