Просмотр исходного кода

fix: 行TabBar登录态数据加载对齐action页(孩子/能量/任务/活动/商品/文章)

liaoxg 3 месяцев назад
Родитель
Сommit
a3149d5158
1 измененных файлов с 184 добавлено и 19 удалено
  1. 184 19
      cfc-frontend/pages/index-home/index.vue

+ 184 - 19
cfc-frontend/pages/index-home/index.vue

@@ -85,12 +85,32 @@
 
     <!-- 今日行动任务 -->
     <DimensionTasks
-      v-if="dimensionTasks.length > 0"
       dimensionCode="action"
       :tasks="dimensionTasks"
       @taskClick="onTaskClick"
       @moreTasks="goTasks" />
 
+    <DimensionActivities
+      dimensionCode="action"
+      :activities="dimensionActivities"
+      :isLoggedIn="true"
+      @activityClick="goActivityDetail"
+      @moreActivities="goMoreActivities" />
+
+    <DimensionProducts
+      dimensionCode="action"
+      :products="dimensionProducts"
+      :isLoggedIn="true"
+      @productClick="goProductDetail"
+      @moreProducts="goMoreProducts" />
+
+    <DimensionArticles
+      dimensionCode="action"
+      :articles="actionArticles"
+      :isLoggedIn="true"
+      @articleClick="goArticleDetail"
+      @moreArticles="goMoreArticles" />
+
     <!-- 功能入口 -->
     <view class="func-section">
       <view class="func-grid">
@@ -278,7 +298,11 @@ import TabTransition from '../../components/tab-transition.vue'
 import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
 import FamilyEnergyBar from '../../components/FamilyEnergyBar.vue'
 import DimensionTasks from '../../components/DimensionTasks.vue'
