Status: Draft Goal: 修复数据断层、重构视觉布局、提升加载体验 涉及模块: cfc-backend, cfc-frontend
familyId 数据断层问题: ParentDashboardController.getDashboard() 不返回 familyId,但前端第 483-485 行试图读取 dashData.familyId,结果为 undefined。这导致第 527 行 getPendingWishes(this._familyId) 发送 null 请求。
改动:
后端 ParentDashboardController.java:在 result map 中添加 familyId
// 获取当前用户的 familyId
Long familyId = userService.getUserFamilyId(userId);
result.put("familyId", familyId);
前端 api.js:getPendingWishes() 请求体加 familyId 判空保护,或 fallback 到独立 API 获取
涉及文件:
cfc-backend/.../controller/parent/ParentDashboardController.javacfc-backend/.../service/UserService.java(可能需要新增 getUserFamilyId 方法)cfc-frontend/pages/index/parent-index.vue问题: 第 1219-1222 行 .pending-grid 使用 display: grid,微信小程序不支持。
改动: 将 .pending-grid 改为 flexbox 布局:
.pending-grid {
display: flex;
flex-wrap: wrap;
gap: 16rpx;
}
.pending-card {
width: calc(50% - 8rpx); /* 2 列 */
}
涉及文件:
cfc-frontend/pages/index/parent-index.vue问题: growthAdvice[] 在 data 中声明(第 386 行),v-for 渲染(第 279-293 行),但整个 loadData() 中没有任何 API 调用填充它。该区块要么永远不显示,要么报错。
改动(二选一):
/api/growth/advice 接口获取数据涉及文件:
cfc-frontend/pages/index/parent-index.vue问题: 第 588-596 行根据 pendingTasks 数量生成 "待完成任务 1/2/3" 这类占位文本。
改动: 从后端获取真实任务列表。有两个方案:
getChildCompletionStats 返回值增加 pendingTaskList[](含 id, title),或直接用已有的 getPendingReviewTasks 数据筛选未完成的任务/api/tasks/pending-by-child?childId=X 返回待完成任务列表涉及文件:
cfc-backend/.../service/TaskStatsService.java(扩展返回数据)cfc-frontend/pages/index/parent-index.vue问题: familyAvgCompletionRate(第 86 行 totalCompletionRate / childCount)只计算了孩子的平均完成率,不含家长自己的完成率。
改动: 后端计算时将家长自己的完成率纳入平均:
// 家长 + 所有孩子
int totalRate = parentCompletionRate + totalCompletionRate;
int avgRate = childCount > 0 ? totalRate / (childCount + 1) : parentCompletionRate;
result.put("avgCompletionRate", avgRate);
或前端直接展示为"孩子平均"并保留"自己的",同时展示"全家平均 = (家长 + Σ孩子) / (1+孩子数)"。
涉及文件:
cfc-backend/.../controller/parent/ParentDashboardController.javacfc-frontend/pages/index/parent-index.vue(label 文案调整)问题: 当 dashboard 降级(第 566-581 行),第 578 行 this.myPoints = targetChild.totalPoints || 0 把"自己的积分"设置成了孩子的积分,而非家长的。
改动: 降级时 myPoints 应从当前用户的 userInfo 缓存中读取:
var userInfo = uni.getStorageSync('userInfo')
this.myPoints = (userInfo && userInfo.totalPoints) || 0
涉及文件:
cfc-frontend/pages/index/parent-index.vue问题: 第 397 行 currentChildId: ''(空字符串),第 613 行 if (overviewChildId) 条件不成立,导致 getEnergyOverview 永远不会被调用。
改动: 加载完 selectedChild 后设置 currentChildId:
// 在 dashboardLoaded 成功后或降级加载 children 后:
this.currentChildId = (this.selectedChild && this.selectedChild.id) || ''
涉及文件:
cfc-frontend/pages/index/parent-index.vue问题: 11 个区块堆叠,用户需要大量滚动。核心数据(统计 + AI)埋得太深。
改动方案:
当前顺序:
Banner → 成员条 → 孩子卡片 → 能量沙盘 → 会员Banner → 成长数据(2卡) → AI入口 → 今日重点 → 里程碑 → 待办网格 → 建议+审核+快捷
建议重组(压缩至 6 区块):
[第1屏] Banner + 成员条
[第2屏] 孩子卡片 + 快捷操作(融合)
[第3屏] 成长数据(2卡) + AI 助手入口(融合在一行)
[第4屏] 能量沙盘(折叠式,默认收起,点击展开)
[第5屏] 今日重点 + 待办网格(合并为"今日概要")
[第6屏] 待审核任务(保留,可滑动删除)
关键改动:
涉及文件:
cfc-frontend/pages/index/parent-index.vue问题: animate-stagger-9 在第 279 行(成长建议)和第 320 行(快捷操作)重复使用。
改动: 重新编号,确保整个模板内 stagger 编号唯一。
涉及文件:
cfc-frontend/pages/index/parent-index.vue问题: 当前一次性 BaseLoading 等待所有 API 完成后才显示内容。dashboard + 多个独立 API 串行导致白屏时间长。
改动: 拆分为分区加载:
改动: 添加 onPullDownRefresh 生命周期钩子:
onPullDownRefresh() {
this.loadData().finally(function() {
uni.stopPullDownRefresh()
})
}
并在 pages.json 对应页面配置 "enablePullDownRefresh": true。
涉及文件:
cfc-frontend/pages/index/parent-index.vuecfc-frontend/pages.json问题: 所有 API 失败仅 console.log,用户无感知。
改动: 每个主要区块添加错误兜底状态:
-- 或 "数据加载失败"Phase 1 — 基础修复(1-2 人天)
├── P0-1: familyId 数据断层 ← 后端 0.5d + 前端 0.2d
├── P0-2: CSS Grid → Flex ← 前端 0.1d
├── P0-3: 成长建议区块处理 ← 前端 0.1d
└── P1-34: 降级/能量初始化 ← 前端 0.3d
Phase 2 — 数据准确性(1 人天)
├── P1-1: 待完成任务真实标题 ← 后端 0.3d + 前端 0.3d
├── P1-2: 全家平均含家长 ← 后端 0.1d + 前端 0.1d
└── P4-2: 下拉刷新 ← 前端 0.2d
Phase 3 — UI 重构(2-3 人天)
├── P2-1: 区块精简重组 ← 前端 1-2d(含测试)
├── P2-2: 动画 class 去重 ← 前端 0.1d
├── P4-1: 骨架屏 ← 前端 0.5d
└── P4-3: 错误状态 UI ← 前端 0.3d
优先执行 Phase 1(修复现有功能断裂),Phase 2 视数据重要性决定是否并行,Phase 3 为视觉/体验升级。
| # | 文件 | 改动量 | Phase |
|---|---|---|---|
| 1 | cfc-backend/.../ParentDashboardController.java |
+10 行 | 1 |
| 2 | cfc-backend/.../service/UserService.java |
新增 getUserFamilyId |
1 |
| 3 | cfc-backend/.../service/TaskStatsService.java |
扩展返回 pendingTaskList |
2 |
| 4 | cfc-frontend/pages/index/parent-index.vue |
100-300 行变更 | 1/2/3 |
| 5 | cfc-frontend/pages.json |
+3 行 (pullRefresh) | 2 |
| 6 | cfc-frontend/utils/api.js |
可能微调 | 1/2 |