Преглед изворни кода

fix(family): 成员列表 isAdmin 按成员本人是否为创建者下发,成员视角限制二次切换

- listMembers: vo.isAdmin 从'操作者是否创建者'改为'该成员本人是否家庭创建者',
  修复创建者请求时所有成员 isAdmin 均为 true 的误判(影响创建者/管理员标识等展示)
- 切换规则确认:所有登录用户均可切换为不可登录成员(不依赖 isAdmin),
  不可登录成员视角(currentView=member)下隐藏全部切换入口,仅可退出切换
- isFamilyAdmin(index-home/parent-index)适配新 isAdmin 语义:改为查自己
  (isSelf)是否为创建者,不再依赖列表首元素
liaoxg пре 23 часа
родитељ
комит
40e7af47c7

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

@@ -224,10 +224,9 @@ public class FamilyMemberService {
         Long familyId = user.getFamilyId();
         List<FamilyMemberVO> result = new ArrayList<>();
 
-        // 查询家庭创建者(管理员),用于下发 isAdmin 给前端控制编辑权限
+        // 查询家庭创建者,用于逐成员判断其是否管理员(isAdmin 语义:该成员本人是否为家庭创建者)
         Family family = familyMapper.selectById(familyId);
         Long creatorId = (family != null) ? family.getCreatorId() : null;
-        boolean isAdmin = creatorId != null && creatorId.equals(userId);
 
         // 查询 family_members 表(排除回收箱成员)
         List<FamilyMember> familyMembers = familyMemberMapper.selectList(
@@ -249,7 +248,8 @@ public class FamilyMemberService {
             vo.setId(fm.getId());
             vo.setSource("family_member");
             vo.setUserId(fm.getUserId());
-            vo.setIsAdmin(isAdmin);
+            // isAdmin:该成员是否为家庭创建者(仅创建者本人为 true)
+            vo.setIsAdmin(creatorId != null && creatorId.equals(fm.getUserId()));
             vo.setNickname(resolveMemberNickname(fm));
             vo.setPhone(fm.getPhone());
             vo.setAvatar(fm.getAvatar());
@@ -341,7 +341,7 @@ vo.setIsSelf(viewerMember != null && viewerMember.getId().equals(fm.getId()));
                 vo.setAge(calculateAge(p.getBirthday()));
             }
             vo.setGeneration(0);
-            vo.setIsAdmin(isAdmin);
+            vo.setIsAdmin(creatorId != null && creatorId.equals(p.getId()));
             vo.setIsSelf(p.getId().equals(userId));
             // 家长账号均为可登录用户,不允许切换视角(与成员段"仅不可登录可切换"一致)
             vo.setIsSwitchable(false); // 含 source='parent' 段

+ 7 - 3
cfc-frontend/components/FamilyMemberStrip.vue

@@ -168,9 +168,13 @@ export default {
     }
   },
   computed: {
+    inSelfView: function() {
+      // 成员视角(已切换到不可登录成员)下不再允许切换其他成员,只能退出切换
+      return !(this.$store && this.$store.state && this.$store.state.currentView === 'member')
+    },
     canSwitch: function() {
-      // 非自己的成员可切换视角(isSwitchable 由后端统一计算,含 family_member 与 parent 两种来源)
-      return this.actionMember && this.actionMember.isSwitchable
+      // 仅本人视角(self)可切换;目标仅限不可登录成员(isSwitchable 由后端统一计算,含 family_member 与 parent 两种来源)
+      return this.inSelfView && this.actionMember && this.actionMember.isSwitchable
     },
     canEdit: function() {
       return this.isParent && this.actionMember && !this.actionMember.userId && this.actionMember.source === 'family_member'
@@ -226,7 +230,7 @@ export default {
     switchToMember: function() {
       var member = this.actionMember
       this.closeMenu()
-      if (member && member.isSwitchable) {
+      if (this.inSelfView && member && member.isSwitchable) {
         this.$emit('switch', member)
       }
     },

+ 5 - 0
cfc-frontend/components/ProfileHeader.vue

@@ -79,6 +79,11 @@ export default {
       }
     },
     async doSwitchMode() {
+      // 成员视角(已切换到不可登录成员)下不可再切换其他成员,只能退出切换
+      if (this.$store.state.currentView === 'member') {
+        uni.showToast({ title: '当前为成员视角,请先退出切换', icon: 'none' })
+        return
+      }
       if (this.children.length === 0) {
         this.loadChildren()
         if (this.children.length === 0) {

+ 3 - 1
cfc-frontend/pages/home-pages/parent-index.vue

@@ -601,7 +601,9 @@ export default {
   computed: {
     isFamilyAdmin() {
       if (!this.familyMembersVisible || this.familyMembersVisible.length === 0) return false
-      return this.familyMembersVisible[0].isAdmin === true
+      // isAdmin 语义为"成员本人是否为家庭创建者";自己(isSelf)是创建者即管理员
+      var me = this.familyMembersVisible.filter(function(m) { return m.isSelf })[0]
+      return !!(me && me.isAdmin === true)
     },
     topPendingTasks() {
       return this.pendingTasks.slice(0, 3)

+ 3 - 1
cfc-frontend/pages/index-home/index.vue

@@ -518,7 +518,9 @@ membershipDays: 0,
   computed: {
     isFamilyAdmin: function() {
       if (!this.familyMembersVisible || this.familyMembersVisible.length === 0) return false
-      return this.familyMembersVisible[0].isAdmin === true
+      // isAdmin 语义为"成员本人是否为家庭创建者";自己(isSelf)是创建者即管理员
+      var me = this.familyMembersVisible.filter(function(m) { return m.isSelf })[0]
+      return !!(me && me.isAdmin === true)
     },
     sandboxScores: function() {
       var d = this.sandboxData || {}

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

@@ -101,7 +101,7 @@
 
         <!-- 操作按钮 -->
         <view class="detail-actions">
-          <button class="detail-action-btn action-switch" @click="onSwitchMember(detailMember)" v-if="detailMember && detailMember.isSwitchable">切换身份</button>
+          <button class="detail-action-btn action-switch" @click="onSwitchMember(detailMember)" v-if="detailMember && detailMember.isSwitchable && isSelfView">切换身份</button>
           <button class="detail-action-btn action-edit" @click="onEditRelation(detailMember)" v-if="canEditMember(detailMember)">编辑资料</button>
           <button class="detail-action-btn action-questionnaire" @click="doQuestionnaire(detailMember)">关系问卷</button>
           <button class="detail-action-btn action-interaction" @click="recordInteraction(detailMember)">记录互动</button>
@@ -164,6 +164,10 @@ export default {
     }
   },
   computed: {
+    isSelfView() {
+      // 成员视角(已切换到不可登录成员)下不再显示切换入口,只能退出切换
+      return store.state.currentView !== 'member'
+    },
     // 列表过滤掉"我"(当前登录用户对应的成员),避免自己和自己互动
     filteredMembers() {
 // 过滤掉自己,只展示其他家庭成员