Эх сурвалжийг харах

fix(family): 家庭成员管理页过滤本人、展示与当前用户的关系标签

- family-members.vue: computed filteredMembers 过滤 isSelf 及 userId 匹配项
- family-members.vue: 成员数/空态改用 filteredMembers
- UserService.getVisibleMembers: 查询 viewerFm,为 parent 源成员补算 relativeLabel(丈夫/妻子/儿子/女儿等)
E2E Test Bot 1 сар өмнө
parent
commit
d603232c7e

+ 34 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/UserService.java

@@ -160,6 +160,7 @@ private FamilyInvitationService familyInvitationService;
         result.setRoles(user.getRoles());
         result.setFamilyId(user.getFamilyId());
         result.setNickname(user.getNickname());
+        result.setPhone(user.getPhone());
         result.setIsNewUser(isNewUser);
         result.setOpenid(openid);
 
@@ -237,6 +238,7 @@ private FamilyInvitationService familyInvitationService;
   result.setRoles(user.getRoles());
   result.setFamilyId(user.getFamilyId());
   result.setNickname(user.getNickname());
+  result.setPhone(user.getPhone());
   result.setIsNewUser(isNewUser);
   result.setNeedsRoleSelect(isNewUser);
   result.setNeedsFamily(user.getFamilyId() == null || user.getFamilyId() == 0L);
@@ -295,6 +297,7 @@ private FamilyInvitationService familyInvitationService;
         result.setRoles(user.getRoles());
         result.setFamilyId(user.getFamilyId());
         result.setNickname(user.getNickname());
+        result.setPhone(user.getPhone());
         result.setIsNewUser(false);
         result.setOpenid(openid);
         result.setNeedsFamily(user.getFamilyId() == null || user.getFamilyId() == 0L);
@@ -328,6 +331,7 @@ private FamilyInvitationService familyInvitationService;
         result.setRole(user.getRole());
         result.setFamilyId(user.getFamilyId());
         result.setNickname(user.getNickname());
+        result.setPhone(user.getPhone());
         result.setIsNewUser(false);
         result.setOpenid(openid);
         result.setNeedsFamily(user.getFamilyId() == null || user.getFamilyId() == 0L);
@@ -556,6 +560,7 @@ private FamilyInvitationService familyInvitationService;
         result.setRoles(user.getRoles());
         result.setFamilyId(user.getFamilyId());
         result.setNickname(user.getNickname());
+        result.setPhone(user.getPhone());
         result.setIsNewUser(true);
         result.setNeedsFamily(user.getFamilyId() == null || user.getFamilyId() == 0L);
         populateTeacherFields(result, user);
@@ -632,6 +637,7 @@ private FamilyInvitationService familyInvitationService;
         result.setRoles(user.getRoles());
         result.setFamilyId(user.getFamilyId());
         result.setNickname(user.getNickname());
+        result.setPhone(user.getPhone());
         result.setIsNewUser(false);
         result.setNeedsFamily(user.getFamilyId() == null || user.getFamilyId() == 0L);
         populateTeacherFields(result, user);
@@ -788,6 +794,17 @@ private FamilyInvitationService familyInvitationService;
         List<User> parents = userMapper.selectList(new LambdaQueryWrapper<User>()
                 .eq(User::getFamilyId, familyId)
                 .eq(User::getRole, "parent"));
