版本:v1.0 日期:2026-08-06 状态:已确认,作为后续实现计划的基线 范围:只描述家庭挑战(
family_challenge);圈子挑战(circle_challenge)不在本文档范围内 读者:产品 / 运营 / 新入职业务同学;开发同学作为基线参照 基准:按当前代码事实撰写,每项标注实现状态(🟢已实现 / 🟡半实现 / 🔴未实现);"未来期望"单列一节,不与现状混淆 证据截止:2026-08-06(以cfc-backend/cfc-frontend当前代码为准)
家庭挑战是 cfc(XAF)产品中"五维能量"体系下的家庭共同行动机制:通过设定带奖励的目标任务(全员打卡、运动、健康周等),让家庭成员共同完成。
现状一句话:挑战由家长在小程序手动创建 / 编辑 / 删除;打卡与奖励发放目前未接通——见 §4.3 / §6 / §7。
为什么梳理:
成功标准:产品 / 运营同事读完本文档,不看代码也能复述:哪些功能能用、哪些不能用、每个功能在哪个端、数据怎么流转。
| 概念 | 定义 | 状态 |
|---|---|---|
| 挑战 | 家庭共同完成的目标任务,含起止日期与奖励配置 | 🟢 已实现 |
| 挑战模板 | 预定义的挑战样例(标题/类型/目标/时长/奖励),是创建的"配方" | 🟢 已实现(7 种,含自定义) |
| 挑战类型 | full_checkin 全员打卡 / sports 运动PK / health_week 健康周 / reading 阅读 / no_screen 无屏幕 / gratitude 感恩日记 / custom 自定义 |
🟢 已实现 |
| 目标模式 | aggregate 集体总合目标(全家人合计达到目标值)/ all_members 全员个人目标(每个成员都达到目标值) |
🟢 已实现 |
| 进度 | 每个成员在某挑战下的累计达标数值 | 🟢 已实现(后端累计逻辑存在) |
| 打卡 | 成员主动上报完成动作,累加进度 | 🟡 半实现:后端接口有、前端无入口 |
| 结算 | 挑战到期后判定完成情况 | 🟡 半实现:仅打卡触发,无到期自动结算 |
| 奖励 | 能量点(rewardPoints)+ 成就徽章(rewardBadge) | 🔴 未实现:仅展示数字,无发放逻辑 |
| 状态 | active 进行中 / completed 已完成 / cancelled 已取消 |
🟢 已实现(三态) |
| 能力 | 状态 | 说明 |
|---|---|---|
| 查看本家庭活跃 / 历史挑战列表 | 🟢 已实现 | GET list / history |
| 查看每个成员的进度 | 🟢 已实现 | 卡片组件展示 |
| 手动发起挑战(选模板 + 自定义标题/目标/时长/奖励) | 🟢 已实现 | challenge-manage.vue + create 接口 |
| 编辑 / 删除(软删 cancelled)自己创建的挑战 | 🟢 已实现 | update / delete 接口 |
| 进入"管理"页 | 🟢 已实现 | 家长首页 → "管理 →" |
| 修改成员进度 | 🔴 未实现 | 家长端无此 UI;且后端无权限校验可被绕过(见 §7 #4) |
| 能力 | 状态 | 说明 |
|---|---|---|
| 查看本家庭活跃 / 历史挑战列表 | 🟢 已实现 | 与家长同 API |
| 打卡 | 🟡 半实现 | 后端接口存在,前端无打卡按钮 |
| 查看自己的历史奖励 | 🔴 未实现 | 奖励未实现 |
| 权限隔离(只能打卡自己) | 🔴 未实现 | 无角色校验,孩子可调管理接口 |
权限边界一句话(现状):无角色检查——所有挑战接口任何登录角色可调;"孩子只能打卡自己"等约束未落地。
| 途径 | 状态 | 证据 |
|---|---|---|
| 家长手动创建 | 🟢 已实现 | createChallenge 接口 + challenge-manage.vue 创建弹窗 |
| 后端按月自动创建 | 🔴 未实现 | autoCreateChallenges(familyId) 方法存在,但 Controller / 定时任务均无调用方——仅 CircleChallengeService 有同名的圈子版自用 |
⚠️ 结论:挑战只能由家长手动创建。产品若宣传"系统按月自动派发挑战",当前不成立。
stateDiagram-v2
[*] --> active: 家长手动创建
active --> completed: 打卡触发结算判定(达成或到期)
active --> cancelled: 家长删除(软删)
completed --> [*]: 进入历史列表
cancelled --> [*]: 从活跃列表消失
| 状态 | 含义 | 进入方式 |
|---|---|---|
active |
进行中,卡片展示在活跃列表 | 家长手动创建 |
completed |
已完成,进入历史列表 | 打卡时 checkAndSettle 判定达成或已到期 |
cancelled |
已取消,从活跃列表消失 | 家长删除(软删,保留记录) |
checkAndSettleaggregate 全家合计 ≥ 目标 / all_members 每成员 ≥ 目标;或 endDate 已过settleChallenge() 无调用方)入口:家长首页(parent-index)→ "家庭挑战"区块 → 卡片列表 + "管理 →"
卡片上看到(FamilyChallengeCard):
aggregate 显示全家总进度条 / all_members 显示成员列表(含 ✓ 完成标记)+50分 等,仅展示)管理页可做(challenge-manage.vue):
家长不可做(现状):
入口:孩子的身维度首页(index-home)→ 同一 FamilyChallengeCard 组件
卡片上看到:与家长端视觉一致(标题 / 状态 / 进度 / 奖励分),无打卡按钮
孩子可做:
/progress 存在但无人调用)孩子不可做(现状):
两端差异一句话(现状):两端看到的东西几乎一样,都只能看不能"做"——家长多了"管理"页,孩子连打卡都没有。
| # | 问题 | 影响 | 状态 |
|---|---|---|---|
| 1 | 打卡无前端入口:api.js 有 updateChallengeProgress,无页面调用 |
孩子无法参与 | 🟡 半实现 |
| 2 | 到期不自动结算:settleChallenge() 无调用方 |
到期挑战停留在 active | 🟡 半实现 |
| 3 | 奖励未发放:结算只改状态 | 能量点 / 徽章不落账 | 🔴 未实现 |
| 4 | 无角色检查:list / progress / create / update / delete 均无角色校验 | 任何角色可调管理接口;孩子可刷任意成员进度 | 🔴 未实现 |
| 5 | 前端展示 bug:FamilyChallengeCard 将 cancelled 也显示为"已完成" |
已删挑战显示为完成 | 🔴 未修复 |
| 6 | 无每日限次:updateProgress 可无限叠加 |
可刷进度 | 🔴 未实现 |
| 7 | 后端 autoCreate 无调用方:方法存在但无人调用 | 宣传的"自动派发"不成立 | 🔴 未实现 |
本节是产品方向,不代表当前可用;实现需另起 spec + plan。
| 能力 | 说明 |
|---|---|
| 孩子打卡 UI | 卡片加"打卡"按钮 + 打卡表单 + 反馈 |
| 到期自动结算 | 定时任务 / 查询时惰性结算 |
| 奖励发放 | 结算时能量点入账 + 徽章授予(对接 EnergyService) |
| 每日限次 | 同挑战每日 1 次打卡 |
| 通知 | 开始前 / 即将到期 / 结算完成推送 |
| 权限 | 角色校验:仅家长可管理,仅本人可打卡 |
| 复盘 | 完成率 / 坚持天数 / 成长轨迹 |
| 规划师视角 | 另起 spec |
| 表名 | 用途 |
|---|---|
family_challenge |
挑战主表(含 creatorId) |
family_challenge_progress |
成员进度表 |
circle_challenge |
圈子挑战(不在本文档范围) |
| 路径 | 用途 | 前端是否调用 |
|---|---|---|
POST /api/health/challenge/list |
活跃列表 | ✅ |
POST /api/health/challenge/history |
历史 | ✅ |
POST /api/health/challenge/progress |
打卡进度 | ❌ 无页面调用 |
POST /api/health/challenge/templates |
模板列表 | ✅ |
POST /api/health/challenge/create |
创建 | ✅ |
POST /api/health/challenge/update/{id} |
编辑 | ✅ |
POST /api/health/challenge/delete/{id} |
删除 | ✅ |
| 术语 | 定义 |
|---|---|
| 挑战 | 家庭共同完成的目标任务,含起止日期与奖励 |
| 挑战模板 | 预定义的挑战配方,可选用或自定义 |
| 挑战类型 | 全员打卡 / 运动PK / 健康周 / 阅读 / 无屏幕 / 感恩日记 / 自定义 |
| 目标模式 | aggregate 全家合计 / all_members 每人目标 |
| 进度 | 成员在某挑战下的累计达标数值 |
| 打卡 | 成员主动上报完成动作(累加进度) |
| 结算 | 挑战到期后判定完成情况 + 发放奖励 |
| 奖励 | 能量点(rewardPoints)+ 成就徽章(rewardBadge) |
| 状态 | active 进行中 / completed 已完成 / cancelled 已取消 |