ソースを参照

fix(frontend): 修复 tabbar 路径与分包 root 冲突导致的 HBuilderX 编译失败

将三个分包目录重命名消除与主包 tabbar 页面的路径前缀冲突:
- pages/growth → pages/growth-pkg
- pages/health → pages/health-pkg
- pages/profile → pages/profile-pkg

同步更新 pages.json 分包 root、tabBar 路径及 30 个文件中的 66 处引用
asus 2 ヶ月 前
親
コミット
49700c8ecc
55 ファイル変更、396 行追加、393 行削除
  1. 5 5
      cfc-frontend/custom-tab-bar/index.vue
  2. 9 9
      cfc-frontend/pages.json
  3. 2 2
      cfc-frontend/pages/ai/chat.vue
  4. 5 5
      cfc-frontend/pages/body/index.vue
  5. 1 1
      cfc-frontend/pages/butler/apply.vue
  6. 4 1
      cfc-frontend/pages/diet/index.vue
  7. 0 0
      cfc-frontend/pages/growth-pkg/assessment-result.vue
  8. 2 2
      cfc-frontend/pages/growth-pkg/create.vue
  9. 3 3
      cfc-frontend/pages/growth-pkg/detail.vue
  10. 2 2
      cfc-frontend/pages/growth-pkg/index.vue
  11. 0 0
      cfc-frontend/pages/growth-pkg/supplement.vue
  12. 1 1
      cfc-frontend/pages/growth-pkg/upload.vue
  13. 1 1
      cfc-frontend/pages/guide/register/index.vue
  14. 0 0
      cfc-frontend/pages/health-pkg/challenge-manage.vue
  15. 0 0
      cfc-frontend/pages/health-pkg/daily-checkin.vue
  16. 0 0
      cfc-frontend/pages/health-pkg/diet-index.vue
  17. 0 0
      cfc-frontend/pages/health-pkg/exercise-index.vue
  18. 5 5
      cfc-frontend/pages/health-pkg/gut-flora-detail.vue
  19. 0 0
      cfc-frontend/pages/health-pkg/gut-flora-foods-detail.vue
  20. 0 0
      cfc-frontend/pages/health-pkg/gut-flora-risks-detail.vue
  21. 0 0
      cfc-frontend/pages/health-pkg/gut-flora-species-detail.vue
  22. 2 2
      cfc-frontend/pages/health-pkg/gut-index.vue
  23. 8 8
      cfc-frontend/pages/health-pkg/index.vue
  24. 0 0
      cfc-frontend/pages/health-pkg/meditation-index.vue
  25. 0 0
      cfc-frontend/pages/health-pkg/nutrition-profile.vue
  26. 0 0
      cfc-frontend/pages/health-pkg/physical-exam-detail.vue
  27. 1 1
      cfc-frontend/pages/health-pkg/report-confirm.vue
  28. 4 4
      cfc-frontend/pages/health-pkg/report-list.vue
  29. 0 0
      cfc-frontend/pages/health-pkg/report-survey.vue
  30. 1 1
      cfc-frontend/pages/health-pkg/report-upload.vue
  31. 0 0
      cfc-frontend/pages/health-pkg/sleep-index.vue
  32. 1 1
      cfc-frontend/pages/health-pkg/tongue-index.vue
  33. 0 0
      cfc-frontend/pages/health-pkg/water-index.vue
  34. 1 1
      cfc-frontend/pages/home-pages/child-index.vue
  35. 1 1
      cfc-frontend/pages/home-pages/parent-index.vue
  36. 1 1
      cfc-frontend/pages/mind/index.vue
  37. 1 1
      cfc-frontend/pages/nutritionist/apply.vue
  38. 1 1
      cfc-frontend/pages/parent/child-detail.vue
  39. 0 0
      cfc-frontend/pages/profile-pkg/components/ProfileBadges.vue
  40. 1 1
      cfc-frontend/pages/profile-pkg/components/ProfileGrowth.vue
  41. 0 0
      cfc-frontend/pages/profile-pkg/components/ProfileHeader.vue
  42. 2 2
      cfc-frontend/pages/profile-pkg/components/ProfileMenu.vue
  43. 0 0
      cfc-frontend/pages/profile-pkg/components/ProfileStats.vue
  44. 0 0
      cfc-frontend/pages/profile-pkg/index.vue
  45. 319 319
      cfc-frontend/pages/profile-pkg/profile.vue
  46. 1 1
      cfc-frontend/pages/profile-pkg/report-detail.vue
  47. 1 1
      cfc-frontend/pages/profile-pkg/report-management.vue
  48. 0 0
      cfc-frontend/pages/profile-pkg/service-role-apply.vue
  49. 1 1
      cfc-frontend/pages/teacher/teacher-home.vue
  50. 1 1
      cfc-frontend/pages/teacher/teacher-profile.vue
  51. 1 1
      cfc-frontend/pages/tianpan/index.vue
  52. 1 1
      cfc-frontend/pages/vendor/apply.vue
  53. 1 1
      cfc-frontend/pages/wealth/index.vue
  54. 3 3
      cfc-frontend/utils/nav.js
  55. 2 2
      cfc-frontend/utils/profile-field-usage.js

+ 5 - 5
cfc-frontend/custom-tab-bar/index.vue

