From 2f6d3a60cc539cd675b917e3ff108e7eaa5a8655 Mon Sep 17 00:00:00 2001 From: seaislee1209 Date: Tue, 12 May 2026 21:08:30 +0800 Subject: [PATCH] =?UTF-8?q?fix(admin):=20=E8=B6=85=E7=AE=A1=E8=A1=A5?= =?UTF-8?q?=E3=80=8C=E5=8D=87=E4=B8=BA=E4=B8=BB=E7=AE=A1=E7=90=86=E5=91=98?= =?UTF-8?q?=E3=80=8D=E5=85=A5=E5=8F=A3=20=E2=80=94=20=E4=B8=8D=E7=84=B6?= =?UTF-8?q?=E4=B8=BB=E7=AE=A1=E6=92=A4=E4=BA=86=E5=8A=A0=E4=B8=8D=E5=9B=9E?= =?UTF-8?q?=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前只能撤主管不能升,撤完只能新建账号或重建团队,不合理。 后端 admin_team_member_role_view 早就支持 is_team_owner=true(L1254-1260, 设 owner=True 时自动同时 admin=True);前端 setMemberRole API 只传 is_team_admin,从没用过 is_team_owner 参数。 修法: - lib/api.ts 加 adminApi.setMemberAsOwner(teamId, memberId) - TeamsPage 副管/成员行 role badge 旁加小灰字 "→主管" 按钮 - 点击 confirm 提示"不会自动降级现有主管,需自己先撤旧主管再升新主管" (后端没强制约束一团队一主管,降级逻辑交给操作员判断) UX 流程: - 主管 → 单击 badge = 撤销 (现有) - 副管 → 单击 badge = 取消副管(变成员)(现有) + [→主管] 升主管 - 成员 → 单击文字 = 升副管 (现有) + [→主管] 升主管 Co-Authored-By: Claude Opus 4.7 (1M context) --- web/src/lib/api.ts | 4 +++ web/src/pages/TeamsPage.tsx | 60 ++++++++++++++++++++++++++++--------- 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/web/src/lib/api.ts b/web/src/lib/api.ts index 3b2c6c4..af576a9 100644 --- a/web/src/lib/api.ts +++ b/web/src/lib/api.ts @@ -210,6 +210,10 @@ export const adminApi = { setMemberRole: (teamId: number, memberId: number, isTeamAdmin: boolean) => api.patch(`/admin/teams/${teamId}/members/${memberId}/role`, { is_team_admin: isTeamAdmin }), + // 升某成员为主管(后端会自动同时设 is_team_admin=true) + setMemberAsOwner: (teamId: number, memberId: number) => + api.patch(`/admin/teams/${teamId}/members/${memberId}/role`, { is_team_owner: true }), + // User management createUser: (data: { username: string; diff --git a/web/src/pages/TeamsPage.tsx b/web/src/pages/TeamsPage.tsx index b139564..1272a27 100644 --- a/web/src/pages/TeamsPage.tsx +++ b/web/src/pages/TeamsPage.tsx @@ -833,21 +833,53 @@ export function TeamsPage() { } catch { showToast('操作失败'); } }}>主管理员 ) : m.is_team_admin ? ( - { - try { - await adminApi.setMemberRole(detailTeam!.id, m.id, false); - showToast('已取消副管理员'); - const { data: refreshed } = await adminApi.getTeamDetail(detailTeam!.id); setDetailTeam(refreshed); - } catch { showToast('操作失败'); } - }}>副管理员 + <> + { + try { + await adminApi.setMemberRole(detailTeam!.id, m.id, false); + showToast('已取消副管理员'); + const { data: refreshed } = await adminApi.getTeamDetail(detailTeam!.id); setDetailTeam(refreshed); + } catch { showToast('操作失败'); } + }}>副管理员 + + ) : ( - { - try { - await adminApi.setMemberRole(detailTeam!.id, m.id, true); - showToast('已设为副管理员'); - const { data: refreshed } = await adminApi.getTeamDetail(detailTeam!.id); setDetailTeam(refreshed); - } catch { showToast('操作失败'); } - }}>成员 + <> + { + try { + await adminApi.setMemberRole(detailTeam!.id, m.id, true); + showToast('已设为副管理员'); + const { data: refreshed } = await adminApi.getTeamDetail(detailTeam!.id); setDetailTeam(refreshed); + } catch { showToast('操作失败'); } + }}>成员 + + )}