日期: 2026-06-15 状态: 草案(待审批)
在首页、身体、心智、行动四个 Tab 页面顶部增加家庭成员卡片条,点击卡片切换当前查看的成员,页面数据随之过滤为该成员在对应维度的内容。成员(家长/孩子)可控制自己是否对其他家庭成员可见。
children 表 (Child.java): nickname, age, gender, totalPoints, familyIdusers 表 (User.java): nickname, avatar, role, familyIdgetFamilyMembers() API (/api/family/user/family-members): 返回 { parents: [...], children: [...] }children 表和 users 表各新增:
show_to_family TINYINT DEFAULT 1 COMMENT '是否对家庭成员可见: 1=是, 0=否'
通过 DatabaseInitializer 自动迁移:
// 检查并添加 show_to_family 列
String checkChildCol = "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'children' AND COLUMN_NAME = 'show_to_family'";
if (jdbcTemplate.queryForObject(checkChildCol, Integer.class) == 0) {
jdbcTemplate.execute("ALTER TABLE children ADD COLUMN show_to_family TINYINT DEFAULT 1 COMMENT '是否对家庭成员可见'");
}
// 同样处理 users 表
FamilyMemberVO@Data
public class FamilyMemberVO {
private Long id; // 成员ID (child.id 或 user.id)
private String nickname; // 昵称
private String avatar; // 头像URL (用户表)
private String memberType; // 'child' 或 'parent'
private String roleLabel; // '孩子' 或 '家长'
private Integer totalPoints;
private Boolean showToFamily;
}
POST /api/family/members/visible获取当前家庭中所有 show_to_family = 1 的成员。
请求体: 无(通过 JWT 获取 userId)
响应:
{
"code": 200,
"data": [
{
"id": 1,
"nickname": "小明",
"avatar": "",
"memberType": "child",
"roleLabel": "孩子",
"totalPoints": 120,
"showToFamily": true
},
{
"id": 2,
"nickname": "妈妈",
"avatar": "https://...",
"memberType": "parent",
"roleLabel": "家长",
"totalPoints": 500,
"showToFamily": true
}
]
}
POST /api/family/members/update-visibility切换当前用户的可见性。
请求体:
{
"memberId": 1,
"memberType": "child",
"showToFamily": false
}
约束: 只有家长可以修改孩子的可见性;用户只能修改自己的可见性。
FamilyMemberCard.vue单个成员卡片组件。
Props:
member: Object — 成员数据 (FamilyMemberVO)isSelected: Boolean — 是否当前选中Events:
@select(member) — 点击选中样式:
FamilyMemberStrip.vue水平滚动成员卡片条。
Props:
members: Array — 成员列表selectedMemberId: Number — 当前选中IDEvents:
@select(member) — 卡片点击@visibilityChange(memberId, show) — 可见性变更行为:
PageBanner
↓
FamilyMemberStrip ← 新增(水平滚动,高亮选中成员)
↓
FamilyEnergyBar(已有,数据响应 selectedMemberId)
↓
UserQuickEntry(已有,保持不变)
↓
各维度专属内容(随 selectedMemberId 切换)
| 页面 | 选中成员后的数据切换逻辑 |
|---|---|
parent-index.vue |
能量沙盘、成长数据统计切换为该成员的数据;孩子卡片区域保持不变 |
body/index.vue |
健康报告、功能入口切换为该成员 |
mind/index.vue |
EMI/DAN 测评数据切换为该成员 |
action/index.vue |
任务、活动、商品切换为该成员 |
FamilyMemberStrip
@select(member)
→ 父页面设置 selectedMemberId
→ 重新请求该成员在对应维度的数据
→ 下发给 FamilyEnergyBar / 内容组件
已有模式参考:UserQuickEntry 的 @childChanged → onChildChanged → 重新加载数据。
pages/family/child-edit.vue 或新增设置页):新增开关"对其他家庭成员可见"pages/profile/profile.vue):新增开关"对家庭成员可见"show_to_family 默认 1,现有成员不受影响/api/family/members/visible 不影响现有 getFamilyMembersFamilyMemberStrip 用 v-if="isLoggedIn" 控制,不登录不影响DatabaseInitializer 添加 show_to_family 字段迁移FamilyMemberVO DTOFamilyService.getVisibleMembers(userId) 查询逻辑FamilyService.updateVisibility(memberId, memberType, showToFamily) 更新逻辑FamilyController 新增两个端点mvn clean compile 验证FamilyMemberCard.vue 组件FamilyMemberStrip.vue 组件api.js 添加 getVisibleFamilyMembers 和 updateMemberVisibilityparent-index.vue — 插 FamilyMemberStripbody/index.vue — 插 FamilyMemberStripmind/index.vue — 插 FamilyMemberStripaction/index.vue — 插 FamilyMemberStripshow_to_family 二值控制FamilyEnergyBar 和 wuxing-sandbox 的行为