"use client"; import { useState, useEffect } from "react"; import { adminAPI } from "@/lib/api"; import { format } from "date-fns"; import { Users, Search } from "lucide-react"; interface AdminUser { id: number; username: string; email: string; full_name: string | null; is_active: boolean; is_superuser: boolean; created_at: string | null; last_login: string | null; session_count: number; message_count: number; } export default function UsersPage() { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [confirmDelete, setConfirmDelete] = useState(null); const [search, setSearch] = useState(""); const loadUsers = () => { setLoading(true); adminAPI.listUsers() .then(setUsers) .catch(console.error) .finally(() => setLoading(false)); }; useEffect(() => { loadUsers(); }, []); const handleToggleActive = async (userId: number) => { try { await adminAPI.toggleUserActive(userId); setUsers((prev) => prev.map((u) => (u.id === userId ? { ...u, is_active: !u.is_active } : u)) ); } catch (e) { console.error(e); } }; const handleToggleAdmin = async (userId: number) => { try { await adminAPI.toggleUserAdmin(userId); setUsers((prev) => prev.map((u) => (u.id === userId ? { ...u, is_superuser: !u.is_superuser } : u)) ); } catch (e) { console.error(e); } }; const handleDelete = async (userId: number) => { try { await adminAPI.deleteUser(userId); setConfirmDelete(null); setUsers((prev) => prev.filter((u) => u.id !== userId)); } catch (e) { console.error(e); } }; const filtered = users.filter( (u) => u.username.toLowerCase().includes(search.toLowerCase()) || u.email.toLowerCase().includes(search.toLowerCase()) || (u.full_name && u.full_name.toLowerCase().includes(search.toLowerCase())) ); if (loading) { return
加载中...
; } return (

用户管理

共 {users.length} 个用户
setSearch(e.target.value)} placeholder="搜索用户名、邮箱..." className="pl-9 pr-3 py-1.5 text-sm border rounded-lg bg-background focus:outline-none focus:ring-1 focus:ring-primary" />
{filtered.length === 0 && ( )} {filtered.map((u) => ( ))}
用户 邮箱 状态 角色 对话 / 消息 注册时间 操作
{search ? "无匹配用户" : "暂无用户"}
{u.username}
{u.full_name &&
{u.full_name}
}
{u.email} {u.session_count} / {u.message_count} {u.created_at ? format(new Date(u.created_at), "yyyy/M/d HH:mm") : "—"} {confirmDelete === u.id ? (
) : ( )}
); }