Bladeren bron

fix(frontend): 修复 4 个五维维度页语法错误(并发写入导致的缺逗号和重复闭合括号)

- body-detail / wealth / wisdom-detail / mind-detail
  - 补全 getLatestIndicators / getDailyTaskOverview,reportAppEnter 等 import 声明缺少的逗号
  - 删除重复的 }}, 修复 depth 计算错误(并发写入导致方法末尾多出闭合括号)
liaoxg 1 week geleden
bovenliggende
commit
bd62eea62b

+ 78 - 7
cfc-frontend/pages/body-detail/index.vue

@@ -206,11 +206,15 @@
       </view>
 
       <!-- 家庭成员选择条 -->
-      <FamilyMemberStrip
+      <DimensionMemberTabs
         v-if="currentView === 'self'"
         :members="familyMembersVisible"
         :selectedMemberId="selectedMemberId"
+        dimension-code="body"
+        :score-map="memberScoreMap"
         @select="onFamilyMemberSelect"
+        @longpress="onMemberLongPress"
+        @manage="onMemberManage"
         @removed="loadFamilyMembersVisible" />
 
       <!-- 五维能量条 -->
@@ -245,8 +249,8 @@ import RadarChart from '../../components/RadarChart.vue'
 import FloatingAvatar from '../../components/AIFloatingAvatar.vue'
 import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import DimensionVisitorCard from '../../components/DimensionVisitorCard.vue'
-import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
 import DimensionPageSkeleton from '../../components/DimensionPageSkeleton.vue'
