日期: 2026-08-05
状态: 已确认
关联组件: cfc-frontend/components/FamilyMemberStrip.vue, cfc-frontend/components/FamilyMemberCard.vue
FamilyMemberStrip 是水平成员选择条(8 个页面共用),目前每个成员卡片只显示:
缺失:关系质量信息(信任度/亲密度/沟通质量)完全没有呈现。
| 数据 | 现状 | 位置 |
|---|---|---|
| 关系类型(pairwise) | ✅ 已有 | family_relationships 表:from→to + generation_value + relationship_key,双向各一条 |
| 信任/亲密度/沟通评分 | ⚠️ 仅单成员维度 | family_members.trust_score/intimacy_score/communication_score——本质是问卷答卷人(当前用户)对该成员的评分(RelationshipQuestionnaireService.updateMemberScores 写入) |
| 问卷答卷 | ✅ pairwise 天然成立 | relationship_questionnaire_responses:respondent_id → snapshot_id → family_member_id |
FamilyRelationGraph(力导向关系图保持现状,作为可选全景视图)FamilyMemberStrip 调用方式(默认视角零改动)family_relationships 表扩展评分列在 family_members 单成员评分之外,将评分落库到 pairwise 关系表,支撑"以任意成员为中心"的视角。
ALTER TABLE family_relationships
ADD COLUMN trust_score DECIMAL(5,2) DEFAULT 0 COMMENT '信任度(答卷人视角)',
ADD COLUMN intimacy_score DECIMAL(5,2) DEFAULT 0 COMMENT '亲密度(答卷人视角)',
ADD COLUMN communication_score DECIMAL(5,2) DEFAULT 0 COMMENT '沟通质量(答卷人视角)';
DatabaseInitializer.runMigrations() 使用 ensureColumn(),幂等schema.sql 的 family_relationships CREATE TABLE 补三列(编号递增,搜索 // 迁移 确认最新号)FamilyRelationship.java 增加三个 BigDecimal 字段RelationshipQuestionnaireService.updateMemberScores(Long memberId, BigDecimal[] scores) 增加逻辑:
memberId 找到被评成员(to_member_id)family_relationships 行则更新三列评分;不存在则插入新行(generation_value 从双方成员 generation 计算)POST /api/family/relationship/pairwise
入参: { "centerMemberId": 123 } // 可选,空 = 当前用户视角
出参: Result<List<FamilyMemberVO>> // 以 centerMember 为中心的关系列表
RelationshipQualityController 新增 pairwise 方法(@PostMapping)RelationshipQualityService 新增 getPairwiseRelationships(Long centerMemberId, Long familyId):
from_member_id = centerMemberId 的所有行relationship_key → 否则用 FamilyRelationshipService.computeRelationshipLabel(generationValue, gender)FamilyMemberVO 结构返回(含 isSelf 标记 centerMember 自身)前端通过 getVisibleFamilyMembers 的返回判定:接口返回空数组 = 无家庭或家庭成员不可见 → 显示"创建家庭"引导。
关系徽章下方增加三个迷你圆点(关系现状指示):
[ 爸爸 ] ← 关系类型徽章(现有,配色保留)
● ● ● ← 三个圆点:信任/亲密度/沟通
#10B981(≥70)/ 黄 #F59E0B(40-69)/ 红 #EF4444(<40)· · ·member.trustScore/intimacyScore/communicationScore(FamilyMemberVO 已有字段,当前用户视角)当前模板 v-if="members && members.length > 0" 空时整条不渲染 → 增加 v-else 分支:
┌─────────────────────────────┐
│ 🏠 还未创建家庭 │
│ 创建家庭,开启全家幸福之旅 │
│ [+ 创建家庭] │
└─────────────────────────────┘
@click 调 createFamily(nickname + '的家庭')(复用 utils/api.js 的 createFamily,参照 user-edit.vue 的 createFamilyAction)$emit('created'),父组件刷新成员列表当前用户(member.isSelf === true)与其他成员菜单不同:
┌─────────────────────────────────┐
│ (头像) 小明 │
│ 儿子 · 8岁 │
│ ── 关系现状 ── │
│ 信任度 ████████ 82 │
│ 亲密度 ██████ 60 │
│ 沟通质量 █████████ 91 │
│ ─────────────── │
│ ➕ 添加成员 │ ← 仅当前用户
│ 📨 邀请成员 │ ← 仅当前用户
│ 🔄 切换到该成员视角 │ ← 非本人且有 userId
│ ✏️ 编辑资料 │ ← isParent 且可编辑
│ 📋 关系问卷 → 上次填写 3天前 │ ← 显示上次填写时间
│ 💬 记录互动 │
│ 📞 拨打电话 │ ← 有 phone
│ 🗑️ 移除成员 │ ← isParent 且非本人
└─────────────────────────────────┘
relationship || relativeLabel || roleLabel)#F3F4F6,填充色按分级),右侧数值;无数据时显示"未测评"/pages/family/add-member)、"邀请成员"(跳邀请二维码页,参照 family-members.vue 的 📨 邀请成员逻辑)canSwitch/canEdit/canRemove computed,新增 isSelf 判断centerMemberId propcenterMemberId: { type: Number, default: null }members 数组(当前用户视角)members 由组件自身组装(以 centerMember 为中心)pages/home-pages/member-home-detail.vue 增加 FamilyMemberStrip 区块:
:center-member-id="memberId",展示"以该成员为中心"的关系条getVisibleFamilyMembers 返回空 → 显示创建家庭引导卡selectedMemberId)或切换视角(沿用现有逻辑)| 场景 | 处理 |
|---|---|
| 无家庭/无成员 | 空状态引导卡 + 创建家庭按钮 |
| 未填写关系问卷 | 色点灰色 · · ·,菜单关系区块"未测评" |
| pairwise 接口失败 | 组件 fallback 为传入的 members 渲染(不阻塞页面) |
| 答卷人无 family_member 记录 | 问卷保存不阻塞,日志记录 |
| 长按非本人卡片 | 不显示添加/邀请成员 |
| 非家长长按 | 不显示编辑/移除(现有 canEdit/canRemove 逻辑保留) |
mvn clean compilenpm run build:mp-weixin(微信小程序编译通过)