Просмотр исходного кода

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

Xiaogang Liao 2 месяцев назад
Родитель
Сommit
adc0c733da

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

@@ -23,7 +23,7 @@
 var DIM_CONFIG = {
   body:    { icon: '🌏', name: '身', subtitle: '科学管理全家健康数据', features: ['七维雷达图', '健康报告AI解读', '能量打卡', '精准营养方案'], gradient: 'linear-gradient(135deg, #FFF7ED, rgba(255,140,66,0.12))', color: '#FF8C42' },
   mind:    { icon: '🔥', name: '心', subtitle: '关注全家心理健康与情绪成长', features: ['EMI心理测评', '情绪趋势追踪', '家庭天盘', '疏导工具'], gradient: 'linear-gradient(135deg, #FFF0F5, rgba(255,107,157,0.12))', color: '#FF6B9D' },
-  wisdom:  { icon: '⚡', name: '智', subtitle: '提升全家认知能力与学习效率', features: ['认知雷达图', '认知训练', '测评预约', '成长档案'], gradient: 'linear-gradient(135deg, #F0F0FF, rgba(99,102,241,0.12))', color: '#6366F1' },
+  wisdom:  { icon: '⚡', name: '智', subtitle: '提升全家认知能力与学习效率', features: ['认知雷达图', '认知训练', '测评预约', '成长记录'], gradient: 'linear-gradient(135deg, #F0F0FF, rgba(99,102,241,0.12))', color: '#6366F1' },
   action:  { icon: '🌿', name: '行', subtitle: '改善全家关系与沟通能力', features: ['关系质量问卷', '互动记录', '任务协作', '家庭挑战'], gradient: 'linear-gradient(135deg, #F0FFF4, rgba(16,185,129,0.12))', color: '#10B981' },
   wealth:  { icon: '💧', name: '富', subtitle: '分享价值,收获财富', features: ['财富能量仪表盘', '推广收益统计', '邀请返利', '会员权益'], gradient: 'linear-gradient(135deg, #FFFBEB, rgba(245,158,11,0.12))', color: '#F59E0B' }
 }

+ 2 - 53
cfc-frontend/pages/membership/upgrade.vue

@@ -30,15 +30,13 @@
           :class="selectedLevel === lv.levelCode ? 'level-tab-active' : ''"
           @click="selectLevel(lv.levelCode)">
           <text class="level-tab-name">{{ lv.levelName }}</text>
-          <text class="level-tab-price">¥{{ getLevelYearlyPrice(lv.levelCode) }}/年</text>
         </view>
       </view>
 
-      <!-- 开通/升级卡片(免费用户开通,或已付费用户切换到其他等级时升级) -->
-      <view class="upgrade-card" v-if="isFree || selectedLevel !== currentMemberLevel">
+      <!-- 开通/升级/续费卡片(标题统一为所选等级名) -->
+      <view class="upgrade-card">
         <view class="upgrade-header">
           <text class="upgrade-title">{{ getSelectedLevelName() }}</text>
-          <text class="upgrade-subtitle">{{ selectedLevel }}</text>
         </view>
         <!-- 档位选择 -->
         <view class="period-tabs">
@@ -57,29 +55,6 @@
         <button class="btn-upgrade" @click="goNext">下一步</button>
       </view>
 
-      <!-- 续费卡片(已付费用户保持当前等级) -->
-      <view class="upgrade-card" v-else>
-        <view class="upgrade-header">
-          <text class="upgrade-title">续费会员</text>
-          <text class="upgrade-subtitle">保持权益不中断</text>
-        </view>
-        <!-- 档位选择 -->
-        <view class="period-tabs">
-          <view 
-            class="period-tab" 
-            v-for="p in visiblePeriods" 
-            :key="p.key"
-            :class="selectedPeriod === p.key ? 'period-tab-active' : ''"
-            @click="selectPeriod(p.key)"
-          >
-            <text class="period-tab-label">{{ p.label }}</text>
-            <text class="period-tab-price">¥{{ getPriceForPeriod(p.key) }}</text>
-            <text class="period-original" v-if="showOriginalPrice(p.key)">¥{{ getOriginalPriceForPeriod(p.key) / 100 }}</text>
-          </view>
-        </view>
-        <button class="btn-upgrade btn-renew" @click="goNext">下一步</button>
-      </view>
-
       <!-- 权益对比表 -->
       <view class="compare-section">
         <text class="section-title">权益对比</text>
