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

fix: 五维成员详情页导航路径修复 + 财富维度成员详情页补齐

Sisyphus 3 недель назад
Родитель
Сommit
f53dfdbeff

+ 12 - 0
cfc-frontend/pages.json

@@ -1138,6 +1138,18 @@
         }
       ]
     },
+    {
+      "root": "pages/wealth-detail",
+      "pages": [
+        {
+          "path": "member-wealth-detail",
+          "style": {
+            "navigationBarTitleText": "财富能量详情",
+            "navigationStyle": "custom"
+          }
+        }
+      ]
+    },
     {
       "root": "pages/action-detail",
       "pages": [

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

@@ -524,7 +524,7 @@ export default {
     goToBodyDetail: function() {
       var id = this.activeChildId || uni.getStorageSync('currentChildId')
       if (!id) return
-      uni.navigateTo({ url: '/pages/body/member-body-detail?memberId=' + id })
+      uni.navigateTo({ url: '/pages/body-detail/member-body-detail?memberId=' + id })
     },
     goIndicatorDetail: function(ind) {
       var id = this.activeChildId || uni.getStorageSync('currentChildId')

+ 1 - 1
cfc-frontend/pages/mind-detail/index.vue

@@ -818,7 +818,7 @@ var descList = descMap[this.dominantElement] || descMap.wood
     goMindDetail: function() {
       var id = this.activeChildId || uni.getStorageSync('currentChildId')
       if (!id) return
-      uni.navigateTo({ url: '/pages/mind/member-mind-detail?memberId=' + id })
+      uni.navigateTo({ url: '/pages/mind-detail/member-mind-detail?memberId=' + id })
     },
     formatNumeric: function(v) {
       if (v === null || v === undefined) return ''

+ 257 - 0
cfc-frontend/pages/wealth-detail/member-wealth-detail.vue

@@ -0,0 +1,257 @@
+<template>
+  <view class="detail-container">
+    <!-- 五维能量条 -->
+    <FamilyEnergyBar
+      dimensionCode="wealth"
+      :sandboxData="sandboxData"
+      :dualDimension="dualDimension" />
+
+    <!-- 成员信息卡 -->
+    <view class="member-card" v-if="memberInfo">
+      <view class="member-avatar wealth-avatar">
+        <text class="avatar-text">{{ memberInfo.name && memberInfo.name.charAt(0) || '孩' }}</text>
+      </view>
+      <view class="member-info">
+        <text class="member-name">{{ memberInfo.name || '孩子' }}</text>
+        <text class="member-role">财富维度</text>
+      </view>
+      <view class="member-score" v-if="dualDimension">
+        <text class="score-value wealth-score">{{ dualDimension.energy || 0 }}</text>
+        <text class="score-label">能量值</text>
+      </view>
+    </view>
+
+    <!-- 家庭成员关系图谱(只读) -->
+    <FamilyRelationGraph
+      dimensionCode="wealth"
+      :selfId="selfId"
+      :members="graphMembers"
+      :energyMap="energyMapForGraph"
+      :intimacyMap="intimacyMapForGraph"
+      :interactive="false" />
+
+    <!-- 今日任务 -->
+    <DimensionTasks
+      :memberId="memberId"
+      @taskClick="onTaskClick"
+      @moreTasks="goTasks" />
+
+    <!-- 活动 -->
+    <DimensionActivities
+      :isLoggedIn="true"
+      @activityClick="goActivityDetail"
+      @moreActivities="goMoreActivities" />
+
+    <!-- 商品 -->
+    <DimensionProducts
+      :isLoggedIn="true"
+      @productClick="goProductDetail"
+      @moreProducts="goMoreProducts" />
+
+    <!-- 底部占位 -->
+    <view class="bottom-spacer"></view>
+  </view>
+</template>
+
+<script>
+import FamilyEnergyBar from '../../components/FamilyEnergyBar.vue'
+import FamilyRelationGraph from '../../components/FamilyRelationGraph.vue'
+import DimensionTasks from '../../components/DimensionTasks.vue'
+import DimensionActivities from '../../components/DimensionActivities.vue'
+import DimensionProducts from '../../components/DimensionProducts.vue'
+import { getEnergyOverview, getFamilyEnergySandbox, getChildren } from '../../utils/api.js'
+
+export default {
+  components: { FamilyEnergyBar, FamilyRelationGraph, DimensionTasks, DimensionActivities, DimensionProducts },
+  data() {
+    return {
+      memberId: null,
+      selfId: null,
+      memberInfo: null,
+      sandboxData: null,
+      dualDimension: null
+    }
+  },
+  computed: {
+    graphMembers: function() {
+      if (!this.sandboxData || !this.sandboxData.members) return []
+      return this.sandboxData.members.map(function(m) {
+        return {
+          id: m.memberId || m.id,
+          nickname: m.name || m.nickname || '成员',
+          memberType: m.memberType || 'child'
+        }
+      })
+    },
+    energyMapForGraph: function() {
+      var map = {}
+      if (this.sandboxData && this.sandboxData.members) {
+        for (var i = 0; i < this.sandboxData.members.length; i++) {
+          var m = this.sandboxData.members[i]
+          map[m.memberId || m.id] = {
+            bodyScore: m.bodyScore || 0,
+            mindScore: m.mindScore || 0,
+            actionScore: m.actionScore || 0
+          }
+        }
+      }
+      return map
+    },
+    intimacyMapForGraph: function() {
+      return {}
+    }
+  },
+  onLoad: function(options) {
+    this.memberId = options.memberId || uni.getStorageSync('currentChildId') || null
+  },
+  onShow: function() {
+    this.selfId = uni.getStorageSync('userId') || null
+    this.loadChildren()
+    this.loadSandboxData()
+    if (this.memberId) {
+      this.loadEnergyData()
+    }
+  },
+  methods: {
+    loadChildren: function() {
+      var self = this
+      getChildren().then(function(res) {
+        if (res.code === 200 && res.data) {
+          for (var i = 0; i < res.data.length; i++) {
+            if (res.data[i].memberId === self.memberId) {
+              self.memberInfo = res.data[i]
+              break
+            }
+          }
+          if (!self.memberInfo && res.data.length > 0) {
+            self.memberInfo = res.data[0]
+            self.memberId = res.data[0].memberId
+          }
+        }
+      }).catch(function() {})
+    },
+    loadSandboxData: function() {
+      var self = this
+      getFamilyEnergySandbox().then(function(res) {
+        if (res && res.data) self.sandboxData = res.data
+      }).catch(function() {})
+    },
+    loadEnergyData: function() {
+      var self = this
+      getEnergyOverview(this.memberId).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 === 'wealth') {
+                self.dualDimension = dims[i]
+                break
+              }
+            }
+          }
+        }
+      }).catch(function() {})
+    },
+    onTaskClick: function(task) {
+      uni.navigateTo({ url: '/pages/tasks/tasks' })
+    },
+    goActivityDetail: function(act) {
+      if (act && act.id) uni.navigateTo({ url: '/pages/activity/activity-detail/activity-detail?id=' + act.id })
+    },
+    goMoreActivities: function() {
+      uni.navigateTo({ url: '/pages/activity/index' })
+    },
+    goProductDetail: function(prod) {
+      if (prod && prod.id) uni.navigateTo({ url: '/pages/discover-detail/product-detail/product-detail?id=' + prod.id })
+    },
+    goMoreProducts: function() {
+      uni.navigateTo({ url: '/pages/shop/index/index' })
+    },
+    goTasks: function() { uni.navigateTo({ url: '/pages/tasks/tasks' }) },
+    goBack: function() { uni.navigateBack() }
+  }
+}
+</script>
+
+<style scoped>
+.detail-container {
+  min-height: 100vh;
+  background: #f5f7fa;
+  padding-bottom: 40rpx;
+}
+
+.member-card {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  margin: 20rpx 30rpx;
+  background: #fff;
+  border-radius: 20rpx;
+  padding: 24rpx;
+  box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.06);
+}
+
+.member-avatar {
+  width: 80rpx;
+  height: 80rpx;
+  border-radius: 40rpx;
+  background: linear-gradient(135deg, #FFD700, #FFA500);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-right: 20rpx;
+}
+
+.wealth-avatar {
+  background: linear-gradient(135deg, #FFD700, #FFA500);
+}
+
+.avatar-text {
+  font-size: 32rpx;
+  color: #fff;
+  font-weight: bold;
+}
+
+.member-info {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+}
+
+.member-name {
+  font-size: 30rpx;
+  font-weight: bold;
+  color: #333;
+}
+
+.member-role {
+  font-size: 24rpx;
+  color: #999;
+  margin-top: 4rpx;
+}
+
+.member-score {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.score-value {
+  font-size: 40rpx;
+  font-weight: bold;
+  color: #FFD700;
+}
+
+.wealth-score {
+  color: #B8860B;
+}
+
+.score-label {
+  font-size: 22rpx;
+  color: #999;
+}
+
+.bottom-spacer {
+  height: 40rpx;
+}
+</style>

+ 43 - 1
cfc-frontend/pages/wealth/index.vue

@@ -54,6 +54,13 @@
         @select="onFamilyMemberSelect"
         @removed="loadFamilyMembersVisible" />
 
+      <!-- 五维能量条 -->
+      <FamilyEnergyBar
+        v-if="isLoggedIn && sandboxData"
+        dimensionCode="wealth"
+        :sandboxData="sandboxData"
+        :dualDimension="dualDimension" />
+
       <!-- 身克富杠杆警告 -->
       <body-wealth-alert
         :status="bodyWealthStatus"
@@ -230,6 +237,7 @@ import WealthEnergyRing from '../../components/WealthEnergyRing.vue'
 import WealthSubScores from '../../components/WealthSubScores.vue'
 import BodyWealthAlert from '../../components/BodyWealthAlert.vue'
 import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
+import FamilyEnergyBar from '../../components/FamilyEnergyBar.vue'
 import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import DimensionSubDims from '../../components/DimensionSubDims.vue'
 import {
@@ -240,13 +248,15 @@ import {
   getCommissionSummary,
   getFamilyMemberList,
   getInsuranceList,
+  getFamilyEnergySandbox,
+  getEnergyOverview,
   productList
 } from '../../utils/api.js'
 import nav from '../../utils/nav.js'
 import config from '../../config.js'
 
 export default {
-  components: { TabTransition, WealthEnergyRing, WealthSubScores, BodyWealthAlert, FamilyMemberStrip, DimensionIntroCard, DimensionSubDims },
+  components: { TabTransition, WealthEnergyRing, WealthSubScores, BodyWealthAlert, FamilyMemberStrip, FamilyEnergyBar, DimensionIntroCard, DimensionSubDims },
   data() {
     return {
       showTabTransition: true,
@@ -299,6 +309,9 @@ export default {
       familyMembersVisible: [],
       selectedMemberId: null,
       guestProducts: [],
+      // 五维能量条数据
+      sandboxData: null,
+      dualDimension: null,
       // 保单列表
       insuranceList: [],
       insuranceLoaded: false,
@@ -368,6 +381,8 @@ export default {
     this.loadWealthData()
     this.loadFamilyMembersVisible()
     this.loadInsuranceList()
+    this.loadSandboxData()
+    this.loadEnergyData()
     this._watchPageReady()
   },
     /** 每月引导语 */
@@ -483,6 +498,33 @@ export default {
         console.error('获取富维度详情失败', e)
       }
     },
+    loadSandboxData: function() {
+      var self = this
+      getFamilyEnergySandbox().then(function(res) {
+        if (res && res.data) self.sandboxData = res.data
+      }).catch(function() {})
+    },
+    loadEnergyData: function() {
+      var self = this
+      var memberId = uni.getStorageSync('userId') || null
+      if (!memberId) return
+      getEnergyOverview(memberId).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 === 'wealth') {
+                self.dualDimension = dims[i]
+                break
+              }
+            }
+          }
+        }
+      }).catch(function() {})
+    },
+    goToMemberDetail: function(memberId) {
+      uni.navigateTo({ url: '/pages/wealth-detail/member-wealth-detail?memberId=' + memberId })
+    },
     async loadWealthData() {
       if (this.role !== 'parent') return
       try {

+ 1 - 1
cfc-frontend/pages/wisdom-detail/index.vue

@@ -440,7 +440,7 @@ export default {
     goWisdomDetail: function() {
       var id = this.activeChildId || uni.getStorageSync('currentChildId')
       if (!id) return
-      uni.navigateTo({ url: '/pages/wisdom/member-wisdom-detail?memberId=' + id })
+      uni.navigateTo({ url: '/pages/wisdom-detail/member-wisdom-detail?memberId=' + id })
     },
     formatNumeric: function(v) {
       if (v === null || v === undefined) return ''