+        // 查询 family_members 以便找到当前用户记录,用于计算相对关系标签
+        List<FamilyMember> familyMembersForVisible = familyMemberMapper.selectList(
+                new LambdaQueryWrapper<FamilyMember>().eq(FamilyMember::getFamilyId, familyId));
+        // 查找当前用户在 family_members 中的记录(用于计算相对关系标签)
+        FamilyMember viewerFm = null;
+        for (FamilyMember fm : familyMembersForVisible) {
+            if (userId.equals(fm.getUserId())) {
+                viewerFm = fm;
+                break;
+            }
+        }
         for (User p : parents) {
             if (p.getId().equals(userId) || (p.getShowToFamily() != null && p.getShowToFamily() == 1)) {
                 FamilyMemberVO vo = new FamilyMemberVO();
@@ -807,6 +824,20 @@ private FamilyInvitationService familyInvitationService;
                 vo.setShowToFamily(p.getShowToFamily() != null ? p.getShowToFamily() : 1);
                 vo.setIsAdmin(isAdmin);
                 vo.setIsSelf(p.getId().equals(userId));
+                // 计算 relativeLabel:与当前用户的辈分关系
+                if (viewerFm != null && viewerFm.getGeneration() != null) {
+                    int viewerGen = viewerFm.getGeneration();
+                    // 同家庭的其他家长(非创建者)generation 通常为 0,配偶/同辈
+                    int genDiff = 0 - viewerGen; // 简化:假定 parent 在同辈(generation=0)
+                    if (genDiff < -1) {
+                        // target 是晚辈
+                        vo.setRelativeLabel("male".equals(p.getGender()) ? "儿子" : "女儿");
+                    } else if (genDiff > 1) {
+                        vo.setRelativeLabel("male".equals(p.getGender()) ? "父亲" : "母亲");
+                    } else {
+                        vo.setRelativeLabel("male".equals(p.getGender()) ? "丈夫" : "妻子");
+                    }
+                }
                 seenUserIds.add(p.getId());
                 result.add(vo);
             }
@@ -916,6 +947,7 @@ private FamilyInvitationService familyInvitationService;
         result.setRole(user.getRole());
         result.setFamilyId(user.getFamilyId());
         result.setNickname(user.getNickname());
+        result.setPhone(user.getPhone());
         result.setNeedsFamily(user.getFamilyId() == null || user.getFamilyId() == 0L);
         populateTeacherFields(result, user);
 
@@ -1486,6 +1518,7 @@ FamilyMember child = familyMemberMapper.selectById(memberId);
             result.setRoles(user.getRoles());
             result.setFamilyId(user.getFamilyId());
             result.setNickname(user.getNickname());
+            result.setPhone(user.getPhone());
             result.setIsNewUser(true);
             result.setNeedsFamily(user.getFamilyId() == null || user.getFamilyId() == 0L);
             populateTeacherFields(result, user);
@@ -1552,6 +1585,7 @@ FamilyMember child = familyMemberMapper.selectById(memberId);
         result.setRoles(user.getRoles());
         result.setFamilyId(user.getFamilyId());
         result.setNickname(user.getNickname());
+        result.setPhone(user.getPhone());
         result.setIsNewUser(isNewUser);
         result.setNeedsFamily(user.getFamilyId() == null || user.getFamilyId() == 0L);
         populateTeacherFields(result, user);

+ 13 - 5
cfc-frontend/pages/profile-extra/family-members.vue

@@ -6,7 +6,7 @@
         <text class="family-header-icon">🏠</text>
         <view class="family-header-text">
           <text class="family-name">{{ familyName || '我的家庭' }}</text>
-          <text class="family-member-count">{{ members.length }} 位成员</text>
+          <text class="family-member-count">{{ filteredMembers.length }} 位成员</text>
         </view>
       </view>
     </view>
@@ -31,8 +31,8 @@
     </view>
 
     <!-- ===== 成员卡片列表 ===== -->
-    <view class="member-list" v-if="members.length > 0">
-      <view class="member-card" v-for="m in members" :key="m.id" @click="showMemberDetail(m)">
+    <view class="member-list" v-if="filteredMembers.length > 0">
+      <view class="member-card" v-for="m in filteredMembers" :key="m.id || m.userId" @click="showMemberDetail(m)">
         <image class="member-avatar" :src="m.avatar || '/static/default-avatar.png'" mode="aspectFill"></image>
         <view class="member-info">
           <text class="member-name">{{ m.nickname || '未设置' }}</text>
@@ -43,7 +43,7 @@
     </view>
 
     <!-- ===== 空状态 ===== -->
-    <view v-if="members.length === 0" class="empty-state">
+    <view v-if="filteredMembers.length === 0" class="empty-state">
       <text class="empty-icon">👨‍👩‍👧‍👦</text>
       <text class="empty-title">还没有家庭成员</text>
       <text class="empty-desc">邀请家人加入,一起记录成长</text>
@@ -157,7 +157,15 @@ export default {
   },
   computed: {
     filteredMembers() {
-      return this.members
+      // 过滤掉自己,只展示其他家庭成员
+      var self = this
+      return (this.members || []).filter(function(m) {
+        var isSelf = m.isSelf === true
+        if (!isSelf && m.userId && m.userId === self.userId) {
+          isSelf = true
+        }
+        return !isSelf
+      })
     },
     detailMemberScores() {
       if (!this.detailMember) return {}