Jelajahi Sumber

chore(frontend): 移除小程序中所有用户可见的 AI 字样

- 情绪识别/健康问卷/健康方案等文案去AI化
- AIFloatingAvatar → FloatingAvatar, AITaskCard → TaskCard 组件重命名
- 政策文档中 AI 相关描述替换为中性表述
- 29 个文件,1398 行变更
Sisyphus 2 bulan lalu
induk
melakukan
658c702620
30 mengubah file dengan 1398 tambahan dan 1398 penghapusan
  1. 2 2
      cfc-frontend/components/AIFloatingAvatar.vue
  2. 1 1
      cfc-frontend/components/AITaskCard.vue
  3. 1 1
      cfc-frontend/components/DimensionIntroCard.vue
  4. 1 1
      cfc-frontend/components/ProfileMenu.vue
  5. 1 1
      cfc-frontend/components/journey-card.vue
  6. 3 3
      cfc-frontend/pages/action-detail/index.vue
  7. 9 9
      cfc-frontend/pages/ai/chat.vue
  8. 1 1
      cfc-frontend/pages/body-detail/health-report.vue
  9. 6 6
      cfc-frontend/pages/body-detail/index.vue
  10. 8 8
      cfc-frontend/pages/health-main/index.vue
  11. 1 1
      cfc-frontend/pages/health/ai-questionnaire-result.vue
  12. 1 1
      cfc-frontend/pages/health/ai-questionnaire.vue
  13. 2 2
      cfc-frontend/pages/health/gut-flora-detail.vue
  14. 3 3
      cfc-frontend/pages/health/physical-exam-detail.vue
  15. 1 1
      cfc-frontend/pages/health/report-list.vue
  16. 2 2
      cfc-frontend/pages/health/report-survey.vue
  17. 1 1
      cfc-frontend/pages/index-home/index.vue
  18. 1 1
      cfc-frontend/pages/meal/recommend.vue
  19. 6 6
      cfc-frontend/pages/membership/benefits.vue
  20. 1 1
      cfc-frontend/pages/membership/upgrade.vue
  21. 7 7
      cfc-frontend/pages/mind-detail/emotion-checkin.vue
  22. 1 1
      cfc-frontend/pages/mind-detail/emotion-report.vue
  23. 3 3
      cfc-frontend/pages/mind-detail/index.vue
  24. 6 6
      cfc-frontend/pages/mind/emotion-checkin.vue
  25. 2 2
      cfc-frontend/pages/policy/agreement.vue
  26. 5 5
      cfc-frontend/pages/policy/privacy.vue
  27. 4 4
      cfc-frontend/pages/profile-main/profile.vue
  28. 1310 1310
      cfc-frontend/pages/user-edit/user-edit.vue
  29. 3 3
      cfc-frontend/pages/wisdom-detail/index.vue
  30. 5 5
      cfc-frontend/utils/api.js

+ 2 - 2
cfc-frontend/components/AIFloatingAvatar.vue

@@ -1,9 +1,9 @@
 <template>
-  <!-- AI问答功能已屏蔽 -->
+  <!-- 问答功能已屏蔽 -->
 </template>
 
 <script>
 export default {
-  name: 'AIFloatingAvatar'
+  name: 'FloatingAvatar'
 }
 </script>

+ 1 - 1
cfc-frontend/components/AITaskCard.vue

