Parcourir la source

refactor: 成长页面调整 — 戒备/饮食推荐从健康移至成长

原则:健康=看见现状,成长=行动调整
- gut-flora-caution-detail → pages/growth/caution-detail
- gut-flora-foods-detail → pages/growth/foods-detail
- growth-main 新增戒备/饮食推荐行动卡片(戒备有数据时显示)
- 更新 gut-flora-detail.vue 跳转链接
iwt il y a 2 mois
Parent
commit
dc1d51b8d4

+ 12 - 12
cfc-frontend/pages.json

@@ -428,6 +428,18 @@
           "style": {
             "navigationBarTitleText": "补充测评材料"
           }
+        },
+        {
+          "path": "caution-detail",
+          "style": {
+            "navigationBarTitleText": "食材戒备匹配"
+          }
+        },
+        {
+          "path": "foods-detail",
+          "style": {
+            "navigationBarTitleText": "饮食推荐"
+          }
         }
       ]
     },
@@ -847,12 +859,6 @@
             "navigationBarTitleText": "菌群详情"
           }
         },
-        {
-          "path": "gut-flora-foods-detail",
-          "style": {
-            "navigationBarTitleText": "饮食推荐"
-          }
-        },
         {
           "path": "gut-flora-risks-detail",
           "style": {
@@ -900,12 +906,6 @@
           "style": {
             "navigationBarTitleText": "报告详情"
           }
-        },
-        {
-          "path": "gut-flora-caution-detail",
-          "style": {
-            "navigationBarTitleText": "食材戒备匹配"
-          }
         }
       ]
     },

+ 40 - 2
cfc-frontend/pages/growth-main/index.vue

@@ -159,6 +159,26 @@
           </view>
         </view>
       </view>
+      <view class="section" v-if="cautionCount > 0">
+        <view class="action-card" @click="goToCaution">
+          <text class="action-icon">⚠️</text>
+          <view class="action-info">
+            <text class="action-title">食材戒备匹配</text>
+            <text class="action-desc">{{ cautionCount }} 种食材需关注,点击查看戒备详情</text>
+          </view>
+          <text class="action-arrow">›</text>
+        </view>
+      </view>
+      <view class="section">
+        <view class="action-card" @click="goToFoods">
+          <text class="action-icon">🍽️</text>
+          <view class="action-info">
+            <text class="action-title">饮食推荐</text>
+            <text class="action-desc">基于菌群报告的个性化食材建议</text>
+          </view>
+          <text class="action-arrow">›</text>
+        </view>
+      </view>
       <view class="section">
         <view class="tracking-card">
           <view class="tracking-tabs">
@@ -230,10 +250,10 @@
 import PageBanner from '../../components/PageBanner.vue'
 import LoginGuideCard from '../../components/LoginGuideCard.vue'
 import DimensionActivities from '../../components/DimensionActivities.vue'
