"use client" import { useState, useEffect } from "react" import { DashboardShell } from "@/components/dashboard-shell" import { DashboardHeader } from "@/components/dashboard-header" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Badge } from "@/components/ui/badge" import { Search, Edit, Loader2 } from "lucide-react" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { UserDetailDialog } from "@/components/users/user-detail-dialog" import { UserFormDialog } from "@/components/users/user-form-dialog" import { DeleteConfirmationDialog } from "@/components/delete-confirmation-dialog" import { useToast } from "@/components/ui/use-toast" import { usersApi, rolesApi, handleApiError } from "@/lib/api" export default function UsersPage() { const [users, setUsers] = useState([]) const [roles, setRoles] = useState([]) const [searchQuery, setSearchQuery] = useState("") const [currentPage, setCurrentPage] = useState(1) const [totalPages, setTotalPages] = useState(1) const [totalUsers, setTotalUsers] = useState(0) const [editingUser, setEditingUser] = useState(null) const [isLoading, setIsLoading] = useState(true) const { toast } = useToast() const itemsPerPage = 10 // 获取用户列表 const fetchUsers = async () => { setIsLoading(true) try { const response = await usersApi.getUsers({ page: currentPage, pageSize: itemsPerPage, search: searchQuery, }) setUsers(response.items) setTotalPages(response.totalPages) setTotalUsers(response.total) } catch (error) { toast({ title: "获取用户列表失败", description: handleApiError(error), variant: "destructive", }) } finally { setIsLoading(false) } } // 获取角色列表 const fetchRoles = async () => { try { const response = await rolesApi.getRoles() setRoles(response.items) } catch (error) { toast({ title: "获取角色列表失败", description: handleApiError(error), variant: "destructive", }) } } // 初始加载 useEffect(() => { fetchRoles() }, []) // 当页码、搜索条件变化时重新获取数据 useEffect(() => { fetchUsers() }, [currentPage, searchQuery]) // 添加用户 const handleAddUser = async (data) => { try { await usersApi.createUser({ name: data.name, email: data.email, role: data.role, status: data.status, phone: data.phone, address: data.address, }) toast({ title: "用户创建成功", description: `用户 "${data.name}" 已成功创建`, variant: "default", }) fetchUsers() // 刷新用户列表 } catch (error) { toast({ title: "创建用户失败", description: handleApiError(error), variant: "destructive", }) throw error // 重新抛出错误,让表单组件处理 } } // 编辑用户 const handleEditUser = async (data) => { if (!editingUser) return try { await usersApi.updateUser(editingUser.id, { name: data.name, email: data.email, role: data.role, status: data.status, phone: data.phone, address: data.address, }) toast({ title: "用户更新成功", description: `用户 "${data.name}" 已成功更新`, variant: "default", }) setEditingUser(null) fetchUsers() // 刷新用户列表 } catch (error) { toast({ title: "更新用户失败", description: handleApiError(error), variant: "destructive", }) throw error // 重新抛出错误,让表单组件处理 } } // 删除用户 const handleDeleteUser = async (userId) => { try { await usersApi.deleteUser(userId) toast({ title: "用户删除成功", description: "用户已成功删除", variant: "default", }) fetchUsers() // 刷新用户列表 } catch (error) { toast({ title: "删除用户失败", description: handleApiError(error), variant: "destructive", }) } } // 开始编辑用户 const startEditUser = (user) => { setEditingUser(user) } // 获取头像颜色 const getAvatarColor = (name) => { const colors = [ "from-pink-500 to-purple-500", "from-blue-500 to-teal-500", "from-red-500 to-orange-500", "from-green-500 to-emerald-500", "from-purple-500 to-indigo-500", ] // Simple hash function to pick a color based on name const hash = name.split("").reduce((acc, char) => acc + char.charCodeAt(0), 0) return colors[hash % colors.length] } // 获取用户名首字母 const getInitials = (name) => { return name .split(" ") .map((part) => part[0]) .join("") .toUpperCase() .substring(0, 2) } return ( ({ id: role.id, name: role.name }))} />
{ setSearchQuery(e.target.value) setCurrentPage(1) // 重置到第一页 }} />
用户列表
管理系统用户账户
用户名 邮箱 角色 状态 注册日期 最后登录 操作 {isLoading ? (
加载中...
) : users.length === 0 ? ( 没有找到匹配的用户 ) : ( users.map((user) => ( {getInitials(user.name)} {user.name} {user.email} {user.role} {user.status} {user.registeredAt} {user.lastLogin || "-"} startEditUser(user)} /> {user.role !== "超级管理员" && ( handleDeleteUser(user.id)} /> )} )) )}
显示 {users.length > 0 ? (currentPage - 1) * itemsPerPage + 1 : 0}- {Math.min(currentPage * itemsPerPage, totalUsers)} 共 {totalUsers} 个用户
{/* 编辑用户对话框 */} {editingUser && ( { if (!open) setEditingUser(null) }} onSubmit={handleEditUser} defaultValues={{ name: editingUser.name, email: editingUser.email, role: editingUser.role, status: editingUser.status, phone: editingUser.phone, address: editingUser.address, }} roles={roles.map((role) => ({ id: role.id, name: role.name }))} /> )}
) }