+import DimensionMemberTabs from '../../components/DimensionMemberTabs.vue'
 
 import {
   getVisibleSections,
@@ -259,13 +263,15 @@ import {
   getRadarData,
   getGutFloraIndicators,
   getBodyAbnormalIndicators,
-  getLatestIndicators
+  getLatestIndicators,
+  kickFamilyMemberById,
 } from '../../utils/api.js'
 
 export default {
-  components: { TabTransition, PageBanner, FamilyEnergyBar, RadarChart, FloatingAvatar, FamilyMemberStrip, DimensionIntroCard, DimensionVisitorCard, DimensionPageSkeleton },
+  components: { TabTransition, PageBanner, FamilyEnergyBar, RadarChart, FloatingAvatar, DimensionMemberTabs, DimensionIntroCard, DimensionVisitorCard, DimensionPageSkeleton },
   data() {
     return {
+    memberScoreMap: {},
     pageLoading: false,
       isLoggedIn: false,
       role: null,
@@ -605,16 +611,81 @@ export default {
       this.activeChildName = child.name || child.nickname || '成员'
       this.loadDashboardData()
     },
-    onFamilyMemberSelect: function(memberId) {
-      this.selectedMemberId = memberId
+    // 切换成员:同步成员ID(页面数据以 activeChildId 为键),持久化后重载该页全部成员相关数据
+    onFamilyMemberSelect: function(member) {
+      if (!member || member.id === this.selectedMemberId) return
+      this.selectedMemberId = member.id
+      this.activeChildId = member.id
+      uni.setStorageSync('currentChildId', member.id)
+      this.reloadForMember()
+    },
+    // 切换成员后的统一重载入口(身维度全部成员相关数据)
+    reloadForMember: function() {
+      if (!this.activeChildId) return
       this.loadDashboardData()
     },
+    // 成员标签长按:唤出管理动作面板
+    onMemberLongPress: function(member) {
+      this.showMemberActions(member)
+    },
+    // 成员标签管理入口
+    onMemberManage: function() {
+      uni.navigateTo({ url: '/pages/profile-extra/family-members' })
+    },
+    // 成员管理动作面板(系统 ActionSheet,触摸目标由微信保证)
+    showMemberActions: function(member) {
+      if (!member) return
+      var self = this
+      var items = ['切换到该成员视角', '编辑资料', '移除成员']
+      uni.showActionSheet({
+        itemList: items,
+        success: function(res) {
+          if (res.tapIndex === 0) {
+            uni.navigateTo({ url: '/pages/action-detail/relationship-questionnaire?memberId=' + member.id })
+          } else if (res.tapIndex === 1) {
+            uni.navigateTo({ url: '/pages/family/add-member?memberId=' + member.id })
+          } else if (res.tapIndex === 2) {
+            uni.showModal({
+              title: '确认移除',
+              content: '确定要移除 ' + (member.nickname || '该成员') + ' 吗?',
+              success: function(m) {
+                if (m.confirm) {
+                  uni.showLoading({ title: '移除中...' })
+                  kickFamilyMemberById(member.id).then(function() {
+                    uni.hideLoading()
+                    uni.showToast({ title: '已移除', icon: 'success' })
+                    self.loadFamilyMembersVisible()
+                  }).catch(function(err) {
+                    uni.hideLoading()
+                    uni.showToast({ title: (err && err.message) || '移除失败', icon: 'none' })
+                  })
+                }
+              }
+            })
+          }
+        }
+      })
+    },
     loadFamilyMembersVisible: function() {
       var self = this
       getFamilyMemberList({}).then(function(res) {
         if (res.code === 200 && res.data) {
+          // 保留后端全字段:成员标签需要 relationship/relativeLabel/roleLabel/effectiveRole/isSelf 等
           self.familyMembersVisible = res.data.map(function(m) {
-            return { id: m.id, nickname: m.nickname, avatar: m.avatar }
+            return {
+              id: m.id,
+              memberId: m.memberId,
+              nickname: m.nickname,
+              avatar: m.avatar,
+              relationship: m.relationship,
+              relativeLabel: m.relativeLabel,
+              roleLabel: m.roleLabel,
+              effectiveRole: m.effectiveRole,
+              generation: m.generation,
+              phone: m.phone,
+              isSelf: m.isSelf,
+              isSwitchable: m.isSwitchable
+            }
           })
         }
       }).catch(function(e) { console.log('获取家庭成员失败', e) })

+ 71 - 4
cfc-frontend/pages/mind-detail/index.vue

@@ -27,11 +27,15 @@
       :traditionalData="traditionalData" />
 
     <!-- 家庭成员选择条 -->
-    <FamilyMemberStrip
+    <DimensionMemberTabs
       v-if="currentView === 'self' && isLoggedIn"
       :members="familyMembersVisible"
       :selectedMemberId="selectedMemberId"
+      dimension-code="mind"
+      :score-map="memberScoreMap"
       @select="onFamilyMemberSelect"
+      @longpress="onMemberLongPress"
+      @manage="onMemberManage"
       @removed="loadFamilyMembersVisible" />
 
     <!-- 游客引导语 -->
@@ -262,17 +266,18 @@ import FamilyEnergyBar from '../../components/FamilyEnergyBar.vue'
 import PsychCrisisBanner from '@/pages/mind-detail/components/PsychCrisisBanner.vue'
 import FloatingAvatar from '../../components/AIFloatingAvatar.vue'
 import FamilyTianpanCard from '@/pages/mind-detail/components/FamilyTianpanCard.vue'
-import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
 import DimensionPageSkeleton from '../../components/DimensionPageSkeleton.vue'
-import { getVisibleSections, getEmiReport, getFamilyEnergySandbox, getEnergySandbox, getChildren, getFamilyMemberList, getEnergyOverview, getContactList, getHealthAlerts, getMilestones, getDanReportByChild, getFamilyFortune, getLatestIndicators, getRadarData } from '../../utils/api.js'
+import DimensionMemberTabs from '../../components/DimensionMemberTabs.vue'
+import { getVisibleSections, getEmiReport, getFamilyEnergySandbox, getEnergySandbox, getChildren, getFamilyMemberList, getEnergyOverview, getContactList, getHealthAlerts, getMilestones, getDanReportByChild, getFamilyFortune, getLatestIndicators, getRadarData, kickFamilyMemberById } from '../../utils/api.js'
 import nav from '../../utils/nav.js'
 import config from '../../config.js'
 import { parseDate } from '../../utils/format.js'
 
 export default {
-components: { TabTransition, PageBanner, RadarChart, FamilyEnergyBar, PsychCrisisBanner, FloatingAvatar, FamilyTianpanCard, FamilyMemberStrip, DimensionIntroCard, DimensionVisitorCard, DimensionPageSkeleton },
+components: { TabTransition, PageBanner, RadarChart, FamilyEnergyBar, PsychCrisisBanner, FloatingAvatar, FamilyTianpanCard, DimensionMemberTabs, DimensionIntroCard, DimensionVisitorCard, DimensionPageSkeleton },
   data() {
     return {
+    memberScoreMap: {},
     pageLoading: false,
       isLoggedIn: false,
       role: null,
@@ -1028,8 +1033,70 @@ var descList = descMap[this.dominantElement] || descMap.wood
         console.log('获取能量概览失败', e)
       })
     },
+    // 切换成员:同步成员ID并持久化,重载该页全部成员相关数据
     onFamilyMemberSelect: function(member) {
+      if (!member || member.id === this.selectedMemberId) return
       this.selectedMemberId = member.id
+      this.currentChildId = member.id
+      uni.setStorageSync('currentChildId', member.id)
+      if (this.$store) this.$store.commit('switchToChild', member.id)
+      this.reloadForMember()
+    },
+    // 切换成员后的统一重载入口
+    reloadForMember: function() {
+      if (!this.isLoggedIn) return
+      this.loadSandboxData()
+      this.loadMindRadarPopulationData()
+      this.loadEmiData()
+      this.loadGutData()
+      this.loadEnergyData()
+      this.loadTraditionalCultureData()
+      this.loadContacts()
+      this.loadHealthAlerts()
+      this.loadMilestones()
+      this.loadDanReports()
+    },
+    // 成员标签长按:唤出管理动作面板
+    onMemberLongPress: function(member) {
+      this.showMemberActions(member)
+    },
+    // 成员标签管理入口
+    onMemberManage: function() {
+      uni.navigateTo({ url: '/pages/profile-extra/family-members' })
+    },
+    // 成员管理动作面板(系统 ActionSheet,触摸目标由微信保证)
+    showMemberActions: function(member) {
+      if (!member) return
+      var self = this
+      var items = ['切换到该成员视角', '编辑资料', '移除成员']
+      uni.showActionSheet({
+        itemList: items,
+        success: function(res) {
+          if (res.tapIndex === 0) {
+            uni.navigateTo({ url: '/pages/action-detail/relationship-questionnaire?memberId=' + member.id })
+          } else if (res.tapIndex === 1) {
+            uni.navigateTo({ url: '/pages/family/add-member?memberId=' + member.id })
+          } else if (res.tapIndex === 2) {
+            uni.showModal({
+              title: '确认移除',
+              content: '确定要移除 ' + (member.nickname || '该成员') + ' 吗?',
+              success: function(m) {
+                if (m.confirm) {
+                  uni.showLoading({ title: '移除中...' })
+                  kickFamilyMemberById(member.id).then(function() {
+                    uni.hideLoading()
+                    uni.showToast({ title: '已移除', icon: 'success' })
+                    self.loadFamilyMembersVisible()
+                  }).catch(function(err) {
+                    uni.hideLoading()
+                    uni.showToast({ title: (err && err.message) || '移除失败', icon: 'none' })
+                  })
+                }
+              }
+            })
+          }
+        }
+      })
     },
     onChildChanged: function(child) {
       this.currentChildId = child.memberId

+ 85 - 8
cfc-frontend/pages/wealth/index.vue

@@ -55,11 +55,15 @@
 
     <template v-else>
 <!-- 家庭成员选择条 -->
-      <FamilyMemberStrip
+      <DimensionMemberTabs
         v-if="currentView === 'self' && isLoggedIn"
         :members="familyMembersVisible"
         :selectedMemberId="selectedMemberId"
+        dimension-code="wealth"
+        :score-map="memberScoreMap"
         @select="onFamilyMemberSelect"
+        @longpress="onMemberLongPress"
+        @manage="onMemberManage"
         @removed="loadFamilyMembersVisible" />
 
       <!-- 五维能量条 -->
@@ -266,12 +270,12 @@ import TabTransition from '../../components/tab-transition.vue'
 import WealthEnergyRing from '@/pages/wealth/components/WealthEnergyRing.vue'
 import WealthSubScores from '@/pages/wealth/components/WealthSubScores.vue'
 import BodyWealthAlert from '@/pages/wealth/components/BodyWealthAlert.vue'
-import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
 import FamilyEnergyBar from '../../components/FamilyEnergyBar.vue'
 import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import DimensionVisitorCard from '../../components/DimensionVisitorCard.vue'
 import DimensionSubDims from './components/DimensionSubDims.vue'
 import DimensionPageSkeleton from '../../components/DimensionPageSkeleton.vue'
+import DimensionMemberTabs from '../../components/DimensionMemberTabs.vue'
 import {
   getChildren,
   getWealthDetail,
@@ -285,15 +289,17 @@ import {
   productList,
   extractReferralCode,
   getChildBadgeStats,
-  getDailyTaskOverview, reportAppEnter
+  getDailyTaskOverview, reportAppEnter,
+  kickFamilyMemberById,
 } from '../../utils/api.js'
 import nav from '../../utils/nav.js'
 import config from '../../config.js'
 
 export default {
-  components: { TabTransition, WealthEnergyRing, WealthSubScores, BodyWealthAlert, FamilyMemberStrip, FamilyEnergyBar, DimensionIntroCard, DimensionVisitorCard, DimensionSubDims, DimensionPageSkeleton },
+  components: { TabTransition, WealthEnergyRing, WealthSubScores, BodyWealthAlert, DimensionMemberTabs, FamilyEnergyBar, DimensionIntroCard, DimensionVisitorCard, DimensionSubDims, DimensionPageSkeleton },
   data() {
     return {
+    memberScoreMap: {},
     pageLoading: false,
       showTabTransition: true,
       isLoggedIn: false,
@@ -499,15 +505,86 @@ export default {
     },
   methods: {
     getInsightKey(prefix, idx) { return prefix + idx },
-    onFamilyMemberSelect(member) {
+    // 切换成员:wealth 各加载方法内部直接读 currentChildId,故先持久化再重载
+    onFamilyMemberSelect: function(member) {
+      if (!member || member.id === this.selectedMemberId) return
       this.selectedMemberId = member.id
+      uni.setStorageSync('currentChildId', member.id)
+      this.reloadForMember()
+    },
+    // 切换成员后的统一重载入口(富维度全部成员相关数据)
+    reloadForMember: function() {
+      if (!this.isLoggedIn) return
+      this.loadWealthDetail()
+      this.loadWealthData()
+      this.loadChildData()
+    },
+    // 成员标签长按:唤出管理动作面板
+    onMemberLongPress: function(member) {
+      this.showMemberActions(member)
+    },
+    // 成员标签管理入口
+    onMemberManage: function() {
+      uni.navigateTo({ url: '/pages/profile-extra/family-members' })
+    },
+    // 成员管理动作面板(系统 ActionSheet,触摸目标由微信保证)
+    showMemberActions: function(member) {
+      if (!member) return
+      var self = this
+      var items = ['切换到该成员视角', '编辑资料', '移除成员']
+      uni.showActionSheet({
+        itemList: items,
+        success: function(res) {
+          if (res.tapIndex === 0) {
+            uni.navigateTo({ url: '/pages/action-detail/relationship-questionnaire?memberId=' + member.id })
+          } else if (res.tapIndex === 1) {
+            uni.navigateTo({ url: '/pages/family/add-member?memberId=' + member.id })
+          } else if (res.tapIndex === 2) {
+            uni.showModal({
+              title: '确认移除',
+              content: '确定要移除 ' + (member.nickname || '该成员') + ' 吗?',
+              success: function(m) {
+                if (m.confirm) {
+                  uni.showLoading({ title: '移除中...' })
+                  kickFamilyMemberById(member.id).then(function() {
+                    uni.hideLoading()
+                    uni.showToast({ title: '已移除', icon: 'success' })
+                    self.loadFamilyMembersVisible()
+                  }).catch(function(err) {
+                    uni.hideLoading()
+                    uni.showToast({ title: (err && err.message) || '移除失败', icon: 'none' })
+                  })
+                }
+              }
+            })
+          }
+        }
+      })
     },
     loadFamilyMembersVisible() {
       var self = this
-      getFamilyMemberList({ visibleOnly: true }).then(function(res) {
-        self.familyMembersVisible = res.data || []
+      getFamilyMemberList({}).then(function(res) {
+        if (res.code === 200 && res.data) {
+          // 保留后端全字段:成员标签需要 relationship/relativeLabel/roleLabel/effectiveRole/isSelf 等
+          self.familyMembersVisible = res.data.map(function(m) {
+            return {
+              id: m.id,
+              memberId: m.memberId,
+              nickname: m.nickname,
+              avatar: m.avatar,
+              relationship: m.relationship,
+              relativeLabel: m.relativeLabel,
+              roleLabel: m.roleLabel,
+              effectiveRole: m.effectiveRole,
+              generation: m.generation,
+              phone: m.phone,
+              isSelf: m.isSelf,
+              isSwitchable: m.isSwitchable
+            }
+          })
+        }
       }).catch(function(e) {
-        console.log('获取可见家庭成员失败', e)
+        console.log('获取家庭成员失败', e)
         self.familyMembersVisible = []
       })
     },

+ 83 - 12
cfc-frontend/pages/wisdom-detail/index.vue

@@ -34,11 +34,15 @@
     </view>
 
     <!-- 家庭成员选择条 -->
-    <FamilyMemberStrip
+    <DimensionMemberTabs
       v-if="currentView === 'self' && isLoggedIn"
       :members="familyMembersVisible"
       :selectedMemberId="selectedMemberId"
+      dimension-code="wisdom"
+      :score-map="memberScoreMap"
       @select="onFamilyMemberSelect"
+      @longpress="onMemberLongPress"
+      @manage="onMemberManage"
       @removed="loadFamilyMembersVisible" />
 
     <!-- 游客引导语 -->
@@ -240,17 +244,18 @@ import TabTransition from '../../components/tab-transition.vue'
 import RadarChart from '../../components/RadarChart.vue'
 import FamilyEnergyBar from '../../components/FamilyEnergyBar.vue'
 import FloatingAvatar from '../../components/AIFloatingAvatar.vue'
-import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
 import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import DimensionVisitorCard from '../../components/DimensionVisitorCard.vue'
 import DimensionPageSkeleton from '../../components/DimensionPageSkeleton.vue'
-import { getVisibleSections, getChildren, getFamilyEnergySandbox, getEnergySandbox, getAssessmentLatestResult, getDanReportByChild, getGutCognitionIndicators, getLatestIndicators, getRadarData } from '../../utils/api.js'
+import DimensionMemberTabs from '../../components/DimensionMemberTabs.vue'
+import { getVisibleSections, getChildren, getFamilyEnergySandbox, getEnergySandbox, getAssessmentLatestResult, getDanReportByChild, getGutCognitionIndicators, getLatestIndicators, getRadarData, getFamilyMemberList, kickFamilyMemberById } from '../../utils/api.js'
 import { parseDate } from '../../utils/format.js'
 
 export default {
-  components: { TabTransition, RadarChart, FamilyEnergyBar, FloatingAvatar, FamilyMemberStrip, DimensionIntroCard, DimensionVisitorCard, DimensionPageSkeleton },
+  components: { TabTransition, RadarChart, FamilyEnergyBar, FloatingAvatar, DimensionMemberTabs, DimensionIntroCard, DimensionVisitorCard, DimensionPageSkeleton },
   data() {
     return {
+    memberScoreMap: {},
     pageLoading: false,
       isLoggedIn: false,
       role: null,
@@ -494,8 +499,62 @@ export default {
   },
   methods: {
     getInsightKey: function(prefix, idx) { return prefix + idx },
+    // 切换成员:同步成员ID并持久化,重载该页全部成员相关数据
     onFamilyMemberSelect: function(member) {
+      if (!member || member.id === this.selectedMemberId) return
       this.selectedMemberId = member.id
+      this.activeChildId = member.id
+      uni.setStorageSync('currentChildId', member.id)
+      this.reloadForMember()
+    },
+    // 切换成员后的统一重载入口
+    reloadForMember: function() {
+      if (!this.isLoggedIn) return
+      this.loadCognitiveReport()
+      this.loadDanReports()
+      this.loadGutCognitionData()
+    },
+    // 成员标签长按:唤出管理动作面板
+    onMemberLongPress: function(member) {
+      this.showMemberActions(member)
+    },
+    // 成员标签管理入口
+    onMemberManage: function() {
+      uni.navigateTo({ url: '/pages/profile-extra/family-members' })
+    },
+    // 成员管理动作面板(系统 ActionSheet,触摸目标由微信保证)
+    showMemberActions: function(member) {
+      if (!member) return
+      var self = this
+      var items = ['切换到该成员视角', '编辑资料', '移除成员']
+      uni.showActionSheet({
+        itemList: items,
+        success: function(res) {
+          if (res.tapIndex === 0) {
+            uni.navigateTo({ url: '/pages/action-detail/relationship-questionnaire?memberId=' + member.id })
+          } else if (res.tapIndex === 1) {
+            uni.navigateTo({ url: '/pages/family/add-member?memberId=' + member.id })
+          } else if (res.tapIndex === 2) {
+            uni.showModal({
+              title: '确认移除',
+              content: '确定要移除 ' + (member.nickname || '该成员') + ' 吗?',
+              success: function(m) {
+                if (m.confirm) {
+                  uni.showLoading({ title: '移除中...' })
+                  kickFamilyMemberById(member.id).then(function() {
+                    uni.hideLoading()
+                    uni.showToast({ title: '已移除', icon: 'success' })
+                    self.loadFamilyMembersVisible()
+                  }).catch(function(err) {
+                    uni.hideLoading()
+                    uni.showToast({ title: (err && err.message) || '移除失败', icon: 'none' })
+                  })
+                }
+              }
+            })
+          }
+        }
+      })
     },
     loadSectionConfig: function() {
       var baseSections = ['func_entries', 'recommended_reading']
@@ -564,15 +623,27 @@ export default {
     },
     loadFamilyMembersVisible: function() {
       var self = this
-      getFamilyEnergySandbox().then(function(res) {
-        if (res && res.data) {
-          self.sandboxData = res.data.sandboxData || null
-          self.dualDimension = res.data.dualDimension || null
-          if (res.data.members) {
-            self.familyMembersVisible = res.data.members
-          }
+      getFamilyMemberList({}).then(function(res) {
+        if (res.code === 200 && res.data) {
+          // 保留后端全字段:成员标签需要 relationship/relativeLabel/roleLabel/effectiveRole/isSelf 等
+          self.familyMembersVisible = res.data.map(function(m) {
+            return {
+              id: m.id,
+              memberId: m.memberId,
+              nickname: m.nickname,
+              avatar: m.avatar,
+              relationship: m.relationship,
+              relativeLabel: m.relativeLabel,
+              roleLabel: m.roleLabel,
+              effectiveRole: m.effectiveRole,
+              generation: m.generation,
+              phone: m.phone,
+              isSelf: m.isSelf,
+              isSwitchable: m.isSwitchable
+            }
+          })
         }
-      }).catch(function(e) {})
+      }).catch(function(e) { console.log('获取家庭成员失败', e) })
     },
     loadCognitiveReport: function() {
       var self = this