diff --git a/frontend/src/pages/admin/AdminGroupsPage.tsx b/frontend/src/pages/admin/AdminGroupsPage.tsx
index 2a8cb29..d636e06 100644
--- a/frontend/src/pages/admin/AdminGroupsPage.tsx
+++ b/frontend/src/pages/admin/AdminGroupsPage.tsx
@@ -1,5 +1,5 @@
import { useState, useEffect, useCallback, useMemo } from "react";
-import { Table, Button, Modal, Input, Checkbox, Tag, App, Spin, Empty, Select, Tooltip } from "antd";
+import { Table, Button, Modal, Input, Checkbox, Tag, App, Spin, Empty, Select } from "antd";
import { Plus, Pencil, Trash2, UserPlus, Crown, ShieldCheck } from "lucide-react";
import { useAuth } from "../../contexts/AuthContext";
import { isSuperAdmin } from "../../constants/task";
@@ -385,36 +385,47 @@ export default function AdminGroupsPage() {
) : detail.members.length === 0 ? (
) : (
- /* 标签云而非表格:成员多时一人一行要滚很久,标签能一行放好几个。
- 有权限时:点标签正文切换组长、点 × 移除;无权限时纯展示。 */
-
+ /* 方块网格:每个成员一格,只显示中文名,全部铺开不做滚动。
+ 自动按容器宽度铺排(auto-fill),窗口越宽一行放得越多。
+ 有权限时:点方块切换组长、悬停右上角出现移除;无权限时纯展示。 */
+
{detail.members.map((m) => (
- { e.preventDefault(); handleRemoveMember(m.user_id); }}
- className="!m-0 !px-2.5 !py-1 !text-sm"
+ title={
+ detail.can_manage_members
+ ? `${m.display_name}(${m.user_id})· ${m.is_leader ? "点击取消组长" : "点击设为组长"}`
+ : `${m.display_name}(${m.user_id})`
+ }
+ onClick={() => {
+ if (detail.can_manage_members) handleToggleLeader(m.user_id, !m.is_leader);
+ }}
+ className={`group relative flex h-11 select-none items-center justify-center rounded-lg border px-2 text-sm transition-colors ${
+ m.is_leader
+ ? "border-amber-300 bg-amber-50 font-medium text-amber-800"
+ : "border-gray-200 bg-white text-gray-700"
+ } ${
+ detail.can_manage_members
+ ? "cursor-pointer hover:border-blue-300 hover:bg-blue-50"
+ : ""
+ }`}
>
-
- {
- if (detail.can_manage_members) handleToggleLeader(m.user_id, !m.is_leader);
- }}
+ {m.is_leader && (
+
+ )}
+ {m.display_name}
+
+ {/* 移除:默认藏起来,悬停该方块才出现,避免误点 */}
+ {detail.can_manage_members && (
+
-
-
+ ×
+
+ )}
+
))}
)}