Procházet zdrojové kódy

merge: 解决 AdminNoticeController 冲突(保留 ne deleted 语义)

Xiaogang Liao před 1 měsícem
rodič
revize
1ed4f9b6c4

+ 6 - 0
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -8485,5 +8485,11 @@ private void runMigration100() {
 		} catch (Exception e) {
 			log.warn("创建notices表失败: " + e.getMessage());
 		}
+
+		// 迁移206: member_upgrade_records 添加审批字段(LIFETIME 授予审批需求,修复升级记录查询 Unknown column 500)
+		ensureColumn("member_upgrade_records", "approve_remark", "VARCHAR(500) DEFAULT NULL COMMENT '审批备注'");
+		ensureColumn("member_upgrade_records", "approve_status", "VARCHAR(20) DEFAULT 'approved' COMMENT '审批状态: approved/rejected'");
+		ensureColumn("member_upgrade_records", "approve_user_id", "BIGINT DEFAULT NULL COMMENT '审批人ID'");
+		ensureColumn("member_upgrade_records", "approve_time", "DATETIME DEFAULT NULL COMMENT '审批时间'");
 	}
 }

+ 1 - 1
cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminNoticeController.java

@@ -29,7 +29,7 @@ public class AdminNoticeController {
         String type = body.get("type") != null ? body.get("type").toString() : null;
 
         LambdaQueryWrapper<Notice> q = new LambdaQueryWrapper<>();
-        q.eq(Notice::getStatus, "deleted");
+        q.ne(Notice::getStatus, "deleted");
         if (status != null && !status.isEmpty()) q.eq(Notice::getStatus, status);
         if (type != null && !type.isEmpty()) q.eq(Notice::getType, type);
         q.orderByDesc(Notice::getCreatedAt);

+ 4 - 0
cfc-backend/src/main/resources/schema.sql

@@ -1494,6 +1494,10 @@ CREATE TABLE IF NOT EXISTS member_upgrade_records (
     order_id BIGINT DEFAULT NULL COMMENT '关联支付订单ID',
     consumption_amount BIGINT DEFAULT NULL COMMENT '触发升级的累计消费金额',
     expire_time DATETIME DEFAULT NULL COMMENT '家庭会员到期时间',
+    approve_remark VARCHAR(500) DEFAULT NULL COMMENT '审批备注',
+    approve_status VARCHAR(20) DEFAULT 'approved' COMMENT '审批状态: approved/rejected',
+    approve_user_id BIGINT DEFAULT NULL COMMENT '审批人ID',
+    approve_time DATETIME DEFAULT NULL COMMENT '审批时间',
     created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     INDEX idx_user (user_id),
     INDEX idx_order (order_id)

+ 125 - 0
cfc-frontend/components/DimensionIntroCard.vue

@@ -0,0 +1,125 @@
+<template>
+  <view class="dim-intro-card" :style="'background:' + bgGradient">
+    <view class="dim-intro-header">
+      <text class="dim-intro-icon">{{ icon }}</text>
+      <view class="dim-intro-text">
+        <text class="dim-intro-title">{{ dimName }}</text>
+        <text class="dim-intro-subtitle">{{ subtitle }}</text>
+      </view>
+    </view>
+    <view class="dim-intro-features">
+      <view class="dim-intro-feature" v-for="(f, i) in features" :key="i">
+        <text class="dim-intro-bullet">●</text>
+        <text class="dim-intro-feature-text">{{ f }}</text>
+      </view>
+    </view>
+    <view class="dim-intro-footer" v-if="learnMoreText">
+      <text class="dim-intro-link" @click="onLearnMore">{{ learnMoreText }}</text>
+    </view>
+  </view>
+</template>
+
+<script>
+var DIM_CONFIG = {
+  body:    { icon: '🌏', name: '身', subtitle: '科学管理全家健康数据', features: ['七维雷达图', '健康报告AI解读', '能量打卡', '精准营养方案'], gradient: 'linear-gradient(135deg, #FFF7ED, rgba(255,140,66,0.12))', color: '#FF8C42' },
+  mind:    { icon: '🔥', name: '心', subtitle: '关注全家心理健康与情绪成长', features: ['EMI心理测评', '情绪趋势追踪', '家庭天盘', '疏导工具'], gradient: 'linear-gradient(135deg, #FFF0F5, rgba(255,107,157,0.12))', color: '#FF6B9D' },
+  wisdom:  { icon: '⚡', name: '智', subtitle: '提升全家认知能力与学习效率', features: ['认知雷达图', '认知训练', '测评预约', '成长档案'], gradient: 'linear-gradient(135deg, #F0F0FF, rgba(99,102,241,0.12))', color: '#6366F1' },
+  action:  { icon: '🌿', name: '行', subtitle: '改善全家关系与沟通能力', features: ['关系质量问卷', '互动记录', '任务协作', '家庭挑战'], gradient: 'linear-gradient(135deg, #F0FFF4, rgba(16,185,129,0.12))', color: '#10B981' },
+  wealth:  { icon: '💧', name: '富', subtitle: '分享价值,收获财富', features: ['财富能量仪表盘', '推广收益统计', '邀请返利', '会员权益'], gradient: 'linear-gradient(135deg, #FFFBEB, rgba(245,158,11,0.12))', color: '#F59E0B' }
+}
+
+export default {
+  name: 'DimensionIntroCard',
+  props: {
+    dimCode: {
+      type: String,
+      required: true,
+      validator: function(v) { return DIM_CONFIG.hasOwnProperty(v) }
+    },
+    learnMoreText: {
+      type: String,
+      default: '了解更多 ›'
+    },
+    learnMoreUrl: {
+      type: String,
+      default: ''
+    }
+  },
+  computed: {
+    dimConfig: function() {
+      return DIM_CONFIG[this.dimCode]
+    },
+    icon: function() { return this.dimConfig.icon },
+    dimName: function() { return this.dimConfig.name },
+    subtitle: function() { return this.dimConfig.subtitle },
+    features: function() { return this.dimConfig.features },
+    bgGradient: function() { return this.dimConfig.gradient }
+  },
+  methods: {
+    onLearnMore: function() {
+      if (this.learnMoreUrl) {
+        uni.navigateTo({ url: this.learnMoreUrl })
+      }
+    }
+  }
+}
+</script>
+
+<style>
+.dim-intro-card {
+  margin: 16rpx 30rpx 0;
+  padding: 24rpx 28rpx;
+  border-radius: 16rpx;
+  box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.04);
+}
+.dim-intro-header {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  margin-bottom: 20rpx;
+}
+.dim-intro-icon {
+  font-size: 48rpx;
+  margin-right: 16rpx;
+}
+.dim-intro-text {
+  flex: 1;
+}
+.dim-intro-title {
+  font-size: 28rpx;
+  font-weight: bold;
+  color: #333;
+  display: block;
+}
+.dim-intro-subtitle {
+  font-size: 22rpx;
+  color: #666;
+  margin-top: 4rpx;
+  display: block;
+}
+.dim-intro-features {
+  margin-bottom: 16rpx;
+}
+.dim-intro-feature {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  margin-bottom: 8rpx;
+}
+.dim-intro-bullet {
+  font-size: 16rpx;
+  color: #999;
+  margin-right: 8rpx;
+}
+.dim-intro-feature-text {
+  font-size: 24rpx;
+  color: #333;
+}
+.dim-intro-footer {
+  text-align: right;
+}
+.dim-intro-link {
+  font-size: 24rpx;
+  color: #999;
+}
+</style>

+ 5 - 1
cfc-frontend/pages/action-detail/member-action-detail.vue

@@ -56,6 +56,9 @@
       @productClick="goProductDetail"
       @moreProducts="goMoreProducts" />
 
+    <!-- 行维度介绍卡片 -->
+    <DimensionIntroCard dimCode="action" v-if="isLoggedIn" learn-more-url="/pages/action-detail/dimension-intro" />
+
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
   </view>
@@ -67,10 +70,11 @@ 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 DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import { getEnergyOverview, getFamilyEnergySandbox, getChildren } from '../../utils/api.js'
 
 export default {
-  components: { FamilyEnergyBar, FamilyRelationGraph, DimensionTasks, DimensionActivities, DimensionProducts },
+  components: { FamilyEnergyBar, FamilyRelationGraph, DimensionTasks, DimensionActivities, DimensionProducts, DimensionIntroCard },
   data() {
     return {
       memberId: null,

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

@@ -95,6 +95,9 @@
 
       </view>
 
+    <!-- 身维度介绍卡片(登录后显示) -->
+    <DimensionIntroCard dimCode="body" v-if="isLoggedIn" learn-more-url="/pages/body-detail/dimension-intro" />
+
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
     <AIFloatingAvatar />
@@ -108,11 +111,12 @@ import LoginGuideCard from '../../components/LoginGuideCard.vue'
 import FamilyEnergyBar from '../../components/FamilyEnergyBar.vue'
 import RadarChart from '../../components/RadarChart.vue'
 import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
+import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
 import { getVisibleSections, getEnergyOverview, getChildren, getFamilyEnergySandbox, getVisibleFamilyMembers, getDimensionOverview } from '../../utils/api.js'
 
 export default {
-  components: { TabTransition, PageBanner, LoginGuideCard, FamilyEnergyBar, RadarChart, AIFloatingAvatar, FamilyMemberStrip },
+  components: { TabTransition, PageBanner, LoginGuideCard, FamilyEnergyBar, RadarChart, AIFloatingAvatar, FamilyMemberStrip, DimensionIntroCard },
   data() {
     return {
       isLoggedIn: false,
@@ -678,4 +682,18 @@ export default {
   font-size: 22rpx;
   color: #bbb;
 }
+
+/* 品牌定位语 */
+.brand-strap {
+  margin: 16rpx 30rpx 0;
+  padding: 20rpx 28rpx;
+  background: linear-gradient(135deg, #FFF7ED, rgba(255,140,66,0.12));
+  border-radius: 16rpx;
+  border-left: 4rpx solid #FF8C42;
+}
+.brand-strap-text {
+  font-size: 26rpx;
+  color: #9A3412;
+  font-weight: 500;
+}
 </style>

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

@@ -187,6 +187,11 @@
       tagline="家庭健康成长俱乐部"
       quote="给全家的一站式幸福提案" />
 
+    <!-- 品牌定位语 -->
+    <view class="brand-strap">
+      <text class="brand-strap-text">身 · 心 · 智 · 行 · 富 &nbsp;五维幸福成长</text>
+    </view>
+
     <!-- 五行沙盘预览 -->
     <wuxing-sandbox mode="preview" badgeText="登录查看完整报告" @point-click="handleLogin" />
 
@@ -1004,6 +1009,20 @@ export default {
   padding-bottom: 100rpx;
 }
 
+/* ===== 品牌定位语 ===== */
+.brand-strap {
+  margin: 16rpx 30rpx 0;
+  padding: 20rpx 28rpx;
+  background: linear-gradient(135deg, #FFF7ED, rgba(249,115,22,0.10));
+  border-radius: 16rpx;
+  border-left: 4rpx solid #F97316;
+}
+.brand-strap-text {
+  font-size: 26rpx;
+  color: #9A3412;
+  font-weight: 500;
+}
+
 /* ===== 会员入口卡(能量沙盘下方) ===== */
 .member-entry {
   display: flex;

+ 2 - 2
cfc-frontend/pages/membership/index.vue

@@ -79,10 +79,10 @@ export default {
       currentLevelName: '免费用户',
       features: ['折扣购物', '家庭管理', '推荐佣金', '专属活动', '任务特权', '成长报告'],
       compareData: [
-        { name: '商品折扣', free: '普通价格', family: '9折', premium: '8折' },
+        { name: '商品折扣', free: '普通价格', family: '会员折扣', premium: '会员折扣' },
         { name: '家庭管理', free: '基础功能', family: '全部功能', premium: '全部功能+优先响应' },
         { name: '管家服务', free: '—', family: '—', premium: '每周一次' },
-        { name: '推荐佣金', free: '不可参与', family: '最高15%', premium: '最高20%' },
+        { name: '推荐佣金', free: '不可参与', family: '可参与', premium: '可参与' },
         { name: '专属活动', free: '部分参与', family: '全部参与', premium: '优先参与' },
         { name: '成长报告', free: '月度', family: '每周+深度', premium: '每日+深度+专家解读' },
         { name: '任务配额', free: '每日5个', family: '不限量', premium: '不限量+优先审核' }

+ 68 - 130
cfc-frontend/pages/membership/upgrade.vue

@@ -1,17 +1,19 @@
 <template>
   <view class="upgrade-page-wrapper">
     <scroll-view class="page" scroll-y>
-      <!-- 当前会员状态卡片 -->
+      <!-- 当前会员状态 -->
       <view class="status-card">
-        <view class="status-badge" :class="isFree ? 'badge-free' : 'badge-family'">
-          <text class="badge-icon">{{ isFree ? '○' : '●' }}</text>
-          <text class="badge-text">{{ currentLevelName }}</text>
+        <view class="status-top">
+          <view class="status-badge" :class="isFree ? 'badge-free' : 'badge-family'">
+            <text class="badge-icon">{{ isFree ? '○' : '●' }}</text>
+            <text class="badge-text">{{ currentLevelName }}</text>
+          </view>
+          <text class="free-hint" v-if="isFree">开通会员解锁全部特权</text>
+          <text class="expiry-value" v-else-if="membership && membership.memberLevel !== 'FREE'">
+            {{ formatDate(membership.endDate) }} 到期
+          </text>
         </view>
         <view class="status-body" v-if="membership && membership.memberLevel !== 'FREE'">
-          <view class="expiry-row">
-            <text class="expiry-label">到期时间</text>
-            <text class="expiry-value">{{ formatDate(membership.endDate) }}</text>
-          </view>
           <view class="days-remaining" v-if="membership.isActive">
             <text class="days-num">{{ membership.daysRemaining || 0 }}</text>
             <text class="days-unit">天剩余</text>
@@ -20,30 +22,23 @@
             <text class="expired-text">会员已过期,续费恢复权益</text>
           </view>
         </view>
-        <view class="status-body" v-else>
-          <text class="free-hint">当前为免费版,开通会员解锁全部特权</text>
-        </view>
       </view>
 
       <!-- 等级切换 tabs -->
-      <view class="level-tabs" v-if="isFree">
-        <view class="level-tab" :class="selectedLevel === 'FAMILY' ? 'level-tab-active' : ''"
-          @click="selectLevel('FAMILY')">
-          <text class="level-tab-name">家庭会员</text>
-          <text class="level-tab-price">¥{{ getLevelYearlyPrice('FAMILY') }}/年</text>
-        </view>
-        <view class="level-tab" :class="selectedLevel === 'PREMIUM' ? 'level-tab-active' : ''"
-          @click="selectLevel('PREMIUM')">
-          <text class="level-tab-name">高级家庭会员</text>
-          <text class="level-tab-price">¥{{ getLevelYearlyPrice('PREMIUM') }}/年</text>
+      <view class="level-tabs" v-if="buyableLevels.length > 0">
+        <view class="level-tab" v-for="lv in buyableLevels" :key="lv.levelCode"
+          :class="selectedLevel === lv.levelCode ? 'level-tab-active' : ''"
+          @click="selectLevel(lv.levelCode)">
+          <text class="level-tab-name">{{ lv.levelName }}</text>
+          <text class="level-tab-price">¥{{ getLevelYearlyPrice(lv.levelCode) }}/年</text>
         </view>
       </view>
 
-      <!-- 家庭会员开通卡片 -->
-      <view class="upgrade-card" v-if="isFree">
+      <!-- 开通/升级卡片(免费用户开通,或已付费用户切换到其他等级时升级) -->
+      <view class="upgrade-card" v-if="isFree || selectedLevel !== currentMemberLevel">
         <view class="upgrade-header">
-          <text class="upgrade-title">{{ selectedLevel === 'FAMILY' ? '家庭会员' : '高级家庭会员' }}</text>
-          <text class="upgrade-subtitle">{{ selectedLevel === 'FAMILY' ? 'FAMILY' : 'PREMIUM' }}</text>
+          <text class="upgrade-title">{{ getSelectedLevelName() }}</text>
+          <text class="upgrade-subtitle">{{ selectedLevel }}</text>
         </view>
         <!-- 档位选择 -->
         <view class="period-tabs">
@@ -59,22 +54,10 @@
             <text class="period-original" v-if="showOriginalPrice(p.key)">¥{{ getOriginalPriceForPeriod(p.key) / 100 }}</text>
           </view>
         </view>
-        <view class="upgrade-price">
-          <text class="price-original-line" v-if="showOriginalPrice(selectedPeriod)">¥{{ getOriginalPriceForPeriod(selectedPeriod) / 100 }}</text>
-          <text class="price-symbol">¥</text>
-          <text class="price-amount">{{ getPriceForPeriod(selectedPeriod) }}</text>
-          <text class="price-unit">{{ getPeriodUnit() }}</text>
-        </view>
-        <view class="feature-list">
-          <view class="feature-item" v-for="(feature, idx) in features" :key="idx">
-            <text class="feature-check">✓</text>
-            <text class="feature-text">{{ feature }}</text>
-          </view>
-        </view>
         <button class="btn-upgrade" @click="goNext">下一步</button>
       </view>
 
-      <!-- 续费卡片 -->
+      <!-- 续费卡片(已付费用户保持当前等级) -->
       <view class="upgrade-card" v-else>
         <view class="upgrade-header">
           <text class="upgrade-title">续费会员</text>
@@ -94,12 +77,6 @@
             <text class="period-original" v-if="showOriginalPrice(p.key)">¥{{ getOriginalPriceForPeriod(p.key) / 100 }}</text>
           </view>
         </view>
-        <view class="upgrade-price">
-          <text class="price-original-line" v-if="showOriginalPrice(selectedPeriod)">¥{{ getOriginalPriceForPeriod(selectedPeriod) / 100 }}</text>
-          <text class="price-symbol">¥</text>
-          <text class="price-amount">{{ getPriceForPeriod(selectedPeriod) }}</text>
-          <text class="price-unit">{{ getPeriodUnit() }}</text>
-        </view>
         <button class="btn-upgrade btn-renew" @click="goNext">下一步</button>
       </view>
 
@@ -110,14 +87,14 @@
           <view class="compare-row header-row">
             <text class="compare-cell cell-feature">权益项</text>
             <text class="compare-cell cell-free">免费</text>
-            <text class="compare-cell cell-family active">家庭会员</text>
-            <text class="compare-cell cell-premium active">高级会员</text>
+            <text class="compare-cell cell-family" :class="selectedLevel === 'FAMILY' ? 'active' : ''">家庭会员</text>
+            <text class="compare-cell cell-premium" :class="selectedLevel === 'PREMIUM' ? 'active' : ''">高级会员</text>
           </view>
           <view class="compare-row" v-for="(item, idx) in compareData" :key="idx">
             <text class="compare-cell cell-feature">{{ item.name }}</text>
             <text class="compare-cell cell-free">{{ item.free }}</text>
-            <text class="compare-cell cell-family active">{{ item.family }}</text>
-            <text class="compare-cell cell-premium active">{{ item.premium }}</text>
+            <text class="compare-cell cell-family" :class="selectedLevel === 'FAMILY' ? 'active' : ''">{{ item.family }}</text>
+            <text class="compare-cell cell-premium" :class="selectedLevel === 'PREMIUM' ? 'active' : ''">{{ item.premium }}</text>
           </view>
         </view>
       </view>
@@ -156,14 +133,13 @@ export default {
       membership: null,
       levels: [],
       records: [],
-      features: ['折扣购物', '家庭管理', '推荐佣金', '专属活动', '任务特权', '成长报告'],
       isFree: true,
       currentLevelName: '免费用户',
       compareData: [
-        { name: '商品折扣', free: '普通价格', family: '9折', premium: '8折', lifetime: '全场最低价' },
+        { name: '商品折扣', free: '普通价格', family: '会员折扣', premium: '会员折扣', lifetime: '会员折扣' },
         { name: '家庭管理', free: '基础功能', family: '全部功能', premium: '全部功能+优先响应', lifetime: '全部功能+专属管家' },
         { name: '管家服务', free: '—', family: '—', premium: '每周一次', lifetime: '专属管家7×24h' },
-        { name: '推荐佣金', free: '不可参与', family: '最高15%', premium: '最高20%', lifetime: '最高25%+团队分红' },
+        { name: '推荐佣金', free: '不可参与', family: '可参与', premium: '可参与', lifetime: '可参与' },
         { name: '专属活动', free: '部分参与', family: '全部参与', premium: '优先参与', lifetime: 'VIP专属+定制活动' },
         { name: '成长报告', free: '月度', family: '每周+深度', premium: '每日+深度+专家解读', lifetime: '实时+AI专家深度解读' },
         { name: '任务配额', free: '每日5个', family: '不限量', premium: '不限量+优先审核', lifetime: '不限量+专属通道' }
@@ -175,10 +151,17 @@ export default {
       ],
       selectedPeriod: 'yearly',
       selectedLevel: 'FAMILY',
+      currentMemberLevel: 'FREE',
       joinRules: [],
     }
   },
   computed: {
+    buyableLevels() {
+      var self = this
+      return this.levels.filter(function(lv) {
+        return lv.levelCode !== 'FREE' && lv.levelCode !== 'LIFETIME' && lv.levelCode !== 'PROVIDER'
+      })
+    },
     visiblePeriods() {
       var self = this
       return this.periods.filter(function(p) {
@@ -215,6 +198,16 @@ export default {
       }
       return map[code] || code || ''
     },
+    getSelectedLevelName() {
+      var name = ''
+      for (var i = 0; i < this.levels.length; i++) {
+        if (this.levels[i].levelCode === this.selectedLevel) {
+          name = this.levels[i].levelName
+          break
+        }
+      }
+      return name || this.getLevelName(this.selectedLevel)
+    },
     getJoinRuleKey(rule, idx) {
       return rule.id + '-' + idx
     },
@@ -231,11 +224,14 @@ export default {
         this.membership = membershipRes.data
         if (this.membership && this.membership.memberLevel && this.membership.memberLevel !== 'FREE') {
           this.isFree = false
+          this.currentMemberLevel = this.membership.memberLevel
           this.currentLevelName = this.membership.levelName || '家庭会员'
           this.selectedLevel = this.membership.memberLevel
         } else {
           this.isFree = true
+          this.currentMemberLevel = 'FREE'
           this.currentLevelName = '免费用户'
+          this.selectedLevel = 'FAMILY'
         }
       } catch (e) {
         console.error('加载会员信息失败', e)
@@ -284,14 +280,6 @@ export default {
       if (periodKey === 'yearly') return plan.yearly ? (plan.yearly / 100).toFixed(0) : '0'
       return '0'
     },
-    getPeriodUnit: function() {
-      for (var i = 0; i < this.periods.length; i++) {
-        if (this.periods[i].key === this.selectedPeriod) {
-          return this.periods[i].unit
-        }
-      }
-      return '/年'
-    },
     goNext: function() {
       var levelCode = this.selectedLevel
       var period = this.selectedPeriod
@@ -339,8 +327,13 @@ export default {
 .status-card {
   background: linear-gradient(135deg, #F97316 0%, #EA580C 100%);
   border-radius: 20rpx;
-  padding: 40rpx;
-  margin-bottom: 30rpx;
+  padding: 26rpx 30rpx;
+  margin-bottom: 24rpx;
+}
+.status-top {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
 }
 .status-badge {
   display: inline-flex;
@@ -369,51 +362,42 @@ export default {
   font-weight: 600;
 }
 .status-body {
-  margin-top: 24rpx;
-}
-.expiry-row {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-}
-.expiry-label {
-  font-size: 26rpx;
-  color: rgba(255,255,255,0.8);
+  margin-top: 18rpx;
 }
 .expiry-value {
-  font-size: 28rpx;
+  font-size: 26rpx;
   color: #fff;
   font-weight: 500;
+  flex-shrink: 0;
 }
 .days-remaining {
   display: flex;
   align-items: baseline;
   justify-content: center;
-  margin-top: 20rpx;
+  margin-top: 14rpx;
 }
 .days-num {
-  font-size: 56rpx;
+  font-size: 44rpx;
   font-weight: bold;
   color: #FEF3C7;
 }
 .days-unit {
-  font-size: 26rpx;
+  font-size: 24rpx;
   color: rgba(255,255,255,0.7);
   margin-left: 8rpx;
 }
 .expired-msg {
   text-align: center;
-  margin-top: 16rpx;
+  margin-top: 12rpx;
 }
 .expired-text {
-  font-size: 26rpx;
+  font-size: 24rpx;
   color: #FEF3C7;
 }
 .free-hint {
-  font-size: 26rpx;
+  font-size: 24rpx;
   color: rgba(255,255,255,0.85);
-  text-align: center;
-  display: block;
+  flex-shrink: 0;
 }
 .lifetime-hint {
   font-size: 26rpx;
@@ -447,50 +431,6 @@ export default {
   margin-top: 6rpx;
   display: block;
 }
-.upgrade-price {
-  text-align: center;
-  margin: 24rpx 0;
-}
-.price-symbol {
-  font-size: 28rpx;
-  color: #F97316;
-  vertical-align: top;
-}
-.price-amount {
-  font-size: 64rpx;
-  font-weight: bold;
-  color: #F97316;
-  line-height: 1;
-}
-.price-unit {
-  font-size: 26rpx;
-  color: #94A3B8;
-  margin-left: 6rpx;
-}
-.feature-list {
-  margin: 24rpx 0;
-}
-.feature-item {
-  display: flex;
-  align-items: center;
-  padding: 12rpx 0;
-}
-.feature-check {
-  width: 40rpx;
-  height: 40rpx;
-  line-height: 40rpx;
-  text-align: center;
-  background: #F97316;
-  color: #fff;
-  border-radius: 50%;
-  font-size: 22rpx;
-  margin-right: 16rpx;
-  flex-shrink: 0;
-}
-.feature-text {
-  font-size: 28rpx;
-  color: #1E293B;
-}
 .btn-upgrade {
   width: 100%;
   height: 88rpx;
@@ -562,10 +502,12 @@ export default {
   color: #94A3B8;
 }
 .cell-family.active {
+  background: #FFEDD5;
   color: #F97316;
   font-weight: 600;
 }
 .cell-premium.active {
+  background: #EDE9FE;
   color: #8B5CF6;
   font-weight: 600;
 }
@@ -587,9 +529,11 @@ export default {
   color: #64748B;
 }
 .header-row .cell-family.active {
+  background: #FFEDD5;
   color: #F97316;
 }
 .header-row .cell-premium.active {
+  background: #EDE9FE;
   color: #8B5CF6;
 }
 
@@ -906,10 +850,4 @@ export default {
   text-decoration: line-through;
   margin-top: 2rpx;
 }
-.price-original-line {
-  font-size: 26rpx;
-  color: #94A3B8;
-  text-decoration: line-through;
-  margin-right: 12rpx;
-}
 </style>

+ 28 - 5
cfc-frontend/pages/mind-detail/index.vue

@@ -8,6 +8,11 @@
       tagline="心智成长 · 智慧人生"
       quote="知己知彼,百战不殆" />
 
+    <!-- 品牌定位语(登录前显示) -->
+    <view class="brand-strap" v-if="!isLoggedIn">
+      <text class="brand-strap-text">关注全家心理健康与情绪成长</text>
+    </view>
+
     <!-- ===== 家庭天盘模块(今日运势 / 今日心情 / 吉位) ===== -->
     <FamilyTianpanCard
       v-if="isLoggedIn"
@@ -29,11 +34,11 @@
     <!-- 游客登录引导卡 -->
     <template v-if="!isLoggedIn">
       <LoginGuideCard
-        title="登录后查看心理成长报告"
+        title="解锁心理成长报告"
         :items="[
-          '查看EMI心理测评四维分析',
-          '查看大五人格分析报告',
-          '阅读专属文章、参与情绪打卡'
+          '完成 EMI 心理测评,查看四维分析报告',
+          '大五人格测评 · 情绪趋势追踪',
+          '阅读专属心理文章,参与每日情绪打卡'
         ]" />
     </template>
 
@@ -128,6 +133,9 @@
       </view>
     </view>
 
+    <!-- 心维度介绍卡片(登录后显示) -->
+    <DimensionIntroCard dimCode="mind" v-if="isLoggedIn" learn-more-url="/pages/mind-detail/dimension-intro" />
+
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
     <AIFloatingAvatar />
@@ -138,6 +146,7 @@
 import TabTransition from '../../components/tab-transition.vue'
 import PageBanner from '../../components/PageBanner.vue'
 import LoginGuideCard from '../../components/LoginGuideCard.vue'
+import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import RadarChart from '../../components/RadarChart.vue'
 import FamilyEnergyBar from '../../components/FamilyEnergyBar.vue'
 import PsychCrisisBanner from '../../components/PsychCrisisBanner.vue'
@@ -149,7 +158,7 @@ import config from '../../config.js'
 import { parseDate } from '../../utils/format.js'
 
 export default {
-components: { TabTransition, PageBanner, RadarChart, LoginGuideCard, FamilyEnergyBar, PsychCrisisBanner, AIFloatingAvatar, FamilyTianpanCard, FamilyMemberStrip },
+components: { TabTransition, PageBanner, RadarChart, LoginGuideCard, FamilyEnergyBar, PsychCrisisBanner, AIFloatingAvatar, FamilyTianpanCard, FamilyMemberStrip, DimensionIntroCard },
   data() {
     return {
       isLoggedIn: false,
@@ -1937,4 +1946,18 @@ components: { TabTransition, PageBanner, RadarChart, LoginGuideCard, FamilyEnerg
   color: #6366F1;
   padding: 8rpx 16rpx;
 }
+
+/* 品牌定位语 */
+.brand-strap {
+  margin: 16rpx 30rpx 0;
+  padding: 20rpx 28rpx;
+  background: linear-gradient(135deg, #FFF0F5, rgba(255,107,157,0.12));
+  border-radius: 16rpx;
+  border-left: 4rpx solid #FF6B9D;
+}
+.brand-strap-text {
+  font-size: 26rpx;
+  color: #9D174D;
+  font-weight: 500;
+}
 </style>

+ 76 - 111
cfc-frontend/pages/profile-main/profile.vue

@@ -5,8 +5,9 @@
     <view v-if="!isLoggedIn" class="login-prompt">
       <text class="prompt-icon">👤</text>
       <text class="prompt-title">登录浠艾福</text>
-      <text class="prompt-desc">登录后查看个人资料、积分记录</text>
+      <text class="prompt-desc">登录后查看个人资料、积分记录、能量数据与家庭管理</text>
       <button class="login-btn" @click="goLogin">登录 / 注册</button>
+      <text class="skip-link" @click="goSkip">暂不登录,先逛逛 ›</text>
     </view>
 
     <!-- 已登录 -->
@@ -29,11 +30,18 @@
               <text class="role-tag">{{ roleLabel }}</text>
             </view>
             <view class="user-sub" v-if="memberLevel">
-              <text class="level-badge" :class="'level-' + memberLevel">{{ memberLevelText }}</text>
-              <text v-if="membershipDays > 0 && membershipDays <= 30" class="days-left">剩余 {{ membershipDays }} 天</text>
+              <view class="level-badge" :class="'level-' + memberLevel">{{ memberLevelText }}</view>
+              <text v-if="isLifetime" class="days-left">永久有效</text>
+              <text v-else-if="membershipDays > 0 && membershipDays <= 30" class="days-left">剩余 {{ membershipDays }} 天</text>
+              <view v-if="hasUpgradeSpace" class="upgrade-btn" @click="goUpgrade">
+                <text class="upgrade-btn-text">{{ upgradeBtnText }}</text>
+              </view>
             </view>
             <view class="user-sub" v-else>
               <text class="days-left">开通会员解锁更多权益</text>
+              <view class="upgrade-btn" @click="goUpgrade">
+                <text class="upgrade-btn-text">立即开通</text>
+              </view>
             </view>
           </view>
         </view>
@@ -120,22 +128,6 @@
         </view>
       </view>
 
-      <!-- 五维能量 -->
-      <view class="energy-section" v-if="sandboxData">
-        <view class="section-header">
-          <text class="section-title">🌟 五维能量</text>
-          <text class="section-more" @click="goToEnergySandbox">详情 ›</text>
-        </view>
-        <view class="energy-row">
-          <view class="energy-item" v-for="dim in energyDims" :key="dim.code">
-            <view class="energy-circle" :style="{ background: dim.color }">
-              <text class="energy-val">{{ dim.score || 0 }}</text>
-            </view>
-            <text class="energy-label">{{ dim.label }}</text>
-          </view>
-        </view>
-      </view>
-
       <!-- 待办提醒 -->
       <view class="reminders-section" v-if="hasReminders">
         <view class="section-header">
@@ -260,7 +252,7 @@
 <script>
 import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
 import {
-  getChildren, getVisibleFamilyMembers, getFamilyEnergySandbox,
+  getChildren, getVisibleFamilyMembers,
   getTodayTasksByCategory, getChallengeList, getMyMembership,
   verifyPassword, getPointsBalance, getUserInfo,
   cartCount, getOrderCounts, getCommissionSummary, getReferralSummary
@@ -282,8 +274,6 @@ export default {
       familyCount: 0,
       activeChallenges: 0,
       profileProgress: 0,
-      sandboxData: null,
-      energyDims: [],
       // 商城
       cartCount: 0,
       orderPending: 0,
@@ -305,16 +295,26 @@ export default {
       return map[this.role] || '用户'
     },
     memberLevelText() {
-      var map = { GOLD: '金卡', PLATINUM: '白金', DIAMOND: '钻石' }
+      var map = { FREE: '免费用户', FAMILY: '家庭会员', PREMIUM: '高级会员', LIFETIME: '终身会员' }
       return map[this.memberLevel] || this.memberLevel || ''
     },
+    isLifetime() {
+      return this.memberLevel === 'LIFETIME'
+    },
+    // 有升级空间:FREE(开通) / FAMILY(升PREMIUM);PREMIUM已是最高可购买等级,LIFETIME永久有效
+    hasUpgradeSpace() {
+      return this.memberLevel === 'FREE' || this.memberLevel === 'FAMILY'
+    },
+    upgradeBtnText() {
+      return this.memberLevel === 'FAMILY' ? '升级' : '立即开通'
+    },
     hasReminders() {
       return this.pendingTasks > 0 || this.activeChallenges > 0 || this.profileProgress < 14
     }
   },
   onShow() {
     if (!this.isLoggedIn) {
-      this.loadAllData()
+      // 未登录:不调用任何需登录接口,仅显示登录引导
       return
     }
     var role = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || 'parent'
@@ -333,7 +333,6 @@ export default {
       this.loadMembership()
       this.loadPoints()
       this.loadFamily()
-      this.loadSandbox()
       this.loadTasks()
       this.loadChallenges()
       this.loadOrderCounts()
@@ -381,23 +380,6 @@ export default {
         self.familyCount = 0
       })
     },
-    loadSandbox() {
-      var self = this
-      getFamilyEnergySandbox().then(function(res) {
-        if (res && res.data) {
-          self.sandboxData = res.data
-          var dims = res.data.dimensions || []
-          self.energyDims = dims.map(function(d) {
-            return {
-              code: d.code,
-              label: d.label || d.code,
-              score: d.score || 0,
-              color: self.getDimColor(d.code)
-            }
-          })
-        }
-      }).catch(function() {})
-    },
     loadTasks() {
       var self = this
       var memberId = uni.getStorageSync('currentChildId') || uni.getStorageSync('userId')
@@ -461,6 +443,9 @@ export default {
     goLogin: function() {
       uni.navigateTo({ url: '/pages/login/login' })
     },
+    goSkip: function() {
+      uni.switchTab({ url: '/pages/index-home/index' })
+    },
     goToEditInfo: function() {
       uni.navigateTo({ url: '/pages/user-edit/user-edit' })
     },
@@ -491,9 +476,12 @@ export default {
     goToReport: function() {
       uni.navigateTo({ url: '/pages/profile/report-management' })
     },
-    goToMembership: function() {
-      uni.navigateTo({ url: '/pages/membership/index' })
-    },
+  goToMembership: function() {
+    uni.navigateTo({ url: '/pages/membership/index' })
+  },
+  goUpgrade: function() {
+    uni.navigateTo({ url: '/pages/membership/upgrade' })
+  },
     goToPromotion: function() {
       uni.navigateTo({ url: '/pages/promotion/index' })
     },
@@ -506,9 +494,6 @@ export default {
     goToCoupons: function() {
       uni.navigateTo({ url: '/pages/profile-extra/coupons' })
     },
-    goToEnergySandbox: function() {
-      uni.switchTab({ url: '/pages/index-home/index' })
-    },
     goToSettings: function() {
       uni.showActionSheet({
         itemList: ['设置密码', '隐私设置', '关于浠艾福'],
@@ -649,7 +634,7 @@ export default {
 }
 .prompt-icon { font-size: 100rpx; margin-bottom: 30rpx; }
 .prompt-title { font-size: 40rpx; font-weight: bold; color: #333; margin-bottom: 16rpx; }
-.prompt-desc { font-size: 26rpx; color: #999; margin-bottom: 60rpx; }
+.prompt-desc { font-size: 26rpx; color: #999; margin-bottom: 20rpx; }
 .login-btn {
   background: linear-gradient(135deg, #667eea, #764ba2);
   color: #fff;
@@ -657,6 +642,12 @@ export default {
   font-size: 30rpx;
   padding: 24rpx 80rpx;
 }
+.skip-link {
+  font-size: 26rpx;
+  color: #999;
+  margin-top: 24rpx;
+  text-decoration: underline;
+}
 
 /* 退出切换 */
 .exit-switch {
@@ -731,19 +722,45 @@ export default {
   gap: 12rpx;
 }
 .level-badge {
-  font-size: 26rpx;
-  padding: 6rpx 20rpx;
-  border-radius: 20rpx;
+  font-size: 24rpx;
+  padding: 8rpx 22rpx;
+  border-radius: 24rpx;
   font-weight: bold;
-  box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.15);
-  border: 2rpx solid rgba(255,255,255,0.3);
+  box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.2);
+  border: 2rpx solid rgba(255,255,255,0.35);
+  display: flex;
+  align-items: center;
+  gap: 6rpx;
+}
+.level-badge::before {
+  content: '👑';
+  font-size: 20rpx;
+}
+.level-FREE { background: linear-gradient(135deg, #9CA3AF, #6B7280); color: #fff; }
+.level-FREE::before { content: ''; }
+.level-FAMILY { background: linear-gradient(135deg, #F59E0B, #D97706); color: #fff; }
+.level-PREMIUM { background: linear-gradient(135deg, #6366F1, #4F46E5); color: #fff; }
+.level-LIFETIME {
+  background: linear-gradient(135deg, #EC4899, #DB2777);
+  color: #fff;
+  box-shadow: 0 4rpx 16rpx rgba(236,72,153,0.45);
+  border-color: rgba(255,255,255,0.55);
 }
-.level-GOLD { background: linear-gradient(135deg, #F59E0B, #D97706); color: #fff; }
-.level-PLATINUM { background: linear-gradient(135deg, #6366F1, #4F46E5); color: #fff; }
-.level-DIAMOND { background: linear-gradient(135deg, #EC4899, #DB2777); color: #fff; }
 .days-left {
-  font-size: 24rpx;
-  color: rgba(255,255,255,0.8);
+  font-size: 22rpx;
+  color: rgba(255,255,255,0.85);
+}
+.upgrade-btn {
+  background: rgba(255,255,255,0.22);
+  border: 2rpx solid rgba(255,255,255,0.6);
+  border-radius: 22rpx;
+  padding: 8rpx 24rpx;
+  flex-shrink: 0;
+}
+.upgrade-btn-text {
+  font-size: 22rpx;
+  font-weight: bold;
+  color: #fff;
 }
 .user-card-right {
   display: flex;
@@ -790,58 +807,6 @@ export default {
   background: #f0f0f0;
 }
 
-/* 五维能量 */
-.energy-section {
-  margin: 0 30rpx 20rpx;
-  background: #fff;
-  border-radius: 20rpx;
-  padding: 28rpx;
-  box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.06);
-}
-.section-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 20rpx;
-}
-.section-title {
-  font-size: 30rpx;
-  font-weight: bold;
-  color: #333;
-}
-.section-more {
-  font-size: 24rpx;
-  color: #999;
-}
-.energy-row {
-  display: flex;
-  justify-content: space-around;
-}
-.energy-item {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  gap: 10rpx;
-}
-.energy-circle {
-  width: 88rpx;
-  height: 88rpx;
-  border-radius: 50%;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  box-shadow: 0 4rpx 16rpx rgba(0,0,0,0.15);
-}
-.energy-val {
-  font-size: 28rpx;
-  font-weight: bold;
-  color: #fff;
-}
-.energy-label {
-  font-size: 24rpx;
-  color: #666;
-}
-
 /* 待办提醒 */
 .reminders-section {
   margin: 0 30rpx 20rpx;

+ 106 - 4
cfc-frontend/pages/wealth/index.vue

@@ -9,10 +9,37 @@
         tagline="利他创富 · 价值共享"
         quote="富足源于利他与坚持" />
 
+      <!-- 品牌定位语 -->
+      <view class="brand-strap">
+        <text class="brand-strap-text">分享价值,收获财富</text>
+      </view>
+
       <!-- 登录引导 -->
       <view class="login-guide-section">
-        <text class="login-guide-text">登录后查看财富能量、推广收益、邀请返利等更多内容</text>
-        <button class="login-btn" @click="goLogin">登录 / 注册</button>
+        <LoginGuideCard
+          title="解锁财富能量与推广收益"
+          :items="[
+            '查看家庭财富能量仪表盘与推广收益',
+            '管理邀请返利,开通会员享专属折扣',
+            '浏览商城精选商品,一键加入购物车'
+          ]" />
+      </view>
+
+      <!-- 商城精选预览(无需登录) -->
+      <view class="section">
+        <view class="section-header">
+          <text class="section-title">🛍️ 商城精选</text>
+          <text class="section-more" @click="goToShop">查看全部 ›</text>
+        </view>
+        <scroll-view scroll-x class="product-scroll" show-scrollbar="false">
+          <view class="product-list">
+            <view class="product-card" v-for="(item, idx) in guestProducts" :key="idx" @click="goProductDetail(item.id)">
+              <image class="product-img" :src="item.image || '/static/default-product.png'" mode="aspectFill" />
+              <text class="product-name">{{ item.name }}</text>
+              <text class="product-price">¥{{ item.price || 0 }}</text>
+            </view>
+          </view>
+        </scroll-view>
       </view>
     </template>
 
@@ -152,11 +179,18 @@
           <text>👤 个人中心</text>
           <text class="arrow">›</text>
         </view>
+        <view class="menu-item" @click="goToPointsLogs">
+          <text>📊 积分记录</text>
+          <text class="arrow">›</text>
+        </view>
         <view class="menu-item logout-item" @click="logout">
           <text>🚪 退出登录</text>
           <text class="arrow">›</text>
         </view>
       </view>
+
+      <!-- 富维度介绍卡片 -->
+      <DimensionIntroCard dimCode="wealth" v-if="isLoggedIn" learn-more-url="/pages/wealth/dimension-intro" />
     </template>
   </view>
 </template>
@@ -168,17 +202,19 @@ 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 DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import {
   getChildren,
   getWealthDetail,
   getReferralCode,
   getReferralSummary,
   getCommissionSummary,
-  getVisibleFamilyMembers
+  getVisibleFamilyMembers,
+  productList
 } from '../../utils/api.js'
 
 export default {
-  components: { TabTransition, PageBanner, WealthEnergyRing, WealthSubScores, BodyWealthAlert, FamilyMemberStrip },
+  components: { TabTransition, PageBanner, WealthEnergyRing, WealthSubScores, BodyWealthAlert, FamilyMemberStrip, DimensionIntroCard },
   data() {
     return {
       showTabTransition: true,
@@ -230,6 +266,7 @@ export default {
       children: [],
       familyMembersVisible: [],
       selectedMemberId: null,
+      guestProducts: [],
     }
   },
   computed: {
@@ -258,6 +295,7 @@ export default {
     var token = uni.getStorageSync('token')
     if (!token) {
       this.isLoggedIn = false
+      this.loadGuestProducts()
       this._watchPageReady()
       return
     }
@@ -426,6 +464,17 @@ export default {
     goToCart() {
       uni.navigateTo({ url: '/pages/shop/cart/cart' })
     },
+    loadGuestProducts() {
+      var self = this
+      productList({ page: 1, size: 4, sort: 'sales' }).then(function(res) {
+        if (res.code === 200 && res.data && res.data.records) {
+          self.guestProducts = res.data.records.slice(0, 4)
+        }
+      }).catch(function() {})
+    },
+    goProductDetail(id) {
+      uni.navigateTo({ url: '/pages/shop/detail/detail?id=' + id })
+    },
     onServiceClick(action) {
       if (this[action]) {
         this[action]()
@@ -776,4 +825,57 @@ export default {
 .login-prompt .login-btn::after {
   border: none;
 }
+
+/* 品牌定位语 */
+.brand-strap {
+  margin: 16rpx 30rpx 0;
+  padding: 20rpx 28rpx;
+  background: linear-gradient(135deg, #FFFBEB, rgba(245,158,11,0.12));
+  border-radius: 16rpx;
+  border-left: 4rpx solid #F59E0B;
+}
+.brand-strap-text {
+  font-size: 26rpx;
+  color: #92400E;
+  font-weight: 500;
+}
+
+/* 商城精选预览 */
+.product-scroll {
+  white-space: nowrap;
+  padding: 0 30rpx;
+}
+.product-list {
+  display: inline-flex;
+  gap: 20rpx;
+}
+.product-card {
+  width: 220rpx;
+  flex-shrink: 0;
+  background: #fff;
+  border-radius: 16rpx;
+  overflow: hidden;
+  box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.06);
+}
+.product-img {
+  width: 220rpx;
+  height: 220rpx;
+  background: #f5f5f5;
+}
+.product-name {
+  display: block;
+  padding: 12rpx 12rpx 4rpx;
+  font-size: 24rpx;
+  color: #333;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.product-price {
+  display: block;
+  padding: 4rpx 12rpx 12rpx;
+  font-size: 26rpx;
+  font-weight: bold;
+  color: #F59E0B;
+}
 </style>

+ 29 - 6
cfc-frontend/pages/wisdom-detail/index.vue

@@ -8,6 +8,11 @@
       tagline="学以启智 · 慧及未来"
       quote="知者不惑,仁者不忧" />
 
+    <!-- 品牌定位语(登录前显示) -->
+    <view class="brand-strap" v-if="!isLoggedIn">
+      <text class="brand-strap-text">提升全家认知能力与学习效率</text>
+    </view>
+
     <!-- 2. 认知雷达图(始终显示,无数据时仅显示人群平均值) -->
     <view class="section">
       <view class="section-header">
@@ -36,11 +41,11 @@
     <!-- 3. 游客专属区块 -->
     <template v-if="!isLoggedIn">
       <LoginGuideCard
-        title="登录后查看全家智慧成长数据"
+        title="解锁认知成长数据"
         :items="[
-          '查看全家认知能量数据和测评报告',
-          '记录每日成长,获取智慧能量',
-          '参与认知训练,提升综合能力'
+          '查看全家认知雷达图与测评报告',
+          '完成认知训练,持续提升思维能力',
+          '预约专业测评,获取个性化成长建议'
         ]" />
     </template>
 
@@ -98,11 +103,14 @@
         <text class="action-text">测评预约</text>
       </view>
       <view class="action-btn" @click="goDanUpload">
-        <text class="action-icon">&#x1F4C4;</text>
+        <text class="action-icon">📄</text>
         <text class="action-text">上传报告</text>
       </view>
     </view>
 
+    <!-- 智维度介绍卡片(登录后显示) -->
+    <DimensionIntroCard dimCode="wisdom" v-if="isLoggedIn" learn-more-url="/pages/wisdom-detail/dimension-intro" />
+
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
     <AIFloatingAvatar />
@@ -118,11 +126,12 @@ import RadarChart from '../../components/RadarChart.vue'
 import FamilyEnergyBar from '../../components/FamilyEnergyBar.vue'
 import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
 import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
+import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import { getVisibleSections, getChildren, getFamilyEnergySandbox, getAssessmentLatestResult, getDanReportByChild } from '../../utils/api.js'
 import { parseDate } from '../../utils/format.js'
 
 export default {
-  components: { TabTransition, PageBanner, LoginGuideCard, RadarChart, FamilyEnergyBar, AIFloatingAvatar, FamilyMemberStrip },
+  components: { TabTransition, PageBanner, LoginGuideCard, RadarChart, FamilyEnergyBar, AIFloatingAvatar, FamilyMemberStrip, DimensionIntroCard },
   data() {
     return {
       isLoggedIn: false,
@@ -529,4 +538,18 @@ export default {
   color: #94A3B8;
   margin-left: 12rpx;
 }
+
+/* 品牌定位语 */
+.brand-strap {
+  margin: 16rpx 30rpx 0;
+  padding: 20rpx 28rpx;
+  background: linear-gradient(135deg, #F0F0FF, rgba(99,102,241,0.12));
+  border-radius: 16rpx;
+  border-left: 4rpx solid #6366F1;
+}
+.brand-strap-text {
+  font-size: 26rpx;
+  color: #3730A3;
+  font-weight: 500;
+}
 </style>

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-9a7a60b5f5c5e227f45965c956fb4299e2b6a50b
+2330831c35ee261bbbef62cfead967cef148c2ea

+ 2 - 2
cfc-web/package-lock.json

@@ -1,12 +1,12 @@
 {
   "name": "cfc-web",
-  "version": "1.0.905",
+  "version": "1.0.909",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "cfc-web",
-      "version": "1.0.905",
+      "version": "1.0.909",
       "dependencies": {
         "@wangeditor/editor": "^5.1.23",
         "@wangeditor/editor-for-vue": "^1.0.2",

+ 1 - 1
cfc-web/package.json

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

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

@@ -4,6 +4,46 @@
 
 ---
 
+## v1.0.910 (2026-08-09)
+
+### 新功能
+- 会员中心权益对比文案与个人中心会员卡升级入口
+- 会员升级页移除功能列表、权益对比列联动高亮、状态卡片紧凑化
+- member_upgrade_records 增加 approve_* 审核列迁移
+
+### 其他
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+
+
+## v1.0.909 (2026-08-09)
+
+### 新功能
+- 首页新增品牌定位语区块
+
+
+## v1.0.908 (2026-08-09)
+
+### 新功能
+- 添加DimensionIntroCard组件 + 四个维度页插入介绍卡片
+
+
+## v1.0.907 (2026-08-09)
+
+### 新功能
+- 登录前页面改版 - 五维品牌定位语+LoginGuideCard升级+我的页跳过入口+富维度商城预览
+
+
+## v1.0.906 (2026-08-09)
+
+### Bug 修复
+- AdminNoticeController LambdaQueryWrapper eq方法参数类型错误
+
+
 ## v1.0.905 (2026-08-09)
 
 ### 文档

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

@@ -1,6 +1,6 @@
 # 更新日志
 
-> 当前版本: v1.0.905
+> 当前版本: v1.0.910
 
 ## 历史版本
 
@@ -8,6 +8,46 @@
 
 ---
 
+## v1.0.910 (2026-08-09)
+
+### 新功能
+- 会员中心权益对比文案与个人中心会员卡升级入口
+- 会员升级页移除功能列表、权益对比列联动高亮、状态卡片紧凑化
+- member_upgrade_records 增加 approve_* 审核列迁移
+
+### 其他
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+
+
+## v1.0.909 (2026-08-09)
+
+### 新功能
+- 首页新增品牌定位语区块
+
+
+## v1.0.908 (2026-08-09)
+
+### 新功能
+- 添加DimensionIntroCard组件 + 四个维度页插入介绍卡片
+
+
+## v1.0.907 (2026-08-09)
+
+### 新功能
+- 登录前页面改版 - 五维品牌定位语+LoginGuideCard升级+我的页跳过入口+富维度商城预览
+
+
+## v1.0.906 (2026-08-09)
+
+### Bug 修复
+- AdminNoticeController LambdaQueryWrapper eq方法参数类型错误
+
+
 ## v1.0.905 (2026-08-09)
 
 ### 文档