Selaa lähdekoodia

chore: auto bump version and changelog [skip ci]

iwt 1 kuukausi sitten
vanhempi
sitoutus
d12e0330fd

+ 181 - 0
cfc-frontend/components/DimensionSubDims.vue

@@ -0,0 +1,181 @@
+<template>
+  <view class="dim-subdims" :style="{ '--accent': accentColor }">
+    <view class="dim-header">
+      <text class="dim-title">{{ title }}</text>
+      <text class="dim-subtitle">{{ subtitle }}</text>
+    </view>
+    <view class="dim-list">
+      <view
+        class="dim-item"
+        v-for="(d, i) in dims"
+        :key="d.label"
+        :style="{ '--dim-color': d.color || accentColor }"
+      >
+        <view class="dim-item-top">
+          <view class="dim-item-info">
+            <text class="dim-item-label">{{ d.label }}</text>
+            <text class="dim-item-desc">{{ d.desc }}</text>
+          </view>
+          <view class="dim-item-score-wrap">
+            <text
+              class="dim-item-score"
+              :class="getScoreClass(d.score)"
+            >{{ d.score }}</text>
+            <text
+              class="dim-item-level"
+              :class="'level-' + getScoreLevel(d.score)"
+            >{{ getScoreLevelText(d.score) }}</text>
+          </view>
+        </view>
+        <view class="dim-bar-track">
+          <view
+            class="dim-bar-fill"
+            :style="{ width: d.score + '%', background: d.color || accentColor }"
+          ></view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'DimensionSubDims',
+  props: {
+    title: { type: String, default: '维度评分' },
+    subtitle: { type: String, default: '' },
+    accentColor: { type: String, default: '#6366F1' },
+    dims: { type: Array, default: () => [] }
+  },
+  methods: {
+    getScoreLevel(score) {
+      if (score >= 80) return 'good'
+      if (score >= 60) return 'ok'
+      return 'low'
+    },
+    getScoreLevelText(score) {
+      if (score >= 80) return '优秀'
+      if (score >= 60) return '良好'
+      if (score > 0) return '待提升'
+      return '-'
+    },
+    getScoreClass(score) {
+      if (score >= 80) return 'score-good'
+      if (score >= 60) return 'score-ok'
+      return 'score-low'
+    }
+  }
+}
+</script>
+
+<style scoped>
+.dim-subdims {
+  margin: 20rpx 30rpx;
+  background: rgba(255, 255, 255, 0.95);
+  border-radius: 24rpx;
+  padding: 28rpx 24rpx;
+  box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.06);
+  border: 1rpx solid rgba(255, 255, 255, 0.8);
+}
+.dim-header {
+  margin-bottom: 24rpx;
+}
+.dim-title {
+  font-size: 32rpx;
+  font-weight: 700;
+  color: #1a1a2e;
+  display: block;
+}
+.dim-subtitle {
+  font-size: 24rpx;
+  color: #94a3b8;
+  margin-top: 6rpx;
+  display: block;
+}
+.dim-list {
+  display: flex;
+  flex-direction: column;
+  gap: 0;
+}
+.dim-item {
+  padding: 20rpx 0;
+  border-bottom: 1rpx solid rgba(0, 0, 0, 0.05);
+}
+.dim-item:last-child {
+  border-bottom: none;
+  padding-bottom: 0;
+}
+.dim-item:first-child {
+  padding-top: 0;
+}
+.dim-item-top {
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+  margin-bottom: 12rpx;
+}
+.dim-item-info {
+  flex: 1;
+  min-width: 0;
+}
+.dim-item-label {
+  font-size: 28rpx;
+  font-weight: 600;
+  color: #1e293b;
+  display: block;
+  line-height: 1.4;
+}
+.dim-item-desc {
+  font-size: 22rpx;
+  color: #94a3b8;
+  margin-top: 4rpx;
+  display: block;
+  line-height: 1.4;
+}
+.dim-item-score-wrap {
+  text-align: right;
+  flex-shrink: 0;
+  margin-left: 16rpx;
+}
+.dim-item-score {
+  font-size: 36rpx;
+  font-weight: 700;
+  line-height: 1;
+}
+.score-good { color: #16a34a; }
+.score-ok { color: #d97706; }
+.score-low { color: #dc2626; }
+.dim-item-level {
+  font-size: 20rpx;
+  font-weight: 500;
+  display: block;
+  margin-top: 4rpx;
+  padding: 2rpx 12rpx;
+  border-radius: 8rpx;
+  width: fit-content;
+  margin-left: auto;
+}
+.level-good {
+  color: #16a34a;
+  background: #f0fdf4;
+}
+.level-ok {
+  color: #d97706;
+  background: #fffbeb;
+}
+.level-low {
+  color: #dc2626;
+  background: #fef2f2;
+}
+.dim-bar-track {
+  height: 8rpx;
+  background: rgba(0, 0, 0, 0.06);
+  border-radius: 4rpx;
+  overflow: hidden;
+}
+.dim-bar-fill {
+  height: 100%;
+  border-radius: 4rpx;
+  transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);
+}
+</style>

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

@@ -41,6 +41,13 @@
     </view>
       :sandboxData="sandboxData"
       :dualDimension="dualDimension" />
+    <!-- 关系六维 -->
+    <dimension-sub-dims
+      v-if="isLoggedIn && actionSubDims.length > 0"
+      title="🌲 关系六维"
+      subtitle="家庭关系的六个方面"
+      accent-color="#10B981"
+      :dims="actionSubDims" />
 
     <!-- 登录后:家庭关系(行维度核心) -->
     <view class="section" v-if="isLoggedIn">
@@ -127,10 +134,11 @@ import DimensionProducts from '../../components/DimensionProducts.vue'
 import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
 import RadarChart from '../../components/RadarChart.vue'
+import DimensionSubDims from '../../components/DimensionSubDims.vue'
 import { getVisibleSections, getEnergyOverview, getChildren, getFamilyEnergySandbox, getEnergySandbox, getVisibleFamilyMembers } from '../../utils/api.js'
 
 export default {
-  components: { TabTransition, PageBanner, FamilyEnergyBar, FamilyRelationGraph, FamilyMemberStrip, DimensionTasks, DimensionActivities, DimensionProducts, DimensionIntroCard, AIFloatingAvatar, RadarChart },
+  components: { TabTransition, PageBanner, FamilyEnergyBar, FamilyRelationGraph, FamilyMemberStrip, DimensionTasks, DimensionActivities, DimensionProducts, DimensionIntroCard, AIFloatingAvatar, RadarChart, DimensionSubDims },
   data() {
     return {
       isLoggedIn: false,
@@ -144,6 +152,7 @@ export default {
       familyMembersVisible: [],
       childrenChecked: false,
       membersChecked: false,
+            actionSubDims: [],
       sandboxData: null,
       currentView: 'self', // 'self' | 'family'
       dualDimension: null,
@@ -457,6 +466,59 @@ export default {
   color: #fff;
   font-weight: 600;
 }
+
+/* 子维度评分卡 */
+.subdim-section {
+  margin: 20rpx 30rpx;
+}
+.subdim-cards {
+  background: rgba(255,255,255,0.08);
+  border-radius: 20rpx;
+  overflow: hidden;
+  border: 1rpx solid rgba(255,255,255,0.12);
+}
+.subdim-card {
+  padding: 24rpx 28rpx;
+  border-bottom: 1rpx solid rgba(255,255,255,0.08);
+}
+.subdim-card:last-child {
+  border-bottom: none;
+}
+.subdim-card-left {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 12rpx;
+}
+.subdim-card-label {
+  font-size: 28rpx;
+  font-weight: 600;
+  color: #fff;
+}
+.subdim-card-desc {
+  font-size: 22rpx;
+  color: rgba(255,255,255,0.5);
+  margin-top: 4rpx;
+}
+.subdim-card-right {
+  text-align: right;
+}
+.subdim-card-score {
+  font-size: 36rpx;
+  font-weight: 700;
+}
+.subdim-bar-track {
+  height: 8rpx;
+  background: rgba(255,255,255,0.1);
+  border-radius: 4rpx;
+  overflow: hidden;
+  margin-top: 8rpx;
+}
+.subdim-bar-fill {
+  height: 100%;
+  border-radius: 4rpx;
+  transition: width 0.5s ease;
+}
 <style scoped>
 .container {
   min-height: 100vh;

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

@@ -53,6 +53,13 @@
       dimensionCode="body"
       :sandboxData="sandboxData"
       :dualDimension="dualDimension" />
+    <!-- 健康七维 -->
+    <dimension-sub-dims
+      v-if="isLoggedIn && healthSubDims.length > 0"
+      title="🌿 健康七维"
+      subtitle="身体各项健康指标,分数越高代表越健康"
+      accent-color="#FF8C42"
+      :dims="healthSubDims" />
 
     <!-- 功能入口 -->
     <view class="func-section" v-if="sectionVisible('func_entries')">
@@ -105,13 +112,14 @@ import TabTransition from '../../components/tab-transition.vue'
 import PageBanner from '../../components/PageBanner.vue'
 import FamilyEnergyBar from '../../components/FamilyEnergyBar.vue'
 import RadarChart from '../../components/RadarChart.vue'
+import DimensionSubDims from '../../components/DimensionSubDims.vue'
 import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
 import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
 import { getVisibleSections, getEnergyOverview, getChildren, getFamilyEnergySandbox, getEnergySandbox, getVisibleFamilyMembers, getDimensionOverview } from '../../utils/api.js'
 
 export default {
-  components: { TabTransition, PageBanner, FamilyEnergyBar, RadarChart, AIFloatingAvatar, FamilyMemberStrip, DimensionIntroCard },
+  components: { TabTransition, PageBanner, FamilyEnergyBar, RadarChart, DimensionSubDims, AIFloatingAvatar, FamilyMemberStrip, DimensionIntroCard },
   data() {
     return {
       isLoggedIn: false,
@@ -126,6 +134,7 @@ export default {
       // 接口数据是否已检查(避免"暂无数据"闪烁)
       childrenChecked: false,
       membersChecked: false,
+            healthSubDims: [],
       sandboxData: null,
       currentView: 'self', // 'self' | 'family'
       dualDimension: null,
@@ -286,6 +295,7 @@ export default {
       getDimensionOverview({ memberId: memberId }).then(function(res) {
         if (res && res.data) {
           self.dimensionData = res.data
+        self.healthSubDims = (self.dimensionData.dimensions || []).map(function(d) { return {label: d.label || d.dimension, score: d.score || 0, desc: d.description || ''}; });
           console.log('[body] dimensionData loaded:', res.data.dimensions ? res.data.dimensions.length : 0, 'dimensions')
         } else if (res) {
           console.warn('[body] dimension API error:', res.message || res.code)
@@ -478,6 +488,59 @@ export default {
   color: rgba(255,255,255,0.8);
   line-height: 1.6;
 }
+
+/* 子维度评分卡 */
+.subdim-section {
+  margin: 20rpx 30rpx;
+}
+.subdim-cards {
+  background: rgba(255,255,255,0.08);
+  border-radius: 20rpx;
+  overflow: hidden;
+  border: 1rpx solid rgba(255,255,255,0.12);
+}
+.subdim-card {
+  padding: 24rpx 28rpx;
+  border-bottom: 1rpx solid rgba(255,255,255,0.08);
+}
+.subdim-card:last-child {
+  border-bottom: none;
+}
+.subdim-card-left {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 12rpx;
+}
+.subdim-card-label {
+  font-size: 28rpx;
+  font-weight: 600;
+  color: #fff;
+}
+.subdim-card-desc {
+  font-size: 22rpx;
+  color: rgba(255,255,255,0.5);
+  margin-top: 4rpx;
+}
+.subdim-card-right {
+  text-align: right;
+}
+.subdim-card-score {
+  font-size: 36rpx;
+  font-weight: 700;
+}
+.subdim-bar-track {
+  height: 8rpx;
+  background: rgba(255,255,255,0.1);
+  border-radius: 4rpx;
+  overflow: hidden;
+  margin-top: 8rpx;
+}
+.subdim-bar-fill {
+  height: 100%;
+  border-radius: 4rpx;
+  transition: width 0.5s ease;
+}
 <style scoped>
 .body-container {
   min-height: 100vh;

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

@@ -42,6 +42,13 @@
           v-if="isLoggedIn"
           dimensionCode="mind"
           :sandboxData="sandboxData" />
+    <!-- 心理维度 -->
+    <dimension-sub-dims
+      v-if="isLoggedIn && mindSubDims.length > 0"
+      title="🔥 心理维度"
+      subtitle="情绪与性格的综合评估"
+      accent-color="#FF6B9D"
+      :dims="mindSubDims" />
 
         <!-- 心理报告卡片(登录后可见) -->
         <view class="emi-card" v-if="isLoggedIn && emiData">
@@ -160,6 +167,7 @@ import TabTransition from '../../components/tab-transition.vue'
 import PageBanner from '../../components/PageBanner.vue'
 import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import RadarChart from '../../components/RadarChart.vue'
+import DimensionSubDims from '../../components/DimensionSubDims.vue'
 import FamilyEnergyBar from '../../components/FamilyEnergyBar.vue'
 import PsychCrisisBanner from '../../components/PsychCrisisBanner.vue'
 import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
@@ -171,7 +179,7 @@ import config from '../../config.js'
 import { parseDate } from '../../utils/format.js'
 
 export default {
-components: { TabTransition, PageBanner, RadarChart, FamilyEnergyBar, PsychCrisisBanner, AIFloatingAvatar, FamilyTianpanCard, FamilyMemberStrip, DimensionIntroCard },
+components: { TabTransition, PageBanner, RadarChart, DimensionSubDims, FamilyEnergyBar, PsychCrisisBanner, AIFloatingAvatar, FamilyTianpanCard, FamilyMemberStrip, DimensionIntroCard },
   data() {
     return {
       isLoggedIn: false,
@@ -231,6 +239,7 @@ components: { TabTransition, PageBanner, RadarChart, FamilyEnergyBar, PsychCrisi
       // 五维组件数据
       userName: '',
       children: [],
+            mindSubDims: [],
       sandboxData: null,
       currentView: 'self', // 'self' | 'family'
       contactList: [],
@@ -609,6 +618,7 @@ var descList = descMap[this.dominantElement] || descMap.wood
       getEmiReport(memberId).then(function(res) {
         if (res.code === 200 && res.data) {
           self.emiData = res.data
+        self.mindSubDims = (function() { var e = self.emiData || {}; return [{label:'情绪稳定性', score:e.emotionStability||0, desc:'识别、理解和管理情绪的综合能力'}, {label:'开放性', score:e.opennessScore||0, desc:'对新事物的接受程度'}, {label:'尽责性', score:e.conscientiousnessScore||0, desc:'做事有条理的程度'}, {label:'外向性', score:e.extraversionScore||0, desc:'社交活跃度'}, {label:'宜人性', score:e.agreeablenessScore||0, desc:'与人相处的和谐度'}, {label:'神经质', score:e.neuroticismScore||0, desc:'情绪波动程度(反向)'}, {label:'自主性', score:e.driveAutonomy||0, desc:'内在驱动力'}, {label:'胜任感', score:e.driveCompetence||0, desc:'对自己能力的信心'}, {label:'归属感', score:e.driveRelatedness||0, desc:'感受被接纳'}]; })();
         }
         self.emiLoading = false
       }).catch(function() {
@@ -974,6 +984,59 @@ var descList = descMap[this.dominantElement] || descMap.wood
   color: rgba(255,255,255,0.8);
   line-height: 1.6;
 }
+
+/* 子维度评分卡 */
+.subdim-section {
+  margin: 20rpx 30rpx;
+}
+.subdim-cards {
+  background: rgba(255,255,255,0.08);
+  border-radius: 20rpx;
+  overflow: hidden;
+  border: 1rpx solid rgba(255,255,255,0.12);
+}
+.subdim-card {
+  padding: 24rpx 28rpx;
+  border-bottom: 1rpx solid rgba(255,255,255,0.08);
+}
+.subdim-card:last-child {
+  border-bottom: none;
+}
+.subdim-card-left {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 12rpx;
+}
+.subdim-card-label {
+  font-size: 28rpx;
+  font-weight: 600;
+  color: #fff;
+}
+.subdim-card-desc {
+  font-size: 22rpx;
+  color: rgba(255,255,255,0.5);
+  margin-top: 4rpx;
+}
+.subdim-card-right {
+  text-align: right;
+}
+.subdim-card-score {
+  font-size: 36rpx;
+  font-weight: 700;
+}
+.subdim-bar-track {
+  height: 8rpx;
+  background: rgba(255,255,255,0.1);
+  border-radius: 4rpx;
+  overflow: hidden;
+  margin-top: 8rpx;
+}
+.subdim-bar-fill {
+  height: 100%;
+  border-radius: 4rpx;
+  transition: width 0.5s ease;
+}
 <style scoped>
 .container {
   min-height: 100vh;

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

@@ -110,6 +110,14 @@
         :social="wealthSocial"
         :points="wealthPoints" />
 
+      <!-- 子维度评分表 -->
+      <dimension-sub-dims
+        v-if="isLoggedIn && wealthSubDims.length > 0"
+        title="💧 财富维度构成"
+        subtitle="家庭财富能量的各个方面"
+        accent-color="#F59E0B"
+        :dims="wealthSubDims" />
+
       <!-- 财富数据卡(家长) -->
       <view class="section" v-if="role === 'parent'">
         <view class="disc-card">
@@ -195,6 +203,7 @@ import WealthSubScores from '../../components/WealthSubScores.vue'
 import BodyWealthAlert from '../../components/BodyWealthAlert.vue'
 import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
 import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
+import DimensionSubDims from '../../components/DimensionSubDims.vue'
 import {
   getChildren,
   getWealthDetail,
@@ -208,7 +217,7 @@ import nav from '../../utils/nav.js'
 import config from '../../config.js'
 
 export default {
-  components: { TabTransition, PageBanner, WealthEnergyRing, WealthSubScores, BodyWealthAlert, FamilyMemberStrip, DimensionIntroCard },
+  components: { TabTransition, PageBanner, WealthEnergyRing, WealthSubScores, BodyWealthAlert, FamilyMemberStrip, DimensionIntroCard, DimensionSubDims },
   data() {
     return {
       showTabTransition: true,
@@ -220,10 +229,13 @@ export default {
       wealthIncome: null,
       wealthAchievement: null,
       wealthNetwork: null,
+      wealthLegacy: null,
       // 子维度 - child
       wealthEducation: null,
       wealthSocial: null,
       wealthPoints: null,
+      // 子维度汇总(DimensionSubDims 用)
+      wealthSubDims: [],
       // 身克富杠杆
       bodyWealthStatus: 'normal',
       bodyWealthMessage: '',
@@ -388,6 +400,21 @@ export default {
           // 身克富杠杆状态
           this.bodyWealthStatus = d.bodyWealthStatus || 'normal'
           this.bodyWealthMessage = d.bodyWealthMessage || ''
+          // 子维度汇总(供 DimensionSubDims 使用)
+          if (memberType === 'parent') {
+            this.wealthSubDims = [
+              { label: '金钱收入', score: this.wealthIncome || 0, desc: '家庭总收入水平' },
+              { label: '社会成就', score: this.wealthAchievement || 0, desc: '家庭任务完成情况' },
+              { label: '资源网络', score: this.wealthNetwork || 0, desc: '家庭成员人脉资源' },
+              { label: '家族传承', score: (this.wealthLegacy || 0), desc: '价值观与精神传承' }
+            ]
+          } else {
+            this.wealthSubDims = [
+              { label: '学习积分', score: this.wealthEducation || 0, desc: '通过学习教育获得的积分' },
+              { label: '社交积分', score: this.wealthSocial || 0, desc: '通过社交活动获得的积分' },
+              { label: '任务积分', score: this.wealthPoints || 0, desc: '完成任务获得的积分' }
+            ]
+          }
         }
       } catch (e) {
         console.error('获取富维度详情失败', e)

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

@@ -51,6 +51,13 @@
       dimensionCode="wisdom"
       :sandboxData="sandboxData"
       :dualDimension="dualDimension" />
+    <!-- 认知七维 -->
+    <dimension-sub-dims
+      v-if="isLoggedIn && wisdomSubDims.length > 0"
+      title="⚡ 认知七维"
+      subtitle="学习能力的七个核心方面"
+      accent-color="#6366F1"
+      :dims="wisdomSubDims" />
 
     <!-- 学习解读 -->
     <view class="section score-explain-card" v-if="isLoggedIn && currentView === 'self' && dualDimension">
@@ -127,6 +134,7 @@ import nav from '../../utils/nav'
 import TabTransition from '../../components/tab-transition.vue'
 import PageBanner from '../../components/PageBanner.vue'
 import RadarChart from '../../components/RadarChart.vue'
+import DimensionSubDims from '../../components/DimensionSubDims.vue'
 import FamilyEnergyBar from '../../components/FamilyEnergyBar.vue'
 import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
 import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
@@ -135,7 +143,7 @@ import { getVisibleSections, getChildren, getFamilyEnergySandbox, getEnergySandb
 import { parseDate } from '../../utils/format.js'
 
 export default {
-  components: { TabTransition, PageBanner, RadarChart, FamilyEnergyBar, AIFloatingAvatar, FamilyMemberStrip, DimensionIntroCard },
+  components: { TabTransition, PageBanner, RadarChart, FamilyEnergyBar, DimensionSubDims, AIFloatingAvatar, FamilyMemberStrip, DimensionIntroCard },
   data() {
     return {
       isLoggedIn: false,
@@ -147,6 +155,7 @@ export default {
       children: [],
       familyMembersVisible: [],
       selectedMemberId: null,
+            wisdomSubDims: [],
       sandboxData: null,
       currentView: 'self', // 'self' | 'family'
       dualDimension: null,
@@ -324,6 +333,7 @@ export default {
       getAssessmentLatestResult(memberId).then(function(res) {
         if (res.code === 200 && res.data) {
           self.cognitiveReport = res.data
+        self.wisdomSubDims = (function() { var r = self.cognitiveReport || {}; return [{label:'感知能力', score:r.perceptionScore||0, desc:'通过感官获取信息'}, {label:'专注力', score:r.focusScore||0, desc:'保持注意力集中'}, {label:'记忆力', score:r.memoryScore||0, desc:'记忆和回忆信息'}, {label:'逻辑思维', score:r.logicScore||0, desc:'分析和推理能力'}, {label:'空间思维', score:r.spatialScore||0, desc:'操作空间关系'}, {label:'加工速度', score:r.processingSpeedScore||0, desc:'快速处理信息'}, {label:'成长型思维', score:r.growthMindset||0, desc:'相信能力可提升'}]; })();
         }
       }).catch(function(e) {})
     },
@@ -466,6 +476,59 @@ export default {
   color: rgba(255,255,255,0.8);
   line-height: 1.6;
 }
+
+/* 子维度评分卡 */
+.subdim-section {
+  margin: 20rpx 30rpx;
+}
+.subdim-cards {
+  background: rgba(255,255,255,0.08);
+  border-radius: 20rpx;
+  overflow: hidden;
+  border: 1rpx solid rgba(255,255,255,0.12);
+}
+.subdim-card {
+  padding: 24rpx 28rpx;
+  border-bottom: 1rpx solid rgba(255,255,255,0.08);
+}
+.subdim-card:last-child {
+  border-bottom: none;
+}
+.subdim-card-left {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 12rpx;
+}
+.subdim-card-label {
+  font-size: 28rpx;
+  font-weight: 600;
+  color: #fff;
+}
+.subdim-card-desc {
+  font-size: 22rpx;
+  color: rgba(255,255,255,0.5);
+  margin-top: 4rpx;
+}
+.subdim-card-right {
+  text-align: right;
+}
+.subdim-card-score {
+  font-size: 36rpx;
+  font-weight: 700;
+}
+.subdim-bar-track {
+  height: 8rpx;
+  background: rgba(255,255,255,0.1);
+  border-radius: 4rpx;
+  overflow: hidden;
+  margin-top: 8rpx;
+}
+.subdim-bar-fill {
+  height: 100%;
+  border-radius: 4rpx;
+  transition: width 0.5s ease;
+}
 <style scoped>
 .wisdom-container {
   min-height: 100vh;

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-fd99c53876d07f6e6d8b35a1fef9bb03661990b7
+f391b693d892d859b8a2aa814984d6160680955a

+ 1 - 1
cfc-web/package.json

@@ -1,6 +1,6 @@
 {
   "name": "cfc-web",
-  "version": "1.0.1028",
+  "version": "1.0.1029",
   "private": true,
   "scripts": {
     "dev": "vue-cli-service serve",

+ 15 - 0
cfc-web/public/CHANGELOG-v1.0.md

@@ -4,6 +4,21 @@
 
 ---
 
+## v1.0.1029 (2026-08-13)
+
+### 新功能
+- 成长页面四大打卡功能完整实现
+
+### 其他
+- - 修复饮食打卡检查接口(从 /api/diet/record/daily 改为 /api/health/meal/list)
+- - 修复心情打卡缺少 memberId 参数问题
+- - 统一 4 类打卡状态检查使用 createdAt/checkinDate 日期比较
+- - 修复 :key 表达式编译警告(report-blocks-renderer, gates)
+- - 移除今日打卡/本周调研快捷按钮,新增睡眠记录
+- - 移除饮食主页/饮食推荐独立卡片
+- 
+
+
 ## v1.0.1028 (2026-08-13)
 
 ### 重构

+ 16 - 1
cfc-web/public/CHANGELOG.md

@@ -1,6 +1,6 @@
 # 更新日志
 
-> 当前版本: v1.0.1028
+> 当前版本: v1.0.1029
 
 ## 历史版本
 
@@ -8,6 +8,21 @@
 
 ---
 
+## v1.0.1029 (2026-08-13)
+
+### 新功能
+- 成长页面四大打卡功能完整实现
+
+### 其他
+- - 修复饮食打卡检查接口(从 /api/diet/record/daily 改为 /api/health/meal/list)
+- - 修复心情打卡缺少 memberId 参数问题
+- - 统一 4 类打卡状态检查使用 createdAt/checkinDate 日期比较
+- - 修复 :key 表达式编译警告(report-blocks-renderer, gates)
+- - 移除今日打卡/本周调研快捷按钮,新增睡眠记录
+- - 移除饮食主页/饮食推荐独立卡片
+- 
+
+
 ## v1.0.1028 (2026-08-13)
 
 ### 重构