Преглед изворни кода

Merge branch 'cfclub' of https://git.iwintrue.com/liaoxg/cfc into cfclub

Xiaogang Liao пре 1 месец
родитељ
комит
dfba40a796

+ 1 - 1
cfc-frontend/AGENTS.md

@@ -46,7 +46,7 @@ uni-app 微信小程序前端,Vue 2 语法,家庭教育任务管理。
 | `pages/games` | 小游戏(5 页) |
 | `pages/assessment` | 测评申请/报告(5 页) |
 | `pages/dan-assessment` | DAN 测评上传(1 页) |
-| `pages/growth` | 成长档案(6 页) |
+| `pages/growth` | 成长记录(6 页) |
 | `pages/shop` | 商城(15 页) |
 | `pages/vendor` | 服务商入驻/管理(5 页) |
 | `pages/health` | 健康功能(18 页) |

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

@@ -103,7 +103,7 @@ export default {
         { 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-main/index', icon: '/static/tab-growth.png', selectedIcon: '/static/tab-growth-active.png' },
+        { text: '成长记录', pagePath: '/pages/growth-main/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: [

+ 2 - 2
cfc-frontend/pages.json

@@ -28,7 +28,7 @@
     {
       "path": "pages/growth-main/index",
       "style": {
-        "navigationBarTitleText": "成长档案",
+        "navigationBarTitleText": "成长记录",
         "usingComponents": {
           "custom-tab-bar": "/custom-tab-bar/index"
         }
@@ -402,7 +402,7 @@
         {
           "path": "create",
           "style": {
-            "navigationBarTitleText": "创建成长档案"
+            "navigationBarTitleText": "创建成长记录"
           }
         },
         {

+ 12 - 12
cfc-frontend/pages/growth-main/index.vue

@@ -65,7 +65,7 @@
           </view>
           <view class="grid-item" @click="goPage('/pages/growth/detail')">
             <view class="grid-icon" style="background:rgba(249,115,22,0.15)"><text>📈</text></view>
-            <text class="grid-label">成长档案</text>
+            <text class="grid-label">成长记录</text>
           </view>
           <view class="grid-item" @click="goPage('/pages/health/meditation-index')">
             <view class="grid-icon" style="background:rgba(255,107,157,0.15)"><text>🧘</text></view>
@@ -80,12 +80,12 @@
         @activityClick="goActivityDetail"
         @moreActivities="goMoreActivities" />
 
-      <!-- 成长档案(原有内容) -->
-      <view class="section">
-        <view class="section-header">
-          <text class="section-title">成长档案</text>
-          <text class="section-more" v-if="records.length > 0" @click="viewAllRecords">查看全部 ›</text>
-        </view>
+       <!-- 成长记录(原有内容) -->
+       <view class="section">
+         <view class="section-header">
+           <text class="section-title">成长记录</text>
+           <text class="section-more" v-if="records.length > 0" @click="viewAllRecords">查看全部 ›</text>
+         </view>
 
         <!-- 孩子选择 -->
         <view class="children-list" v-if="!selectedChild">
@@ -122,7 +122,7 @@
 
           <view class="record-card" v-for="record in filteredRecords" :key="record.id" @click="viewDetail(record)">
             <view class="record-header">
-              <text class="record-title">{{ record.recordTitle || '成长档案' }}</text>
+               <text class="record-title">{{ record.recordTitle || '成长记录' }}</text>
               <view class="record-badges">
                 <text class="record-source-tag" v-if="record.sourceType">{{ sourceTypeLabel(record.sourceType) }}</text>
                 <text class="record-tag" :class="record.status === 'completed' ? 'tag-completed' : 'tag-pending'">
@@ -140,14 +140,14 @@
             <text class="empty-text">该类型暂无记录</text>
           </view>
           <view class="empty-state" v-if="records.length === 0">
-            <text class="empty-text">暂无成长档案记录</text>
-            <text class="empty-hint">点击下方按钮创建第一个成长档案</text>
+            <text class="empty-text">暂无成长记录</text>
+            <text class="empty-hint">点击下方按钮创建第一个成长记录</text>
           </view>
         </view>
 
         <!-- 创建按钮 -->
         <view class="footer-btn" v-if="selectedChild">
-          <button class="btn-create" @click="createRecord">创建成长档案</button>
+           <button class="btn-create" @click="createRecord">记录成长</button>
         </view>
         <view class="footer-btn" v-if="!selectedChild && children.length > 0">
           <button class="btn-invite-guide" open-type="share" @click="prepareGuideInvite">邀请成长规划师</button>
@@ -298,7 +298,7 @@ export default {
           this.records = res.data || []
         }
       } catch (e) {
-        console.error('加载成长档案失败', e)
+        console.error('加载成长记录失败', e)
       } finally {
         this.loading = false
       }

+ 5 - 5
cfc-frontend/pages/growth/create.vue

@@ -1,7 +1,7 @@
 <template>
   <view class="container">
     <view class="header">
-      <text class="title">创建成长档案</text>
+      <text class="title">创建成长记录</text>
       <text class="subtitle">选择创建方式</text>
     </view>
 
@@ -92,14 +92,14 @@
 
       <view class="redirect-section" v-if="sourceType === 'upload'">
         <view class="redirect-card">
-          <text class="redirect-desc">上传PDF格式的DAN测评报告,系统将自动解析报告内容并创建成长档案。</text>
+          <text class="redirect-desc">上传PDF格式的DAN测评报告,系统将自动解析报告内容并创建成长记录。</text>
           <button class="btn-submit" @click="goUpload">上传测评报告</button>
         </view>
       </view>
 
       <view class="redirect-section" v-if="sourceType === 'assessment'">
         <view class="redirect-card">
-          <text class="redirect-desc">购买DAN测评服务后,规划师完成测评录入将自动创建成长档案,无需手动填写。</text>
+          <text class="redirect-desc">购买DAN测评服务后,规划师完成测评录入将自动创建成长记录,无需手动填写。</text>
           <button class="btn-submit" @click="goPurchase">购买测评服务</button>
         </view>
       </view>
@@ -140,7 +140,7 @@ export default {
     }
     this.loadChildren()
     if (this.targetChildId) {
-      this.formData.recordTitle = '成长档案 - ' + this.getCurrentDate()
+      this.formData.recordTitle = '成长记录 - ' + this.getCurrentDate()
     }
   },
   computed: {},
@@ -197,7 +197,7 @@ export default {
       try {
         var submitData = {
           memberId: this.formData.memberId,
-          recordTitle: this.formData.recordTitle || '成长档案',
+          recordTitle: this.formData.recordTitle || '成长记录',
           height: this.formData.height || null,
           weight: this.formData.weight || null,
           school: this.formData.school || null,

+ 2 - 2
cfc-frontend/pages/growth/detail.vue

@@ -5,7 +5,7 @@
     <template v-if="record">
       <view class="header-card">
         <view class="header-top">
-          <text class="record-title">{{ record.recordTitle || '成长档案' }}</text>
+          <text class="record-title">{{ record.recordTitle || '成长记录' }}</text>
           <text class="record-tag" :class="record.status === 'completed' ? 'tag-completed' : 'tag-pending'">
             {{ record.status === 'completed' ? '已完成' : '待同步' }}
           </text>
@@ -242,7 +242,7 @@ export default {
     handleDelete() {
       uni.showModal({
         title: '确认删除',
-        content: '删除后无法恢复,确定要删除此成长档案吗?',
+        content: '删除后无法恢复,确定要删除此成长记录吗?',
         success: async function(res) {
           if (res.confirm) {
             uni.showLoading({ title: '删除中...' })

+ 1 - 1
cfc-frontend/pages/growth/supplement.vue

@@ -2,7 +2,7 @@
   <view class="container">
     <view class="header">
       <text class="title">补充测评材料</text>
-      <text class="subtitle">为已有成长档案补充额外报告</text>
+      <text class="subtitle">为已有成长记录补充额外报告</text>
     </view>
 
     <view class="form" v-if="step === 1">

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

@@ -70,13 +70,13 @@
             <view class="grid-icon" style="background:rgba(139,92,246,0.15)"><text>🧬</text></view>
             <text class="grid-label">肠道菌群</text>
           </view>
-          <view class="grid-item" @click="goPage('/pages/health/daily-checkin')">
-            <view class="grid-icon" style="background:rgba(249,115,22,0.15)"><text>🌡️</text></view>
-            <text class="grid-label">体征记录</text>
+          <view class="grid-item" @click="goPage('/pages/assessment/apply')">
+            <view class="grid-icon" style="background:rgba(249,115,22,0.15)"><text>📋</text></view>
+            <text class="grid-label">测评管理</text>
           </view>
-          <view class="grid-item" @click="goPage('/pages/assessment/purchase')">
-            <view class="grid-icon" style="background:rgba(16,185,129,0.15)"><text>📐</text></view>
-            <text class="grid-label">五维测评</text>
+          <view class="grid-item" @click="goPage('/pages/assessment/execution')">
+            <view class="grid-icon" style="background:rgba(16,185,129,0.15)"><text>💡</text></view>
+            <text class="grid-label">方案中心</text>
           </view>
           <view class="grid-item" @click="goPage('/pages/mind-detail/emotion-report')">
             <view class="grid-icon" style="background:rgba(255,107,157,0.15)"><text>🧠</text></view>
@@ -159,6 +159,14 @@ export default {
     goPage: function(url) {
       uni.navigateTo({ url: url })
     },
+    getMemberId: function() {
+      // 优先当前选中的孩子/成员,兜底用登录用户 ID
+      var store = this.$store
+      if (store && store.state && store.state.currentChildId) return store.state.currentChildId
+      if (store && store.state && store.state.currentMemberId) return store.state.currentMemberId
+      if (store && store.state && store.state.userId) return store.state.userId
+      return uni.getStorageSync('userId') || ''
+    },
     goReportDetail: function(report) {
       if (report.id) {
         uni.navigateTo({ url: '/pages/health/report-list?reportId=' + report.id })
@@ -168,10 +176,11 @@ export default {
     },
     loadHealthData: function() {
       var self = this
+      var memberId = this.getMemberId()
       try {
         var api = require('../../utils/api.js')
-        // 加载健康报告列表
-        api.getReportList().then(function(res) {
+        // 加载健康报告列表(需要 memberId)
+        api.getReportList(memberId).then(function(res) {
           if (res.code === 200 && res.data) {
             var list = Array.isArray(res.data) ? res.data : (res.data.list || [])
             self.reports = list

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

@@ -196,7 +196,7 @@ B) 积分卡片 — Claymorphism 暖橙黏土风格
             <view class="quick-btn-icon quick-icon--growth">
               <text class="quick-emoji">🏆</text>
             </view>
-            <text class="quick-btn-label">成长档案</text>
+            <text class="quick-btn-label">成长记录</text>
           </view>
 
           <view
@@ -661,7 +661,7 @@ export default {
     },
     goToGrowth() {
       this.$emit('navigate', { page: 'growth' })
-      uni.navigateTo({ url: '/pages/growth/growth' })
+      uni.switchTab({ url: '/pages/growth-main/index' })
     },
     goToGames() {
       this.$emit('navigate', { page: 'games' })

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

@@ -153,7 +153,8 @@ import PsychCrisisBanner from '../../components/PsychCrisisBanner.vue'
 import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
 import FamilyTianpanCard from '../../components/FamilyTianpanCard.vue'
 import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
-import { getVisibleSections, getFamilyEnergySandbox, getChildren, getVisibleFamilyMembers, getEnergyOverview, getContactList, getHealthAlerts, getMilestones, getDanReportByChild, getFamilyFortune } from '../../utils/api.js'
+import { getVisibleSections, getEmiReport, getFamilyEnergySandbox, getChildren, getVisibleFamilyMembers, getEnergyOverview, getContactList, getHealthAlerts, getMilestones, getDanReportByChild, getFamilyFortune } from '../../utils/api.js'
+import nav from '../../utils/nav.js'
 import config from '../../config.js'
 import { parseDate } from '../../utils/format.js'
 
@@ -191,7 +192,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-main/index' },
+        { icon: '\u{1F4DD}', label: '成长记录', needLogin: true, page: '/pages/growth-main/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' },
@@ -606,7 +607,7 @@ components: { TabTransition, PageBanner, RadarChart, LoginGuideCard, FamilyEnerg
         })
         return
       }
-      if (item.page) uni.navigateTo({ url: item.page })
+      if (item.page) nav.goPage(item.page)
     },
     // ===== 孩子列表与维度数据 =====
     loadChildren: function() {

+ 2 - 4
cfc-frontend/pages/parent/child-detail.vue

@@ -43,7 +43,7 @@
           </view>
           <view class="action-btn" @click="goToGrowth">
             <view class="action-btn-icon growth-icon">📊</view>
-            <text class="action-btn-label">成长档案</text>
+            <text class="action-btn-label">成长记录</text>
           </view>
           <view class="action-btn" @click="goToCompletionStats">
             <view class="action-btn-icon stats-icon">📈</view>
@@ -189,9 +189,7 @@ export default {
       })
     },
     goToGrowth() {
-      uni.navigateTo({
-        url: '/pages/growth-main/index?memberId=' + this.memberId
-      })
+      uni.switchTab({ url: '/pages/growth-main/index' })
     },
     goToCompletionStats() {
       uni.navigateTo({

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

@@ -39,7 +39,7 @@
 
         <text class="section-text">2.9 健康数据(敏感个人信息):您上传或产生的体检报告数据、菌群检测报告数据,包括健康总分、菌群健康评分、慢病控制评分、营养均衡评分、肠道预测年龄、肠型分类、菌群平衡评分、多样性评分、有益菌/有害菌评分、核心菌属评分、健康评级等指标。</text>
 
-        <text class="section-text">2.10 使用记录:您在平台上的操作记录,包括任务创建和执行记录、打卡记录、心愿创建和兑换记录、积分变动记录、小游戏记录(舒尔特方格、猜数字、数独等)、成长档案、活动参与记录、课程学习记录。</text>
+        <text class="section-text">2.10 使用记录:您在平台上的操作记录,包括任务创建和执行记录、打卡记录、心愿创建和兑换记录、积分变动记录、小游戏记录(舒尔特方格、猜数字、数独等)、成长记录、活动参与记录、课程学习记录。</text>
 
         <text class="section-text">2.11 通讯内容:您与成长规划师之间的消息记录、您与AI助手(浠宝/福宝)的对话记录。请注意,AI对话内容可能会被记录并用于改进服务质量。</text>
 

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

@@ -103,7 +103,7 @@
           </view>
           <view class="menu-item" @click="goTo('growth')">
             <view class="menu-icon gray">📋</view>
-            <text class="menu-label">成长档案</text>
+            <text class="menu-label">成长记录</text>
           </view>
         </view>
       </view>
@@ -132,7 +132,7 @@
           </view>
           <view class="menu-item">
             <view class="menu-icon gray disabled-icon">📋</view>
-            <text class="menu-label disabled-label">成长档案</text>
+            <text class="menu-label disabled-label">成长记录</text>
           </view>
         </view>
       </view>

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

@@ -26,7 +26,7 @@
         <text class="arrow">›</text>
       </view>
       <view class="menu-item" @click="goToGrowth">
-        <text>📊 我的成长档案</text>
+        <text>📊 我的成长记录</text>
         <text class="arrow">›</text>
       </view>
 <view class="menu-item" @click="goToMessages">

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

@@ -212,6 +212,7 @@ import {
   getVisibleFamilyMembers,
   productList
 } from '../../utils/api.js'
+import nav from '../../utils/nav.js'
 
 export default {
   components: { TabTransition, PageBanner, WealthEnergyRing, WealthSubScores, BodyWealthAlert, FamilyMemberStrip, DimensionIntroCard },
@@ -429,7 +430,7 @@ export default {
       })
     },
     goToProfile() {
-      uni.navigateTo({ url: '/pages/profile-main/profile' })
+      nav.goPage('/pages/profile-main/profile')
     },
     goToCheckin() {
       uni.navigateTo({ url: '/pages/wealth-sub/checkin' })

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

@@ -1105,7 +1105,7 @@ export const registerWithInviteCode = (data) => {
   return request('/api/auth/register-with-invite', 'POST', data)
 }
 
-// 成长档案
+// 成长记录
 export const createGrowthRecord = (data) => {
   // 如果包含 alsoPurchaseAssessment 字段,使用合并接口
   if (data.alsoPurchaseAssessment) {

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-2330831c35ee261bbbef62cfead967cef148c2ea
+23c039a1b227eba0e6dac1591bf7838e7f554296

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

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

+ 1 - 1
cfc-web/package.json

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

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

@@ -4,6 +4,21 @@
 
 ---
 
+## v1.0.911 (2026-08-09)
+
+### 新功能
+- 健康/成长Tab功能入口重组 + 成长档案改名成长记录
+
+### 其他
+- - 成长Tab: 移除重复体征记录入口,保留每日打卡等8项执行层入口
+- - 全局改名: 成长档案 → 成长记录 (15个文件: 页面文本/导航标题/注释)
+- - 导航修复: mind-detail和wealth的TabBar页跳转改用nav.goPage; child-index/child-detail goToGrowth改用switchTab
+- 
+
+### Bug 修复
+- health tab getReportList 空 memberId → 从 store/storage 取当前用户ID
+
+
 ## v1.0.910 (2026-08-09)
 
 ### 新功能

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

@@ -1,6 +1,6 @@
 # 更新日志
 
-> 当前版本: v1.0.910
+> 当前版本: v1.0.911
 
 ## 历史版本
 
@@ -8,6 +8,21 @@
 
 ---
 
+## v1.0.911 (2026-08-09)
+
+### 新功能
+- 健康/成长Tab功能入口重组 + 成长档案改名成长记录
+
+### 其他
+- - 成长Tab: 移除重复体征记录入口,保留每日打卡等8项执行层入口
+- - 全局改名: 成长档案 → 成长记录 (15个文件: 页面文本/导航标题/注释)
+- - 导航修复: mind-detail和wealth的TabBar页跳转改用nav.goPage; child-index/child-detail goToGrowth改用switchTab
+- 
+
+### Bug 修复
+- health tab getReportList 空 memberId → 从 store/storage 取当前用户ID
+
+
 ## v1.0.910 (2026-08-09)
 
 ### 新功能