@@ -151,7 +126,6 @@ export default {
       ],
       selectedPeriod: 'yearly',
       selectedLevel: 'FAMILY',
-      currentMemberLevel: 'FREE',
       joinRules: [],
     }
   },
@@ -224,12 +198,10 @@ export default {
         this.membership = membershipRes.data
         if (this.membership && this.membership.memberLevel && this.membership.memberLevel !== 'FREE') {
           this.isFree = false
-          this.currentMemberLevel = this.membership.memberLevel
           this.currentLevelName = this.membership.levelName || '家庭会员'
           this.selectedLevel = this.membership.memberLevel
         } else {
           this.isFree = true
-          this.currentMemberLevel = 'FREE'
           this.currentLevelName = '免费用户'
           this.selectedLevel = 'FAMILY'
         }
@@ -255,14 +227,6 @@ export default {
       this.selectedLevel = code
       this.selectedPeriod = 'yearly'
     },
-    getLevelYearlyPrice: function(code) {
-      for (var i = 0; i < this.levels.length; i++) {
-        if (this.levels[i].levelCode === code) {
-          return this.levels[i].yearly ? (this.levels[i].yearly / 100).toFixed(0) : '0'
-        }
-      }
-      return '0'
-    },
     selectPeriod: function(key) {
       this.selectedPeriod = key
     },
@@ -425,12 +389,6 @@ export default {
   color: #1E293B;
   display: block;
 }
-.upgrade-subtitle {
-  font-size: 24rpx;
-  color: #94A3B8;
-  margin-top: 6rpx;
-  display: block;
-}
 .btn-upgrade {
   width: 100%;
   height: 88rpx;
@@ -449,9 +407,6 @@ export default {
 .btn-upgrade:active {
   opacity: 0.9;
 }
-.btn-renew {
-  background: linear-gradient(135deg, #0EA5E9 0%, #0284C7 100%);
-}
 
 /* ===== 权益对比 ===== */
 .compare-section {
@@ -562,12 +517,6 @@ export default {
   color: #1E293B;
   display: block;
 }
-.level-tab-price {
-  font-size: 22rpx;
-  color: #F97316;
-  margin-top: 6rpx;
-  display: block;
-}
 .level-tab-active .level-tab-name {
   color: #F97316;
 }

+ 8 - 1
cfc-frontend/pages/profile-main/profile.vue

@@ -187,7 +187,7 @@
           </view>
           <view class="menu-item" @click="goToGrowth">
             <text class="menu-icon">📈</text>
-            <text class="menu-text">成长档案</text>
+            <text class="menu-text">成长记录</text>
             <text class="arrow">›</text>
           </view>
           <view class="menu-item" @click="goToReport">
@@ -731,6 +731,8 @@ export default {
   display: flex;
   align-items: center;
   gap: 6rpx;
+  box-sizing: border-box;
+  height: 44rpx;
 }
 .level-badge::before {
   content: '👑';
@@ -756,11 +758,16 @@ export default {
   border-radius: 22rpx;
   padding: 8rpx 24rpx;
   flex-shrink: 0;
+  box-sizing: border-box;
+  height: 44rpx;
+  display: flex;
+  align-items: center;
 }
 .upgrade-btn-text {
   font-size: 22rpx;
   font-weight: bold;
   color: #fff;
+  line-height: 1;
 }
 .user-card-right {
   display: flex;

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-f39431946be2245549e9b84a9530c02ae788dc80
+b431b88b22c1392d576d3736fd179dd129f5eec6

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

@@ -1,12 +1,12 @@
 {
   "name": "cfc-web",
-  "version": "1.0.911",
+  "version": "1.0.913",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "cfc-web",
-      "version": "1.0.911",
+      "version": "1.0.913",
       "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.911",
+  "version": "1.0.914",
   "private": true,
   "scripts": {
     "dev": "vue-cli-service serve",

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

@@ -4,6 +4,34 @@
 
 ---
 
+## v1.0.914 (2026-08-09)
+
+### 文档
+- 成长页面重构为干预中心设计文档(今日进度+持续追踪+里程碑+定期调研)
+
+
+## v1.0.913 (2026-08-09)
+
+### 新功能
+- 会员页精简 - 合并续费/升级卡片、移除tab价格、个人中心按钮与徽章等高
+
+### 其他
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+
+### Bug 修复
+- 清理残留成长档案文案 (DimensionIntroCard + profile-main)
+
+
+## v1.0.912 (2026-08-09)
+
+### Bug 修复
+- AdminController 补 @Slf4j + 修复 AdminNoticeController LambdaQueryWrapper 写法
+
+### 新功能
+- 报告上传流程拆分 — 新增 /report/upload(仅上传)+ /report/parse(按草稿解析)端点,修复 uploadBaseDir BLOCKING-2 残留
+
+
 ## v1.0.911 (2026-08-09)
 
 ### 新功能

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

@@ -1,6 +1,6 @@
 # 更新日志
 
-> 当前版本: v1.0.911
+> 当前版本: v1.0.914
 
 ## 历史版本
 
@@ -8,6 +8,34 @@
 
 ---
 
+## v1.0.914 (2026-08-09)
+
+### 文档
+- 成长页面重构为干预中心设计文档(今日进度+持续追踪+里程碑+定期调研)
+
+
+## v1.0.913 (2026-08-09)
+
+### 新功能
+- 会员页精简 - 合并续费/升级卡片、移除tab价格、个人中心按钮与徽章等高
+
+### 其他
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+
+### Bug 修复
+- 清理残留成长档案文案 (DimensionIntroCard + profile-main)
+
+
+## v1.0.912 (2026-08-09)
+
+### Bug 修复
+- AdminController 补 @Slf4j + 修复 AdminNoticeController LambdaQueryWrapper 写法
+
+### 新功能
+- 报告上传流程拆分 — 新增 /report/upload(仅上传)+ /report/parse(按草稿解析)端点,修复 uploadBaseDir BLOCKING-2 残留
+
+
 ## v1.0.911 (2026-08-09)
 
 ### 新功能

+ 254 - 0
docs/superpowers/specs/2026-08-08-growth-intervention-center-design.md

@@ -0,0 +1,254 @@
+# 成长页面重构 — 干预中心
+
+**版本:** v1.0
+**日期:** 2026-08-08
+**状态:** 设计稿
+
+## 1. 概述
+
+将成长TabBar页(growth-main/index.vue)重构为"干预中心",聚焦主动健康闭环中的"干预"环节。核心问题:"我们做了什么,效果如何?"通过每日记录、持续追踪、里程碑、定期调研,追踪干预的执行与成效。
+
+## 2. 页面布局
+
+```
+┌──────────────────────────────────┐
+│  📊 今日干预进度卡               │
+│  (打卡/饮食/运动/心情/调研进度)   │
+│  有未完成项自动提醒               │
+├──────────────────────────────────┤
+│  📈 持续追踪 Tab                 │
+│  [饮食] [运动] [睡眠] [心情] [调研]│
+│  各维度历史记录摘要               │
+├──────────────────────────────────┤
+│  🏆 里程碑                       │
+│  连续打卡/挑战完成/档案完整度      │
+├──────────────────────────────────┤
+│  📋 定期调研                     │
+│  周期问卷 + 历史记录 + 趋势       │
+├──────────────────────────────────┤
+│  活动/商品推荐 (弱化)             │
+└──────────────────────────────────┘
+```
+
+## 3. 移除项
+
+- 现有 8 个功能入口网格(打卡/任务/挑战/饮食/运动/作息/档案/冥想)——功能融入各区块
+- 现有"今日执行概览"卡片——升级为今日干预进度卡
+- 现有"成长档案"孩子选择区块——成员选择条已在上方,成长档案融入其他区块
+
+## 4. 今日干预进度卡
+
+### 4.1 结构
+
+```
+┌── 今日干预进度 ─────────────────────┐
+│  2026-08-08 星期五                    │
+│  ✅ 今日打卡  ✔ 已完成               │
+│  ☐ 饮食记录  [补录]  ← 未完成        │
+│  ☐ 运动记录  [补录]                  │
+│  ✅ 心情记录  ✔ 已完成               │
+│  ⚠ 本周调研  [开始]  ← 待完成        │
+│  ──────────────────────             │
+│  今日完成 2/5 · 连续打卡 7 天 🔥      │
+└──────────────────────────────────────┘
+```
+
+### 4.2 行为
+
+- **自动提醒:** `onShow` 时检查今日未完成项,有未完成在顶部显示提醒条("今日还有 X 项未记录")
+- **补录:** 点击[补录]跳转对应记录页,传日期参数标识补录
+- **调研提醒:** 根据调研周期判断是否到期,到期显示[开始]
+- **连续打卡:** 调用 `healthCheckinList`
+- **心情记录:** 调用 emotion-checkin 接口
+- 底部:今日完成数/总数 + 连续打卡天数
+
+### 4.3 数据来源
+
+| 项 | 接口 |
+|----|------|
+| 今日打卡 | `healthCheckinList({ memberId, date })` |
+| 饮食记录 | `getDietDailyRecords({ memberId, date })` |
+| 运动记录 | exercise 相关接口 |
+| 心情记录 | emotion-checkin 接口 |
+| 调研状态 | 新增 `survey/status` 接口 |
+
+## 5. 持续追踪 Tab
+
+### 5.1 结构
+
+```
+┌── 持续追踪 ──────────────────────────┐
+│  [饮食] [运动] [睡眠] [心情] [调研]    │
+│  ┌─ 饮食记录 (举例) ────────────┐   │
+│  │  08/08 早餐: 全麦面包+牛奶    │   │
+│  │  08/08 午餐: 鸡胸肉沙拉      │   │
+│  │  08/07 晚餐: 清蒸鱼+蔬菜     │   │
+│  │  [查看全部 →]                │   │
+│  └─────────────────────────────┘   │
+│  无数据时: "还没有记录,开始记录吧"   │
+└───────────────────────────────────────┘
+```
+
+### 5.2 各 Tab
+
+| Tab | 数据来源接口 | 点击跳转 |
+|-----|------------|---------|
+| 饮食 | `getDietDailyRecords` | 饮食记录页 |
+| 运动 | exercise 接口 | 运动记录页 |
+| 睡眠 | sleep 接口 | 作息记录页 |
+| 心情 | emotion-checkin 接口 | 心情记录页 |
+| 调研 | 新增 `survey/list` 接口 | 调研问卷页 |
+
+每个 Tab 展示最近 3-5 条记录摘要,点击"查看全部"或记录项跳转对应详情页。
+
+## 6. 里程碑
+
+### 6.1 结构
+
+```
+┌── 里程碑 ────────────────────────────┐
+│  🔥 连续打卡 7 天 ✓                  │
+│  🎯 完成 "21天挑战" ✓                │
+│  📈 健康档案完整度 60%               │
+│  [查看全部成就 →]                    │
+└──────────────────────────────────────┘
+```
+
+### 6.2 数据来源
+
+- 连续打卡天数:`healthCheckinList` 派生
+- 挑战完成数:挑战接口派生
+- 档案完整度:报告/档案数据派生
+
+## 7. 定期调研(新功能)
+
+### 7.1 概念
+
+周期性问卷,记录行为变化,追踪干预成效。有定时任务属性,到期自动提醒,可补录。
+
+### 7.2 前端展示
+
+```
+┌── 定期调研 ─────────────────────────┐
+│  ⚠ 本周还未完成调研                   │
+│  "过去一周,你吃了几次不该吃的食物?" │
+│  选项: 0次 / 1-2次 / 3-5次 / 6次以上  │
+│  [开始填写]                          │
+│  ─────────────────────              │
+│  历史调研记录:                        │
+│  · 上周: 油炸食品 3次                │
+│  · 上上周: 含糖饮料 5次              │
+└──────────────────────────────────────┘
+```
+
+### 7.3 调研模板配置(管理端)
+
+管理端新增调研模板管理页面(如 `SurveyTemplates.vue`),支持:
+- 创建/编辑/删除调研模板
+- 每个模板:标题、一组问题(题目+选项)、周期(周/两周/月)、适用维度
+- 启用/停用
+
+### 7.4 LangGraph 自动生成
+
+- 管理端可点"AI生成调研"按钮,调用 LangGraph 根据指定维度/主题自动生成题目
+- 生成结果可编辑后保存为调研模板
+
+### 7.5 数据模型
+
+**survey_templates 表(调研模板):**
+```sql
+CREATE TABLE IF NOT EXISTS survey_templates (
+  id BIGINT AUTO_INCREMENT PRIMARY KEY,
+  title VARCHAR(100) NOT NULL COMMENT '调研标题',
+  dimension VARCHAR(20) COMMENT '适用维度',
+  questions_json TEXT COMMENT '题目JSON(含选项)',
+  cycle_type VARCHAR(20) DEFAULT 'weekly' COMMENT '周期: weekly/biweekly/monthly',
+  ai_generated TINYINT(1) DEFAULT 0 COMMENT '是否AI生成',
+  enabled TINYINT(1) DEFAULT 1 COMMENT '是否启用',
+  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='定期调研模板';
+```
+
+**survey_records 表(调研记录,成员历次答案):**
+```sql
+CREATE TABLE IF NOT EXISTS survey_records (
+  id BIGINT AUTO_INCREMENT PRIMARY KEY,
+  family_id BIGINT NOT NULL COMMENT '家庭ID',
+  member_id BIGINT NOT NULL COMMENT '成员ID',
+  template_id BIGINT NOT NULL COMMENT '调研模板ID',
+  answers_json TEXT COMMENT '答案JSON',
+  submitted_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '提交时间',
+  period_start DATE COMMENT '周期开始',
+  period_end DATE COMMENT '周期结束',
+  INDEX idx_member (member_id),
+  INDEX idx_template (template_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='定期调研记录';
+```
+
+### 7.6 接口
+
+| 方法 | 路径 | 说明 |
+|------|------|------|
+| POST | `/api/admin/survey/template/save` | 保存调研模板(管理端) |
+| POST | `/api/admin/survey/template/list` | 查询调研模板(管理端) |
+| POST | `/api/admin/survey/template/delete` | 删除调研模板(管理端) |
+| POST | `/api/admin/survey/template/ai-generate` | LangGraph生成调研题目 |
+| POST | `/api/survey/status` | 查询当前成员的待办调研 |
+| POST | `/api/survey/template/active` | 查询启用的调研模板(小程序) |
+| POST | `/api/survey/submit` | 提交调研答案 |
+| POST | `/api/survey/history` | 查询成员调研历史 |
+
+## 8. 后端改动
+
+### 8.1 新增表
+
+- `survey_templates`(调研模板)
+- `survey_records`(调研记录)
+
+### 8.2 迁移
+
+DatabaseInitializer.runMigrations() 新增迁移195、196(创建上述两表)。
+
+### 8.3 新增 Controller / Service
+
+- `SurveyController`(小程序端:status/active/submit/history)
+- `AdminSurveyController`(管理端:template CRUD + ai-generate)
+- `SurveyService`
+
+### 8.4 LangGraph 对接
+
+`ai-generate` 接口调用 LangGraph `analysis/run`,传入主题/维度,返回结构化题目 JSON。
+
+## 9. 前端改动清单
+
+| 文件 | 改动内容 |
+|------|---------|
+| `pages/growth-main/index.vue` | 重构:今日干预进度卡 + 持续追踪Tab + 里程碑 + 定期调研 |
+| 新建 `pages/health/survey-questionnaire.vue` | 调研问卷页(答题+提交) |
+| 新建 `pages/health/survey-history.vue` | 调研历史页 |
+| `utils/api.js` | 新增调研相关接口 |
+| `pages.json` | 注册 survey-questionnaire / survey-history 页面 |
+| `cfc-web` 新建 `SurveyTemplates.vue` | 管理端调研模板管理 |
+
+## 10. 页面注册
+
+在 `pages.json` 的 `pages/health` 分包新增:
+
+```json
+{
+  "path": "survey-questionnaire",
+  "style": { "navigationBarTitleText": "定期调研" }
+},
+{
+  "path": "survey-history",
+  "style": { "navigationBarTitleText": "调研记录" }
+}
+```
+
+## 11. 保留项
+
+- PageBanner(文案改为"干预 · 记录 · 成长")
+- FamilyMemberStrip 家庭成员选择条
+- DimensionActivities 活动推荐(弱化)
+- 成长档案相关数据(融入里程碑/持续追踪)