@@ -70,15 +70,15 @@ export default {
       showDimOverlay: false,
       mainTabs: [
         { text: '首页', pagePath: '/pages/index-home/index', icon: '/static/tab-action.png', selectedIcon: '/static/tab-action-active.png' },
-        { text: '健康', pagePath: '/pages/health/index', icon: '/static/tab-body.png', selectedIcon: '/static/tab-body-active.png' },
-        { text: '成长', pagePath: '/pages/growth/index', icon: '/static/tab-growth.png', selectedIcon: '/static/tab-growth-active.png' },
-        { text: '我的', pagePath: '/pages/profile/profile', icon: '/static/tab-profile.png', selectedIcon: '/static/tab-profile-active.png' }
+        { text: '健康', pagePath: '/pages/health-pkg/index', icon: '/static/tab-body.png', selectedIcon: '/static/tab-body-active.png' },
+        { text: '成长', pagePath: '/pages/growth-pkg/index', icon: '/static/tab-growth.png', selectedIcon: '/static/tab-growth-active.png' },
+        { text: '我的', pagePath: '/pages/profile-pkg/profile', icon: '/static/tab-profile.png', selectedIcon: '/static/tab-profile-active.png' }
       ],
       teacherTabs: [
         { text: '首页', pagePath: '/pages/teacher/index', icon: '/static/tab-action.png', selectedIcon: '/static/tab-action-active.png' },
         { text: '家庭', pagePath: '/pages/teacher/families', icon: '/static/tab-family.png', selectedIcon: '/static/tab-family-active.png' },
         { text: '团队', pagePath: '/pages/teacher/team', icon: '/static/tab-team.png', selectedIcon: '/static/tab-team-active.png' },
-        { text: '成长档案', pagePath: '/pages/growth/index', icon: '/static/tab-growth.png', selectedIcon: '/static/tab-growth-active.png' },
+        { text: '成长档案', pagePath: '/pages/growth-pkg/index', icon: '/static/tab-growth.png', selectedIcon: '/static/tab-growth-active.png' },
         { text: '我的', pagePath: '/pages/teacher/teacher-profile', icon: '/static/tab-profile.png', selectedIcon: '/static/tab-profile-active.png' }
       ],
       dimensions: [
@@ -130,7 +130,7 @@ export default {
     switchTab(item, index) {
       this.currentIndex = index
       // 只有 TabBar 注册页才能用 switchTab
-      const nativeTabPages = ['/pages/index-home/index', '/pages/health/index', '/pages/growth/index', '/pages/profile/profile']
+      const nativeTabPages = ['/pages/index-home/index', '/pages/health-pkg/index', '/pages/growth-pkg/index', '/pages/profile-pkg/profile']
       if (nativeTabPages.includes(item.pagePath)) {
         uni.switchTab({ url: item.pagePath })
       } else {

+ 9 - 9
cfc-frontend/pages.json

@@ -7,19 +7,19 @@
       }
     },
     {
-      "path": "pages/health/index",
+      "path": "pages/health-pkg/index",
       "style": {
         "navigationBarTitleText": "健康"
       }
     },
     {
-      "path": "pages/growth/index",
+      "path": "pages/growth-pkg/index",
       "style": {
         "navigationBarTitleText": "成长"
       }
     },
     {
-      "path": "pages/profile/profile",
+      "path": "pages/profile-pkg/profile",
       "style": {
         "navigationBarTitleText": "我的"
       }
@@ -422,7 +422,7 @@
       ]
     },
     {
-      "root": "pages/growth",
+      "root": "pages/growth-pkg",
       "pages": [
         {
           "path": "create",
@@ -773,7 +773,7 @@
       ]
     },
     {
-      "root": "pages/health",
+      "root": "pages/health-pkg",
       "pages": [
         {
           "path": "report-upload",
@@ -1403,7 +1403,7 @@
       ]
     },
     {
-      "root": "pages/profile",
+      "root": "pages/profile-pkg",
       "pages": [
         {
           "path": "index",
@@ -1493,19 +1493,19 @@
         "selectedIconPath": "static/tab-action-active.png"
       },
       {
-        "pagePath": "pages/health/index",
+        "pagePath": "pages/health-pkg/index",
         "text": "健康",
         "iconPath": "/static/tab-body.png",
         "selectedIconPath": "/static/tab-body-active.png"
       },
       {
-        "pagePath": "pages/growth/index",
+        "pagePath": "pages/growth-pkg/index",
         "text": "成长",
         "iconPath": "static/tab-growth.png",
         "selectedIconPath": "static/tab-growth-active.png"
       },
       {
-        "pagePath": "pages/profile/profile",
+        "pagePath": "pages/profile-pkg/profile",
         "text": "我的",
         "iconPath": "static/tab-profile.png",
         "selectedIconPath": "static/tab-profile-active.png"

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

@@ -208,8 +208,8 @@ export default {
           'pages/index/index': '首页',
           'pages/index/parent-index': '首页',
           'pages/index/child-index': '首页',
-          'pages/profile/profile': '我的',
-          'pages/profile/children': '我的',
+          'pages/profile-pkg/profile': '我的',
+          'pages/profile-pkg/children': '我的',
           'pages/shop/index': '商城',
           'pages/discover/index': '发现'
         }

+ 5 - 5
cfc-frontend/pages/body/index.vue

@@ -179,8 +179,8 @@ export default {
         { icon: '\u{1F3C3}', label: '运动', needLogin: true, page: '/pages/body/exercise-record' },
         { icon: '\u{1F957}', label: '饮食', needLogin: true, page: '/pages/body/meal-record' },
         { 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' },
+        { icon: '\u{1F9D8}', label: '冥想', needLogin: true, page: '/pages/health-pkg/meditation-index' },
+        { icon: '\u{1F4CA}', label: '舌诊', needLogin: true, page: '/pages/health-pkg/report-upload?reportType=tongue' },
         // AI问答功能已屏蔽: { 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' }
       ]
@@ -469,7 +469,7 @@ export default {
     },
     goTasks: function() { uni.navigateTo({ url: '/pages/tasks/tasks' }) },
     goFamilyMembers: function() {
-      uni.navigateTo({ url: '/pages/profile/family-members' })
+      uni.navigateTo({ url: '/pages/profile-pkg/family-members' })
     },
     sectionVisible: function(key) {
       return this.visibleSections.length === 0 || this.visibleSections.indexOf(key) !== -1
@@ -512,11 +512,11 @@ export default {
         uni.showToast({ title: '请先选择成员', icon: 'none' })
         return
       }
-      uni.navigateTo({ url: '/pages/health/nutrition-profile?memberId=' + id })
+      uni.navigateTo({ url: '/pages/health-pkg/nutrition-profile?memberId=' + id })
     },
     goToUploadReport: function() {
       var id = this.activeChildId || uni.getStorageSync('currentChildId') || ''
-      uni.navigateTo({ url: '/pages/health/report-upload?memberId=' + id + '&from=body' })
+      uni.navigateTo({ url: '/pages/health-pkg/report-upload?memberId=' + id + '&from=body' })
     },
     _watchPageReady() {
       var self = this

+ 1 - 1
cfc-frontend/pages/butler/apply.vue

@@ -45,7 +45,7 @@ import { butlerApply } from '@/utils/api'
 
 export default {
   onLoad() {
-    uni.redirectTo({ url: '/pages/profile/service-role-apply' })
+    uni.redirectTo({ url: '/pages/profile-pkg/service-role-apply' })
   },
   data() {
     return {

+ 4 - 1
cfc-frontend/pages/diet/index.vue

@@ -49,7 +49,7 @@
           </view>
           
           <view class="ingredient-list" v-if="ingredients.length > 0">
-            <view class="ingredient-item" v-for="(item, index) in ingredients" :key="'ing-' + index">
+            <view class="ingredient-item" v-for="(item, index) in ingredients" :key="getIngredientKey(item, index)">
               <view class="ingredient-info">
                 <text class="ingredient-name">{{ item.name }}</text>
                 <text class="ingredient-reason" v-if="item.reason">{{ item.reason }}</text>
@@ -157,6 +157,9 @@ export default {
     this.loadMealSummary()
   },
   methods: {
+    getIngredientKey(item, index) {
+      return 'ing-' + index
+    },
     goBack() {
       uni.navigateBack()
     },

+ 0 - 0
cfc-frontend/pages/growth/assessment-result.vue → cfc-frontend/pages/growth-pkg/assessment-result.vue


+ 2 - 2
cfc-frontend/pages/growth/create.vue → cfc-frontend/pages/growth-pkg/create.vue

@@ -226,7 +226,7 @@ export default {
           uni.showToast({ title: '创建成功', icon: 'success' })
           setTimeout(function() {
             uni.navigateTo({
-              url: '/pages/growth/detail?recordId=' + res.data.id
+              url: '/pages/growth-pkg/detail?recordId=' + res.data.id
             })
           }, 500)
         } else {
@@ -238,7 +238,7 @@ export default {
       }
     },
     goUpload() {
-      var url = '/pages/growth/upload'
+      var url = '/pages/growth-pkg/upload'
       if (this.targetChildId) {
         url += '?memberId=' + this.targetChildId
       }

+ 3 - 3
cfc-frontend/pages/growth/detail.vue → cfc-frontend/pages/growth-pkg/detail.vue

@@ -215,18 +215,18 @@ export default {
     },
     viewAssessment() {
       uni.navigateTo({
-        url: '/pages/growth/assessment-result?recordId=' + this.recordId + '&assessmentId=' + this.record.assessmentId
+        url: '/pages/growth-pkg/assessment-result?recordId=' + this.recordId + '&assessmentId=' + this.record.assessmentId
       })
     },
     viewSupplement(item) {
       uni.navigateTo({
-        url: '/pages/growth/detail?recordId=' + item.id
+        url: '/pages/growth-pkg/detail?recordId=' + item.id
       })
     },
     goSupplement() {
       var memberId = this.record && this.record.memberId ? this.record.memberId : ''
       uni.navigateTo({
-        url: '/pages/growth/supplement?recordId=' + this.recordId + '&memberId=' + memberId
+        url: '/pages/growth-pkg/supplement?recordId=' + this.recordId + '&memberId=' + memberId
       })
     },
     copyFileUrl() {

+ 2 - 2
cfc-frontend/pages/growth/index.vue → cfc-frontend/pages/growth-pkg/index.vue

@@ -168,12 +168,12 @@ export default {
     },
     viewDetail(record) {
       uni.navigateTo({
-        url: '/pages/growth/detail?recordId=' + record.id
+        url: '/pages/growth-pkg/detail?recordId=' + record.id
       })
     },
     createRecord() {
       uni.navigateTo({
-        url: '/pages/growth/create?memberId=' + this.selectedChild.id + '&childName=' + encodeURIComponent(this.selectedChildName)
+        url: '/pages/growth-pkg/create?memberId=' + this.selectedChild.id + '&childName=' + encodeURIComponent(this.selectedChildName)
       })
     },
     formatDate(date) {

+ 0 - 0
cfc-frontend/pages/growth/supplement.vue → cfc-frontend/pages/growth-pkg/supplement.vue


+ 1 - 1
cfc-frontend/pages/growth/upload.vue → cfc-frontend/pages/growth-pkg/upload.vue

@@ -222,7 +222,7 @@ export default {
         if (res.code === 200) {
           uni.showToast({ title: '创建成功', icon: 'success' })
           setTimeout(function() {
-            uni.navigateTo({ url: '/pages/growth/detail?recordId=' + res.data.id })
+            uni.navigateTo({ url: '/pages/growth-pkg/detail?recordId=' + res.data.id })
           }, 500)
         } else {
           uni.showToast({ title: res.message || '创建失败', icon: 'none' })

+ 1 - 1
cfc-frontend/pages/guide/register/index.vue

@@ -142,7 +142,7 @@ import { registerGuide, validateInviteCode } from '../../../utils/api.js'
 
 export default {
   onLoad() {
-    uni.redirectTo({ url: '/pages/profile/service-role-apply' })
+    uni.redirectTo({ url: '/pages/profile-pkg/service-role-apply' })
   },
   data() {
     return {

+ 0 - 0
cfc-frontend/pages/health/challenge-manage.vue → cfc-frontend/pages/health-pkg/challenge-manage.vue


+ 0 - 0
cfc-frontend/pages/health/daily-checkin.vue → cfc-frontend/pages/health-pkg/daily-checkin.vue


+ 0 - 0
cfc-frontend/pages/health/diet-index.vue → cfc-frontend/pages/health-pkg/diet-index.vue


+ 0 - 0
cfc-frontend/pages/health/exercise-index.vue → cfc-frontend/pages/health-pkg/exercise-index.vue


+ 5 - 5
cfc-frontend/pages/health/gut-flora-detail.vue → cfc-frontend/pages/health-pkg/gut-flora-detail.vue

@@ -372,19 +372,19 @@ export default {
       })
     },
     goToSpecies: function() {
-      uni.navigateTo({ url: '/pages/health/gut-flora-species-detail?reportId=' + this.reportId })
+      uni.navigateTo({ url: '/pages/health-pkg/gut-flora-species-detail?reportId=' + this.reportId })
     },
     goToPathogen: function() {
-      uni.navigateTo({ url: '/pages/health/gut-flora-species-detail?reportId=' + this.reportId + '&tab=pathogen_genus' })
+      uni.navigateTo({ url: '/pages/health-pkg/gut-flora-species-detail?reportId=' + this.reportId + '&tab=pathogen_genus' })
     },
     goToTaxonomy: function() {
-      uni.navigateTo({ url: '/pages/health/gut-flora-species-detail?reportId=' + this.reportId + '&tab=taxonomy_class' })
+      uni.navigateTo({ url: '/pages/health-pkg/gut-flora-species-detail?reportId=' + this.reportId + '&tab=taxonomy_class' })
     },
     goToRisks: function() {
-      uni.navigateTo({ url: '/pages/health/gut-flora-risks-detail?reportId=' + this.reportId })
+      uni.navigateTo({ url: '/pages/health-pkg/gut-flora-risks-detail?reportId=' + this.reportId })
     },
     goToFoods: function() {
-      uni.navigateTo({ url: '/pages/health/gut-flora-foods-detail?reportId=' + this.reportId })
+      uni.navigateTo({ url: '/pages/health-pkg/gut-flora-foods-detail?reportId=' + this.reportId })
     },
     goToIndicators: function() {
       this.accordionOpen.nutri = true

+ 0 - 0
cfc-frontend/pages/health/gut-flora-foods-detail.vue → cfc-frontend/pages/health-pkg/gut-flora-foods-detail.vue


+ 0 - 0
cfc-frontend/pages/health/gut-flora-risks-detail.vue → cfc-frontend/pages/health-pkg/gut-flora-risks-detail.vue


+ 0 - 0
cfc-frontend/pages/health/gut-flora-species-detail.vue → cfc-frontend/pages/health-pkg/gut-flora-species-detail.vue


+ 2 - 2
cfc-frontend/pages/health/gut-index.vue → cfc-frontend/pages/health-pkg/gut-index.vue

@@ -142,7 +142,7 @@ export default {
     },
     goToReportUpload: function() {
       uni.navigateTo({
-        url: '/pages/health/report-upload'
+        url: '/pages/health-pkg/report-upload'
       })
     },
     goToMyReport: function() {
@@ -159,7 +159,7 @@ export default {
       healthRequest('/api/health/report/latest', { memberId: memberId }).then(function(res) {
         if (res.data && res.data.id) {
           uni.navigateTo({
-            url: '/pages/health/gut-flora-detail?reportId=' + res.data.id
+            url: '/pages/health-pkg/gut-flora-detail?reportId=' + res.data.id
           })
         } else {
           uni.showToast({ title: '暂无菌群报告', icon: 'none' })

+ 8 - 8
cfc-frontend/pages/health/index.vue → cfc-frontend/pages/health-pkg/index.vue

@@ -165,35 +165,35 @@ export default {
       })
     },
     goReportList() {
-      uni.navigateTo({ url: '/pages/health/report-list' })
+      uni.navigateTo({ url: '/pages/health-pkg/report-list' })
     },
     goUploadReport() {
-      uni.navigateTo({ url: '/pages/health/report-upload' })
+      uni.navigateTo({ url: '/pages/health-pkg/report-upload' })
     },
     goCheckin() {
-      uni.navigateTo({ url: '/pages/health/daily-checkin' })
+      uni.navigateTo({ url: '/pages/health-pkg/daily-checkin' })
     },
     goAssessment() {
       uni.navigateTo({ url: '/pages/assessment/apply' })
     },
     goNutrition() {
       var id = this.selectedMemberId || ''
-      uni.navigateTo({ url: '/pages/health/nutrition-profile?memberId=' + id })
+      uni.navigateTo({ url: '/pages/health-pkg/nutrition-profile?memberId=' + id })
     },
     goDiet() {
       uni.navigateTo({ url: '/pages/meal/recommend' })
     },
     goExercise() {
-      uni.navigateTo({ url: '/pages/health/exercise-index' })
+      uni.navigateTo({ url: '/pages/health-pkg/exercise-index' })
     },
     goSleep() {
-      uni.navigateTo({ url: '/pages/health/sleep-index' })
+      uni.navigateTo({ url: '/pages/health-pkg/sleep-index' })
     },
     goMeditation() {
-      uni.navigateTo({ url: '/pages/health/meditation-index' })
+      uni.navigateTo({ url: '/pages/health-pkg/meditation-index' })
     },
     goTongue() {
-      uni.navigateTo({ url: '/pages/health/report-upload?reportType=tongue' })
+      uni.navigateTo({ url: '/pages/health-pkg/report-upload?reportType=tongue' })
     },
     goHealthDimensions() {
       var id = this.selectedMemberId || ''

+ 0 - 0
cfc-frontend/pages/health/meditation-index.vue → cfc-frontend/pages/health-pkg/meditation-index.vue


+ 0 - 0
cfc-frontend/pages/health/nutrition-profile.vue → cfc-frontend/pages/health-pkg/nutrition-profile.vue


+ 0 - 0
cfc-frontend/pages/health/physical-exam-detail.vue → cfc-frontend/pages/health-pkg/physical-exam-detail.vue


+ 1 - 1
cfc-frontend/pages/health/report-confirm.vue → cfc-frontend/pages/health-pkg/report-confirm.vue

@@ -746,7 +746,7 @@ export default {
           setTimeout(function() {
             if (reportId) {
               if (reportType === 'gut_flora') {
-                uni.redirectTo({ url: '/pages/health/report-survey?reportId=' + reportId + '&memberId=' + (postData.subjectId || '') })
+                uni.redirectTo({ url: '/pages/health-pkg/report-survey?reportId=' + reportId + '&memberId=' + (postData.subjectId || '') })
               } else {
                 uni.redirectTo({ url: '/pages/body/health-report?reportId=' + reportId })
               }

+ 4 - 4
cfc-frontend/pages/health/report-list.vue → cfc-frontend/pages/health-pkg/report-list.vue

@@ -80,15 +80,15 @@ export default {
     },
 	goToDetail(reportId, reportType) {
 		var detailPages = {
-		'gut_flora': '/pages/health/gut-flora-detail',
-		'physical_exam': '/pages/health/physical-exam-detail',
-		'tongue': '/pages/health/tongue-index'
+		'gut_flora': '/pages/health-pkg/gut-flora-detail',
+		'physical_exam': '/pages/health-pkg/physical-exam-detail',
+		'tongue': '/pages/health-pkg/tongue-index'
 	  }
 	  var url = detailPages[reportType] || '/pages/body/health-report'
 	  uni.navigateTo({ url: url + '?reportId=' + reportId })
 	},
     goToUpload() {
-      uni.navigateTo({ url: '/pages/health/report-upload' })
+      uni.navigateTo({ url: '/pages/health-pkg/report-upload' })
     },
     formatDate(dateStr) {
       if (!dateStr) return '--'

+ 0 - 0
cfc-frontend/pages/health/report-survey.vue → cfc-frontend/pages/health-pkg/report-survey.vue


+ 1 - 1
cfc-frontend/pages/health/report-upload.vue → cfc-frontend/pages/health-pkg/report-upload.vue

@@ -541,7 +541,7 @@ export default {
         params += '&familyId=' + self.familyId
       }
 
-      uni.navigateTo({ url: '/pages/health/report-confirm?' + params })
+      uni.navigateTo({ url: '/pages/health-pkg/report-confirm?' + params })
     },
     getImageUrl: function(path) {
       return config.API_BASE_URL + path

+ 0 - 0
cfc-frontend/pages/health/sleep-index.vue → cfc-frontend/pages/health-pkg/sleep-index.vue


+ 1 - 1
cfc-frontend/pages/health/tongue-index.vue → cfc-frontend/pages/health-pkg/tongue-index.vue

@@ -6,7 +6,7 @@
 // 废弃 — 舌诊功能已迁移到 report-upload?reportType=tongue
 export default {
   onLoad: function() {
-    uni.redirectTo({ url: '/pages/health/report-upload?reportType=tongue' })
+    uni.redirectTo({ url: '/pages/health-pkg/report-upload?reportType=tongue' })
   }
 }
 </script>

+ 0 - 0
cfc-frontend/pages/health/water-index.vue → cfc-frontend/pages/health-pkg/water-index.vue


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

@@ -676,7 +676,7 @@ export default {
     },
     goToGrowth() {
       this.$emit('navigate', { page: 'growth' })
-      uni.navigateTo({ url: '/pages/growth/growth' })
+      uni.navigateTo({ url: '/pages/growth-pkg/growth' })
     },
     goToGames() {
       this.$emit('navigate', { page: 'games' })

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

@@ -1033,7 +1033,7 @@ export default {
       })
     },
     addTask() { uni.navigateTo({ url: '/pages/tasks/create-task' }) },
-    goToChallengeManage() { uni.navigateTo({ url: '/pages/health/challenge-manage' }) },
+    goToChallengeManage() { uni.navigateTo({ url: '/pages/health-pkg/challenge-manage' }) },
     goToReview() { uni.navigateTo({ url: '/pages/tasks/review' }) },
     goToWishApprove() { uni.navigateTo({ url: '/pages/wishes/approve' }) },
     goToAssessmentReport() { uni.navigateTo({ url: '/pages/assessment/report' }) },

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

@@ -227,7 +227,7 @@ components: { TabTransition, PageBanner, RadarChart, LoginGuideCard, FamilyEnerg
       funcList: [
         { icon: '\u{1F4D6}', label: '阅读', needLogin: false, page: '/pages/mind-extra/articles' },
         { icon: '\u{1F4CA}', label: '测评报告', needLogin: true, page: '/pages/mind/emotion-report' },
-        { icon: '\u{1F4DD}', label: '成长档案', needLogin: true, page: '/pages/growth/index' },
+        { icon: '\u{1F4DD}', label: '成长档案', needLogin: true, page: '/pages/growth-pkg/index' },
         { icon: '\u{2728}', label: '情绪打卡', needLogin: true, page: '/pages/mind-detail/emotion-checkin' },
         { icon: '\u{1F4C8}', label: '情绪趋势', needLogin: true, page: '/pages/mind-detail/emotion-trend' },
         { icon: '\u{1F9E9}', label: '心理自评', needLogin: true, page: '/pages/mind-detail/screening' },

+ 1 - 1
cfc-frontend/pages/nutritionist/apply.vue

@@ -34,7 +34,7 @@ import { nutritionistApply } from '@/utils/api'
 
 export default {
   onLoad() {
-    uni.redirectTo({ url: '/pages/profile/service-role-apply' })
+    uni.redirectTo({ url: '/pages/profile-pkg/service-role-apply' })
   },
   data() {
     return {

+ 1 - 1
cfc-frontend/pages/parent/child-detail.vue

@@ -200,7 +200,7 @@ export default {
     },
     goToGrowth() {
       uni.navigateTo({
-        url: '/pages/growth/index?memberId=' + this.memberId
+        url: '/pages/growth-pkg/index?memberId=' + this.memberId
       })
     },
     goToCompletionStats() {

+ 0 - 0
cfc-frontend/pages/profile/components/ProfileBadges.vue → cfc-frontend/pages/profile-pkg/components/ProfileBadges.vue


+ 1 - 1
cfc-frontend/pages/profile/components/ProfileGrowth.vue → cfc-frontend/pages/profile-pkg/components/ProfileGrowth.vue

@@ -76,7 +76,7 @@ export default {
     },
     goGrowthReport() {
       const memberId = uni.getStorageSync('currentChildId') || ''
-      uni.navigateTo({ url: '/pages/growth/report?memberId=' + memberId })
+      uni.navigateTo({ url: '/pages/growth-pkg/report?memberId=' + memberId })
     }
   }
 }

+ 0 - 0
cfc-frontend/pages/profile/components/ProfileHeader.vue → cfc-frontend/pages/profile-pkg/components/ProfileHeader.vue


+ 2 - 2
cfc-frontend/pages/profile/components/ProfileMenu.vue → cfc-frontend/pages/profile-pkg/components/ProfileMenu.vue

@@ -147,10 +147,10 @@ export default {
       uni.navigateTo({ url: '/pages/profile-extra/onboarding' })
     },
     goToReportManagement() {
-      uni.navigateTo({ url: '/pages/profile/report-management' })
+      uni.navigateTo({ url: '/pages/profile-pkg/report-management' })
     },
     goToServiceRoleApply() {
-      uni.navigateTo({ url: '/pages/profile/service-role-apply' })
+      uni.navigateTo({ url: '/pages/profile-pkg/service-role-apply' })
     },
     goToFamilyMembers() {
       uni.navigateTo({ url: '/pages/profile-extra/family-members' })

+ 0 - 0
cfc-frontend/pages/profile/components/ProfileStats.vue → cfc-frontend/pages/profile-pkg/components/ProfileStats.vue


+ 0 - 0
cfc-frontend/pages/profile/index.vue → cfc-frontend/pages/profile-pkg/index.vue


+ 319 - 319
cfc-frontend/pages/profile/profile.vue → cfc-frontend/pages/profile-pkg/profile.vue

@@ -1,321 +1,321 @@
-<template>
-  <view class="container">
-    <!-- Tabbar 切换过渡页 -->
-    <tab-transition v-if="showTabTransition" dimCode="wealth" ref="tabTransition" @close="showTabTransition = false" />
-
-    <!-- ===== 未登录状态 ===== -->
-    <view v-if="!isLoggedIn" class="login-prompt">
-      <view class="prompt-icon">👤</view>
-      <text class="prompt-title">登录浠艾福</text>
-      <text class="prompt-desc">登录后可查看个人资料、积分记录等</text>
-      <button class="login-btn" @click="goLogin">登录 / 注册</button>
-    </view>
-
-    <!-- ===== 已登录状态 ===== -->
-    <template v-else>
-      <!-- 用户卡片 -->
-      <ProfileHeader @avatar-click="goToEditInfo" />
-
-      <!-- 个人信息完善卡片(全部填满后隐藏) -->
-      <view class="profile-card" v-if="isLoggedIn && profileProgress < 14" @click="goToEditInfo">
-        <view class="profile-card-left">
-          <text class="profile-card-title">个人信息</text>
-          <text class="profile-card-desc">已完善 {{ profileProgress }}/14 个字段,点击继续补充</text>
-        </view>
-        <text class="profile-card-arrow">›</text>
-      </view>
-
-      <!-- 成长报告 -->
-      <ProfileGrowth />
-
-      <!-- 成就徽章 -->
-      <ProfileBadges />
-
-      <!-- 健康等级称号(P2-1) -->
-      <HealthBadge
-        v-if="levelInfo"
-        :levelInfo="levelInfo"
-        :score="score"
-        :progress="progress"
-        :nextLevel="nextLevel"
-        :streakDays="streakDays" />
-
-      <!-- 健康故事时间线(P2-1) -->
-      <HealthTimeline :events="timelineEvents" />
-
-      <!-- 菜单列表(仅个人信息 + 设置,不含服务/商城板块) -->
-      <ProfileMenu :role="role" :show-services="false" @invite-generate="onInviteGenerate" />
-    </template>
-    <AIFloatingAvatar />
-  </view>
-</template>
-
-<script>
-import TabTransition from '../../components/tab-transition.vue'
-import ProfileHeader from './components/ProfileHeader.vue'
-import ProfileBadges from './components/ProfileBadges.vue'
-import ProfileGrowth from './components/ProfileGrowth.vue'
-import ProfileMenu from './components/ProfileMenu.vue'
-import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
-import HealthBadge from '../../components/HealthBadge.vue'
-import HealthTimeline from '../../components/HealthTimeline.vue'
-import { getHealthScoreInfo, getHealthTimeline, getUserInfo } from '../../utils/api.js'
-
-export default {
-components: {
-TabTransition,
-ProfileHeader,
-ProfileBadges,
-ProfileGrowth,
-ProfileMenu,
-AIFloatingAvatar,
-HealthBadge,
-HealthTimeline
+<template>
+  <view class="container">
+    <!-- Tabbar 切换过渡页 -->
+    <tab-transition v-if="showTabTransition" dimCode="wealth" ref="tabTransition" @close="showTabTransition = false" />
+
+    <!-- ===== 未登录状态 ===== -->
+    <view v-if="!isLoggedIn" class="login-prompt">
+      <view class="prompt-icon">👤</view>
+      <text class="prompt-title">登录浠艾福</text>
+      <text class="prompt-desc">登录后可查看个人资料、积分记录等</text>
+      <button class="login-btn" @click="goLogin">登录 / 注册</button>
+    </view>
+
+    <!-- ===== 已登录状态 ===== -->
+    <template v-else>
+      <!-- 用户卡片 -->
+      <ProfileHeader @avatar-click="goToEditInfo" />
+
+      <!-- 个人信息完善卡片(全部填满后隐藏) -->
+      <view class="profile-card" v-if="isLoggedIn && profileProgress < 14" @click="goToEditInfo">
+        <view class="profile-card-left">
+          <text class="profile-card-title">个人信息</text>
+          <text class="profile-card-desc">已完善 {{ profileProgress }}/14 个字段,点击继续补充</text>
+        </view>
+        <text class="profile-card-arrow">›</text>
+      </view>
+
+      <!-- 成长报告 -->
+      <ProfileGrowth />
+
+      <!-- 成就徽章 -->
+      <ProfileBadges />
+
+      <!-- 健康等级称号(P2-1) -->
+      <HealthBadge
+        v-if="levelInfo"
+        :levelInfo="levelInfo"
+        :score="score"
+        :progress="progress"
+        :nextLevel="nextLevel"
+        :streakDays="streakDays" />
+
+      <!-- 健康故事时间线(P2-1) -->
+      <HealthTimeline :events="timelineEvents" />
+
+      <!-- 菜单列表(仅个人信息 + 设置,不含服务/商城板块) -->
+      <ProfileMenu :role="role" :show-services="false" @invite-generate="onInviteGenerate" />
+    </template>
+    <AIFloatingAvatar />
+  </view>
+</template>
+
+<script>
+import TabTransition from '../../components/tab-transition.vue'
+import ProfileHeader from './components/ProfileHeader.vue'
+import ProfileBadges from './components/ProfileBadges.vue'
+import ProfileGrowth from './components/ProfileGrowth.vue'
+import ProfileMenu from './components/ProfileMenu.vue'
+import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
+import HealthBadge from '../../components/HealthBadge.vue'
+import HealthTimeline from '../../components/HealthTimeline.vue'
+import { getHealthScoreInfo, getHealthTimeline, getUserInfo } from '../../utils/api.js'
+
+export default {
+components: {
+TabTransition,
+ProfileHeader,
+ProfileBadges,
+ProfileGrowth,
+ProfileMenu,
+AIFloatingAvatar,
+HealthBadge,
+HealthTimeline
 },
-  data() {
-    return {
-      shareData: null,
-      showTabTransition: true,
-      selectedMascot: '',
-      currentMascotName: '小助手',
-      // P2-1 身份重塑
-      levelInfo: null,
-      score: 0,
-      progress: 0,
-      nextLevel: null,
-      streakDays: 0,
-      timelineEvents: [],
-      // 个人信息完善进度(0-14 字段)
-      profileProgress: 0
-    }
-  },
-  computed: {
-    isLoggedIn() {
-      return !!uni.getStorageSync('token')
-    },
-    role() {
-      return uni.getStorageSync('currentRole') || uni.getStorageSync('role') || 'parent'
-    }
-  },
-  onShareAppMessage() {
-    if (this.shareData) {
-      return {
-        title: this.shareData.title,
-        path: this.shareData.path,
-        imageUrl: '/static/invite-card.png'
-      }
-    }
-  },
-  onShow() {
-    this.showTabTransition = true
-
-    if (!uni.getStorageSync('token')) {
-      this._watchPageReady()
-      return
-    }
-    this.loadMascot()
-    const currentRole = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || 'parent'
-    if (currentRole === 'teacher') {
-      uni.redirectTo({ url: '/pages/teacher/teacher-profile' })
-    }
-    this.loadHealthScoreData()
-    this.loadProfileProgress()
-    this._watchPageReady()
-  },
-  methods: {
-    goLogin() {
-      uni.navigateTo({ url: '/pages/login/login' })
-    },
-    onInviteGenerate(shareData) {
-      this.shareData = shareData
-    },
-    changeMascot(mascot) {
-      if (this.selectedMascot === mascot) return;
-      uni.request({
-        url: this.$config.API_BASE_URL + '/api/user/mascot/set',
-        method: 'POST',
-        header: { Authorization: 'Bearer ' + uni.getStorageSync('token') },
-        data: { mascot },
-        success: (res) => {
-          if (res.data.code === 200 || res.data.code === 0) {
-            this.selectedMascot = mascot;
-            this.currentMascotName = mascot === 'xibao' ? '浠宝' : '福宝';
-            // 同步更新 localStorage 以便 AIFloatingAvatar 等组件能读到最新值
-            var userInfo = uni.getStorageSync('userInfo') || {};
-            userInfo.mascot = mascot;
-            uni.setStorageSync('userInfo', userInfo);
-            uni.showToast({ title: '已更换' });
-          }
-        }
-      });
-    },
-    loadMascot() {
-      var userInfo = uni.getStorageSync('userInfo');
-      if (userInfo && userInfo.mascot) {
-        this.selectedMascot = userInfo.mascot;
-        this.currentMascotName = userInfo.mascot === 'xibao' ? '浠宝' : '福宝';
-      }
-    },
-    _watchPageReady() {
-      var self = this
-      this.$nextTick(function() {
-        if (self.$refs.tabTransition) self.$refs.tabTransition.markReady()
-      })
-    },
-    loadHealthScoreData() {
-      var memberId = uni.getStorageSync('currentChildId') || null
-      if (!memberId) return
-      var self = this
-      getHealthScoreInfo({ memberId: memberId }).then(function(res) {
-        if (res.code === 200 && res.data) {
-          self.levelInfo = res.data.level || null
-          self.score = res.data.score || 0
-          self.progress = res.data.progress || 0
-          self.nextLevel = res.data.nextLevel || null
-          self.streakDays = res.data.streakDays || 0
-        }
-      }).catch(function() {})
-      getHealthTimeline({ memberId: memberId }).then(function(res) {
-        if (res.code === 200 && Array.isArray(res.data)) {
-          self.timelineEvents = res.data.slice(0, 10)
-        }
-      }).catch(function() {})
-    },
-    loadProfileProgress() {
-      var self = this
-      getUserInfo().then(function(res) {
-        if (res && res.code === 200 && res.data) {
-          var user = res.data
-          var fields = ['nickname', 'avatar', 'realName', 'gender', 'birthday', 'birthHour', 'ethnicity', 'bloodType', 'highestEducation', 'maritalStatus', 'address', 'hobbies', 'dietPreferences', 'phone']
-          var filled = 0
-          for (var i = 0; i < fields.length; i++) {
-            var v = user[fields[i]]
-            if (v !== null && v !== undefined && v !== '') filled++
-          }
-          self.profileProgress = filled
-        }
-      }).catch(function() {})
-    },
-    // 修复:ProfileHeader 头像点击进入编辑页(原方法缺失)
-    goToEditInfo() {
-      uni.navigateTo({ url: '/pages/user-edit/user-edit' })
-    }
-  }
-}
-</script>
-
-<style scoped>
-.container {
-  min-height: 100vh;
-  background: #f5f7fa;
-  padding-bottom: 120rpx;
-}
-
-.login-prompt {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  padding: 200rpx 60rpx;
-}
-.prompt-icon { font-size: 100rpx; margin-bottom: 30rpx; }
-.prompt-title { font-size: 40rpx; font-weight: bold; color: #333; margin-bottom: 16rpx; }
-.prompt-desc { font-size: 26rpx; color: #999; margin-bottom: 60rpx; }
-.login-btn {
-  width: 80%;
-  background: linear-gradient(135deg, #667eea, #764ba2);
-  color: #fff;
-  border-radius: 50rpx;
-  font-size: 30rpx;
-  padding: 24rpx;
-  line-height: 1.5;
-}
-
-.mascot-selector {
-  margin: 20rpx 0;
-  padding: 24rpx;
-  background: #fff;
-  border-radius: 16rpx;
-}
-.selector-header {
-  margin-bottom: 20rpx;
-}
-.selector-title {
-  font-size: 32rpx;
-  font-weight: bold;
-  color: #1F2937;
-}
-.selector-subtitle {
-  font-size: 24rpx;
-  color: #6366F1;
-  margin-left: 16rpx;
-}
-.mascot-cards {
-  display: flex;
-  gap: 20rpx;
-}
-.mascot-card {
-  flex: 1;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  padding: 24rpx 0;
-  border: 2rpx solid #E5E7EB;
-  border-radius: 12rpx;
-}
-.mascot-card.active {
-  border-color: #6366F1;
-  background: #EEF2FF;
-}
-.card-icon {
-  width: 80rpx;
-  height: 80rpx;
-  border-radius: 50%;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  font-size: 32rpx;
-  font-weight: bold;
-  color: #fff;
-  margin-bottom: 12rpx;
-}
-.card-icon.xibao {
-  background: linear-gradient(135deg, #FF8C42, #FF6B9D);
-}
-.card-icon.fubao {
-  background: linear-gradient(135deg, #6366F1, #10B981);
-}
-.card-name {
-  font-size: 26rpx;
-  color: #374151;
-}
-
-.profile-card {
-  display: flex;
-  flex-direction: row;
-  align-items: center;
-  justify-content: space-between;
-  margin: 20rpx 30rpx;
-  padding: 28rpx 32rpx;
-  background: #fff;
-  border-radius: 16rpx;
-}
-.profile-card-left {
-  display: flex;
-  flex-direction: column;
-}
-.profile-card-title {
-  font-size: 30rpx;
-  font-weight: bold;
-  color: #333;
-}
-.profile-card-desc {
-  font-size: 24rpx;
-  color: #999;
-  margin-top: 8rpx;
-}
-.profile-card-arrow {
-  font-size: 40rpx;
-  color: #ccc;
-}
+  data() {
+    return {
+      shareData: null,
+      showTabTransition: true,
+      selectedMascot: '',
+      currentMascotName: '小助手',
+      // P2-1 身份重塑
+      levelInfo: null,
+      score: 0,
+      progress: 0,
+      nextLevel: null,
+      streakDays: 0,
+      timelineEvents: [],
+      // 个人信息完善进度(0-14 字段)
+      profileProgress: 0
+    }
+  },
+  computed: {
+    isLoggedIn() {
+      return !!uni.getStorageSync('token')
+    },
+    role() {
+      return uni.getStorageSync('currentRole') || uni.getStorageSync('role') || 'parent'
+    }
+  },
+  onShareAppMessage() {
+    if (this.shareData) {
+      return {
+        title: this.shareData.title,
+        path: this.shareData.path,
+        imageUrl: '/static/invite-card.png'
+      }
+    }
+  },
+  onShow() {
+    this.showTabTransition = true
+
+    if (!uni.getStorageSync('token')) {
+      this._watchPageReady()
+      return
+    }
+    this.loadMascot()
+    const currentRole = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || 'parent'
+    if (currentRole === 'teacher') {
+      uni.redirectTo({ url: '/pages/teacher/teacher-profile' })
+    }
+    this.loadHealthScoreData()
+    this.loadProfileProgress()
+    this._watchPageReady()
+  },
+  methods: {
+    goLogin() {
+      uni.navigateTo({ url: '/pages/login/login' })
+    },
+    onInviteGenerate(shareData) {
+      this.shareData = shareData
+    },
+    changeMascot(mascot) {
+      if (this.selectedMascot === mascot) return;
+      uni.request({
+        url: this.$config.API_BASE_URL + '/api/user/mascot/set',
+        method: 'POST',
+        header: { Authorization: 'Bearer ' + uni.getStorageSync('token') },
+        data: { mascot },
+        success: (res) => {
+          if (res.data.code === 200 || res.data.code === 0) {
+            this.selectedMascot = mascot;
+            this.currentMascotName = mascot === 'xibao' ? '浠宝' : '福宝';
+            // 同步更新 localStorage 以便 AIFloatingAvatar 等组件能读到最新值
+            var userInfo = uni.getStorageSync('userInfo') || {};
+            userInfo.mascot = mascot;
+            uni.setStorageSync('userInfo', userInfo);
+            uni.showToast({ title: '已更换' });
+          }
+        }
+      });
+    },
+    loadMascot() {
+      var userInfo = uni.getStorageSync('userInfo');
+      if (userInfo && userInfo.mascot) {
+        this.selectedMascot = userInfo.mascot;
+        this.currentMascotName = userInfo.mascot === 'xibao' ? '浠宝' : '福宝';
+      }
+    },
+    _watchPageReady() {
+      var self = this
+      this.$nextTick(function() {
+        if (self.$refs.tabTransition) self.$refs.tabTransition.markReady()
+      })
+    },
+    loadHealthScoreData() {
+      var memberId = uni.getStorageSync('currentChildId') || null
+      if (!memberId) return
+      var self = this
+      getHealthScoreInfo({ memberId: memberId }).then(function(res) {
+        if (res.code === 200 && res.data) {
+          self.levelInfo = res.data.level || null
+          self.score = res.data.score || 0
+          self.progress = res.data.progress || 0
+          self.nextLevel = res.data.nextLevel || null
+          self.streakDays = res.data.streakDays || 0
+        }
+      }).catch(function() {})
+      getHealthTimeline({ memberId: memberId }).then(function(res) {
+        if (res.code === 200 && Array.isArray(res.data)) {
+          self.timelineEvents = res.data.slice(0, 10)
+        }
+      }).catch(function() {})
+    },
+    loadProfileProgress() {
+      var self = this
+      getUserInfo().then(function(res) {
+        if (res && res.code === 200 && res.data) {
+          var user = res.data
+          var fields = ['nickname', 'avatar', 'realName', 'gender', 'birthday', 'birthHour', 'ethnicity', 'bloodType', 'highestEducation', 'maritalStatus', 'address', 'hobbies', 'dietPreferences', 'phone']
+          var filled = 0
+          for (var i = 0; i < fields.length; i++) {
+            var v = user[fields[i]]
+            if (v !== null && v !== undefined && v !== '') filled++
+          }
+          self.profileProgress = filled
+        }
+      }).catch(function() {})
+    },
+    // 修复:ProfileHeader 头像点击进入编辑页(原方法缺失)
+    goToEditInfo() {
+      uni.navigateTo({ url: '/pages/user-edit/user-edit' })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.container {
+  min-height: 100vh;
+  background: #f5f7fa;
+  padding-bottom: 120rpx;
+}
+
+.login-prompt {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  padding: 200rpx 60rpx;
+}
+.prompt-icon { font-size: 100rpx; margin-bottom: 30rpx; }
+.prompt-title { font-size: 40rpx; font-weight: bold; color: #333; margin-bottom: 16rpx; }
+.prompt-desc { font-size: 26rpx; color: #999; margin-bottom: 60rpx; }
+.login-btn {
+  width: 80%;
+  background: linear-gradient(135deg, #667eea, #764ba2);
+  color: #fff;
+  border-radius: 50rpx;
+  font-size: 30rpx;
+  padding: 24rpx;
+  line-height: 1.5;
+}
+
+.mascot-selector {
+  margin: 20rpx 0;
+  padding: 24rpx;
+  background: #fff;
+  border-radius: 16rpx;
+}
+.selector-header {
+  margin-bottom: 20rpx;
+}
+.selector-title {
+  font-size: 32rpx;
+  font-weight: bold;
+  color: #1F2937;
+}
+.selector-subtitle {
+  font-size: 24rpx;
+  color: #6366F1;
+  margin-left: 16rpx;
+}
+.mascot-cards {
+  display: flex;
+  gap: 20rpx;
+}
+.mascot-card {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  padding: 24rpx 0;
+  border: 2rpx solid #E5E7EB;
+  border-radius: 12rpx;
+}
+.mascot-card.active {
+  border-color: #6366F1;
+  background: #EEF2FF;
+}
+.card-icon {
+  width: 80rpx;
+  height: 80rpx;
+  border-radius: 50%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 32rpx;
+  font-weight: bold;
+  color: #fff;
+  margin-bottom: 12rpx;
+}
+.card-icon.xibao {
+  background: linear-gradient(135deg, #FF8C42, #FF6B9D);
+}
+.card-icon.fubao {
+  background: linear-gradient(135deg, #6366F1, #10B981);
+}
+.card-name {
+  font-size: 26rpx;
+  color: #374151;
+}
+
+.profile-card {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: space-between;
+  margin: 20rpx 30rpx;
+  padding: 28rpx 32rpx;
+  background: #fff;
+  border-radius: 16rpx;
+}
+.profile-card-left {
+  display: flex;
+  flex-direction: column;
+}
+.profile-card-title {
+  font-size: 30rpx;
+  font-weight: bold;
+  color: #333;
+}
+.profile-card-desc {
+  font-size: 24rpx;
+  color: #999;
+  margin-top: 8rpx;
+}
+.profile-card-arrow {
+  font-size: 40rpx;
+  color: #ccc;
+}
 </style>

+ 1 - 1
cfc-frontend/pages/profile/report-detail.vue → cfc-frontend/pages/profile-pkg/report-detail.vue

@@ -50,7 +50,7 @@ export default {
   onShareAppMessage() {
     return {
       title: '浠艾福报告',
-      path: '/pages/profile/report-detail?id=' + this.reportId
+      path: '/pages/profile-pkg/report-detail?id=' + this.reportId
     }
   },
   methods: {

+ 1 - 1
cfc-frontend/pages/profile/report-management.vue → cfc-frontend/pages/profile-pkg/report-management.vue

@@ -122,7 +122,7 @@ export default {
     },
     goToDetail(item) {
       uni.navigateTo({
-        url: '/pages/profile/report-detail?id=' + item.id + '&title=' + encodeURIComponent(item.title)
+        url: '/pages/profile-pkg/report-detail?id=' + item.id + '&title=' + encodeURIComponent(item.title)
       })
     },
     getCardClass(reportType) {

+ 0 - 0
cfc-frontend/pages/profile/service-role-apply.vue → cfc-frontend/pages/profile-pkg/service-role-apply.vue


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

@@ -203,7 +203,7 @@ export default {
         team: '/pages/teacher/team',
         messages: '/pages/teacher/messages',
         orders: '/pages/teacher/orders',
-        growth: '/pages/growth/index'
+        growth: '/pages/growth-pkg/index'
       }
       uni.reLaunch({ url: routes[page] })
     }

+ 1 - 1
cfc-frontend/pages/teacher/teacher-profile.vue

@@ -129,7 +129,7 @@ export default {
       uni.navigateTo({ url: '/pages/user-edit/user-edit' })
     },
     goToGrowth() {
-      uni.reLaunch({ url: '/pages/growth/index' })
+      uni.reLaunch({ url: '/pages/growth-pkg/index' })
     },
     goToMessages() {
       uni.navigateTo({ url: '/pages/teacher/messages' })

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

@@ -577,7 +577,7 @@ export default {
       } else if (item.type === 'assessment') {
         uni.navigateTo({ url: '/pages/assessment/detail?id=' + item.id })
       } else if (item.type === 'alert') {
-        uni.navigateTo({ url: '/pages/health/alert-detail?id=' + item.id })
+        uni.navigateTo({ url: '/pages/health-pkg/alert-detail?id=' + item.id })
       } else if (item.type === 'milestone') {
         uni.navigateTo({ url: '/pages/family/milestone-detail?id=' + item.id })
       }

+ 1 - 1
cfc-frontend/pages/vendor/apply.vue

@@ -40,7 +40,7 @@ import { vendorApply } from '../../utils/api'
 
 export default {
   onLoad() {
-    uni.redirectTo({ url: '/pages/profile/service-role-apply' })
+    uni.redirectTo({ url: '/pages/profile-pkg/service-role-apply' })
   },
   data() {
     return {

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

@@ -551,7 +551,7 @@ export default {
       })
     },
     goToProfile() {
-      uni.navigateTo({ url: '/pages/profile/profile' })
+      uni.navigateTo({ url: '/pages/profile-pkg/profile' })
     },
     goToCheckin() {
       uni.navigateTo({ url: '/pages/wealth-sub/checkin' })

+ 3 - 3
cfc-frontend/utils/nav.js

@@ -4,9 +4,9 @@
  */
 var TAB_BAR_PAGES = [
   '/pages/index-home/index',
-  '/pages/health/index',
-  '/pages/growth/index',
-  '/pages/profile/profile'
+  '/pages/health-pkg/index',
+  '/pages/growth-pkg/index',
+  '/pages/profile-pkg/profile'
 ]
 
 /**

+ 2 - 2
cfc-frontend/utils/profile-field-usage.js

@@ -20,7 +20,7 @@ module.exports = {
     scenes: [
       { scene: 'assessment', page: 'pages/assessment/*', usage: '测评年龄计算', backfillTarget: ['user', 'member'] },
       { scene: 'tianpan', page: 'pages/tianpan/*', usage: '天盘命理计算', backfillTarget: ['user', 'member'] },
-      { scene: 'health-report', page: 'pages/health/*', usage: '健康报告年龄相关', backfillTarget: ['member'] }
+      { scene: 'health-report', page: 'pages/health-pkg/*', usage: '健康报告年龄相关', backfillTarget: ['member'] }
     ]
   },
   gender: {
@@ -39,7 +39,7 @@ module.exports = {
   dietPreferences: {
     label: '饮食偏好',
     scenes: [
-      { scene: 'nutrition-recommend', page: 'pages/health/nutrition-profile', usage: '饮食推荐个性化', backfillTarget: ['user', 'member'] }
+      { scene: 'nutrition-recommend', page: 'pages/health-pkg/nutrition-profile', usage: '饮食推荐个性化', backfillTarget: ['user', 'member'] }
     ]
   },
   address: {