import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, DialogFooter } from "@/components/ui/dialog"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Pencil, Trash2, Plus, Users as UsersIcon, Loader2 } from "lucide-react"; import { api } from "@/lib/api"; interface User { id: number; username: string; email: string; is_active: boolean; is_admin: boolean; created_at: string; } export function Users() { const [users, setUsers] = useState([]); const [isLoading, setIsLoading] = useState(true); const [isDialogOpen, setIsDialogOpen] = useState(false); const [editingUser, setEditingUser] = useState(null); const [formData, setFormData] = useState({ username: "", email: "", password: "", is_active: true, is_admin: false, }); const [error, setError] = useState(""); const fetchUsers = async () => { try { setIsLoading(true); const data = await api.get("/api/v1/users"); setUsers(data); } catch (err) { console.error("Failed to fetch users", err); } finally { setIsLoading(false); } }; useEffect(() => { fetchUsers(); }, []); const handleOpenDialog = (user?: User) => { setError(""); if (user) { setEditingUser(user); setFormData({ username: user.username, email: user.email, password: "", // Don't show password is_active: user.is_active, is_admin: user.is_admin, }); } else { setEditingUser(null); setFormData({ username: "", email: "", password: "", is_active: true, is_admin: false, }); } setIsDialogOpen(true); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(""); try { if (editingUser) { // Update await api.put(`/api/v1/users/${editingUser.id}`, { username: formData.username, email: formData.email, is_active: formData.is_active, is_admin: formData.is_admin, }); } else { // Create if (!formData.password) { setError("新建用户必须填写密码"); return; } await api.post("/api/v1/users", formData); } setIsDialogOpen(false); fetchUsers(); } catch (err: any) { setError(err.message || "发生错误"); } }; const handleDelete = async (id: number) => { if (window.confirm("确认删除该用户吗?")) { try { await api.delete(`/api/v1/users/${id}`); fetchUsers(); } catch (err) { console.error("Failed to delete user", err); } } }; return (
用户管理
handleOpenDialog()}> 添加用户
{editingUser ? "编辑用户" : "添加新用户"}
{error &&
{error}
}
setFormData({ ...formData, username: e.target.value })} required />
setFormData({ ...formData, email: e.target.value })} required />
{!editingUser && (
setFormData({ ...formData, password: e.target.value })} required />
)}
setFormData({ ...formData, is_active: checked })} />
setFormData({ ...formData, is_admin: checked })} />
{isLoading ? (
) : ( ID 用户名 邮箱 状态 角色 创建时间 操作 {users.length === 0 ? ( 暂无用户数据 ) : ( users.map((user) => ( {user.id} {user.username} {user.email} {user.is_active ? '正常' : '禁用'} {user.is_admin ? '管理员' : '普通用户'} {new Date(user.created_at).toLocaleDateString()} )) )}
)}
); }