-import { acceptParentInvite, productList, getActivityList, getFeaturedArticles, getFamilyEnergySandbox, getVisibleFamilyMembers, getTodayTasksByCategory } from '../../utils/api.js'
+import DimensionActivities from '../../components/DimensionActivities.vue'
+import DimensionProducts from '../../components/DimensionProducts.vue'
+import DimensionArticles from '../../components/DimensionArticles.vue'
+import LoginGuideCard from '../../components/LoginGuideCard.vue'
+import { acceptParentInvite, productList, getActivityList, getFeaturedArticles, getFamilyEnergySandbox, getVisibleFamilyMembers, getTodayTasksByCategory, getChildren, getEnergyOverview, getProductsByDomain, getHealthAlerts } from '../../utils/api.js'
 
 var DIMENSIONS = [
   { code: 'body', name: '身', icon: '🌏', color: '#8D6E63', bgColor: 'rgba(141,110,99,0.15)', title: '主动健康', desc: '用最适合的方法,从根源调理家人体质,畅享高质量长寿生活' },
@@ -295,7 +319,11 @@ export default {
     TabTransition,
     FamilyMemberStrip,
     FamilyEnergyBar,
-    DimensionTasks
+    DimensionTasks,
+    DimensionActivities,
+    DimensionProducts,
+    DimensionArticles,
+    LoginGuideCard
   },
   data() {
     // 从 storage 预取登录态/角色,确保首次渲染即正确(WeChat 渲染层/逻辑层分离架构下 onLoad 执行前已渲染)
@@ -344,6 +372,12 @@ export default {
       sandboxData: null,
       dualDimension: null,
       dimensionTasks: [],
+      dimensionActivities: [],
+      dimensionProducts: [],
+      articles: [],
+      children: [],
+      currentChildId: null,
+      healthAlerts: [],
       funcList: [
         { icon: '\u{1F3CB}', label: '任务', page: '/pages/tasks/tasks' },
         { icon: '\u{1F3C0}', label: '活动', page: '/pages/discover/index?type=activity' },
@@ -353,6 +387,20 @@ export default {
       loggedInInitDone: false
     }
   },
+  computed: {
+    actionArticles: function() {
+      if (!this.articles || this.articles.length === 0) return []
+      var result = []
+      for (var i = 0; i < this.articles.length; i++) {
+        var a = this.articles[i]
+        if (a.relatedDimensions && a.relatedDimensions.indexOf('action') !== -1) {
+          result.push(a)
+        }
+      }
+      if (result.length === 0) return this.articles.slice(0, 5)
+      return result.slice(0, 5)
+    }
+  },
   onLoad(options) {
     this._doInit(options)
   },
@@ -413,26 +461,51 @@ export default {
 
     // ===== 登录态数据加载 =====
     loadLoggedInData: function() {
-      var self = this
       this.loadFamilyMembers()
-      this.loadEnergySandbox()
-      this.loadDimensionTasks()
+      this.loadChildren()
     },
-    loadFamilyMembers: function() {
+    loadChildren: function() {
       var self = this
-      getVisibleFamilyMembers().then(function(res) {
+      getChildren().then(function(res) {
         if (res.code === 200 && res.data) {
-          self.familyMembersVisible = Array.isArray(res.data) ? res.data : (res.data.list || [])
-          if (self.familyMembersVisible.length > 0) {
-            self.selectedMemberId = self.familyMembersVisible[0].memberId || self.familyMembersVisible[0].id
+          self.children = res.data
+          var savedChildId = uni.getStorageSync('currentChildId')
+          if (savedChildId) {
+            self.currentChildId = savedChildId
+          }
+          self.loadDimensionData()
+        }
+      }).catch(function() {})
+    },
+    loadDimensionData: function() {
+      this.loadEnergyData()
+      this.loadSandboxData()
+      this.loadDimensionTasks()
+      this.loadActionActivities()
+      this.loadActionProducts()
+      this.loadActionArticles()
+    },
+    loadEnergyData: function() {
+      var self = this
+      if (!this.currentChildId) return
+      getEnergyOverview(this.currentChildId).then(function(res) {
+        if (res && res.data) {
+          var dims = res.data.dimensions
+          if (dims && dims.length > 0) {
+            for (var i = 0; i < dims.length; i++) {
+              if (dims[i].code === 'action') {
+                self.dualDimension = dims[i]
+                break
+              }
+            }
           }
         }
       }).catch(function() {})
     },
-    loadEnergySandbox: function() {
+    loadSandboxData: function() {
       var self = this
       getFamilyEnergySandbox().then(function(res) {
-        if (res.code === 200 && res.data) {
+        if (res && res.data) {
           self.sandboxData = res.data
           self._splashReady = true
           self._tryHideSplash()
@@ -441,23 +514,115 @@ export default {
     },
     loadDimensionTasks: function() {
       var self = this
-      getTodayTasksByCategory({ category: 'action' }).then(function(res) {
+      if (!this.currentChildId) return
+      getTodayTasksByCategory(this.currentChildId, 'action').then(function(res) {
+        if (res && res.data) {
+          self.dimensionTasks = Array.isArray(res.data) ? res.data.slice(0, 5) : []
+        }
+      }).catch(function() { self.dimensionTasks = [] })
+    },
+    loadActionActivities: function() {
+      var self = this
+      getActivityList({ dimensionCode: 'action', page: 1, size: 3 }).then(function(res) {
+        if (res && res.data) {
+          var list = Array.isArray(res.data) ? res.data : (res.data.records || [])
+          self.dimensionActivities = list.slice(0, 3)
+        }
+      }).catch(function() { self.dimensionActivities = [] })
+    },
+    loadActionProducts: function() {
+      var self = this
+      getProductsByDomain('action', 1, 4).then(function(res) {
+        if (res && res.data) {
+          var list = Array.isArray(res.data) ? res.data : (res.data.records || [])
+          self.dimensionProducts = list.slice(0, 4)
+        }
+      }).catch(function() { self.dimensionProducts = [] })
+    },
+    loadActionArticles: function() {
+      var self = this
+      getFeaturedArticles({ size: 5, dimensionCode: 'action' }).then(function(res) {
         if (res.code === 200 && res.data) {
-          self.dimensionTasks = Array.isArray(res.data) ? res.data : (res.data.list || [])
+          var gradientColors = [
+            'linear-gradient(135deg, #10B981, #34D399)',
+            'linear-gradient(135deg, #5B9BD5, #8FC5E8)',
+            'linear-gradient(135deg, #8B5CF6, #C084FC)',
+            'linear-gradient(135deg, #F97316, #FB923C)',
+            'linear-gradient(135deg, #6366F1, #818CF8)'
+          ]
+          var list = Array.isArray(res.data) ? res.data : (res.data.records || [])
+          self.articles = list.map(function(item, index) {
+            return {
+              id: item.id,
+              category: item.categoryName || '行动社交',
+              categoryColor: gradientColors[index % gradientColors.length],
+              title: item.title || '',
+              summary: item.summary || '',
+              views: item.viewCount ? String(item.viewCount) : '0',
+              date: item.publishedAt ? item.publishedAt.slice(0, 10) : '',
+              relatedDimensions: self.parseRelatedDimensions(item.relatedDimensions)
+            }
+          })
         }
       }).catch(function() {})
     },
+    loadFamilyMembers: function() {
+      var self = this
+      getVisibleFamilyMembers().then(function(res) {
+        if (res.code === 200 && res.data) {
+          self.familyMembersVisible = Array.isArray(res.data) ? res.data : (res.data.list || [])
+        }
+      }).catch(function() {})
+    },
+    parseRelatedDimensions: function(val) {
+      if (!val) return []
+      if (Array.isArray(val)) return val
+      if (typeof val === 'string') {
+        try {
+          var parsed = JSON.parse(val)
+          return Array.isArray(parsed) ? parsed : []
+        } catch (e) {
+          return val.split(',').map(function(s) { return s.trim() }).filter(function(s) { return s })
+        }
+      }
+      return []
+    },
     onFamilyMemberSelect: function(member) {
-      this.selectedMemberId = member.memberId || member.id
+      this.selectedMemberId = member.id
     },
     onTaskClick: function(task) {
-      uni.navigateTo({ url: '/pages/tasks/task-detail?taskId=' + (task.id || task.taskId) })
+      uni.navigateTo({ url: '/pages/tasks/tasks' })
     },
     goTasks: function() {
-      uni.navigateTo({ url: '/pages/tasks/tasks' })
+      uni.switchTab({ url: '/pages/tasks/tasks' })
+    },
+    goActivityDetail: function(act) {
+      if (!act || !act.id) return
+      uni.navigateTo({ url: '/pages/discover-detail/activity-detail/activity-detail?id=' + act.id })
+    },
+    goMoreActivities: function() {
+      uni.navigateTo({ url: '/pages/activity/index' })
+    },
+    goProductDetail: function(prod) {
+      uni.navigateTo({ url: '/pages/discover-detail/product-detail/product-detail?id=' + prod.id })
+    },
+    goMoreProducts: function() {
+      uni.navigateTo({ url: '/pages/shop/index' })
+    },
+    goArticleDetail: function(article) {
+      var id = article.id || article
+      uni.navigateTo({ url: '/pages/mind-detail/article-detail?id=' + id })
+    },
+    goMoreArticles: function() {
+      uni.navigateTo({ url: '/pages/article-center/index?dimension=action' })
     },
     onFuncClick: function(item) {
-      uni.navigateTo({ url: item.page })
+      var nativeTabs = ['/pages/tasks/tasks', '/pages/index-home/index', '/pages/body/index', '/pages/mind/index', '/pages/wisdom/index', '/pages/wealth/index']
+      if (nativeTabs.indexOf(item.page) !== -1) {
+        uni.switchTab({ url: item.page })
+      } else {
+        uni.navigateTo({ url: item.page })
+      }
     },
 
     // 首页 TabTransition 动态关闭:检测关键内容是否就绪