# 家庭成员关系卡片 — 需求与实现差距分析 ## FamilyMemberStrip 当前实现 ### 组件结构 ``` FamilyMemberStrip(横向滚动容器) └── FamilyMemberCard(单个成员卡片) ├── 头像(avatar) ├── 角色标签(roleBadge: parent/child/teacher/elderly) ├── 昵称(nickname) ├── 能量分数(energyScore,可选) └── 选中标记(isSelected) ``` ### 数据来源 `/api/family/member/list` 返回的 `FamilyMember` 对象,包含: ``` id, familyId, userId, nickname, phone, avatar, gender, birthday, generation, isSpouse, totalPoints, trustScore, intimacyScore, ... ``` ### 当前使用场景(9个页面) | 页面 | 用途 | |------|------| | parent-index | 家长首页成员选择器 | | child-index | 孩子首页成员选择器 | | mind/body/wisdom/wealth/action/index | 五维首页成员选择器 | | index-home | 首页成员选择 | ## 需求设计 vs 当前实现差距 ### 差距矩阵 | # | 功能 | 需求 | 当前实现 | 差距 | |---|------|------|---------|------| | 1 | **关系标签** | 显示成员与当前用户的关系(爸爸/妈妈/儿子/女儿/配偶) | 只显示 `roleLabel`(parent/child/teacher),没有家庭关系语义 | ❌ 缺少关系标签 | | 2 | **辈分/世代** | 显示辈分信息(如"二代") | FamilyMember 有 `generation` 字段,但未展示 | ❌ 未使用 | | 3 | **配偶标记** | 标记配偶关系 | `isSpouse` 字段存在,但未展示 | ❌ 未使用 | | 4 | **联系方式** | 快速拨打电话/发消息 | 无电话显示,无快捷操作 | ❌ 缺少 | | 5 | **成员编辑** | 编辑成员信息(昵称/头像/角色) | 无编辑入口 | ❌ 缺少 | | 6 | **移除成员** | 从家庭中移除成员 | 无移除操作 | ❌ 缺少 | | 7 | **角色切换** | 一键切换到该成员视角 | 只有 `member/switch` API 但卡片未集成 | ❌ 缺少 | | 8 | **成员详情** | 点击进入成员详情页 | 只有 `select` 事件,无导航到详情页 | ❌ 缺少 | | 9 | **长按菜单** | 长按弹出操作菜单(编辑/切换/移除) | 无长按交互 | ❌ 缺少 | | 10 | **关系色** | 根据关系类型显示不同配色 | 只有4种角色色(parent橙/child蓝/teacher紫/elderly灰) | ⚠️ 部分实现 | | 11 | **能量分数** | 显示成员五维能量综合分数 | 已实现,但只显示一个总分 | ⚠️ 部分实现 | | 12 | **选中状态** | 高亮当前选中的成员 | 已实现 | ✅ | | 13 | **横向滚动** | 成员多时可横向滚动 | 已实现(scroll-view) | ✅ | | 14 | **头像显示** | 显示成员头像 | 已实现,有默认头像 fallback | ✅ | ### 关键差距详细说明 ### 1. 关系标签(高优先级) 当前 `roleBadge` 显示的是系统角色(parent/child/teacher),但用户需要看到的是**家庭关系**: - 爸爸、妈妈、儿子、女儿、爷爷、奶奶、丈夫、妻子 `FamilyMember` 实体中没有直接的关系字段。关系信息存在于 `family_relationships` 表中(双向关系),需要通过 `/api/family/relationship/list` 获取。 **实现方案:** ```json // 需要的 API 返回数据 { "id": 1003, "nickname": "小明", "relationship": "儿子", // 当前用户的儿子 "generation": 2, // 第二代 "isSpouse": false, "avatar": "...", "phone": "138xxxx" } ``` ### 2. 交互操作(高优先级) 当前卡片只能点击选中,缺少以下操作: | 操作 | 触发方式 | 功能 | |------|---------|------| | 切换视角 | 点击 | 切换到该成员视角(家长可用) | | 编辑资料 | 长按菜单/编辑按钮 | 修改昵称、头像 | | 移除成员 | 长按菜单 | 从家庭中移除(仅限家长操作) | | 拨打电话 | 点击电话图标 | 调用系统拨号 | ### 3. 信息展示(中优先级) 当前卡片信息过于简单,缺少: - 关系标签(如"爸爸 · 二代") - 联系电话 - 最近互动时间 - 信任度/亲密度分数(`trustScore`, `intimacyScore` 字段已存在但未使用) ## 建议改造方案 ### FamilyMemberCard 增强 ```vue ``` ### 新增 API 需求 | 端点 | 说明 | 当前状态 | |------|------|---------| | `GET /api/family/member/list` | 返回含 relationship 字段 | ❌ 需增加 relationship 字段 | | `GET /api/family/relationship/list` | 获取家庭成员关系 | ✅ 已存在 | | `POST /api/family/member/switch` | 切换到成员视角 | ✅ 已存在 | | `POST /api/family/member/update` | 更新成员信息 | ✅ 已存在 | | `POST /api/family/member/kick` | 移除成员 | ✅ 已存在 | ### 后端改造:FamilyMemberDTO 增加 relationship 字段 ```java // FamilyMemberDTO 增加 private String relationship; // 与当前用户的关系: 爸爸/妈妈/儿子/女儿 private Integer generation; // 辈分 private Boolean isSpouse; // 是否配偶 private BigDecimal trustScore; // 信任度 private BigDecimal intimacyScore; // 亲密度 ``` ### 后端改造:FamilyMembersController.list() 增加关系计算 ```java // 查询家庭成员列表时,同时计算每个成员与当前用户的关系 List members = familyMemberMapper.selectList(...); // 查询关系类型配置 List relationTypes = relationshipTypeMapper.selectList(...); // 为每个成员计算关系标签 for (FamilyMember member : members) { String relation = relationshipService.calculateRelation(currentUserId, member.getUserId()); member.setRelationship(relation); } ```