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

feat(frontend): 心13维分组雷达图+行6维关系域雷达图+智成长型思维加入认知雷达

Xiaogang Liao 2 месяцев назад
Родитель
Сommit
d5c53d7a43

+ 66 - 1
cfc-frontend/pages/action-detail/index.vue

@@ -49,6 +49,21 @@
         :interactive="true" />
         :interactive="true" />
     </view>
     </view>
 
 
+    <!-- 行6维关系域雷达图(登录后) -->
+    <view class="section" v-if="isLoggedIn && currentMemberEnergies">
+      <view class="section-header">
+        <text class="section-title">🫂 关系域评估</text>
+      </view>
+      <RadarChart
+        :dimensions="actionDimensions"
+        :scores="actionScores"
+        fillColor="#10B981"
+        gridColor="#D1FAE5"
+        labelColor="#065F46"
+        :width="580"
+        :height="580" />
+    </view>
+
     <!-- 功能入口 -->
     <!-- 功能入口 -->
     <view class="func-section" v-if="sectionVisible('func_entries')">
     <view class="func-section" v-if="sectionVisible('func_entries')">
       <view class="func-grid">
       <view class="func-grid">
@@ -102,10 +117,11 @@ import DimensionActivities from '../../components/DimensionActivities.vue'
 import DimensionProducts from '../../components/DimensionProducts.vue'
 import DimensionProducts from '../../components/DimensionProducts.vue'
 import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
 import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