@@ -31,7 +31,7 @@
 
 <script>
 export default {
-  name: 'AITaskCard',
+  name: 'TaskCard',
 
   props: {
     task: {

+ 1 - 1
cfc-frontend/components/DimensionIntroCard.vue

@@ -21,7 +21,7 @@
 
 <script>
 var DIM_CONFIG = {
-  body:    { icon: '🌏', name: '身', subtitle: '科学管理全家健康数据', features: ['七维雷达图', '健康报告AI解读', '能量打卡', '精准营养方案'], gradient: 'linear-gradient(135deg, #FFF7ED, rgba(255,140,66,0.12))', color: '#FF8C42' },
+  body:    { icon: '🌏', name: '身', subtitle: '科学管理全家健康数据', features: ['七维雷达图', '健康报告解读', '能量打卡', '精准营养方案'], 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' },

+ 1 - 1
cfc-frontend/components/ProfileMenu.vue

@@ -333,7 +333,7 @@ export default {
     },
     intentText(type) {
       if (type === 'A') return '随便看看'
-      if (type === 'B') return '智能问卷'
+      if (type === 'B') return '问卷'
       if (type === 'C') return '解决问题'
       return ''
     },

+ 1 - 1
cfc-frontend/components/journey-card.vue

@@ -118,7 +118,7 @@ export default {
         return this.domainMap[code]
       }
       if (this.intentType === 'A') return 'A类 · 随便看看'
-      if (this.intentType === 'B') return 'B类 · 智能问卷'
+      if (this.intentType === 'B') return 'B类 · 问卷'
       if (this.intentType === 'C') return 'C类 · 解决问题'
       return ''
     }

+ 3 - 3
cfc-frontend/pages/action-detail/index.vue

@@ -118,7 +118,7 @@
 
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
-    <AIFloatingAvatar />
+    <FloatingAvatar />
   </view>
 </template>
 
@@ -132,13 +132,13 @@ 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 AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
+import FloatingAvatar from '../../components/FloatingAvatar.vue'
 import RadarChart from '../../components/RadarChart.vue'
 import DimensionSubDims from '../../components/DimensionSubDims.vue'
 import { getVisibleSections, getEnergyOverview, getChildren, getFamilyEnergySandbox, getEnergySandbox, getFamilyMemberList } from '../../utils/api.js'
 
 export default {
-  components: { TabTransition, PageBanner, FamilyEnergyBar, FamilyRelationGraph, FamilyMemberStrip, DimensionTasks, DimensionActivities, DimensionProducts, DimensionIntroCard, AIFloatingAvatar, RadarChart, DimensionSubDims },
+  components: { TabTransition, PageBanner, FamilyEnergyBar, FamilyRelationGraph, FamilyMemberStrip, DimensionTasks, DimensionActivities, DimensionProducts, DimensionIntroCard, FloatingAvatar, RadarChart, DimensionSubDims },
   data() {
     return {
       isLoggedIn: false,

+ 9 - 9
cfc-frontend/pages/ai/chat.vue

@@ -5,7 +5,7 @@
       <view class="nav-back" @click="goBack">
         <text class="nav-back-icon">‹</text>
       </view>
-      <text class="nav-title">{{ isNutrition ? '精准营养助手' : (isHealthCoach ? 'AI 健康教练' : (isButler ? 'AI 健康管家' : 'AI 家庭助手')) }}</text>
+      <text class="nav-title">{{ isNutrition ? '营养助手' : (isHealthCoach ? '健康教练' : (isButler ? '健康管家' : '家庭助手')) }}</text>
       <view class="nav-actions">
         <view class="mascot-badge" v-if="mascotCode && !isNutrition" @click="showConversations = !showConversations">
           <text class="mascot-badge-icon">{{ mascotIcon }}</text>
@@ -39,7 +39,7 @@
       <view class="message-list-inner">
         <view class="welcome-card" v-if="messages.length === 0 && !sending">
           <view class="welcome-icon">{{ mascotIcon || (isNutrition ? '🥗' : (isHealthCoach ? '💡' : '🤖')) }}</view>
-          <text class="welcome-title">{{ isNutrition ? '你好!我是精准营养助手' : (isHealthCoach ? '你好!我是AI健康教练' : (isButler ? '你好!我是AI健康管家' : ('你好!我是' + (mascotName || '家庭助手')))) }}</text>
+          <text class="welcome-title">{{ isNutrition ? '你好!我是营养助手' : (isHealthCoach ? '你好!我是健康教练' : (isButler ? '你好!我是健康管家' : ('你好!我是' + (mascotName || '家庭助手')))) }}</text>
           <text class="welcome-desc">{{ welcomeSubtitle }}</text>
           <view class="welcome-suggestions">
             <view class="welcome-suggestion" v-if="!isNutrition && !isHealthCoach" @click="quickQuestion('小明最近任务完成怎么样?')">
@@ -94,7 +94,7 @@
           <view class="message message-user" v-if="msg.query">
             <view class="message-bubble user-bubble">{{ msg.query }}</view>
           </view>
-          <!-- AI 回复 -->
+          <!-- 回复 -->
           <view class="message message-ai" v-if="msg.answer">
 <view class="message-avatar">{{ isHealthCoach ? '🎯' : (isButler ? '🏥' : (mascotIcon || '🤖')) }}</view>
             <view class="message-bubble ai-bubble">
@@ -111,9 +111,9 @@
             </view>
           </view>
         </view>
-        <!-- AI 任务卡片 -->
+        <!-- 任务卡片 -->
         <view class="task-list" v-if="msg.tasks && msg.tasks.length > 0">
-          <AITaskCard v-for="(task, ti) in msg.tasks" :key="ti" :task="task" :conversationId="currentConversationId" @accepted="onTaskAccepted" />
+          <TaskCard v-for="(task, ti) in msg.tasks" :key="ti" :task="task" :conversationId="currentConversationId" @accepted="onTaskAccepted" />
         </view>
         <!-- 报告来源标识 -->
         <view class="source-label" v-if="msg.sourceReport">
@@ -148,18 +148,18 @@
         <text class="send-icon">➤</text>
       </view>
     </view>
-    <view class="chat-disclaimer">本服务为AI生成内容,结果仅供参考</view>
+    <view class="chat-disclaimer">本服务为生成内容,结果仅供参考</view>
   </view>
 </template>
 
 <script>
 import { aiSendMessage, aiGetConversations, aiGetMessages, aiDeleteConversation, aiSendNutritionMessage, aiSendHealthCoachMessage, aiSendHealthButlerMessage, getMyMembership } from '../../utils/api.js'
 import BaseEmpty from '../../components/BaseEmpty.vue'
-import AITaskCard from '../../components/AITaskCard.vue'
+import TaskCard from '../../components/TaskCard.vue'
 import config from '@/config.js'
 
 export default {
-  components: { BaseEmpty, AITaskCard },
+  components: { BaseEmpty, TaskCard },
   data() {
     return {
       inputText: '',
@@ -226,7 +226,7 @@ export default {
     if (options.firstMessage) {
       this.pendingFirstMessage = decodeURIComponent(options.firstMessage)
     }
-    // 会员检查:免费用户不可见福宝/浠宝AI功能
+    // 会员检查:免费用户不可见福宝/浠宝功能
     var self = this
     getMyMembership().then(function(res) {
       if (res.data && res.data.memberLevel && res.data.memberLevel !== 'FREE') {

+ 1 - 1
cfc-frontend/pages/body-detail/health-report.vue

@@ -405,7 +405,7 @@ export default {
     goBack: function() {
       uni.navigateBack()
     },
-    // AI问答功能已屏蔽
+    // 问答功能已屏蔽
     goNutritionChat: function() {},
     loadDeficiencyRecords: function() {
       if (!this.memberId) return

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

@@ -86,11 +86,11 @@
         </view>
         <view class="nutrition-report-right">
           <text class="nutrition-title">上传健康报告</text>
-          <text class="nutrition-desc">上传体检报告或肠道检测报告,AI智能解读分析,获取个性化营养方案</text>
+          <text class="nutrition-desc">上传体检报告或肠道检测报告,解读分析,获取个性化营养方案</text>
           <view class="nutrition-report-tags">
             <text class="tag">体检报告</text>
             <text class="tag">肠道检测</text>
-            <text class="tag">AI解读</text>
+            <text class="tag">解读</text>
           </view>
         </view>
         <text class="nutrition-arrow">›</text>
@@ -103,7 +103,7 @@
 
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
-    <AIFloatingAvatar />
+    <FloatingAvatar />
   </view>
 </template>
 
@@ -113,13 +113,13 @@ 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 FloatingAvatar from '../../components/FloatingAvatar.vue'
 import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
 import { getVisibleSections, getEnergyOverview, getChildren, getFamilyEnergySandbox, getEnergySandbox, getFamilyMemberList, getDimensionOverview } from '../../utils/api.js'
 
 export default {
-  components: { TabTransition, PageBanner, FamilyEnergyBar, RadarChart, DimensionSubDims, AIFloatingAvatar, FamilyMemberStrip, DimensionIntroCard },
+  components: { TabTransition, PageBanner, FamilyEnergyBar, RadarChart, DimensionSubDims, FloatingAvatar, FamilyMemberStrip, DimensionIntroCard },
   data() {
     return {
       isLoggedIn: false,
@@ -148,7 +148,7 @@ export default {
         { icon: '\u{1F634}', label: '作息', needLogin: true, page: '/pages/body/sleep-record' },
         { icon: '\u{1F9D8}', label: '冥想', needLogin: true, page: '/pages/health/meditation-index' },
         { icon: '\u{1F4CA}', label: '舌诊', needLogin: true, page: '/pages/health/report-upload?reportType=tongue' },
-        // AI问答功能已屏蔽: { icon: '\u{1F3E5}', label: '健康管家', needLogin: true, page: '/pages/ai/chat?mode=butler&fromPage=pages/body/index' },
+        // 问答功能已屏蔽: { icon: '\u{1F3E5}', label: '健康管家', needLogin: true, page: '/pages/ai/chat?mode=butler&fromPage=pages/body/index' },
         { icon: '\u{1F9EC}', label: '健康维度', needLogin: true, page: 'health-dimensions' }
       ]
     }

+ 8 - 8
cfc-frontend/pages/health-main/index.vue

@@ -14,7 +14,7 @@
         <view class="feat-card" @click="goPage('/pages/health/report-upload')">
           <text class="feat-icon">📋</text>
           <text class="feat-title">上传健康报告</text>
-          <text class="feat-desc">体检/肠道/舌诊 · AI解读</text>
+          <text class="feat-desc">体检/肠道/舌诊 · 解读</text>
         </view>
         <view class="feat-card" @click="goPage('/pages/body/detail')">
           <text class="feat-icon">🧠</text>
@@ -28,7 +28,7 @@
         </view>
         <view class="feat-card" @click="goPlanSummary">
           <text class="feat-icon">📝</text>
-          <text class="feat-title">智能健康方案</text>
+          <text class="feat-title">健康方案</text>
           <text class="feat-desc">选维度·选成员·定目标</text>
         </view>
         <view class="feat-card" @click="goPage('/pages/health/health-status-form')">
@@ -48,12 +48,12 @@
           <text class="self-test-arrow">›</text>
         </view>
       </view>
-      <!-- AI 健康问卷入口 -->
+      <!-- 健康问卷入口 -->
       <view class="ai-q-entry" @click="goAiQuestionnaire">
         <view class="ai-q-head">
           <text class="ai-q-icon">🤖</text>
           <view class="ai-q-info">
-            <text class="ai-q-title">AI 健康问卷</text>
+            <text class="q-title">健康问卷</text>
             <text class="ai-q-sub">智能问答,生成您的健康画像</text>
           </view>
           <text class="ai-q-arrow">›</text>
@@ -159,7 +159,7 @@
         <LoginGuideCard
           title="解锁全家健康数据"
           :items="[
-            '查看七维雷达图与健康报告AI解读',
+            '查看七维雷达图与健康报告解读',
             '完成测评获取个性化健康方案',
             '每日打卡追踪身体/情绪/认知趋势'
           ]" />
@@ -196,7 +196,7 @@
           <view class="data-card-icon" style="background:rgba(249,115,22,0.12)"><text>📋</text></view>
           <view class="data-card-info">
             <text class="data-card-title">上传健康报告</text>
-            <text class="data-card-desc">体检/肠道/舌诊报告 · AI智能解读</text>
+            <text class="data-card-desc">体检/肠道/舌诊报告 · 解读</text>
           </view>
           <text class="data-card-arrow">›</text>
         </view>
@@ -252,7 +252,7 @@
             <button class="plan-btn" @click="goPlanSummary">{{ lastPlan ? '查看方案' : '生成新方案' }}</button>
           </view>
           <text v-if="lastPlan" class="plan-goal">{{ lastPlan }}</text>
-          <text v-else class="plan-hint">选维度 + 选成员 + 设定目标 → 智能生成</text>
+          <text v-else class="plan-hint">选维度 + 选成员 + 设定目标 → 生成</text>
         </view>
       </view>
 
@@ -688,7 +688,7 @@ export default {
 .ai-q-head { display: flex; align-items: center; }
 .ai-q-icon { font-size: 40rpx; margin-right: 16rpx; }
 .ai-q-info { flex: 1; }
-.ai-q-title { font-size: 28rpx; font-weight: bold; color: #fff; display: block; }
+.q-title { font-size: 28rpx; font-weight: bold; color: #fff; display: block; }
 .ai-q-sub { font-size: 22rpx; color: rgba(255,255,255,0.85); display: block; margin-top: 4rpx; }
 .self-test-arrow { font-size: 36rpx; color: rgba(255,255,255,0.7); }
 .demo-section { margin: 0 24rpx 16rpx; }

+ 1 - 1
cfc-frontend/pages/health/ai-questionnaire-result.vue

@@ -1,7 +1,7 @@
 <template>
   <view class="container">
     <view class="result-header">
-      <text class="result-title">AI 问卷画像报告</text>
+      <text class="result-title">问卷画像报告</text>
     </view>
 
     <!-- 用户画像 -->

+ 1 - 1
cfc-frontend/pages/health/ai-questionnaire.vue

@@ -25,7 +25,7 @@
       </view>
 
       <view v-if="loading" class="qa-loading">
-        <text class="qa-loading-text">AI 正在思考下一题...</text>
+        <text class="qa-loading-text">正在思考下一题...</text>
       </view>
 
       <view v-else-if="currentQuestion" class="qa-card">

+ 2 - 2
cfc-frontend/pages/health/gut-flora-detail.vue

@@ -485,7 +485,7 @@ export default {
     goToIndicators: function() {
       this.accordionOpen.nutri = true
     },
-    // AI问答功能已屏蔽
+    // 问答功能已屏蔽
     goAIChat: function() {}
   }
 }
@@ -589,7 +589,7 @@ export default {
   line-height: 1.6;
 }
 
-/* AI 解读入口 */
+/* 解读入口 */
 .ai-fab {
   position: fixed;
   right: 30rpx;

+ 3 - 3
cfc-frontend/pages/health/physical-exam-detail.vue

@@ -71,10 +71,10 @@
 
 <view class="bottom-spacer"></view>
 
-<!-- AI 解读入口(已屏蔽)
+<!-- 解读入口(已屏蔽)
 <view class="ai-fab" @click="goAIChat" v-if="report && reportId">
   <text class="fab-icon">🤖</text>
-  <text class="fab-text">AI 解读报告</text>
+  <text class="fab-text">解读报告</text>
 </view> -->
 </view>
 </template>
@@ -200,7 +200,7 @@ export default {
       }
       return ''
     },
-// AI问答功能已屏蔽
+// 问答功能已屏蔽
 goAIChat: function() {},
 goBack: function() {
   uni.navigateBack()

+ 1 - 1
cfc-frontend/pages/health/report-list.vue

@@ -33,7 +33,7 @@
     <view class="empty-wrap" v-else>
       <text class="empty-icon">📋</text>
       <text class="empty-title">暂无健康报告</text>
-      <text class="empty-desc">上传体检报告或肠道检测报告,获取 AI 解读</text>
+      <text class="empty-desc">上传体检报告或肠道检测报告,获取 解读</text>
       <view class="empty-btn" @click="goToUpload">上传报告</view>
     </view>
 

+ 2 - 2
cfc-frontend/pages/health/report-survey.vue

@@ -382,7 +382,7 @@
       <!-- 提交按钮 -->
       <view class="submit-btn" :class="{ 'btn-disabled': !canSubmit }" @click="doSubmit">
         <text v-if="submitting">提交中...</text>
-        <text v-else>提交并进入 AI 解读</text>
+        <text v-else>提交并进入 解读</text>
       </view>
     </view>
 
@@ -622,7 +622,7 @@ export default {
           uni.hideLoading()
           if (res.code === 200) {
             uni.showToast({ title: '提交成功', icon: 'success' })
-            // AI问答功能已屏蔽
+            // 问答功能已屏蔽
             // setTimeout(function() {
             //   var params = 'reportId=' + self.reportId + '&surveyId=' + self.surveyId + '&firstMessage=' + encodeURIComponent('请根据报告和问卷信息,提供个性化的健康建议')
             //   uni.redirectTo({ url: '/pages/ai/chat?' + params })

+ 1 - 1
cfc-frontend/pages/index-home/index.vue

@@ -1087,7 +1087,7 @@ export default {
           getUserIntent().then(function(r) {
             self.userIntent = r && r.data
           }).catch(function() {})
-          // B类:进入AI问卷,问卷完成后回调更新画像
+          // B类:进入问卷,问卷完成后回调更新画像
           if (payload.intentType === 'B') {
             uni.navigateTo({ url: '/pages/health/ai-questionnaire' })
           } else if (payload.intentType === 'C') {

+ 1 - 1
cfc-frontend/pages/meal/recommend.vue

@@ -58,7 +58,7 @@
     <!-- 空状态 -->
     <view v-if="!recommendResult && !generating" class="empty-state">
       <text class="empty-icon">🍽️</text>
-      <text class="empty-text">点击上方按钮获取智能食谱推荐</text>
+      <text class="empty-text">点击上方按钮获取食谱推荐</text>
     </view>
 
     <!-- 替换结果提示 -->

+ 6 - 6
cfc-frontend/pages/membership/benefits.vue

@@ -121,14 +121,14 @@ export default {
       benefits: [
         { 
           code: 'AI_CHAT_UNLIMITED', 
-          name: 'AI 健康顾问', 
+          name: '健康顾问', 
           desc: '7×24 小时不限次数问答',
           icon: '🤖', 
           bg: '#DBEAFE',
           canUse: true,
           used: false,
           usedAt: null,
-          detail: '支持文字/语音提问,报告智能解读'
+          detail: '支持文字/语音提问,报告解读'
         },
         { 
           code: 'FAMILY_MEMBERS', 
@@ -154,8 +154,8 @@ export default {
         },
         { 
           code: 'REPORT_READING', 
-          name: '报告智能解读', 
-          desc: '体检/菌群/测评报告 AI 解读',
+          name: '报告解读', 
+          desc: '体检/菌群/测评报告 解读',
           icon: '📊', 
           bg: '#FCE7F3',
           canUse: true,
@@ -177,13 +177,13 @@ export default {
         {
           code: 'GROWTH_COACH',
           name: '7X24小时成长教练',
-          desc: 'AI智能教练随时解答家庭教育问题',
+          desc: '智能教练随时解答家庭教育问题',
           icon: '🎯',
           bg: '#FEF3C7',
           canUse: true,
           used: false,
           usedAt: null,
-          detail: '浠宝/福宝AI助手,随时回答育儿、学习、情绪等问题'
+          detail: '浠宝/福宝助手,随时回答育儿、学习、情绪等问题'
         },
         { 
           code: 'PRODUCT_DISCOUNT', 

+ 1 - 1
cfc-frontend/pages/membership/upgrade.vue

@@ -116,7 +116,7 @@ export default {
         { name: '管家服务', free: '—', family: '—', premium: '每周一次', lifetime: '专属管家7×24h' },
         { name: '推荐佣金', free: '不可参与', family: '可参与', premium: '可参与', lifetime: '可参与' },
         { name: '专属活动', free: '部分参与', family: '全部参与', premium: '优先参与', lifetime: 'VIP专属+定制活动' },
-        { name: '成长报告', free: '月度', family: '每周+深度', premium: '每日+深度+专家解读', lifetime: '实时+AI专家深度解读' },
+        { name: '成长报告', free: '月度', family: '每周+深度', premium: '每日+深度+专家解读', lifetime: '实时+专家深度解读' },
         { name: '任务配额', free: '每日5个', family: '不限量', premium: '不限量+优先审核', lifetime: '不限量+专属通道' }
       ],
       periods: [

+ 7 - 7
cfc-frontend/pages/mind-detail/emotion-checkin.vue

@@ -123,15 +123,15 @@
       <text class="photo-note">{{ captureMode === 'photo' ? '照片' : '视频' }}仅对自己可见</text>
     </view>
 
-    <!-- AI 情绪识别 -->
+    <!-- 情绪识别 -->
     <view class="section" v-if="photoPath || videoPath">
-      <text class="section-title">\uD83E\uDD16 AI 情绪识别</text>
+      <text class="section-title">\uD83E\uDD16 情绪识别</text>
       <view class="ai-recognize-btn" v-if="!aiResult && !aiAnalyzing" @click="analyzeEmotion">
         <text class="ai-btn-icon">\uD83D\uDD0D</text>
         <text class="ai-btn-text">{{ captureMode === 'video' ? '识别视频中的情绪' : '识别照片中的情绪' }}</text>
       </view>
       <view class="ai-analyzing" v-if="aiAnalyzing">
-        <text class="ai-loading-text">AI 分析中...</text>
+        <text class="loading-text">分析中...</text>
       </view>
       <view class="ai-result" v-if="aiResult">
         <text class="ai-result-title">识别结果</text>
@@ -437,7 +437,7 @@ export default {
       this.showCustomTagInput = false
     },
 
-    // ===== 拍照/录像 & AI =====
+    // ===== 拍照/录像 =====
     switchCaptureMode(mode) {
       this.captureMode = mode
       this.photoPath = ''
@@ -470,7 +470,7 @@ export default {
       }
     },
 
-    // ===== 增强型 AI 模拟识别 =====
+    // ===== 增强型模拟识别 =====
     // 基于效价/激活度/时段/强度等多维参数,生成更自然的模拟结果
     analyzeEmotion() {
       this.aiAnalyzing = true
@@ -1088,7 +1088,7 @@ export default {
   border-radius: 16rpx;
 }
 
-/* ===== AI 情绪识别 ===== */
+/* ===== 情绪识别 ===== */
 .ai-recognize-btn {
   display: flex;
   align-items: center;
@@ -1121,7 +1121,7 @@ export default {
   padding: 30rpx 0;
 }
 
-.ai-loading-text {
+.loading-text {
   font-size: 26rpx;
   color: #8B5CF6;
 }

+ 1 - 1
cfc-frontend/pages/mind-detail/emotion-report.vue

@@ -71,7 +71,7 @@
     <view class="section rec-section" v-if="recommendations.length > 0 && !recLoading">
       <view class="section-header">
         <text class="section-title">🎯 为你推荐</text>
-        <text class="section-sub">基于你的心理画像智能匹配</text>
+        <text class="section-sub">基于你的心理画像匹配</text>
       </view>
       <view class="rec-list">
         <view class="rec-card" v-for="(item, idx) in recommendations" :key="idx" @click="goRecDetail(item)">

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

@@ -158,7 +158,7 @@
 
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
-    <AIFloatingAvatar />
+    <FloatingAvatar />
   </view>
 </template>
 
@@ -170,7 +170,7 @@ 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'
+import FloatingAvatar from '../../components/FloatingAvatar.vue'
 import FamilyTianpanCard from '../../components/FamilyTianpanCard.vue'
 import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
 import { getVisibleSections, getEmiReport, getFamilyEnergySandbox, getEnergySandbox, getChildren, getFamilyMemberList, getEnergyOverview, getContactList, getHealthAlerts, getMilestones, getDanReportByChild, getFamilyFortune } from '../../utils/api.js'
@@ -179,7 +179,7 @@ import config from '../../config.js'
 import { parseDate } from '../../utils/format.js'
 
 export default {
-components: { TabTransition, PageBanner, RadarChart, DimensionSubDims, FamilyEnergyBar, PsychCrisisBanner, AIFloatingAvatar, FamilyTianpanCard, FamilyMemberStrip, DimensionIntroCard },
+components: { TabTransition, PageBanner, RadarChart, DimensionSubDims, FamilyEnergyBar, PsychCrisisBanner, FloatingAvatar, FamilyTianpanCard, FamilyMemberStrip, DimensionIntroCard },
   data() {
     return {
       isLoggedIn: false,

+ 6 - 6
cfc-frontend/pages/mind/emotion-checkin.vue

@@ -111,15 +111,15 @@
       <text class="photo-note">照片仅对自己可见</text>
     </view>
 
-    <!-- AI 情绪识别 -->
+    <!-- 情绪识别 -->
     <view class="section" v-if="photoPath">
-      <text class="section-title">\uD83E\uDD16 AI 情绪识别</text>
+      <text class="section-title">\uD83E\uDD16 情绪识别</text>
       <view class="ai-recognize-btn" v-if="!aiResult && !aiAnalyzing" @click="analyzeEmotion">
         <text class="ai-btn-icon">\uD83D\uDD0D</text>
         <text class="ai-btn-text">识别照片中的情绪</text>
       </view>
       <view class="ai-analyzing" v-if="aiAnalyzing">
-        <text class="ai-loading-text">AI 分析中...</text>
+        <text class="loading-text">分析中...</text>
       </view>
       <view class="ai-result" v-if="aiResult">
         <text class="ai-result-title">识别结果</text>
@@ -415,7 +415,7 @@ export default {
       this.showCustomTagInput = false
     },
 
-    // ===== 拍照 & AI =====
+    // ===== 拍照 =====
     takePhoto() {
       uni.chooseImage({
         count: 1,
@@ -873,7 +873,7 @@ export default {
   margin-top: 12rpx;
 }
 
-/* ===== AI 情绪识别 ===== */
+/* ===== 情绪识别 ===== */
 .ai-recognize-btn {
   display: flex;
   align-items: center;
@@ -906,7 +906,7 @@ export default {
   padding: 30rpx 0;
 }
 
-.ai-loading-text {
+.loading-text {
   font-size: 26rpx;
   color: #8B5CF6;
 }

+ 2 - 2
cfc-frontend/pages/policy/agreement.vue

@@ -36,7 +36,7 @@
       <view class="policy-section">
         <text class="section-title">三、服务内容</text>
         <text class="section-text">
-          3.1 本平台提供包括但不限于:家庭任务管理、五维能量评估、成长测评、活动课程报名、商城购物、成长规划师咨询、健康报告解析、AI成长助手等服务。
+          3.1 本平台提供包括但不限于:家庭任务管理、五维能量评估、成长测评、活动课程报名、商城购物、成长规划师咨询、健康报告解析、成长助手等服务。
         </text>
         <text class="section-text">
           3.2 我们有权根据业务发展需要调整、增加或减少服务内容,变更后的服务内容将在平台上公示。
@@ -154,7 +154,7 @@
           10.2 心理测评结果仅反映测评当次的状态,不代表临床诊断结论。测评结果不应用于替代专业心理咨询或医疗诊断。
         </text>
         <text class="section-text">
-          10.3 AI助手(浠宝/福宝)生成的内容仅供参考,我们不保证其准确性、完整性和适用性。AI生成内容不构成专业建议。
+          10.3 助手(浠宝/福宝)生成的内容仅供参考,我们不保证其准确性、完整性和适用性。生成内容不构成专业建议。
         </text>
         <text class="section-text">
           10.4 本平台服务商(成长规划师等)提供的服务及其结果,由其自身对服务质量负责,我们不对服务商提供的专业意见承担担保责任。

+ 5 - 5
cfc-frontend/pages/policy/privacy.vue

@@ -41,7 +41,7 @@
 
         <text class="section-text">2.10 使用记录:您在平台上的操作记录,包括任务创建和执行记录、打卡记录、心愿创建和兑换记录、积分变动记录、小游戏记录(舒尔特方格、猜数字、数独等)、成长记录、活动参与记录、课程学习记录。</text>
 
-        <text class="section-text">2.11 通讯内容:您与成长规划师之间的消息记录、您与AI助手(浠宝/福宝)的对话记录。请注意,AI对话内容可能会被记录并用于改进服务质量。</text>
+        <text class="section-text">2.11 通讯内容:您与成长规划师之间的消息记录、您与助手(浠宝/福宝)的对话记录。请注意,AI对话内容可能会被记录并用于改进服务质量。</text>
 
         <text class="section-text">2.12 位置信息:当您使用地址相关功能(如家庭地址设置、街道匹配)时,我们可能会收集您的位置信息。</text>
 
@@ -57,7 +57,7 @@
         <text class="section-text">我们收集的信息将用于以下目的:</text>
         <text class="section-text">3.1 提供、维护和改进本平台的核心服务,包括家庭任务管理、五维能量评估、成长测评、活动课程、商城购物、成长规划师咨询等。</text>
         <text class="section-text">3.2 个性化推荐和内容展示,根据您的使用习惯和偏好推荐适合的服务和内容。</text>
-        <text class="section-text">3.3 AI服务(经您单独同意后):用于AI对话分析、用户画像构建、智能推荐和成长建议生成。如您不同意,我们将不会将您的数据用于AI分析。</text>
+        <text class="section-text">3.3 服务(经您单独同意后):用于对话分析、用户画像构建、推荐和成长建议生成。如您不同意,我们将不会将您的数据用于分析。</text>
         <text class="section-text">3.4 与您沟通,发送服务通知、活动信息、系统公告等。</text>
         <text class="section-text">3.5 数据分析和研究,用于优化产品功能、改进服务体验、提升平台安全性。</text>
         <text class="section-text">3.6 履行法定义务,包括实名认证、税务合规、反洗钱、网络安全等法律法规要求。</text>
@@ -100,7 +100,7 @@
         <text class="section-text">(b) 为提供服务需要与必要的合作伙伴共享,包括但不限于:</text>
         <text class="section-text">—— 微信支付(深圳市腾讯计算机系统有限公司):处理虚拟支付交易,共享信息为订单号、支付金额、支付状态;</text>
         <text class="section-text">—— 微信开放平台(深圳市腾讯计算机系统有限公司):提供微信登录和身份认证服务,共享信息为OpenID、UnionID、昵称、头像;</text>
-        <text class="section-text">—— Dify AI平台(如适用):提供AI对话和智能分析服务,共享信息为对话内容、用户查询;</text>
+        <text class="section-text">—— Dify 平台(如适用):提供对话和分析服务,共享信息为对话内容、用户查询;</text>
         <text class="section-text">(c) 成长规划师在为您提供服务时,可在您授权范围内查看家庭信息和测评结果;</text>
         <text class="section-text">(d) 法律法规要求或有关国家机关依法要求;</text>
         <text class="section-text">(e) 为保护我们或他人的合法权益所必需。</text>
@@ -132,7 +132,7 @@
         <text class="section-text">(a) 用户基本资料:在您使用本平台期间持续保留,注销账号后180天内删除或匿名化处理;</text>
         <text class="section-text">(b) 心理测评数据:自测评完成之日起保留7年(用于成长轨迹追踪),到期后匿名化处理;</text>
         <text class="section-text">(c) 健康数据:自上传之日起保留5年,到期后匿名化处理;</text>
-        <text class="section-text">(d) AI对话记录:自对话完成之日起保留1年,到期后匿名化处理;</text>
+        <text class="section-text">(d) 对话记录:自对话完成之日起保留1年,到期后匿名化处理;</text>
         <text class="section-text">(e) 交易记录:自交易完成之日起保留不少于5年(根据《电子商务法》要求);</text>
         <text class="section-text">(f) 日志记录:自产生之日起保留6个月,到期后自动删除。</text>
         <text class="section-text">9.2 超出上述保留期限后,我们将删除或匿名化处理您的个人信息。匿名化后的信息无法识别特定个人,不属于个人信息,可不受限制地使用。</text>
@@ -151,7 +151,7 @@
         <text class="section-text">10.4 撤回同意权:您可以撤回对个人信息处理的同意,撤回不影响此前基于同意进行的处理。您可以通过个人中心的"数据授权管理"功能撤回相关授权。</text>
         <text class="section-text">10.5 注销账号权:您可以通过"我的—设置—注销账号"申请注销账号。注销后,我们将删除或匿名化处理您的个人信息,但法律法规另有要求的除外。</text>
         <text class="section-text">10.6 数据可携带权:您可以要求我们将您的个人信息以结构化、常用、机器可读的格式提供给您,或转移给您指定的第三方。</text>
-        <text class="section-text">10.7 拒绝自动化决策权:您有权拒绝我们仅通过自动化决策方式做出对您权益有重大影响的决定。如您对AI生成的测评结果或建议有异议,可以联系人工客服进行复核。</text>
+        <text class="section-text">10.7 拒绝自动化决策权:您有权拒绝我们仅通过自动化决策方式做出对您权益有重大影响的决定。如您对测评结果或建议有异议,可以联系人工客服进行复核。</text>
         <text class="section-text">10.8 逝者近亲属权利:已故用户的近亲属可以在符合法律法规规定的情况下,查阅、复制、更正、删除已故用户的个人信息。</text>
         <text class="section-text">如您需要行使上述权利,请通过本政策底部的联系方式与我们联系。我们将在15个工作日内回复您的请求。</text>
       </view>

+ 4 - 4
cfc-frontend/pages/profile-main/profile.vue

@@ -234,7 +234,7 @@
         </view>
       </view>
     </template>
-    <AIFloatingAvatar />
+    <FloatingAvatar />
     <IntentPicker
       :show="showIntentPicker"
       @select="handleReSelect"
@@ -243,7 +243,7 @@
 </template>
 
 <script>
-import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
+import FloatingAvatar from '../../components/FloatingAvatar.vue'
 import IntentPicker from '../../components/intent-picker.vue'
 import {
   getChildren, getFamilyMemberList,
@@ -254,7 +254,7 @@ import {
 } from '../../utils/api.js'
 
 export default {
-  components: { AIFloatingAvatar, IntentPicker },
+  components: { FloatingAvatar, IntentPicker },
   data() {
     return {
       nickname: '',
@@ -295,7 +295,7 @@ export default {
     intentLabel() {
       var type = this.userIntent && this.userIntent.intentType
       if (type === 'A') return '随便看看'
-      if (type === 'B') return '智能问卷'
+      if (type === 'B') return '问卷'
       if (type === 'C') return '解决问题'
       return ''
     },

+ 1310 - 1310
cfc-frontend/pages/user-edit/user-edit.vue

@@ -1,1316 +1,1316 @@
-<template>
-	<view class="user-edit-container">
-		<view class="header">
-			<text class="title">{{ isEdit ? '完善个人信息' : '选择角色' }}</text>
-			<text class="subtitle">{{ isEdit ? '以下信息可帮助您更好地使用服务' : '请选择您的身份类型' }}</text>
-		</view>
-
-		<!-- 角色选择(新用户首次登录时显示) -->
-		<view class="role-select-section" v-if="!isEdit && showRoleSelect">
-			<view 
-				class="role-card" 
-				:class="{ active: form.role === 'parent' }"
-				@click="selectRole('parent')"
-			>
-				<text class="role-icon">👨‍👩‍👧</text>
-				<text class="role-name">家长</text>
-				<text class="role-desc">管理孩子任务、审核奖励</text>
-			</view>
-			
-			<view 
-				class="role-card" 
-				:class="{ active: form.role === 'child' }"
-				@click="selectRole('child')"
-			>
-				<text class="role-icon">👶</text>
-				<text class="role-name">孩子</text>
-				<text class="role-desc">执行任务、赚取积分</text>
-			</view>
-			
-			<view 
-				class="role-card" 
-				:class="{ active: form.role === 'teacher' }"
-				@click="selectRole('teacher')"
-			>
-				<text class="role-icon">👨‍🏫</text>
-				<text class="role-name">成长规划师</text>
-				<text class="role-desc">DAN测评、制定成长方案</text>
-			</view>
-
-			<button class="btn-next" @click="confirmRole" :disabled="!form.role">
-				下一步
-			</button>
-		</view>
-
-		<!-- 详细信息填写(选择角色后显示) -->
-		<view v-if="isEdit && (!isNewUserFlow || hasFamily)">
-		<view class="form-section">
-			<!-- 头像 -->
-			<view class="form-item avatar-item">
-				<text class="label">头像</text>
-				<view class="avatar-upload" @click="chooseAvatar">
-					<image v-if="form.avatar" :src="form.avatar" class="avatar-preview"></image>
-					<view v-else class="avatar-placeholder">
-						<text class="iconfont icon-plus">+</text>
-					</view>
-				</view>
-			</view>
-
-			<!-- 昵称 -->
-			<view class="form-item">
-				<text class="label">昵称 <text class="required">*</text></text>
-				<input type="text" v-model="form.nickname" placeholder="请输入昵称" class="input" maxlength="20" />
-			</view>
-
-			<!-- 新用户流程:仅展示头像+昵称,其余字段按需在功能页补充 -->
-			<view v-if="!isNewUserFlow">
-
-			<!-- 真实姓名 -->
-			<view class="form-item">
-				<text class="label">真实姓名</text>
-				<input type="text" v-model="form.realName" placeholder="选填,用于家庭管理" class="input" maxlength="20" />
-			</view>
-
-			<!-- 性别(成长规划师必填) -->
-			<view class="form-item">
-				<text class="label">性别 <text class="required" v-if="form.role === 'teacher'">*</text></text>
-				<radio-group class="role-select" @change="onGenderChange">
-					<label class="role-option">
-						<radio value="male" :checked="form.gender === 'male'" />
-						<text>男</text>
-					</label>
-					<label class="role-option">
-						<radio value="female" :checked="form.gender === 'female'" />
-						<text>女</text>
-					</label>
-				</radio-group>
-			</view>
-
-			<!-- 身份证号(成长规划师必填) -->
-			<view class="form-item">
-				<text class="label">身份证号 <text class="required" v-if="form.role === 'teacher'">*</text></text>
-				<input type="idcard" v-model="form.idCard" placeholder="选填,填写后自动生成生日" class="input" maxlength="18" @input="onIdCardInput" />
-			</view>
-
-			<!-- 生日 -->
-			<view class="form-item">
-				<text class="label">生日</text>
-				<picker mode="date" :value="form.birthday" @change="onBirthdayChange">
-					<view class="picker-input">{{ form.birthday || '请选择生日' }}</view>
-				</picker>
-			</view>
-
-			<!-- 出生时辰 -->
-			<view class="form-item">
-				<text class="label">出生时辰</text>
-				<picker mode="selector" :range="birthHourOptions" :value="birthHourIndex" @change="onBirthHourChange">
-					<view class="picker-input">{{ form.birthHour || '请选择出生时辰' }}</view>
-				</picker>
-			</view>
-
-			<!-- 民族 -->
-			<view class="form-item">
-				<text class="label">民族</text>
-				<picker mode="selector" :range="ethnicityOptions" :value="ethnicityIndex" @change="onEthnicityChange">
-					<view class="picker-input">{{ form.ethnicity || '请选择民族' }}</view>
-				</picker>
-			</view>
-
-			<!-- 血型 -->
-			<view class="form-item">
-				<text class="label">血型</text>
-				<picker mode="selector" :range="bloodTypeOptions" :value="bloodTypeIndex" @change="onBloodTypeChange">
-					<view class="picker-input">{{ form.bloodType || '请选择血型' }}</view>
-				</picker>
-			</view>
-
-			<!-- 最高学历 -->
-			<view class="form-item">
-				<text class="label">最高学历</text>
-				<picker mode="selector" :range="educationOptions" :value="educationIndex" @change="onEducationChange">
-					<view class="picker-input">{{ form.highestEducation || '请选择最高学历' }}</view>
-				</picker>
-			</view>
-
-			<!-- 婚姻状态 -->
-			<view class="form-item">
-				<text class="label">婚姻状态</text>
-				<picker mode="selector" :range="maritalOptions" :value="maritalIndex" @change="onMaritalChange">
-					<view class="picker-input">{{ form.maritalStatus || '请选择婚姻状态' }}</view>
-				</picker>
-			</view>
-
-		<!-- 所在地区(省市区三级联动,与订单收货人地址一致) -->
-		<view class="form-item address-row" @click="openRegionPicker">
-			<text class="label">所在地区 <text class="required" v-if="isNewUserFlow">*</text></text>
-			<view class="address-value-wrap">
-				<text v-if="form.address" class="address-value">{{ form.address }}</text>
-				<text v-else class="address-placeholder">请选择省市区</text>
-				<text class="address-arrow">›</text>
-			</view>
-		</view>
-
-		<!-- 详细地址 -->
-		<view class="form-item">
-			<text class="label">详细地址</text>
-			<input type="text" v-model="form.street" placeholder="请输入详细地址(选填)" class="input" maxlength="100" @input="updateFullAddress" />
+<template>
+	<view class="user-edit-container">
+		<view class="header">
+			<text class="title">{{ isEdit ? '完善个人信息' : '选择角色' }}</text>
+			<text class="subtitle">{{ isEdit ? '以下信息可帮助您更好地使用服务' : '请选择您的身份类型' }}</text>
 		</view>
-
-			<!-- 兴趣爱好 -->
-			<view class="form-item">
-				<text class="label">兴趣爱好</text>
-				<input type="text" v-model="form.hobbies" placeholder="如: 阅读、运动、音乐" class="input" maxlength="200" />
-			</view>
-
-			<!-- 饮食偏好 -->
-			<view class="form-item">
-				<text class="label">饮食偏好</text>
-				<input type="text" v-model="form.dietPreferences" placeholder="如: 清淡、无辣、低糖" class="input" maxlength="200" />
-			</view>
-			</view>
-
-			<!-- 成长规划师额外字段 -->
-			<view class="form-section-title" v-if="form.role === 'teacher'">成长规划师信息</view>
-			
-			<!-- 成长规划师证书号(成长规划师必填) -->
-			<view class="form-item" v-if="form.role === 'teacher'">
-				<text class="label">成长规划师证书号 <text class="required">*</text></text>
-				<input type="text" v-model="form.teacherNo" placeholder="请输入成长规划师证书号" class="input" maxlength="50" />
-			</view>
-
-			<!-- 成长规划师照片(成长规划师必填) -->
-			<view class="form-item" v-if="form.role === 'teacher'">
-				<text class="label">成长规划师照片 <text class="required">*</text></text>
-				<view class="photo-upload" @click="chooseTeacherPhoto">
-					<image v-if="form.teacherPhoto" :src="form.teacherPhoto" class="photo-preview" mode="aspectFill"></image>
-					<view v-else class="photo-placeholder">
-						<text class="plus-icon">+</text>
-						<text class="placeholder-text">上传照片</text>
-					</view>
-				</view>
-			</view>
-
-			<!-- 成长规划师证书照片(成长规划师必填) -->
-			<view class="form-item" v-if="form.role === 'teacher'">
-				<text class="label">成长规划师证书 <text class="required">*</text></text>
-				<view class="photo-upload" @click="chooseCertificate">
-					<image v-if="form.certificateImage" :src="form.certificateImage" class="photo-preview" mode="aspectFill"></image>
-					<view v-else class="photo-placeholder">
-						<text class="plus-icon">+</text>
-						<text class="placeholder-text">上传证书</text>
-					</view>
-				</view>
-			</view>
-		</view>
-
-		<!-- AI助手选择(会员专属) -->
-		<view class="family-section" v-if="isEdit && memberLevel !== 'FREE'">
-			<view class="section-title">🤖 选择AI助手</view>
-			<view class="mascot-cards">
-				<view class="mascot-card" :class="{ active: form.mascot === 'xibao' }" @click="selectMascot('xibao')">
-					<view class="mascot-card-icon xibao-bg">🌟</view>
-					<view class="mascot-card-info">
-						<text class="mascot-card-name">浠宝</text>
-						<text class="mascot-card-desc">温柔活泼的阳光女孩</text>
-					</view>
-				</view>
-				<view class="mascot-card" :class="{ active: form.mascot === 'fubao' }" @click="selectMascot('fubao')">
-					<view class="mascot-card-icon fubao-bg">💪</view>
-					<view class="mascot-card-info">
-						<text class="mascot-card-name">福宝</text>
-						<text class="mascot-card-desc">开朗自信的阳光男孩</text>
-					</view>
-				</view>
-			</view>
-		</view>
-		<!-- 免费用户提示 -->
-		<view class="family-section" v-if="isEdit && memberLevel === 'FREE'">
-			<view class="mascot-locked-hint" @click="goUpgrade">
-				<text class="locked-icon">🔒</text>
-				<text class="locked-text">开通会员解锁更多能力</text>
-				<text class="locked-arrow">›</text>
-			</view>
-		</view>
-
-		<!-- 新用户流程:保存资料 / 跳过(不再创建或加入家庭) -->
-		<view class="family-section" v-if="isEdit && form.role !== 'teacher' && isNewUserFlow">
-			<view class="family-actions">
-				<button class="btn btn-primary" @click="saveUserInfo" :loading="loading">
-					保存资料
-				</button>
-				<button class="btn btn-skip" @click="skip">
-					跳过
-				</button>
-			</view>
-		</view>
-
-		<!-- 修改个人资料保存按钮(非新用户流程时显示) -->
-		<view class="family-section" v-if="isEdit && !isNewUserFlow && form.role !== 'teacher'">
-			<view class="family-actions">
-				<button class="btn btn-primary" @click="saveUserInfo" :loading="loading">
-					保存修改
-				</button>
-			</view>
-		</view>
-
-		<!-- 成长规划师提交按钮 -->
-		<view class="family-section" v-if="isEdit && form.role === 'teacher' && isNewUserFlow">
-			<view class="family-actions">
-				<button class="btn btn-primary" @click="submitTeacherInfo" :loading="loading">
-					提交申请
-				</button>
-			</view>
-		</view>
-		</view>
-		<view v-else-if="isEdit">
-			<FamilyEmptyState type="card" />
-		</view>
-
-		<!-- 区域选择弹窗(省市区三级联动) -->
-		<view class="region-mask" v-if="showRegionPicker" @click="cancelRegion">
-			<view class="region-picker" @click.stop>
-				<view class="region-header">
-					<text class="region-header-btn" @click="cancelRegion">取消</text>
-					<text class="region-header-title">选择地区</text>
-					<text class="region-header-btn region-confirm" @click="confirmRegion">确定</text>
-				</view>
-				<view class="region-breadcrumb">
-					<text
-						v-for="(name, i) in regionBreadcrumb"
-						:key="i"
-						:class="['crumb-item', i === currentRegionLevel ? 'crumb-active' : '']"
-						@click="jumpRegionLevel(i)"
-					>{{ name || '请选择' }}</text>
-					<text class="crumb-arrow" v-if="currentRegionLevel < 2">›</text>
-				</view>
-				<scroll-view class="region-list" scroll-y>
-					<view
-						v-for="(item, idx) in currentRegionItems"
-						:key="idx"
-						:class="['region-item', isRegionSelected(item) ? 'region-item-selected' : '']"
-						@click="selectRegionItem(item)"
-					>
-						<text class="region-item-text">{{ getRegionName(item) }}</text>
-						<text class="region-item-check" v-if="isRegionSelected(item)">✓</text>
-					</view>
-					<view v-if="regionLoading" class="region-loading">
-						<text>加载中...</text>
-					</view>
-				</scroll-view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-import { updateUserInfo, createFamily, directRegister, getUserInfo, requestJoinByCode, getMyMembership } from '../../utils/api.js'
-import config from '@/config.js'
-
-export default {
-	data() {
-		return {
-			isEdit: false,
-			showRoleSelect: true,
-			isNewUserFlow: false,  // 是否是新用户注册流程
-			memberLevel: 'FREE', // 会员等级,用于判断是否解锁AI助手
-			form: {
-				role: '',
-				avatar: '',
-				nickname: '',
-				realName: '',
-				gender: '',
-				idCard: '',
-				birthday: '',
-				birthHour: '',
-				inviteCode: '',
-				mascot: '',
-				phone: '',
-				teacherNo: '',
-				teacherPhoto: '',
-				certificateImage: '',
-				ethnicity: '',
-				bloodType: '',
-				highestEducation: '',
-				maritalStatus: '',
-				hobbies: '',
-				dietPreferences: '',
-				address: '',
-				province: '',
-				city: '',
-				district: '',
-				street: ''
-			},
-			// 区域选择弹窗(省市区三级联动,与订单收货人地址一致)
-			showRegionPicker: false,
-			currentRegionLevel: 0, // 0=省份, 1=城市, 2=区县
-			regionLoading: false,
-			provinceList: [],
-			cityList: [],
-			districtList: [],
-			tempProvince: null,
-			tempCity: null,
+
+		<!-- 角色选择(新用户首次登录时显示) -->
+		<view class="role-select-section" v-if="!isEdit && showRoleSelect">
+			<view 
+				class="role-card" 
+				:class="{ active: form.role === 'parent' }"
+				@click="selectRole('parent')"
+			>
+				<text class="role-icon">👨‍👩‍👧</text>
+				<text class="role-name">家长</text>
+				<text class="role-desc">管理孩子任务、审核奖励</text>
+			</view>
+			
+			<view 
+				class="role-card" 
+				:class="{ active: form.role === 'child' }"
+				@click="selectRole('child')"
+			>
+				<text class="role-icon">👶</text>
+				<text class="role-name">孩子</text>
+				<text class="role-desc">执行任务、赚取积分</text>
+			</view>
+			
+			<view 
+				class="role-card" 
+				:class="{ active: form.role === 'teacher' }"
+				@click="selectRole('teacher')"
+			>
+				<text class="role-icon">👨‍🏫</text>
+				<text class="role-name">成长规划师</text>
+				<text class="role-desc">DAN测评、制定成长方案</text>
+			</view>
+
+			<button class="btn-next" @click="confirmRole" :disabled="!form.role">
+				下一步
+			</button>
+		</view>
+
+		<!-- 详细信息填写(选择角色后显示) -->
+		<view v-if="isEdit && (!isNewUserFlow || hasFamily)">
+		<view class="form-section">
+			<!-- 头像 -->
+			<view class="form-item avatar-item">
+				<text class="label">头像</text>
+				<view class="avatar-upload" @click="chooseAvatar">
+					<image v-if="form.avatar" :src="form.avatar" class="avatar-preview"></image>
+					<view v-else class="avatar-placeholder">
+						<text class="iconfont icon-plus">+</text>
+					</view>
+				</view>
+			</view>
+
+			<!-- 昵称 -->
+			<view class="form-item">
+				<text class="label">昵称 <text class="required">*</text></text>
+				<input type="text" v-model="form.nickname" placeholder="请输入昵称" class="input" maxlength="20" />
+			</view>
+
+			<!-- 新用户流程:仅展示头像+昵称,其余字段按需在功能页补充 -->
+			<view v-if="!isNewUserFlow">
+
+			<!-- 真实姓名 -->
+			<view class="form-item">
+				<text class="label">真实姓名</text>
+				<input type="text" v-model="form.realName" placeholder="选填,用于家庭管理" class="input" maxlength="20" />
+			</view>
+
+			<!-- 性别(成长规划师必填) -->
+			<view class="form-item">
+				<text class="label">性别 <text class="required" v-if="form.role === 'teacher'">*</text></text>
+				<radio-group class="role-select" @change="onGenderChange">
+					<label class="role-option">
+						<radio value="male" :checked="form.gender === 'male'" />
+						<text>男</text>
+					</label>
+					<label class="role-option">
+						<radio value="female" :checked="form.gender === 'female'" />
+						<text>女</text>
+					</label>
+				</radio-group>
+			</view>
+
+			<!-- 身份证号(成长规划师必填) -->
+			<view class="form-item">
+				<text class="label">身份证号 <text class="required" v-if="form.role === 'teacher'">*</text></text>
+				<input type="idcard" v-model="form.idCard" placeholder="选填,填写后自动生成生日" class="input" maxlength="18" @input="onIdCardInput" />
+			</view>
+
+			<!-- 生日 -->
+			<view class="form-item">
+				<text class="label">生日</text>
+				<picker mode="date" :value="form.birthday" @change="onBirthdayChange">
+					<view class="picker-input">{{ form.birthday || '请选择生日' }}</view>
+				</picker>
+			</view>
+
+			<!-- 出生时辰 -->
+			<view class="form-item">
+				<text class="label">出生时辰</text>
+				<picker mode="selector" :range="birthHourOptions" :value="birthHourIndex" @change="onBirthHourChange">
+					<view class="picker-input">{{ form.birthHour || '请选择出生时辰' }}</view>
+				</picker>
+			</view>
+
+			<!-- 民族 -->
+			<view class="form-item">
+				<text class="label">民族</text>
+				<picker mode="selector" :range="ethnicityOptions" :value="ethnicityIndex" @change="onEthnicityChange">
+					<view class="picker-input">{{ form.ethnicity || '请选择民族' }}</view>
+				</picker>
+			</view>
+
+			<!-- 血型 -->
+			<view class="form-item">
+				<text class="label">血型</text>
+				<picker mode="selector" :range="bloodTypeOptions" :value="bloodTypeIndex" @change="onBloodTypeChange">
+					<view class="picker-input">{{ form.bloodType || '请选择血型' }}</view>
+				</picker>
+			</view>
+
+			<!-- 最高学历 -->
+			<view class="form-item">
+				<text class="label">最高学历</text>
+				<picker mode="selector" :range="educationOptions" :value="educationIndex" @change="onEducationChange">
+					<view class="picker-input">{{ form.highestEducation || '请选择最高学历' }}</view>
+				</picker>
+			</view>
+
+			<!-- 婚姻状态 -->
+			<view class="form-item">
+				<text class="label">婚姻状态</text>
+				<picker mode="selector" :range="maritalOptions" :value="maritalIndex" @change="onMaritalChange">
+					<view class="picker-input">{{ form.maritalStatus || '请选择婚姻状态' }}</view>
+				</picker>
+			</view>
+
+		<!-- 所在地区(省市区三级联动,与订单收货人地址一致) -->
+		<view class="form-item address-row" @click="openRegionPicker">
+			<text class="label">所在地区 <text class="required" v-if="isNewUserFlow">*</text></text>
+			<view class="address-value-wrap">
+				<text v-if="form.address" class="address-value">{{ form.address }}</text>
+				<text v-else class="address-placeholder">请选择省市区</text>
+				<text class="address-arrow">›</text>
+			</view>
+		</view>
+
+		<!-- 详细地址 -->
+		<view class="form-item">
+			<text class="label">详细地址</text>
+			<input type="text" v-model="form.street" placeholder="请输入详细地址(选填)" class="input" maxlength="100" @input="updateFullAddress" />
+		</view>
+
+			<!-- 兴趣爱好 -->
+			<view class="form-item">
+				<text class="label">兴趣爱好</text>
+				<input type="text" v-model="form.hobbies" placeholder="如: 阅读、运动、音乐" class="input" maxlength="200" />
+			</view>
+
+			<!-- 饮食偏好 -->
+			<view class="form-item">
+				<text class="label">饮食偏好</text>
+				<input type="text" v-model="form.dietPreferences" placeholder="如: 清淡、无辣、低糖" class="input" maxlength="200" />
+			</view>
+			</view>
+
+			<!-- 成长规划师额外字段 -->
+			<view class="form-section-title" v-if="form.role === 'teacher'">成长规划师信息</view>
+			
+			<!-- 成长规划师证书号(成长规划师必填) -->
+			<view class="form-item" v-if="form.role === 'teacher'">
+				<text class="label">成长规划师证书号 <text class="required">*</text></text>
+				<input type="text" v-model="form.teacherNo" placeholder="请输入成长规划师证书号" class="input" maxlength="50" />
+			</view>
+
+			<!-- 成长规划师照片(成长规划师必填) -->
+			<view class="form-item" v-if="form.role === 'teacher'">
+				<text class="label">成长规划师照片 <text class="required">*</text></text>
+				<view class="photo-upload" @click="chooseTeacherPhoto">
+					<image v-if="form.teacherPhoto" :src="form.teacherPhoto" class="photo-preview" mode="aspectFill"></image>
+					<view v-else class="photo-placeholder">
+						<text class="plus-icon">+</text>
+						<text class="placeholder-text">上传照片</text>
+					</view>
+				</view>
+			</view>
+
+			<!-- 成长规划师证书照片(成长规划师必填) -->
+			<view class="form-item" v-if="form.role === 'teacher'">
+				<text class="label">成长规划师证书 <text class="required">*</text></text>
+				<view class="photo-upload" @click="chooseCertificate">
+					<image v-if="form.certificateImage" :src="form.certificateImage" class="photo-preview" mode="aspectFill"></image>
+					<view v-else class="photo-placeholder">
+						<text class="plus-icon">+</text>
+						<text class="placeholder-text">上传证书</text>
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<!-- 助手选择(会员专属) -->
+		<view class="family-section" v-if="isEdit && memberLevel !== 'FREE'">
+			<view class="section-title">🤖 选择助手</view>
+			<view class="mascot-cards">
+				<view class="mascot-card" :class="{ active: form.mascot === 'xibao' }" @click="selectMascot('xibao')">
+					<view class="mascot-card-icon xibao-bg">🌟</view>
+					<view class="mascot-card-info">
+						<text class="mascot-card-name">浠宝</text>
+						<text class="mascot-card-desc">温柔活泼的阳光女孩</text>
+					</view>
+				</view>
+				<view class="mascot-card" :class="{ active: form.mascot === 'fubao' }" @click="selectMascot('fubao')">
+					<view class="mascot-card-icon fubao-bg">💪</view>
+					<view class="mascot-card-info">
+						<text class="mascot-card-name">福宝</text>
+						<text class="mascot-card-desc">开朗自信的阳光男孩</text>
+					</view>
+				</view>
+			</view>
+		</view>
+		<!-- 免费用户提示 -->
+		<view class="family-section" v-if="isEdit && memberLevel === 'FREE'">
+			<view class="mascot-locked-hint" @click="goUpgrade">
+				<text class="locked-icon">🔒</text>
+				<text class="locked-text">开通会员解锁更多能力</text>
+				<text class="locked-arrow">›</text>
+			</view>
+		</view>
+
+		<!-- 新用户流程:保存资料 / 跳过(不再创建或加入家庭) -->
+		<view class="family-section" v-if="isEdit && form.role !== 'teacher' && isNewUserFlow">
+			<view class="family-actions">
+				<button class="btn btn-primary" @click="saveUserInfo" :loading="loading">
+					保存资料
+				</button>
+				<button class="btn btn-skip" @click="skip">
+					跳过
+				</button>
+			</view>
+		</view>
+
+		<!-- 修改个人资料保存按钮(非新用户流程时显示) -->
+		<view class="family-section" v-if="isEdit && !isNewUserFlow && form.role !== 'teacher'">
+			<view class="family-actions">
+				<button class="btn btn-primary" @click="saveUserInfo" :loading="loading">
+					保存修改
+				</button>
+			</view>
+		</view>
+
+		<!-- 成长规划师提交按钮 -->
+		<view class="family-section" v-if="isEdit && form.role === 'teacher' && isNewUserFlow">
+			<view class="family-actions">
+				<button class="btn btn-primary" @click="submitTeacherInfo" :loading="loading">
+					提交申请
+				</button>
+			</view>
+		</view>
+		</view>
+		<view v-else-if="isEdit">
+			<FamilyEmptyState type="card" />
+		</view>
+
+		<!-- 区域选择弹窗(省市区三级联动) -->
+		<view class="region-mask" v-if="showRegionPicker" @click="cancelRegion">
+			<view class="region-picker" @click.stop>
+				<view class="region-header">
+					<text class="region-header-btn" @click="cancelRegion">取消</text>
+					<text class="region-header-title">选择地区</text>
+					<text class="region-header-btn region-confirm" @click="confirmRegion">确定</text>
+				</view>
+				<view class="region-breadcrumb">
+					<text
+						v-for="(name, i) in regionBreadcrumb"
+						:key="i"
+						:class="['crumb-item', i === currentRegionLevel ? 'crumb-active' : '']"
+						@click="jumpRegionLevel(i)"
+					>{{ name || '请选择' }}</text>
+					<text class="crumb-arrow" v-if="currentRegionLevel < 2">›</text>
+				</view>
+				<scroll-view class="region-list" scroll-y>
+					<view
+						v-for="(item, idx) in currentRegionItems"
+						:key="idx"
+						:class="['region-item', isRegionSelected(item) ? 'region-item-selected' : '']"
+						@click="selectRegionItem(item)"
+					>
+						<text class="region-item-text">{{ getRegionName(item) }}</text>
+						<text class="region-item-check" v-if="isRegionSelected(item)">✓</text>
+					</view>
+					<view v-if="regionLoading" class="region-loading">
+						<text>加载中...</text>
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { updateUserInfo, createFamily, directRegister, getUserInfo, requestJoinByCode, getMyMembership } from '../../utils/api.js'
+import config from '@/config.js'
+
+export default {
+	data() {
+		return {
+			isEdit: false,
+			showRoleSelect: true,
+			isNewUserFlow: false,  // 是否是新用户注册流程
+			memberLevel: 'FREE', // 会员等级,用于判断是否解锁助手
+			form: {
+				role: '',
+				avatar: '',
+				nickname: '',
+				realName: '',
+				gender: '',
+				idCard: '',
+				birthday: '',
+				birthHour: '',
+				inviteCode: '',
+				mascot: '',
+				phone: '',
+				teacherNo: '',
+				teacherPhoto: '',
+				certificateImage: '',
+				ethnicity: '',
+				bloodType: '',
+				highestEducation: '',
+				maritalStatus: '',
+				hobbies: '',
+				dietPreferences: '',
+				address: '',
+				province: '',
+				city: '',
+				district: '',
+				street: ''
+			},
+			// 区域选择弹窗(省市区三级联动,与订单收货人地址一致)
+			showRegionPicker: false,
+			currentRegionLevel: 0, // 0=省份, 1=城市, 2=区县
+			regionLoading: false,
+			provinceList: [],
+			cityList: [],
+			districtList: [],
+			tempProvince: null,
+			tempCity: null,
 			tempDistrict: null,
-			ethnicityOptions: ['汉族','蒙古族','回族','藏族','维吾尔族','苗族','彝族','壮族','布依族','朝鲜族','满族','侗族','瑶族','白族','土家族','哈尼族','哈萨克族','傣族','黎族','其他'],
-			bloodTypeOptions: ['A','B','AB','O','未知'],
-			birthHourOptions: ['子时(23-01)','丑时(01-03)','寅时(03-05)','卯时(05-07)','辰时(07-09)','巳时(09-11)','午时(11-13)','未时(13-15)','申时(15-17)','酉时(17-19)','戌时(19-21)','亥时(21-23)'],
-			birthHourValues: ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'],
-			educationOptions: ['小学','初中','高中','中专','大专','本科','硕士','博士'],
-			maritalOptions: ['未婚','已婚','离异','丧偶'],
-			loading: false,
-			userId: '',
-			token: ''
-		}
-	},
-  computed: {
-    ethnicityIndex() {
-      return this.ethnicityOptions.indexOf(this.form.ethnicity)
-    },
-    bloodTypeIndex() {
-      return this.bloodTypeOptions.indexOf(this.form.bloodType)
-    },
-    birthHourIndex() {
-      return this.birthHourValues.indexOf(this.form.birthHour)
-    },
-    educationIndex() {
-      return this.educationOptions.indexOf(this.form.highestEducation)
-    },
-    maritalIndex() {
-      return this.maritalOptions.indexOf(this.form.maritalStatus)
-    },
-    hasFamily: function() {
-      if (this.token) return true
-      return this.$store.getters.hasFamily
-    },
-    regionBreadcrumb: function() {
-      var names = []
-      names.push(this.tempProvince ? this.getRegionName(this.tempProvince) : '省份')
-      names.push(this.tempCity ? this.getRegionName(this.tempCity) : '城市')
-      names.push(this.tempDistrict ? this.getRegionName(this.tempDistrict) : '区县')
-      return names
-    },
-    currentRegionItems: function() {
-      if (this.currentRegionLevel === 0) return this.provinceList
-      if (this.currentRegionLevel === 1) return this.cityList
-      if (this.currentRegionLevel === 2) return this.districtList
-      return []
-    },
+			ethnicityOptions: ['汉族','蒙古族','回族','藏族','维吾尔族','苗族','彝族','壮族','布依族','朝鲜族','满族','侗族','瑶族','白族','土家族','哈尼族','哈萨克族','傣族','黎族','其他'],
+			bloodTypeOptions: ['A','B','AB','O','未知'],
+			birthHourOptions: ['子时(23-01)','丑时(01-03)','寅时(03-05)','卯时(05-07)','辰时(07-09)','巳时(09-11)','午时(11-13)','未时(13-15)','申时(15-17)','酉时(17-19)','戌时(19-21)','亥时(21-23)'],
+			birthHourValues: ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'],
+			educationOptions: ['小学','初中','高中','中专','大专','本科','硕士','博士'],
+			maritalOptions: ['未婚','已婚','离异','丧偶'],
+			loading: false,
+			userId: '',
+			token: ''
+		}
+	},
+  computed: {
+    ethnicityIndex() {
+      return this.ethnicityOptions.indexOf(this.form.ethnicity)
+    },
+    bloodTypeIndex() {
+      return this.bloodTypeOptions.indexOf(this.form.bloodType)
+    },
+    birthHourIndex() {
+      return this.birthHourValues.indexOf(this.form.birthHour)
+    },
+    educationIndex() {
+      return this.educationOptions.indexOf(this.form.highestEducation)
+    },
+    maritalIndex() {
+      return this.maritalOptions.indexOf(this.form.maritalStatus)
+    },
+    hasFamily: function() {
+      if (this.token) return true
+      return this.$store.getters.hasFamily
+    },
+    regionBreadcrumb: function() {
+      var names = []
+      names.push(this.tempProvince ? this.getRegionName(this.tempProvince) : '省份')
+      names.push(this.tempCity ? this.getRegionName(this.tempCity) : '城市')
+      names.push(this.tempDistrict ? this.getRegionName(this.tempDistrict) : '区县')
+      return names
+    },
+    currentRegionItems: function() {
+      if (this.currentRegionLevel === 0) return this.provinceList
+      if (this.currentRegionLevel === 1) return this.cityList
+      if (this.currentRegionLevel === 2) return this.districtList
+      return []
+    },
   },
-	onLoad(options) {
-		if (options.token && options.userId) {
-			this.token = options.token
-			this.userId = options.userId
-
-			if (options.autoParent === 'true') {
-				// 首次登录:跳过角色选择,默认 parent,直接进入信息补充页
-				this.showRoleSelect = false
-				this.isEdit = true
-				this.isNewUserFlow = true
-				this.form.role = 'parent'
-			} else {
-				// 检查是否需要选择角色(新用户)- 只有明确传递 needsRoleSelect=true 才显示选择
-				this.showRoleSelect = options.needsRoleSelect === 'true'
-				this.isEdit = !this.showRoleSelect
-				this.isNewUserFlow = options.needsRoleSelect === 'true'
-			}
-		} else if (options.phone && (options.autoParent === 'true' || options.needsRoleSelect === 'true')) {
-			// 测试环境:没有token,只有手机号,是新用户注册流程
-			this.showRoleSelect = options.needsRoleSelect === 'true'
-			this.isEdit = !this.showRoleSelect
-			this.isNewUserFlow = true
-			if (options.autoParent === 'true') {
-				this.form.role = 'parent'
-			}
-			// 将手机号传递给表单
-			this.form.phone = options.phone
-		} else {
-			// 其他情况:默认进入编辑模式(如从"我的"页面进入)
-			this.showRoleSelect = false
-			this.isEdit = true
-			this.isNewUserFlow = false
-		}
-		
-		// 非新用户流程时,加载已有用户信息
-		if (this.isEdit && !this.isNewUserFlow) {
-			this.loadUserInfo()
-		}
-		// 加载会员等级(用于AI助手解锁)
-		var self = this
-		getMyMembership().then(function(res) {
-			if (res.data && res.data.memberLevel) {
-				self.memberLevel = res.data.memberLevel
-			}
-		}).catch(function() {})
-	},
-	methods: {
-		selectRole(role) {
-			this.form.role = role
-		},
-		confirmRole() {
-			if (!this.form.role) {
-				uni.showToast({ title: '请选择角色', icon: 'none' })
-				return
-			}
-			this.showRoleSelect = false
-			this.isEdit = true
-			
-			// 测试环境:直接注册用户(不需要验证码)
-			if (!this.token && this.form.phone) {
-				// 自动进入家庭绑定流程
-			}
-		},
-		chooseAvatar() {
-			uni.chooseImage({
-				count: 1,
-				success: (res) => {
-					this.form.avatar = res.tempFilePaths[0]
-				}
-			})
-		},
-		chooseTeacherPhoto() {
-			uni.chooseImage({
-				count: 1,
-				success: (res) => {
-					this.form.teacherPhoto = res.tempFilePaths[0]
-				}
-			})
-		},
-		chooseCertificate() {
-			uni.chooseImage({
-				count: 1,
-				success: (res) => {
-					this.form.certificateImage = res.tempFilePaths[0]
-				}
-			})
-		},
-		onGenderChange(e) {
-			this.form.gender = e.detail.value
-		},
-		onIdCardInput(e) {
-			const idCard = e.detail.value
-			if (idCard.length === 18) {
-				// 根据身份证号自动提取生日
-				const year = idCard.substring(6, 10)
-				const month = idCard.substring(10, 12)
-				const day = idCard.substring(12, 14)
-				this.form.birthday = `${year}-${month}-${day}`
-			}
-		},
-		onBirthdayChange(e) {
-			this.form.birthday = e.detail.value
-		},
-		onEthnicityChange(e) {
-			this.form.ethnicity = this.ethnicityOptions[e.detail.value]
-		},
-		onBloodTypeChange(e) {
-			this.form.bloodType = this.bloodTypeOptions[e.detail.value]
-		},
-		onBirthHourChange(e) {
-			this.form.birthHour = this.birthHourValues[e.detail.value]
-		},
-		onEducationChange(e) {
-			this.form.highestEducation = this.educationOptions[e.detail.value]
-		},
-		onMaritalChange(e) {
-			this.form.maritalStatus = this.maritalOptions[e.detail.value]
-		},
-	selectMascot(code) {
-		this.form.mascot = code
-	},
-	goUpgrade() {
-		uni.navigateTo({ url: '/pages/membership/upgrade' })
-	},
-	// ===== 省市区三级联动弹窗(与订单收货人地址一致) =====
-	openRegionPicker() {
-		this.tempProvince = this.form.province ? { name: this.form.province, id: null } : null
-		this.tempCity = this.form.city ? { name: this.form.city, id: null } : null
-		this.tempDistrict = this.form.district ? { name: this.form.district, id: null } : null
-		this.currentRegionLevel = 0
-		this.showRegionPicker = true
-		this.loadRegionProvinces()
-	},
-	loadRegionProvinces() {
-		var self = this
-		self.regionLoading = true
-		uni.request({
-			url: config.api('/api/region/provinces'),
-			method: 'POST',
-			header: {
-				'Content-Type': 'application/json',
-				'Authorization': 'Bearer ' + uni.getStorageSync('token')
-			},
-			success: function(res) {
-				self.regionLoading = false
-				if (res.data && res.data.code === 200) {
-					self.provinceList = res.data.data || []
-				}
-			},
-			fail: function() {
-				self.regionLoading = false
-			}
-		})
-	},
-	loadRegionCities(parentId) {
-		if (!parentId) return
-		var self = this
-		self.regionLoading = true
-		uni.request({
-			url: config.api('/api/region/cities'),
-			method: 'POST',
-			data: { parentId: parentId },
-			header: {
-				'Content-Type': 'application/json',
-				'Authorization': 'Bearer ' + uni.getStorageSync('token')
-			},
-			success: function(res) {
-				self.regionLoading = false
-				if (res.data && res.data.code === 200) {
-					self.cityList = res.data.data || []
-				}
-			},
-			fail: function() {
-				self.regionLoading = false
-			}
-		})
-	},
-	loadRegionDistricts(parentId) {
-		if (!parentId) return
-		var self = this
-		self.regionLoading = true
-		uni.request({
-			url: config.api('/api/region/districts'),
-			method: 'POST',
-			data: { parentId: parentId },
-			header: {
-				'Content-Type': 'application/json',
-				'Authorization': 'Bearer ' + uni.getStorageSync('token')
-			},
-			success: function(res) {
-				self.regionLoading = false
-				if (res.data && res.data.code === 200) {
-					self.districtList = res.data.data || []
-				}
-			},
-			fail: function() {
-				self.regionLoading = false
-			}
-		})
-	},
-	selectRegionItem(item) {
-		if (this.currentRegionLevel === 0) {
-			this.tempProvince = item
-			this.tempCity = null
-			this.tempDistrict = null
-			this.cityList = []
-			this.districtList = []
-			this.currentRegionLevel = 1
-			this.loadRegionCities(this.getRegionId(item))
-		} else if (this.currentRegionLevel === 1) {
-			this.tempCity = item
-			this.tempDistrict = null
-			this.districtList = []
-			this.currentRegionLevel = 2
-			this.loadRegionDistricts(this.getRegionId(item))
-		} else if (this.currentRegionLevel === 2) {
-			this.tempDistrict = item
-			this.confirmRegion()
-		}
-	},
-	confirmRegion() {
-		if (this.tempProvince) {
-			this.form.province = this.getRegionName(this.tempProvince)
-		}
-		if (this.tempCity) {
-			this.form.city = this.getRegionName(this.tempCity)
-		}
-		if (this.tempDistrict) {
-			this.form.district = this.getRegionName(this.tempDistrict)
-		}
-		this.updateFullAddress()
-		this.showRegionPicker = false
-	},
-	cancelRegion() {
-		this.showRegionPicker = false
-	},
-	jumpRegionLevel(level) {
-		if (level < this.currentRegionLevel) {
-			this.currentRegionLevel = level
-		}
-	},
-	getRegionName(item) {
-		return item && (item.name || item.province || item.city || item.district || '')
-	},
-	getRegionId(item) {
-		return item && (item.id || item.code)
-	},
-	isRegionSelected(item) {
-		var name = this.getRegionName(item)
-		if (this.currentRegionLevel === 0) return this.tempProvince && this.getRegionName(this.tempProvince) === name
-		if (this.currentRegionLevel === 1) return this.tempCity && this.getRegionName(this.tempCity) === name
-		if (this.currentRegionLevel === 2) return this.tempDistrict && this.getRegionName(this.tempDistrict) === name
-		return false
-	},
-	updateFullAddress() {
-		this.form.address = (this.form.province || '') + (this.form.city || '') + (this.form.district || '') + (this.form.street || '')
-	},
+	onLoad(options) {
+		if (options.token && options.userId) {
+			this.token = options.token
+			this.userId = options.userId
+
+			if (options.autoParent === 'true') {
+				// 首次登录:跳过角色选择,默认 parent,直接进入信息补充页
+				this.showRoleSelect = false
+				this.isEdit = true
+				this.isNewUserFlow = true
+				this.form.role = 'parent'
+			} else {
+				// 检查是否需要选择角色(新用户)- 只有明确传递 needsRoleSelect=true 才显示选择
+				this.showRoleSelect = options.needsRoleSelect === 'true'
+				this.isEdit = !this.showRoleSelect
+				this.isNewUserFlow = options.needsRoleSelect === 'true'
+			}
+		} else if (options.phone && (options.autoParent === 'true' || options.needsRoleSelect === 'true')) {
+			// 测试环境:没有token,只有手机号,是新用户注册流程
+			this.showRoleSelect = options.needsRoleSelect === 'true'
+			this.isEdit = !this.showRoleSelect
+			this.isNewUserFlow = true
+			if (options.autoParent === 'true') {
+				this.form.role = 'parent'
+			}
+			// 将手机号传递给表单
+			this.form.phone = options.phone
+		} else {
+			// 其他情况:默认进入编辑模式(如从"我的"页面进入)
+			this.showRoleSelect = false
+			this.isEdit = true
+			this.isNewUserFlow = false
+		}
+		
+		// 非新用户流程时,加载已有用户信息
+		if (this.isEdit && !this.isNewUserFlow) {
+			this.loadUserInfo()
+		}
+		// 加载会员等级(用于助手解锁)
+		var self = this
+		getMyMembership().then(function(res) {
+			if (res.data && res.data.memberLevel) {
+				self.memberLevel = res.data.memberLevel
+			}
+		}).catch(function() {})
+	},
+	methods: {
+		selectRole(role) {
+			this.form.role = role
+		},
+		confirmRole() {
+			if (!this.form.role) {
+				uni.showToast({ title: '请选择角色', icon: 'none' })
+				return
+			}
+			this.showRoleSelect = false
+			this.isEdit = true
+			
+			// 测试环境:直接注册用户(不需要验证码)
+			if (!this.token && this.form.phone) {
+				// 自动进入家庭绑定流程
+			}
+		},
+		chooseAvatar() {
+			uni.chooseImage({
+				count: 1,
+				success: (res) => {
+					this.form.avatar = res.tempFilePaths[0]
+				}
+			})
+		},
+		chooseTeacherPhoto() {
+			uni.chooseImage({
+				count: 1,
+				success: (res) => {
+					this.form.teacherPhoto = res.tempFilePaths[0]
+				}
+			})
+		},
+		chooseCertificate() {
+			uni.chooseImage({
+				count: 1,
+				success: (res) => {
+					this.form.certificateImage = res.tempFilePaths[0]
+				}
+			})
+		},
+		onGenderChange(e) {
+			this.form.gender = e.detail.value
+		},
+		onIdCardInput(e) {
+			const idCard = e.detail.value
+			if (idCard.length === 18) {
+				// 根据身份证号自动提取生日
+				const year = idCard.substring(6, 10)
+				const month = idCard.substring(10, 12)
+				const day = idCard.substring(12, 14)
+				this.form.birthday = `${year}-${month}-${day}`
+			}
+		},
+		onBirthdayChange(e) {
+			this.form.birthday = e.detail.value
+		},
+		onEthnicityChange(e) {
+			this.form.ethnicity = this.ethnicityOptions[e.detail.value]
+		},
+		onBloodTypeChange(e) {
+			this.form.bloodType = this.bloodTypeOptions[e.detail.value]
+		},
+		onBirthHourChange(e) {
+			this.form.birthHour = this.birthHourValues[e.detail.value]
+		},
+		onEducationChange(e) {
+			this.form.highestEducation = this.educationOptions[e.detail.value]
+		},
+		onMaritalChange(e) {
+			this.form.maritalStatus = this.maritalOptions[e.detail.value]
+		},
+	selectMascot(code) {
+		this.form.mascot = code
+	},
+	goUpgrade() {
+		uni.navigateTo({ url: '/pages/membership/upgrade' })
+	},
+	// ===== 省市区三级联动弹窗(与订单收货人地址一致) =====
+	openRegionPicker() {
+		this.tempProvince = this.form.province ? { name: this.form.province, id: null } : null
+		this.tempCity = this.form.city ? { name: this.form.city, id: null } : null
+		this.tempDistrict = this.form.district ? { name: this.form.district, id: null } : null
+		this.currentRegionLevel = 0
+		this.showRegionPicker = true
+		this.loadRegionProvinces()
+	},
+	loadRegionProvinces() {
+		var self = this
+		self.regionLoading = true
+		uni.request({
+			url: config.api('/api/region/provinces'),
+			method: 'POST',
+			header: {
+				'Content-Type': 'application/json',
+				'Authorization': 'Bearer ' + uni.getStorageSync('token')
+			},
+			success: function(res) {
+				self.regionLoading = false
+				if (res.data && res.data.code === 200) {
+					self.provinceList = res.data.data || []
+				}
+			},
+			fail: function() {
+				self.regionLoading = false
+			}
+		})
+	},
+	loadRegionCities(parentId) {
+		if (!parentId) return
+		var self = this
+		self.regionLoading = true
+		uni.request({
+			url: config.api('/api/region/cities'),
+			method: 'POST',
+			data: { parentId: parentId },
+			header: {
+				'Content-Type': 'application/json',
+				'Authorization': 'Bearer ' + uni.getStorageSync('token')
+			},
+			success: function(res) {
+				self.regionLoading = false
+				if (res.data && res.data.code === 200) {
+					self.cityList = res.data.data || []
+				}
+			},
+			fail: function() {
+				self.regionLoading = false
+			}
+		})
+	},
+	loadRegionDistricts(parentId) {
+		if (!parentId) return
+		var self = this
+		self.regionLoading = true
+		uni.request({
+			url: config.api('/api/region/districts'),
+			method: 'POST',
+			data: { parentId: parentId },
+			header: {
+				'Content-Type': 'application/json',
+				'Authorization': 'Bearer ' + uni.getStorageSync('token')
+			},
+			success: function(res) {
+				self.regionLoading = false
+				if (res.data && res.data.code === 200) {
+					self.districtList = res.data.data || []
+				}
+			},
+			fail: function() {
+				self.regionLoading = false
+			}
+		})
+	},
+	selectRegionItem(item) {
+		if (this.currentRegionLevel === 0) {
+			this.tempProvince = item
+			this.tempCity = null
+			this.tempDistrict = null
+			this.cityList = []
+			this.districtList = []
+			this.currentRegionLevel = 1
+			this.loadRegionCities(this.getRegionId(item))
+		} else if (this.currentRegionLevel === 1) {
+			this.tempCity = item
+			this.tempDistrict = null
+			this.districtList = []
+			this.currentRegionLevel = 2
+			this.loadRegionDistricts(this.getRegionId(item))
+		} else if (this.currentRegionLevel === 2) {
+			this.tempDistrict = item
+			this.confirmRegion()
+		}
+	},
+	confirmRegion() {
+		if (this.tempProvince) {
+			this.form.province = this.getRegionName(this.tempProvince)
+		}
+		if (this.tempCity) {
+			this.form.city = this.getRegionName(this.tempCity)
+		}
+		if (this.tempDistrict) {
+			this.form.district = this.getRegionName(this.tempDistrict)
+		}
+		this.updateFullAddress()
+		this.showRegionPicker = false
+	},
+	cancelRegion() {
+		this.showRegionPicker = false
+	},
+	jumpRegionLevel(level) {
+		if (level < this.currentRegionLevel) {
+			this.currentRegionLevel = level
+		}
+	},
+	getRegionName(item) {
+		return item && (item.name || item.province || item.city || item.district || '')
+	},
+	getRegionId(item) {
+		return item && (item.id || item.code)
+	},
+	isRegionSelected(item) {
+		var name = this.getRegionName(item)
+		if (this.currentRegionLevel === 0) return this.tempProvince && this.getRegionName(this.tempProvince) === name
+		if (this.currentRegionLevel === 1) return this.tempCity && this.getRegionName(this.tempCity) === name
+		if (this.currentRegionLevel === 2) return this.tempDistrict && this.getRegionName(this.tempDistrict) === name
+		return false
+	},
+	updateFullAddress() {
+		this.form.address = (this.form.province || '') + (this.form.city || '') + (this.form.district || '') + (this.form.street || '')
+	},
 	// 加载已有用户信息
-		async loadUserInfo() {
-			try {
-				const res = await getUserInfo()
-				if (res.code === 200 && res.data) {
-					const userData = res.data
-					this.form.nickname = userData.nickname || ''
-					this.form.realName = userData.realName || ''
-					this.form.gender = userData.gender || ''
-					this.form.idCard = userData.idCard || ''
-				// 生日只取日期部分,去掉时间和 ISO 格式的 T 分隔符
-				this.form.birthday = userData.birthday ? String(userData.birthday).split(/[T ]/)[0] : ''
-					this.form.avatar = userData.avatar || ''
-					this.form.role = userData.role || ''
-					this.form.phone = userData.phone || ''
-					this.form.ethnicity = userData.ethnicity || ''
-					this.form.bloodType = userData.bloodType || ''
-					this.form.highestEducation = userData.highestEducation || ''
-					this.form.maritalStatus = userData.maritalStatus || ''
-					this.form.hobbies = userData.hobbies || ''
-					this.form.dietPreferences = userData.dietPreferences || ''
-				this.form.mascot = userData.mascot || ''
-			this.form.address = userData.address || ''
-			this.form.province = userData.province || ''
-			this.form.city = userData.city || ''
-			this.form.district = userData.district || ''
-			this.form.street = userData.street || ''
-			// 若无完整地址文本但有省市区,则拼接
-			if (!this.form.address && (this.form.province || this.form.city || this.form.district)) {
-				this.updateFullAddress()
-			}
+		async loadUserInfo() {
+			try {
+				const res = await getUserInfo()
+				if (res.code === 200 && res.data) {
+					const userData = res.data
+					this.form.nickname = userData.nickname || ''
+					this.form.realName = userData.realName || ''
+					this.form.gender = userData.gender || ''
+					this.form.idCard = userData.idCard || ''
+				// 生日只取日期部分,去掉时间和 ISO 格式的 T 分隔符
+				this.form.birthday = userData.birthday ? String(userData.birthday).split(/[T ]/)[0] : ''
+					this.form.avatar = userData.avatar || ''
+					this.form.role = userData.role || ''
+					this.form.phone = userData.phone || ''
+					this.form.ethnicity = userData.ethnicity || ''
+					this.form.bloodType = userData.bloodType || ''
+					this.form.highestEducation = userData.highestEducation || ''
+					this.form.maritalStatus = userData.maritalStatus || ''
+					this.form.hobbies = userData.hobbies || ''
+					this.form.dietPreferences = userData.dietPreferences || ''
+				this.form.mascot = userData.mascot || ''
+			this.form.address = userData.address || ''
+			this.form.province = userData.province || ''
+			this.form.city = userData.city || ''
+			this.form.district = userData.district || ''
+			this.form.street = userData.street || ''
+			// 若无完整地址文本但有省市区,则拼接
+			if (!this.form.address && (this.form.province || this.form.city || this.form.district)) {
+				this.updateFullAddress()
+			}
+			}
+			} catch (e) {
+				console.error('加载用户信息失败', e)
+			}
+		},
+		// 保存修改
+		async saveUserInfo() {
+			// 新用户流程:昵称可跳过(跳过时用默认昵称);老用户流程:昵称必填
+			if (!this.isNewUserFlow && !this.form.nickname) {
+				uni.showToast({ title: '请输入昵称', icon: 'none' })
+				return
 			}
-			} catch (e) {
-				console.error('加载用户信息失败', e)
-			}
-		},
-		// 保存修改
-		async saveUserInfo() {
-			// 新用户流程:昵称可跳过(跳过时用默认昵称);老用户流程:昵称必填
-			if (!this.isNewUserFlow && !this.form.nickname) {
-				uni.showToast({ title: '请输入昵称', icon: 'none' })
-				return
-			}
-			if (this.isNewUserFlow && !this.form.nickname) {
-				var phone = this.form.phone || ''
-				this.form.nickname = phone ? '用户' + phone.substring(phone.length - 4) : '微信用户'
-			}
-
-		// 从省市区街道字段同步完整地址文本
-		this.updateFullAddress()
-
-		this.loading = true
-		try {
-			await updateUserInfo({
-				nickname: this.form.nickname,
-				realName: this.form.realName,
-				gender: this.form.gender,
-				idCard: this.form.idCard,
-				birthday: this.form.birthday,
-				avatar: this.form.avatar,
-				mascot: this.form.mascot,
-				ethnicity: this.form.ethnicity,
-				bloodType: this.form.bloodType,
-				highestEducation: this.form.highestEducation,
-				maritalStatus: this.form.maritalStatus,
-				hobbies: this.form.hobbies,
-				dietPreferences: this.form.dietPreferences,
-				address: this.form.address,
-				province: this.form.province,
-				city: this.form.city,
-				district: this.form.district,
-				street: this.form.street
+			if (this.isNewUserFlow && !this.form.nickname) {
+				var phone = this.form.phone || ''
+				this.form.nickname = phone ? '用户' + phone.substring(phone.length - 4) : '微信用户'
+			}
+
+		// 从省市区街道字段同步完整地址文本
+		this.updateFullAddress()
+
+		this.loading = true
+		try {
+			await updateUserInfo({
+				nickname: this.form.nickname,
+				realName: this.form.realName,
+				gender: this.form.gender,
+				idCard: this.form.idCard,
+				birthday: this.form.birthday,
+				avatar: this.form.avatar,
+				mascot: this.form.mascot,
+				ethnicity: this.form.ethnicity,
+				bloodType: this.form.bloodType,
+				highestEducation: this.form.highestEducation,
+				maritalStatus: this.form.maritalStatus,
+				hobbies: this.form.hobbies,
+				dietPreferences: this.form.dietPreferences,
+				address: this.form.address,
+				province: this.form.province,
+				city: this.form.city,
+				district: this.form.district,
+				street: this.form.street
 			})
-				uni.showToast({ title: '保存成功', icon: 'success' })
-				setTimeout(() => {
-					if (this.isNewUserFlow) {
-						this.navigateToHome()
-					} else {
-						uni.navigateBack()
-					}
-				}, 1500)
-			} catch (e) {
-				uni.showToast({ title: '保存失败', icon: 'none' })
-			} finally {
-				this.loading = false
-			}
-		},
-		async submitTeacherInfo() {
-			// 验证必填字段
-			if (!this.form.nickname) {
-				uni.showToast({ title: '请输入昵称', icon: 'none' })
-				return
-			}
-			if (!this.form.gender) {
-				uni.showToast({ title: '请选择性别', icon: 'none' })
-				return
-			}
-			if (!this.form.idCard) {
-				uni.showToast({ title: '请输入身份证号', icon: 'none' })
-				return
-			}
-			if (!this.form.teacherNo) {
-				uni.showToast({ title: '请输入成长规划师证书号', icon: 'none' })
-				return
-			}
-			if (!this.form.teacherPhoto) {
-				uni.showToast({ title: '请上传成长规划师照片', icon: 'none' })
-				return
-			}
-			if (!this.form.certificateImage) {
-				uni.showToast({ title: '请上传成长规划师证书', icon: 'none' })
-				return
-			}
-
-			this.loading = true
-			try {
-				await updateUserInfo({
-					...this.form,
-					roles: this.form.role
-				})
-				uni.showToast({ title: '提交成功,请等待审核' })
-				setTimeout(() => {
-					uni.switchTab({ url: '/pages/index-home/index' })
-				}, 1500)
-			} catch (e) {
-				uni.showToast({ title: '提交失败', icon: 'none' })
-			} finally {
-				this.loading = false
-			}
-		},
-		async joinFamilyAction() {
-			if (!this.form.inviteCode) {
-				uni.showToast({ title: '请输入邀请码', icon: 'none' })
-				return
-			}
-			
-			if (!this.form.nickname) {
-				uni.showToast({ title: '请输入昵称', icon: 'none' })
-				return
-			}
-			
-			this.loading = true
-			try {
-				let userId = this.userId
-				
-				// 测试环境:没有token,需要先注册用户
-				if (!this.token && this.form.phone) {
-					const regRes = await directRegister({
-						phone: this.form.phone,
-						nickname: this.form.nickname,
-						avatar: this.form.avatar,
-						role: this.form.role,
-						mascot: this.form.mascot,
-						birthday: this.form.birthday,
-						gender: this.form.gender,
-						inviteCode: this.form.inviteCode
-					})
-					userId = regRes.data.userId
-					// 保存登录信息
-					uni.setStorageSync('token', regRes.data.token)
-					uni.setStorageSync('userId', userId)
-					uni.setStorageSync('role', regRes.data.role)
-					// 邀请码注册不写入 familyId(加入需管理员审批)
-				} else {
-					await updateUserInfo(this.form)
-					await requestJoinByCode(this.form.inviteCode)
-				}
-				
-				uni.showToast({ title: '申请已提交,等待管理员审批' })
-				setTimeout(() => {
-					this.navigateToHome()
-				}, 1500)
-			} catch (e) {
-				uni.showToast({ title: e.message || '加入失败', icon: 'none' })
-			} finally {
-				this.loading = false
-			}
-		},
-		async createFamilyAction() {
-			if (!this.form.nickname) {
-				uni.showToast({ title: '请输入昵称', icon: 'none' })
-				return
-			}
-			
-			this.loading = true
-			try {
-				let userId = this.userId
-				
-				// 测试环境:没有token,需要先注册用户
-				if (!this.token && this.form.phone) {
-					const regRes = await directRegister({
-						phone: this.form.phone,
-						nickname: this.form.nickname,
-						avatar: this.form.avatar,
-						role: this.form.role,
-						mascot: this.form.mascot,
-						birthday: this.form.birthday,
-						gender: this.form.gender
-					})
-					userId = regRes.data.userId
-					// 保存登录信息
-					uni.setStorageSync('token', regRes.data.token)
-					uni.setStorageSync('userId', userId)
-					uni.setStorageSync('role', regRes.data.role)
-					// 注册不写入 familyId(后端根据 userId 获取)
-				} else {
-					await updateUserInfo(this.form)
-					const famRes = await createFamily(this.form.nickname + '的家庭')
-					// 同步 familyId 到 store(hasFamily getter 依赖)
-					if (famRes && famRes.data) {
-						this.$store.commit('setFamilyId', famRes.data)
-					}
-				}
-				
-				uni.showToast({ title: '创建成功' })
-				setTimeout(() => {
-					this.navigateToHome()
-				}, 1500)
-			} catch (e) {
-				uni.showToast({ title: e.message || '创建失败', icon: 'none' })
-			} finally {
-				this.loading = false
-			}
-		},
-		skip() {
-			this.navigateToHome()
-		},
-		navigateToHome() {
-			// 保存 mascot 到 userInfo 存储,供 AI 聊天页读取
-			if (this.form.mascot) {
-				try {
-					const userInfo = uni.getStorageSync('userInfo') || {}
-					userInfo.mascot = this.form.mascot
-					uni.setStorageSync('userInfo', userInfo)
-				} catch (e) {
-					console.error('保存 mascot 失败', e)
-				}
-			}
-			// 用 switchTab 跳转带底部 TabBar 的首页(行/身/智/心/富)
-            // parent-index/child-index 是分包页面(非 TabBar 页),用 navigateTo 会丢失底部 TabBar
-			uni.switchTab({ url: '/pages/index-home/index' })
-		}
-	}
-}
-</script>
-
-<style scoped>
-.user-edit-container {
-	min-height: 100vh;
-	background: #f5f5f5;
-	padding: 30rpx;
-}
-
-.header {
-	margin-bottom: 40rpx;
-	text-align: center;
-}
-
-.title {
-	font-size: 40rpx;
-	font-weight: bold;
-	color: #333;
-	display: block;
-	margin-bottom: 10rpx;
-}
-
-.subtitle {
-	font-size: 28rpx;
-	color: #999;
-}
-
-/* 角色选择 */
-.role-select-section {
-	margin-bottom: 40rpx;
-}
-
-.role-card {
-	background: #fff;
-	border-radius: 16rpx;
-	padding: 40rpx;
-	margin-bottom: 20rpx;
-	display: flex;
-	flex-direction: column;
-	align-items: center;
-	border: 2rpx solid transparent;
-	transition: all 0.3s;
-}
-
-.role-card.active {
-	border-color: #4CAF50;
-	background: #f8fdf8;
-}
-
-.role-icon {
-	font-size: 80rpx;
-	margin-bottom: 16rpx;
-}
-
-.role-name {
-	font-size: 32rpx;
-	font-weight: bold;
-	color: #333;
-	margin-bottom: 8rpx;
-}
-
-.role-desc {
-	font-size: 24rpx;
-	color: #999;
-}
-
-.btn-next {
-	background: #4CAF50;
-	color: #fff;
-	border-radius: 40rpx;
-	margin-top: 20rpx;
-}
-
-/* 表单 */
-.form-section {
-	background: #fff;
-	border-radius: 16rpx;
-	padding: 30rpx;
-	margin-bottom: 30rpx;
-}
-
-.form-section-title {
-	font-size: 30rpx;
-	font-weight: bold;
-	color: #333;
-	margin-bottom: 20rpx;
-	padding-bottom: 16rpx;
-	border-bottom: 1rpx solid #f0f0f0;
-}
-
-.form-item {
-	margin-bottom: 30rpx;
-}
-
-.label {
-	display: block;
-	font-size: 28rpx;
-	color: #333;
-	margin-bottom: 16rpx;
-}
-
-.required {
-	color: #f44336;
-}
-
-.input, .picker-input {
-	padding: 20rpx;
-	background: #f5f5f5;
-	border-radius: 12rpx;
-	font-size: 28rpx;
-}
-
-.role-select {
-	display: flex;
-	gap: 40rpx;
-}
-
-.role-option {
-	display: flex;
-	align-items: center;
-	gap: 8rpx;
-}
-
-/* 头像上传 */
-.avatar-upload {
-	width: 150rpx;
-	height: 150rpx;
-}
-
-.avatar-preview {
-	width: 150rpx;
-	height: 150rpx;
-	border-radius: 50%;
-}
-
-.avatar-placeholder {
-	width: 150rpx;
-	height: 150rpx;
-	background: #f5f5f5;
-	border-radius: 50%;
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	font-size: 60rpx;
-	color: #ccc;
-}
-
-/* 照片上传 */
-.photo-upload {
-	width: 300rpx;
-	height: 200rpx;
-}
-
-.photo-preview {
-	width: 300rpx;
-	height: 200rpx;
-	border-radius: 12rpx;
-}
-
-.photo-placeholder {
-	width: 300rpx;
-	height: 200rpx;
-	background: #f5f5f5;
-	border-radius: 12rpx;
-	display: flex;
-	flex-direction: column;
-	align-items: center;
-	justify-content: center;
-}
-
-.plus-icon {
-	font-size: 60rpx;
-	color: #ccc;
-}
-
-.placeholder-text {
-	font-size: 24rpx;
-	color: #999;
-	margin-top: 8rpx;
-}
-
-/* AI助手选择 */
-.mascot-cards {
-	display: flex;
-	gap: 20rpx;
-	margin-top: 16rpx;
-}
-.mascot-card {
-	flex: 1;
-	background: #f8f8f8;
-	border-radius: 16rpx;
-	padding: 24rpx;
-	display: flex;
-	align-items: center;
-	gap: 16rpx;
-	border: 2rpx solid transparent;
-	transition: all 0.3s;
-}
-.mascot-card.active {
-	border-color: #4CAF50;
-	background: #f0fdf4;
-}
-.mascot-card-icon {
-	width: 72rpx;
-	height: 72rpx;
-	border-radius: 50%;
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	font-size: 36rpx;
-	flex-shrink: 0;
-}
-.xibao-bg {
-	background: linear-gradient(135deg, #FFF0DB, #FFD6A5);
-}
-.fubao-bg {
-	background: linear-gradient(135deg, #FFF8E1, #FCD34D);
-}
-.mascot-card-info {
-	display: flex;
-	flex-direction: column;
-	gap: 4rpx;
-}
-.mascot-card-name {
-	font-size: 30rpx;
-	font-weight: bold;
-	color: #333;
-}
-.mascot-card-desc {
-	font-size: 22rpx;
-	color: #999;
-}
-
-/* 家庭绑定 */
-.family-section {
-	background: #fff;
-	border-radius: 16rpx;
-	padding: 30rpx;
-}
-
-.section-title {
-	font-size: 30rpx;
-	font-weight: bold;
-	color: #333;
-	margin-bottom: 20rpx;
-}
-
-.family-actions {
-	display: flex;
-	flex-direction: column;
-	gap: 20rpx;
-	margin-top: 30rpx;
-}
-
-.btn {
-	border-radius: 40rpx;
-	font-size: 30rpx;
-}
-
-.btn-primary {
-	background: #4CAF50;
-	color: #fff;
-}
-
-.btn-skip {
-	background: #f5f5f5;
-	color: #999;
-}
-
-/* ===== 区域选择弹窗 ===== */
-.region-mask {
-	position: fixed;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-	background: rgba(0, 0, 0, 0.5);
-	z-index: 999;
-	display: flex;
-	align-items: flex-end;
-}
-.region-picker {
-	background: #fff;
-	border-radius: 20rpx 20rpx 0 0;
-	width: 100%;
-	max-height: 70vh;
-	display: flex;
-	flex-direction: column;
-}
-.region-header {
-	display: flex;
-	justify-content: space-between;
-	align-items: center;
-	padding: 24rpx 30rpx;
-	border-bottom: 1rpx solid #f0f0f0;
-}
-.region-header-btn {
-	font-size: 28rpx;
-	color: #999;
-}
-.region-confirm {
-	color: #F97316;
-	font-weight: bold;
-}
-.region-header-title {
-	font-size: 30rpx;
-	font-weight: bold;
-	color: #333;
-}
-.region-breadcrumb {
-	display: flex;
-	align-items: center;
-	padding: 20rpx 30rpx;
-	border-bottom: 1rpx solid #f5f5f5;
-}
-.crumb-item {
-	font-size: 26rpx;
-	color: #999;
-	padding: 8rpx 12rpx;
-	border-radius: 8rpx;
-}
-.crumb-item.crumb-active {
-	color: #F97316;
-	font-weight: bold;
-}
-.crumb-arrow {
-	font-size: 24rpx;
-	color: #ccc;
-	margin: 0 8rpx;
-}
-.region-list {
-	max-height: 50vh;
-	overflow-y: auto;
-}
-.region-item {
-	display: flex;
-	justify-content: space-between;
-	align-items: center;
-	padding: 28rpx 30rpx;
-	border-bottom: 1rpx solid #f5f5f5;
-}
-.region-item:active {
-	background: #FFF7ED;
-}
-.region-item-text {
-	font-size: 28rpx;
-	color: #333;
-}
-.region-item-check {
-	font-size: 28rpx;
-	color: #F97316;
-	font-weight: bold;
-}
-.region-item-selected {
-	background: #FFF7ED;
-}
-.region-item-selected .region-item-text {
-	color: #F97316;
-	font-weight: bold;
-}
-.region-loading {
-	padding: 40rpx;
-	text-align: center;
-	font-size: 26rpx;
-	color: #999;
-}
-
-/* ===== 地址行(所在地区) ===== */
-.address-row {
-	display: flex;
-	justify-content: space-between;
-	align-items: center;
-}
-.address-value-wrap {
-	display: flex;
-	align-items: center;
-	flex: 1;
-	justify-content: flex-end;
-}
-.address-value {
-	font-size: 28rpx;
-	color: #333;
-}
-.address-placeholder {
-	font-size: 28rpx;
-	color: #999;
-}
-.address-arrow {
-	font-size: 28rpx;
-	color: #ccc;
-	margin-left: 8rpx;
-}
-
-/* AI助手锁定提示 */
-.mascot-locked-hint {
-	display: flex;
-	align-items: center;
-	padding: 28rpx 32rpx;
-	background: linear-gradient(135deg, #FEF3C7, #FDE68A);
-	border-radius: 20rpx;
-	margin-top: 16rpx;
-}
-.locked-icon {
-	font-size: 36rpx;
-	margin-right: 16rpx;
-}
-.locked-text {
-	flex: 1;
-	font-size: 28rpx;
-	font-weight: 600;
-	color: #92400e;
-}
-.locked-arrow {
-	font-size: 32rpx;
-	color: #92400e;
-	margin-left: 8rpx;
-}
-</style>
+				uni.showToast({ title: '保存成功', icon: 'success' })
+				setTimeout(() => {
+					if (this.isNewUserFlow) {
+						this.navigateToHome()
+					} else {
+						uni.navigateBack()
+					}
+				}, 1500)
+			} catch (e) {
+				uni.showToast({ title: '保存失败', icon: 'none' })
+			} finally {
+				this.loading = false
+			}
+		},
+		async submitTeacherInfo() {
+			// 验证必填字段
+			if (!this.form.nickname) {
+				uni.showToast({ title: '请输入昵称', icon: 'none' })
+				return
+			}
+			if (!this.form.gender) {
+				uni.showToast({ title: '请选择性别', icon: 'none' })
+				return
+			}
+			if (!this.form.idCard) {
+				uni.showToast({ title: '请输入身份证号', icon: 'none' })
+				return
+			}
+			if (!this.form.teacherNo) {
+				uni.showToast({ title: '请输入成长规划师证书号', icon: 'none' })
+				return
+			}
+			if (!this.form.teacherPhoto) {
+				uni.showToast({ title: '请上传成长规划师照片', icon: 'none' })
+				return
+			}
+			if (!this.form.certificateImage) {
+				uni.showToast({ title: '请上传成长规划师证书', icon: 'none' })
+				return
+			}
+
+			this.loading = true
+			try {
+				await updateUserInfo({
+					...this.form,
+					roles: this.form.role
+				})
+				uni.showToast({ title: '提交成功,请等待审核' })
+				setTimeout(() => {
+					uni.switchTab({ url: '/pages/index-home/index' })
+				}, 1500)
+			} catch (e) {
+				uni.showToast({ title: '提交失败', icon: 'none' })
+			} finally {
+				this.loading = false
+			}
+		},
+		async joinFamilyAction() {
+			if (!this.form.inviteCode) {
+				uni.showToast({ title: '请输入邀请码', icon: 'none' })
+				return
+			}
+			
+			if (!this.form.nickname) {
+				uni.showToast({ title: '请输入昵称', icon: 'none' })
+				return
+			}
+			
+			this.loading = true
+			try {
+				let userId = this.userId
+				
+				// 测试环境:没有token,需要先注册用户
+				if (!this.token && this.form.phone) {
+					const regRes = await directRegister({
+						phone: this.form.phone,
+						nickname: this.form.nickname,
+						avatar: this.form.avatar,
+						role: this.form.role,
+						mascot: this.form.mascot,
+						birthday: this.form.birthday,
+						gender: this.form.gender,
+						inviteCode: this.form.inviteCode
+					})
+					userId = regRes.data.userId
+					// 保存登录信息
+					uni.setStorageSync('token', regRes.data.token)
+					uni.setStorageSync('userId', userId)
+					uni.setStorageSync('role', regRes.data.role)
+					// 邀请码注册不写入 familyId(加入需管理员审批)
+				} else {
+					await updateUserInfo(this.form)
+					await requestJoinByCode(this.form.inviteCode)
+				}
+				
+				uni.showToast({ title: '申请已提交,等待管理员审批' })
+				setTimeout(() => {
+					this.navigateToHome()
+				}, 1500)
+			} catch (e) {
+				uni.showToast({ title: e.message || '加入失败', icon: 'none' })
+			} finally {
+				this.loading = false
+			}
+		},
+		async createFamilyAction() {
+			if (!this.form.nickname) {
+				uni.showToast({ title: '请输入昵称', icon: 'none' })
+				return
+			}
+			
+			this.loading = true
+			try {
+				let userId = this.userId
+				
+				// 测试环境:没有token,需要先注册用户
+				if (!this.token && this.form.phone) {
+					const regRes = await directRegister({
+						phone: this.form.phone,
+						nickname: this.form.nickname,
+						avatar: this.form.avatar,
+						role: this.form.role,
+						mascot: this.form.mascot,
+						birthday: this.form.birthday,
+						gender: this.form.gender
+					})
+					userId = regRes.data.userId
+					// 保存登录信息
+					uni.setStorageSync('token', regRes.data.token)
+					uni.setStorageSync('userId', userId)
+					uni.setStorageSync('role', regRes.data.role)
+					// 注册不写入 familyId(后端根据 userId 获取)
+				} else {
+					await updateUserInfo(this.form)
+					const famRes = await createFamily(this.form.nickname + '的家庭')
+					// 同步 familyId 到 store(hasFamily getter 依赖)
+					if (famRes && famRes.data) {
+						this.$store.commit('setFamilyId', famRes.data)
+					}
+				}
+				
+				uni.showToast({ title: '创建成功' })
+				setTimeout(() => {
+					this.navigateToHome()
+				}, 1500)
+			} catch (e) {
+				uni.showToast({ title: e.message || '创建失败', icon: 'none' })
+			} finally {
+				this.loading = false
+			}
+		},
+		skip() {
+			this.navigateToHome()
+		},
+		navigateToHome() {
+			// 保存 mascot 到 userInfo 存储,供聊天页读取
+			if (this.form.mascot) {
+				try {
+					const userInfo = uni.getStorageSync('userInfo') || {}
+					userInfo.mascot = this.form.mascot
+					uni.setStorageSync('userInfo', userInfo)
+				} catch (e) {
+					console.error('保存 mascot 失败', e)
+				}
+			}
+			// 用 switchTab 跳转带底部 TabBar 的首页(行/身/智/心/富)
+            // parent-index/child-index 是分包页面(非 TabBar 页),用 navigateTo 会丢失底部 TabBar
+			uni.switchTab({ url: '/pages/index-home/index' })
+		}
+	}
+}
+</script>
+
+<style scoped>
+.user-edit-container {
+	min-height: 100vh;
+	background: #f5f5f5;
+	padding: 30rpx;
+}
+
+.header {
+	margin-bottom: 40rpx;
+	text-align: center;
+}
+
+.title {
+	font-size: 40rpx;
+	font-weight: bold;
+	color: #333;
+	display: block;
+	margin-bottom: 10rpx;
+}
+
+.subtitle {
+	font-size: 28rpx;
+	color: #999;
+}
+
+/* 角色选择 */
+.role-select-section {
+	margin-bottom: 40rpx;
+}
+
+.role-card {
+	background: #fff;
+	border-radius: 16rpx;
+	padding: 40rpx;
+	margin-bottom: 20rpx;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	border: 2rpx solid transparent;
+	transition: all 0.3s;
+}
+
+.role-card.active {
+	border-color: #4CAF50;
+	background: #f8fdf8;
+}
+
+.role-icon {
+	font-size: 80rpx;
+	margin-bottom: 16rpx;
+}
+
+.role-name {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #333;
+	margin-bottom: 8rpx;
+}
+
+.role-desc {
+	font-size: 24rpx;
+	color: #999;
+}
+
+.btn-next {
+	background: #4CAF50;
+	color: #fff;
+	border-radius: 40rpx;
+	margin-top: 20rpx;
+}
+
+/* 表单 */
+.form-section {
+	background: #fff;
+	border-radius: 16rpx;
+	padding: 30rpx;
+	margin-bottom: 30rpx;
+}
+
+.form-section-title {
+	font-size: 30rpx;
+	font-weight: bold;
+	color: #333;
+	margin-bottom: 20rpx;
+	padding-bottom: 16rpx;
+	border-bottom: 1rpx solid #f0f0f0;
+}
+
+.form-item {
+	margin-bottom: 30rpx;
+}
+
+.label {
+	display: block;
+	font-size: 28rpx;
+	color: #333;
+	margin-bottom: 16rpx;
+}
+
+.required {
+	color: #f44336;
+}
+
+.input, .picker-input {
+	padding: 20rpx;
+	background: #f5f5f5;
+	border-radius: 12rpx;
+	font-size: 28rpx;
+}
+
+.role-select {
+	display: flex;
+	gap: 40rpx;
+}
+
+.role-option {
+	display: flex;
+	align-items: center;
+	gap: 8rpx;
+}
+
+/* 头像上传 */
+.avatar-upload {
+	width: 150rpx;
+	height: 150rpx;
+}
+
+.avatar-preview {
+	width: 150rpx;
+	height: 150rpx;
+	border-radius: 50%;
+}
+
+.avatar-placeholder {
+	width: 150rpx;
+	height: 150rpx;
+	background: #f5f5f5;
+	border-radius: 50%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 60rpx;
+	color: #ccc;
+}
+
+/* 照片上传 */
+.photo-upload {
+	width: 300rpx;
+	height: 200rpx;
+}
+
+.photo-preview {
+	width: 300rpx;
+	height: 200rpx;
+	border-radius: 12rpx;
+}
+
+.photo-placeholder {
+	width: 300rpx;
+	height: 200rpx;
+	background: #f5f5f5;
+	border-radius: 12rpx;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+}
+
+.plus-icon {
+	font-size: 60rpx;
+	color: #ccc;
+}
+
+.placeholder-text {
+	font-size: 24rpx;
+	color: #999;
+	margin-top: 8rpx;
+}
+
+/* 助手选择 */
+.mascot-cards {
+	display: flex;
+	gap: 20rpx;
+	margin-top: 16rpx;
+}
+.mascot-card {
+	flex: 1;
+	background: #f8f8f8;
+	border-radius: 16rpx;
+	padding: 24rpx;
+	display: flex;
+	align-items: center;
+	gap: 16rpx;
+	border: 2rpx solid transparent;
+	transition: all 0.3s;
+}
+.mascot-card.active {
+	border-color: #4CAF50;
+	background: #f0fdf4;
+}
+.mascot-card-icon {
+	width: 72rpx;
+	height: 72rpx;
+	border-radius: 50%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 36rpx;
+	flex-shrink: 0;
+}
+.xibao-bg {
+	background: linear-gradient(135deg, #FFF0DB, #FFD6A5);
+}
+.fubao-bg {
+	background: linear-gradient(135deg, #FFF8E1, #FCD34D);
+}
+.mascot-card-info {
+	display: flex;
+	flex-direction: column;
+	gap: 4rpx;
+}
+.mascot-card-name {
+	font-size: 30rpx;
+	font-weight: bold;
+	color: #333;
+}
+.mascot-card-desc {
+	font-size: 22rpx;
+	color: #999;
+}
+
+/* 家庭绑定 */
+.family-section {
+	background: #fff;
+	border-radius: 16rpx;
+	padding: 30rpx;
+}
+
+.section-title {
+	font-size: 30rpx;
+	font-weight: bold;
+	color: #333;
+	margin-bottom: 20rpx;
+}
+
+.family-actions {
+	display: flex;
+	flex-direction: column;
+	gap: 20rpx;
+	margin-top: 30rpx;
+}
+
+.btn {
+	border-radius: 40rpx;
+	font-size: 30rpx;
+}
+
+.btn-primary {
+	background: #4CAF50;
+	color: #fff;
+}
+
+.btn-skip {
+	background: #f5f5f5;
+	color: #999;
+}
+
+/* ===== 区域选择弹窗 ===== */
+.region-mask {
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	background: rgba(0, 0, 0, 0.5);
+	z-index: 999;
+	display: flex;
+	align-items: flex-end;
+}
+.region-picker {
+	background: #fff;
+	border-radius: 20rpx 20rpx 0 0;
+	width: 100%;
+	max-height: 70vh;
+	display: flex;
+	flex-direction: column;
+}
+.region-header {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 24rpx 30rpx;
+	border-bottom: 1rpx solid #f0f0f0;
+}
+.region-header-btn {
+	font-size: 28rpx;
+	color: #999;
+}
+.region-confirm {
+	color: #F97316;
+	font-weight: bold;
+}
+.region-header-title {
+	font-size: 30rpx;
+	font-weight: bold;
+	color: #333;
+}
+.region-breadcrumb {
+	display: flex;
+	align-items: center;
+	padding: 20rpx 30rpx;
+	border-bottom: 1rpx solid #f5f5f5;
+}
+.crumb-item {
+	font-size: 26rpx;
+	color: #999;
+	padding: 8rpx 12rpx;
+	border-radius: 8rpx;
+}
+.crumb-item.crumb-active {
+	color: #F97316;
+	font-weight: bold;
+}
+.crumb-arrow {
+	font-size: 24rpx;
+	color: #ccc;
+	margin: 0 8rpx;
+}
+.region-list {
+	max-height: 50vh;
+	overflow-y: auto;
+}
+.region-item {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 28rpx 30rpx;
+	border-bottom: 1rpx solid #f5f5f5;
+}
+.region-item:active {
+	background: #FFF7ED;
+}
+.region-item-text {
+	font-size: 28rpx;
+	color: #333;
+}
+.region-item-check {
+	font-size: 28rpx;
+	color: #F97316;
+	font-weight: bold;
+}
+.region-item-selected {
+	background: #FFF7ED;
+}
+.region-item-selected .region-item-text {
+	color: #F97316;
+	font-weight: bold;
+}
+.region-loading {
+	padding: 40rpx;
+	text-align: center;
+	font-size: 26rpx;
+	color: #999;
+}
+
+/* ===== 地址行(所在地区) ===== */
+.address-row {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+}
+.address-value-wrap {
+	display: flex;
+	align-items: center;
+	flex: 1;
+	justify-content: flex-end;
+}
+.address-value {
+	font-size: 28rpx;
+	color: #333;
+}
+.address-placeholder {
+	font-size: 28rpx;
+	color: #999;
+}
+.address-arrow {
+	font-size: 28rpx;
+	color: #ccc;
+	margin-left: 8rpx;
+}
+
+/* 助手锁定提示 */
+.mascot-locked-hint {
+	display: flex;
+	align-items: center;
+	padding: 28rpx 32rpx;
+	background: linear-gradient(135deg, #FEF3C7, #FDE68A);
+	border-radius: 20rpx;
+	margin-top: 16rpx;
+}
+.locked-icon {
+	font-size: 36rpx;
+	margin-right: 16rpx;
+}
+.locked-text {
+	flex: 1;
+	font-size: 28rpx;
+	font-weight: 600;
+	color: #92400e;
+}
+.locked-arrow {
+	font-size: 32rpx;
+	color: #92400e;
+	margin-left: 8rpx;
+}
+</style>

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

@@ -125,7 +125,7 @@
 
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
-    <AIFloatingAvatar />
+    <FloatingAvatar />
   </view>
 </template>
 
@@ -136,14 +136,14 @@ 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 FloatingAvatar from '../../components/FloatingAvatar.vue'
 import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
 import DimensionIntroCard from '../../components/DimensionIntroCard.vue'
 import { getVisibleSections, getChildren, getFamilyEnergySandbox, getEnergySandbox, getAssessmentLatestResult, getDanReportByChild } from '../../utils/api.js'
 import { parseDate } from '../../utils/format.js'
 
 export default {
-  components: { TabTransition, PageBanner, RadarChart, FamilyEnergyBar, DimensionSubDims, AIFloatingAvatar, FamilyMemberStrip, DimensionIntroCard },
+  components: { TabTransition, PageBanner, RadarChart, FamilyEnergyBar, DimensionSubDims, FloatingAvatar, FamilyMemberStrip, DimensionIntroCard },
   data() {
     return {
       isLoggedIn: false,

+ 5 - 5
cfc-frontend/utils/api.js

@@ -1381,7 +1381,7 @@ export const aiDeleteConversation = (id) => {
   return request('/api/ai/chat/conversations/' + id + '/delete', 'POST', {})
 }
 
-// 精准营养助手(基于体检报告)
+// 营养助手(基于体检报告)
 export const aiSendNutritionMessage = (data) => {
   var query = data && data.query ? data.query : ''
   var conversationId = data && data.conversationId ? data.conversationId : ''
@@ -1393,7 +1393,7 @@ export const aiSendNutritionMessage = (data) => {
     user_id: userId,
     conversation_id: conversationId,
     response_mode: 'blocking',
-    bot_name: '精准营养助手'
+    bot_name: '营养助手'
   }
   if (reportId) {
     langgraphBody.inputs = { report_id: reportId }
@@ -1419,7 +1419,7 @@ export const aiSendNutritionMessage = (data) => {
   })
 }
 
-// AI 健康教练
+// 健康教练
 export const aiSendHealthCoachMessage = (data) => {
   var query = data && data.query ? data.query : ''
   var conversationId = data && data.conversationId ? data.conversationId : ''
@@ -1456,7 +1456,7 @@ export const aiSendHealthCoachMessage = (data) => {
   })
 }
 
-// AI 健康管家(健康知识库检索 + 个性化建议 + 任务生成)
+// 健康管家(健康知识库检索 + 个性化建议 + 任务生成)
 export const aiSendHealthButlerMessage = (data) => {
   var query = data && data.query ? data.query : ''
   var conversationId = data && data.conversationId ? data.conversationId : ''
@@ -1468,7 +1468,7 @@ export const aiSendHealthButlerMessage = (data) => {
     user_id: userId,
     conversation_id: conversationId,
     response_mode: 'blocking',
-    bot_name: 'AI健康管家'
+    bot_name: '健康管家'
   }
   var inputs = {}
   if (memberId) { inputs.child_id = memberId }