import { useState, useEffect } from "react"; import { useTranslation } from 'react-i18next'; 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 { t } = useTranslation(); 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(t('newUserMustHavePassword')); return; } await api.post("/api/v1/users", formData); } setIsDialogOpen(false); fetchUsers(); } catch (err: any) { setError(err.message || t('anErrorOccurred')); } }; const handleDelete = async (id: number) => { if (window.confirm(t('confirmDeleteUser'))) { try { await api.delete(`/api/v1/users/${id}`); fetchUsers(); } catch (err) { console.error("Failed to delete user", err); } } }; return (
用户管理
handleOpenDialog()}> 添加用户
{editingUser ? t('editUser') : t('addNewUser')}
{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 ? (
) : ( {t('id')} {t('username')} {t('email')} {t('status')} {t('role')} {t('createdAt')} {t('actions')} {users.length === 0 ? ( 暂无用户数据 ) : ( users.map((user) => ( {user.id} {user.username} {user.email} {user.is_active ? t('normal') : t('disabled')} {user.is_admin ? t('admin') : t('regularUser')} {new Date(user.created_at).toLocaleDateString()} )) )}
)}
); }