Quellcode durchsuchen

feat: 允许切换到可登录成员视角,统一 isSwitchable 口径

- toFamilyMemberVO 加 operatorUserId 参数:isSwitchable 改为非本人即可切换(含可登录成员),移除仅无 openid 可切换的旧限制,与 listMembers/switchToMember 口径一致
- switchToMember 成员段返回 nickname 改用 resolveMemberNickname(可登录成员显示 users 表昵称)
- 前端 store 切换守卫文案与 ProfileHeader 注释同步,移除'可通过微信登录不能切换'的旧提示
liaoxg vor 6 Stunden
Ursprung
Commit
601bcf083f

+ 8 - 12
cfc-backend/src/main/java/com/etotem/cfc/service/FamilyMemberService.java

@@ -210,7 +210,7 @@ public class FamilyMemberService {
             membershipService.syncMembershipForNewMember(memberUserId, familyId);
         }
 
-        return toFamilyMemberVO(member);
+        return toFamilyMemberVO(member, userId);
     }
 
     /**
@@ -373,7 +373,7 @@ public class FamilyMemberService {
             vo.setMemberId(member.getId());
             vo.setSource("family_member");
             vo.setEffectiveRole(effectiveRole);
-            vo.setNickname(member.getNickname());
+            vo.setNickname(resolveMemberNickname(member));
             vo.setIsSwitchable(true);
             return vo;
         }
@@ -870,7 +870,7 @@ public class FamilyMemberService {
         member.setUpdatedAt(new Date());
         familyMemberMapper.updateById(member);
         logMemberAction(member.getFamilyId(), member.getId(), "update", oldNickname, member.getNickname(), userId);
-        return toFamilyMemberVO(member);
+        return toFamilyMemberVO(member, userId);
     }
 
     /**
@@ -959,7 +959,7 @@ public class FamilyMemberService {
         return fm.getNickname();
     }
 
-    private FamilyMemberVO toFamilyMemberVO(FamilyMember member) {
+    private FamilyMemberVO toFamilyMemberVO(FamilyMember member, Long operatorUserId) {
         FamilyMemberVO vo = new FamilyMemberVO();
         vo.setId(member.getId());
         vo.setSource("family_member");
@@ -976,14 +976,10 @@ public class FamilyMemberService {
         if (member.getBirthday() != null) {
             vo.setAge(calculateAge(member.getBirthday()));
         }
-        // 设置 isSwitchable:仅无 openid 的不可登录成员可被切换
-        if (member.getUserId() != null) {
-            User memberUser = userMapper.selectById(member.getUserId());
-            String openid = memberUser != null ? memberUser.getOpenid() : null;
-            vo.setIsSwitchable(openid == null || openid.isEmpty());
-        } else {
-            vo.setIsSwitchable(true);
-        }
+        // 设置 isSwitchable:非操作者本人即可切换视角(含可登录成员),与 listMembers 口径一致
+        boolean switchableIsSelf = operatorUserId != null && member.getUserId() != null
+                && operatorUserId.equals(member.getUserId());
+        vo.setIsSwitchable(!switchableIsSelf);
         return vo;
     }
 

+ 1 - 1
cfc-frontend/components/ProfileHeader.vue

@@ -94,7 +94,7 @@ export default {
           return
         }
       }
-      // 优先显示可切换成员(不可登录成员),过滤掉可通过微信登录的成员
+      // 优先显示可切换成员(isSwitchable 由后端计算:非本人即可切换,含可登录成员)
       var switchable = this.children.filter(function(m) { return m.isSwitchable })
       if (switchable.length === 0) {
         uni.showToast({ title: '暂无可切换成员', icon: 'none' })

+ 2 - 2
cfc-frontend/store/index.js

@@ -195,11 +195,11 @@ const store = new Vuex.Store({
       commit('switchToChild', memberId)
       return true
     },
-    // 切换到家庭成员前检查(仅不可登录成员可切换
+    // 切换到家庭成员前检查(isSwitchable 由后端统一计算:非本人即可切换,含可登录成员
     switchToMemberWithCheck({ commit }, payload) {
       var member = payload.member || {}
       if (member.isSwitchable === false) {
-        uni.showToast({ title: '该成员可通过微信登录,不能切换为TA的身份', icon: 'none' })
+        uni.showToast({ title: '该成员暂不可切换', icon: 'none' })
         return false
       }
       commit('switchToMember', payload)