-import { healthCheckinList, getDietDailyRecords, getSurveyStatus, getSurveyHistory } from '../../utils/api.js'
+import { healthCheckinList, getDietDailyRecords, getSurveyStatus, getSurveyHistory, getFoodCautionList } from '../../utils/api.js'
 export default {
   components: { PageBanner, LoginGuideCard, DimensionActivities },
-  data() { return { memberId: '', todayDate: '', hasIncomplete: false, incompleteCount: 0, progressItems: [], activeTab: 'diet', trackingTabs: [{ key: 'diet', label: '饮食' }, { key: 'exercise', label: '运动' }, { key: 'sleep', label: '睡眠' }, { key: 'emotion', label: '心情' }, { key: 'survey', label: '调研' }], trackingData: { diet: [], exercise: [], sleep: [], emotion: [], survey: [] }, streakDays: 0, activeChallenges: 0, completeness: 0, pendingSurvey: null, allDone: false, surveyHistory: [], isLoggedIn: false } },
+  data() { return { memberId: '', todayDate: '', hasIncomplete: false, incompleteCount: 0, progressItems: [], activeTab: 'diet', trackingTabs: [{ key: 'diet', label: '饮食' }, { key: 'exercise', label: '运动' }, { key: 'sleep', label: '睡眠' }, { key: 'emotion', label: '心情' }, { key: 'survey', label: '调研' }], trackingData: { diet: [], exercise: [], sleep: [], emotion: [], survey: [] }, streakDays: 0, activeChallenges: 0, completeness: 0, cautionCount: 0, pendingSurvey: null, allDone: false, surveyHistory: [], isLoggedIn: false } },
   computed: {
     doneCount: function() { var c = 0; for (var i = 0; i < this.progressItems.length; i++) if (this.progressItems[i] && this.progressItems[i].done) c++; return c },
     totalCount: function() { return this.progressItems.length },
@@ -271,11 +291,14 @@ export default {
     goActivityDetail: function(act) { uni.navigateTo({ url: '/pages/activity/activity-detail/activity-detail?id=' + act.id }) },
     goMoreActivities: function() { uni.navigateTo({ url: '/pages/activity/index' }) },
     handleGuestFeatureTap: function() { uni.showToast({ title: '登录后即可体验该功能', icon: 'none' }) },
+    goToCaution: function() { uni.navigateTo({ url: '/pages/growth/caution-detail' }) },
+    goToFoods: function() { uni.navigateTo({ url: '/pages/growth/foods-detail' }) },
     goPage: function(url) { uni.navigateTo({ url: url }) },
     loadTrackingData: function(key) { return this.trackingData[key] || [] },
     async loadAllData() {
       var self = this
       try { await self.loadProgressItems() } catch(e) {}
+      try { await self.loadCautionData() } catch(e) {}
       try { await self.loadSurveyData() } catch(e) {}
       try { await self.loadMilestones() } catch(e) {}
     },
@@ -323,6 +346,13 @@ export default {
         }
       } catch(e) {}
     },
+    async loadCautionData() {
+      var self = this
+      try {
+        var res = await getFoodCautionList()
+        if (res && res.code === 200) self.cautionCount = (res.data || []).length
+      } catch(e) {}
+    },
     async loadMilestones() {
       var self = this
       try {
@@ -361,6 +391,14 @@ export default {
 .feat-title{font-size:26rpx;font-weight:600;color:#333;display:block;margin-bottom:4rpx}
 .feat-desc{font-size:22rpx;color:#999;display:block}
 .login-guide-section{margin:0 24rpx 24rpx}
+/* 成长行动卡片 */
+.action-card{display:flex;align-items:center;padding:24rpx 28rpx;background:#fff;border-radius:16rpx;margin:0 24rpx 16rpx;box-shadow:0 2rpx 12rpx rgba(0,0,0,0.06)}
+.action-card:active{opacity:0.85}
+.action-icon{font-size:44rpx;margin-right:20rpx}
+.action-info{flex:1}
+.action-title{font-size:28rpx;font-weight:600;color:#333;display:block}
+.action-desc{font-size:22rpx;color:#888;margin-top:4rpx;display:block}
+.action-arrow{font-size:32rpx;color:#ccc}
 /* 登录后原有样式 */
 .reminder-bar{margin:12rpx 24rpx;background:#FFF3E0;border:1rpx solid #FFB74D;border-radius:12rpx;padding:14rpx 20rpx;display:flex;align-items:center;justify-content:space-between}
 .reminder-text{font-size:24rpx;color:#E65100}

+ 300 - 0
cfc-frontend/pages/growth/caution-detail.vue

@@ -0,0 +1,300 @@
+<template>
+  <view class="page">
+    <view class="nav-bar">
+      <view class="nav-back" @tap="goBack">
+        <text class="back-text">‹ 返回</text>
+      </view>
+      <text class="nav-title">食材戒备匹配</text>
+      <view class="nav-placeholder"></view>
+    </view>
+
+    <view class="warning-banner">
+      <text class="banner-icon">⚠️</text>
+      <text class="banner-text">以下食材推荐指数低于 0,建议谨慎食用或避免</text>
+    </view>
+
+    <scroll-view class="content" scroll-y :refresher-enabled="true" :refresher-triggered="refreshing" @refresherrefresh="onRefresh">
+      <view class="food-card" v-for="(item, idx) in foods" :key="idx">
+        <view class="food-header">
+          <text class="food-name">{{ item.foodName }}</text>
+          <view class="caution-badge">戒备</view>
+        </view>
+        <view class="food-meta">
+          <text class="meta-item" v-if="item.category">{{ item.category }}</text>
+        </view>
+        <view class="food-score-row">
+          <view class="score-bar-wrap">
+            <view class="score-bar-bg">
+              <view class="score-bar-fill danger" :style="'width:' + Math.min(Math.abs(item.indexScore) / 50 * 100, 100) + '%'"></view>
+            </view>
+            <text class="score-value danger">{{ item.indexScore }}</text>
+          </view>
+          <text class="score-label">推荐指数</text>
+        </view>
+        <view class="food-nutrition" v-if="item.nutrition">
+          <text class="nut-item">蛋白 {{ item.nutrition.protein }}g</text>
+          <text class="nut-item">脂肪 {{ item.nutrition.fat }}g</text>
+          <text class="nut-item">碳水 {{ item.nutrition.carbs }}g</text>
+        </view>
+      </view>
+
+      <view class="empty-state" v-if="!loading && foods.length === 0">
+        <text class="empty-icon">✅</text>
+        <text class="empty-text">暂无戒备食材</text>
+        <text class="empty-hint">您的菌群报告未显示需要戒备的食材</text>
+      </view>
+
+      <view class="loading-state" v-if="loading">
+        <text class="loading-text">加载中...</text>
+      </view>
+
+      <view class="bottom-spacer"></view>
+    </scroll-view>
+  </view>
+</template>
+
+<script>
+import { getFoodCautionList } from '../../utils/api.js'
+
+export default {
+  data() {
+    return {
+      foods: [],
+      loading: true,
+      refreshing: false,
+      nutritionCache: {}
+    }
+  },
+  onLoad() {
+    this.loadFoods()
+  },
+  methods: {
+    goBack() {
+      uni.navigateBack()
+    },
+    async loadFoods() {
+      this.loading = true
+      try {
+        var res = await getFoodCautionList()
+        if (res && res.code === 200 && res.data) {
+          this.foods = res.data
+          // 批量加载营养数据
+          this.loadNutrition()
+        } else {
+          this.foods = []
+        }
+      } catch (e) {
+        console.error('加载戒备食材失败', e)
+        this.foods = []
+      } finally {
+        this.loading = false
+        this.refreshing = false
+      }
+    },
+    async loadNutrition() {
+      if (!this.foods.length) return
+      try {
+        var kbRes = await this.getKnowledgeSection('食物库')
+        if (kbRes && kbRes.data && kbRes.data['数据']) {
+          var kbFoods = kbRes.data['数据']
+          var cache = {}
+          for (var i = 0; i < kbFoods.length; i++) {
+            var f = kbFoods[i]
+            cache[f['名称']] = {
+              protein: f['蛋白g'] || null,
+              fat: f['脂肪g'] || null,
+              carbs: f['碳水化合物g'] || null,
+              fiber: f['总膳食纤维g'] || null,
+              energy: f['能量KJ'] || null,
+              category: f['分类'] || ''
+            }
+          }
+          this.nutritionCache = cache
+          this.foods = this.foods.map(function(item) {
+            var n = cache[item.foodName] || {}
+            return Object.assign({}, item, {
+              nutrition: n,
+              category: item.category || n.category || ''
+            })
+          })
+          this.$forceUpdate()
+        }
+      } catch (e) {
+        console.warn('加载营养数据失败', e)
+      }
+    },
+    getKnowledgeSection(key) {
+      return new Promise(function(resolve) {
+        uni.request({
+          url: getApp().globalData.baseApi + '/api/kb/section',
+          method: 'POST',
+          header: {
+            'Content-Type': 'application/json',
+            'Authorization': 'Bearer ' + (uni.getStorageSync('token') || '')
+          },
+          data: { key: key },
+          success: function(res) { resolve(res.data) },
+          fail: function() { resolve({}) }
+        })
+      })
+    },
+    onRefresh() {
+      this.refreshing = true
+      this.loadFoods()
+    }
+  }
+}
+</script>
+
+<style scoped>
+.page {
+  min-height: 100vh;
+  background: #f5f6fa;
+}
+.nav-bar {
+  display: flex;
+  align-items: center;
+  padding: 20rpx 30rpx;
+  background: #fff;
+  position: relative;
+}
+.nav-back { padding: 10rpx 0; }
+.back-text { font-size: 28rpx; color: #4A9BD7; }
+.nav-title { flex: 1; text-align: center; font-size: 32rpx; font-weight: 600; }
+.nav-placeholder { width: 80rpx; }
+
+.warning-banner {
+  display: flex;
+  align-items: center;
+  gap: 12rpx;
+  padding: 20rpx 30rpx;
+  background: #FFF3CD;
+  border-bottom: 1rpx solid #FFECB5;
+}
+.banner-icon { font-size: 32rpx; }
+.banner-text { font-size: 24rpx; color: #856404; flex: 1; }
+
+.content {
+  padding: 20rpx 30rpx;
+  height: calc(100vh - 160rpx);
+}
+
+.food-card {
+  background: #fff;
+  border-radius: 16rpx;
+  padding: 24rpx;
+  margin-bottom: 16rpx;
+  border-left: 6rpx solid #EF4444;
+  box-shadow: 0 2rpx 8rpx rgba(239, 68, 68, 0.08);
+}
+.food-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: 8rpx;
+}
+.food-name {
+  font-size: 32rpx;
+  font-weight: 600;
+  color: #1a1a1a;
+}
+.caution-badge {
+  padding: 4rpx 16rpx;
+  background: #EF4444;
+  color: #fff;
+  border-radius: 20rpx;
+  font-size: 22rpx;
+  font-weight: 500;
+}
+.food-meta {
+  margin-bottom: 16rpx;
+}
+.meta-item {
+  font-size: 24rpx;
+  color: #888;
+  background: #f5f5f5;
+  padding: 4rpx 12rpx;
+  border-radius: 8rpx;
+}
+.food-score-row {
+  display: flex;
+  align-items: center;
+  gap: 16rpx;
+  margin-bottom: 12rpx;
+}
+.score-bar-wrap {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  gap: 12rpx;
+}
+.score-bar-bg {
+  flex: 1;
+  height: 12rpx;
+  background: #fee2e2;
+  border-radius: 6rpx;
+  overflow: hidden;
+}
+.score-bar-fill {
+  height: 100%;
+  border-radius: 6rpx;
+  transition: width 0.3s ease;
+}
+.score-bar-fill.danger {
+  background: linear-gradient(90deg, #EF4444, #DC2626);
+}
+.score-value {
+  font-size: 28rpx;
+  font-weight: 700;
+  color: #EF4444;
+  min-width: 60rpx;
+  text-align: right;
+}
+.score-label {
+  font-size: 24rpx;
+  color: #999;
+  white-space: nowrap;
+}
+.food-nutrition {
+  display: flex;
+  gap: 20rpx;
+  flex-wrap: wrap;
+}
+.nut-item {
+  font-size: 22rpx;
+  color: #999;
+}
+
+.empty-state {
+  text-align: center;
+  padding: 100rpx 40rpx;
+}
+.empty-icon {
+  font-size: 80rpx;
+  display: block;
+  margin-bottom: 20rpx;
+}
+.empty-text {
+  font-size: 30rpx;
+  color: #333;
+  font-weight: 500;
+  display: block;
+  margin-bottom: 12rpx;
+}
+.empty-hint {
+  font-size: 24rpx;
+  color: #999;
+  display: block;
+}
+
+.loading-state {
+  text-align: center;
+  padding: 80rpx 0;
+}
+.loading-text {
+  font-size: 26rpx;
+  color: #999;
+}
+
+.bottom-spacer { height: 40rpx; }
+</style>

+ 201 - 0
cfc-frontend/pages/growth/foods-detail.vue

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

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

@@ -477,10 +477,10 @@ export default {
       uni.navigateTo({ url: '/pages/health/gut-flora-risks-detail?reportId=' + this.reportId })
     },
     goToFoods: function() {
-      uni.navigateTo({ url: '/pages/health/gut-flora-foods-detail?reportId=' + this.reportId })
+      uni.navigateTo({ url: '/pages/growth/foods-detail?reportId=' + this.reportId })
     },
     goToCaution: function() {
-      uni.navigateTo({ url: '/pages/health/gut-flora-caution-detail' })
+      uni.navigateTo({ url: '/pages/growth/caution-detail' })
     },
     goToIndicators: function() {
       this.accordionOpen.nutri = true