+import RadarChart from '../../components/RadarChart.vue'
 import { getVisibleSections, getEnergyOverview, getChildren, getFamilyEnergySandbox, getVisibleFamilyMembers } from '../../utils/api.js'
 import { getVisibleSections, getEnergyOverview, getChildren, getFamilyEnergySandbox, getVisibleFamilyMembers } from '../../utils/api.js'
 
 
 export default {
 export default {
-  components: { TabTransition, PageBanner, FamilyEnergyBar, FamilyRelationGraph, FamilyMemberStrip, DimensionTasks, DimensionActivities, DimensionProducts, DimensionIntroCard, AIFloatingAvatar },
+  components: { TabTransition, PageBanner, FamilyEnergyBar, FamilyRelationGraph, FamilyMemberStrip, DimensionTasks, DimensionActivities, DimensionProducts, DimensionIntroCard, AIFloatingAvatar, RadarChart },
   data() {
   data() {
     return {
     return {
       isLoggedIn: false,
       isLoggedIn: false,
@@ -179,6 +195,55 @@ export default {
         '十二月:年终总结,回顾家庭成长'
         '十二月:年终总结,回顾家庭成长'
       ]
       ]
       return messages[month] || messages[0]
       return messages[month] || messages[0]
+    },
+
+    /** 当前选中成员的能量数据(从 sandboxData.members 中查找) */
+    currentMemberEnergies: function() {
+      if (!this.sandboxData || !this.sandboxData.members) return null
+      var members = this.sandboxData.members
+      var targetId = this.selectedMemberId || this.activeChildId
+      for (var i = 0; i < members.length; i++) {
+        var m = members[i]
+        if (m && (m.memberId === targetId)) return m
+      }
+      return members[0] || null
+    },
+
+    /** 行6维关系域维度定义(根据角色切换家长版/孩子版) */
+    actionDimensions: function() {
+      var role = this.role || uni.getStorageSync('currentRole') || ''
+      var isParent = (role === 'parent')
+      if (isParent) {
+        return [
+          { key: 'actionParentChild', label: '亲子关系' },
+          { key: 'actionMarital', label: '夫妻关系' },
+          { key: 'actionParental', label: '父母关系' },
+          { key: 'actionLeadership', label: '领导关系' },
+          { key: 'actionSociality', label: '社会性' },
+          { key: 'actionInterpersonal', label: '人际韧性' }
+        ]
+      } else {
+        return [
+          { key: 'actionChildParentChild', label: '亲子关系' },
+          { key: 'actionSibling', label: '同胞关系' },
+          { key: 'actionRelative', label: '亲属关系' },
+          { key: 'actionTeacherStudent', label: '师生关系' },
+          { key: 'actionChildSociality', label: '社会性' },
+          { key: 'actionChildInterpersonal', label: '人际韧性' }
+        ]
+      }
+    },
+
+    /** 行6维分值(从当前成员中提取,与 dimensions 顺序对应) */
+    actionScores: function() {
+      var member = this.currentMemberEnergies
+      if (!member) return []
+      var dims = this.actionDimensions
+      var scores = []
+      for (var i = 0; i < dims.length; i++) {
+        scores.push(member[dims[i].key] || 0)
+      }
+      return scores
     }
     }
   },
   },
   onShow() {
   onShow() {

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

@@ -128,6 +128,24 @@
       </view>
       </view>
     </view>
     </view>
 
 
+    <!-- 心13维雷达图(分组展示,登录后且选中成员时) -->
+    <view class="section" v-if="isLoggedIn && currentMemberEnergies">
+      <view class="section-header">
+        <text class="section-title">&#x1F9E0; 心理维度详解</text>
+      </view>
+      <view class="radar-group" v-for="(group, gIdx) in mindRadarGroups" :key="gIdx">
+        <text class="radar-group-label">{{ group.label }}</text>
+        <RadarChart
+          :dimensions="group.dimensions"
+          :scores="getMindGroupScores(group)"
+          fillColor="#FF6B9D"
+          gridColor="#FCE7F3"
+          labelColor="#9D174D"
+          :width="540"
+          :height="540" />
+      </view>
+    </view>
+
     <!-- 心维度介绍卡片(登录后显示) -->
     <!-- 心维度介绍卡片(登录后显示) -->
     <DimensionIntroCard dimCode="mind" v-if="isLoggedIn" learn-more-url="/pages/mind-detail/dimension-intro" />
     <DimensionIntroCard dimCode="mind" v-if="isLoggedIn" learn-more-url="/pages/mind-detail/dimension-intro" />
 
 
@@ -222,6 +240,43 @@ components: { TabTransition, PageBanner, RadarChart, FamilyEnergyBar, PsychCrisi
       milestones: [],
       milestones: [],
       danReports: [],
       danReports: [],
 
 
+      // 心13维雷达图分组配置
+      mindRadarGroups: [
+        {
+          label: '大五人格',
+          dimensions: [
+            { key: 'bigFiveOpenness', label: '开放性' },
+            { key: 'bigFiveConscientiousness', label: '尽责性' },
+            { key: 'bigFiveExtraversion', label: '外向性' },
+            { key: 'bigFiveAgreeableness', label: '宜人性' },
+            { key: 'bigFiveNeuroticism', label: '神经质' }
+          ]
+        },
+        {
+          label: '情绪稳定',
+          dimensions: [
+            { key: 'emotionEmotion', label: '情绪商数' },
+            { key: 'emotionResilience', label: '心理韧性' },
+            { key: 'emotionStressCoping', label: '压力应对' },
+            { key: 'emotionSelfAwareness', label: '自我认知' }
+          ]
+        },
+        {
+          label: '自驱力',
+          dimensions: [
+            { key: 'driveAutonomy', label: '自主性' },
+            { key: 'driveCompetence', label: '胜任感' },
+            { key: 'driveRelatedness', label: '归属感' }
+          ]
+        },
+        {
+          label: '自我概念',
+          dimensions: [
+            { key: 'selfConceptOverall', label: '综合自我概念' }
+          ]
+        }
+      ],
+
     // 家庭天盘 - 今日心情(占位数据)
     // 家庭天盘 - 今日心情(占位数据)
     todayMood: {
     todayMood: {
         emoji: '\u{1F60A}',
         emoji: '\u{1F60A}',
@@ -404,8 +459,20 @@ components: { TabTransition, PageBanner, RadarChart, FamilyEnergyBar, PsychCrisi
             metal: ['大吉:决策力强', '吉:思维清晰', '平:保持专注', '凶:注意言辞', '大凶:不宜强求'],
             metal: ['大吉:决策力强', '吉:思维清晰', '平:保持专注', '凶:注意言辞', '大凶:不宜强求'],
             water: ['大吉:灵感丰富', '吉:人际和谐', '平:安静内省', '凶:情绪波动', '大凶:宜藏不宜放']
             water: ['大吉:灵感丰富', '吉:人际和谐', '平:安静内省', '凶:情绪波动', '大凶:宜藏不宜放']
         }
         }
-        var descList = descMap[this.dominantElement] || descMap.wood
+var descList = descMap[this.dominantElement] || descMap.wood
         return { level: level, text: levels[level], description: descList[level] }
         return { level: level, text: levels[level], description: descList[level] }
+    },
+
+    /** 当前选中成员的能量数据(从 sandboxData.members 中按 selectedMemberId 查找) */
+    currentMemberEnergies: function() {
+      if (!this.sandboxData || !this.sandboxData.members) return null
+      var members = this.sandboxData.members
+      var targetId = this.selectedMemberId || this.currentChildId
+      for (var i = 0; i < members.length; i++) {
+        var m = members[i]
+        if (m && (m.memberId === targetId)) return m
+      }
+      return members[0] || null
     }
     }
   },
   },
   onShow() {
   onShow() {
@@ -438,6 +505,17 @@ components: { TabTransition, PageBanner, RadarChart, FamilyEnergyBar, PsychCrisi
     this._watchPageReady()
     this._watchPageReady()
   },
   },
   methods: {
   methods: {
+    /** 获取心维度分组雷达图的分值数组 */
+    getMindGroupScores: function(group) {
+      var member = this.currentMemberEnergies
+      if (!member) return []
+      var scores = []
+      var dims = group.dimensions
+      for (var i = 0; i < dims.length; i++) {
+        scores.push(member[dims[i].key] || 0)
+      }
+      return scores
+    },
     // ===== 区块可见性 =====
     // ===== 区块可见性 =====
     loadSectionConfig: function() {
     loadSectionConfig: function() {
       var self = this
       var self = this
@@ -1993,4 +2071,14 @@ components: { TabTransition, PageBanner, RadarChart, FamilyEnergyBar, PsychCrisi
   color: #9D174D;
   color: #9D174D;
   font-weight: 500;
   font-weight: 500;
 }
 }
+
+/* 雷达图分组 */
+.radar-group { margin-bottom: 30rpx; }
+.radar-group-label {
+  font-size: 28rpx;
+  font-weight: bold;
+  color: #9D174D;
+  margin-bottom: 16rpx;
+  padding-left: 10rpx;
+}
 </style>
 </style>

+ 22 - 4
cfc-frontend/pages/wisdom-detail/index.vue

@@ -142,8 +142,8 @@ export default {
       visibleSections: [],
       visibleSections: [],
       cognitiveReport: null,
       cognitiveReport: null,
       articles: [],
       articles: [],
-      /** Mock 平均值(6维认知):感知/专注/记忆/逻辑/空间/加工速度 */
-      cognitiveAvgScores: [70, 65, 72, 68, 66, 71],
+      /** Mock 平均值(7维认知):感知/专注/记忆/逻辑/空间/加工速度/成长型思维 */
+      cognitiveAvgScores: [70, 65, 72, 68, 66, 71, 70],
       danReports: [],
       danReports: [],
       funcList: [
       funcList: [
         { icon: '\u{1F4CA}', label: '认知报告', needLogin: true, page: '/pages/wisdom-detail/cognitive-report' },
         { icon: '\u{1F4CA}', label: '认知报告', needLogin: true, page: '/pages/wisdom-detail/cognitive-report' },
@@ -173,15 +173,33 @@ export default {
         { label: '记忆力', key: 'memoryScore' },
         { label: '记忆力', key: 'memoryScore' },
         { label: '逻辑思维', key: 'logicScore' },
         { label: '逻辑思维', key: 'logicScore' },
         { label: '空间思维', key: 'spatialScore' },
         { label: '空间思维', key: 'spatialScore' },
-        { label: '加工速度', key: 'processingSpeedScore' }
+        { label: '加工速度', key: 'processingSpeedScore' },
+        { label: '成长型思维', key: 'wisdomGrowthMindset' }
       ]
       ]
     },
     },
     cognitiveScores: function() {
     cognitiveScores: function() {
       if (!this.cognitiveReport) return []
       if (!this.cognitiveReport) return []
       var dims = this.cognitiveDimensions
       var dims = this.cognitiveDimensions
       var scores = []
       var scores = []
+      // 解析 structuredAnalysis 中的成长型思维
+      var growthMindset = 0
+      if (this.cognitiveReport.structuredAnalysis) {
+        try {
+          var analysis = JSON.parse(this.cognitiveReport.structuredAnalysis)
+          if (analysis && analysis.extra && analysis.extra.growthMindset) {
+            var gm = analysis.extra.growthMindset
+            var vals = Object.values(gm)
+            if (vals.length > 0) growthMindset = parseInt(vals[0]) || 0
+          }
+        } catch (e) { /* ignore parse error */ }
+      }
       for (var i = 0; i < dims.length; i++) {
       for (var i = 0; i < dims.length; i++) {
-        scores.push(this.cognitiveReport[dims[i].key] || 0)
+        var key = dims[i].key
+        if (key === 'wisdomGrowthMindset') {
+          scores.push(growthMindset)
+        } else {
+          scores.push(this.cognitiveReport[key] || 0)
+        }
       }
       }
       return scores
       return scores
     },
     },