import { useState, useEffect } from 'react' import { Plus, Search, RefreshCw, Edit, Trash2, ShieldCheck, MoreHorizontal } from 'lucide-react' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' import { Badge } from '@/components/ui/badge' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Label } from '@/components/ui/label' import { getUserList, createUser, updateUser, deleteUser } from '@/api/system/user' import type { SystemUser } from '@/api/system' export default function UserManage() { const [users, setUsers] = useState([]) const [total, setTotal] = useState(0) const [loading, setLoading] = useState(false) const [search, setSearch] = useState({ account: '', name: '' }) // Dialog State const [dialogOpen, setDialogOpen] = useState(false) const [editingUser, setEditingUser] = useState(null) const [formData, setFormData] = useState({ account: '', name: '', phone: '', clientId: '' }) const fetchUsers = async () => { setLoading(true) try { const res = await getUserList({ current: 1, pageSize: 10, ...search }) if (res.data) { setUsers(res.data.list) setTotal(res.data.total) } } finally { setLoading(false) } } useEffect(() => { fetchUsers() }, []) const handleSearch = () => fetchUsers() const handleReset = () => { setSearch({ account: '', name: '' }) setTimeout(() => fetchUsers(), 0) } const openCreateDialog = () => { setEditingUser(null) setFormData({ account: '', name: '', phone: '', clientId: '' }) setDialogOpen(true) } const openEditDialog = (user: SystemUser) => { setEditingUser(user) setFormData({ account: user.account, name: user.name, phone: user.phone || '', clientId: user.clientId || '' }) setDialogOpen(true) } const handleSave = async () => { if (editingUser) { await updateUser(editingUser.id, formData) } else { await createUser(formData) } setDialogOpen(false) fetchUsers() } const handleDelete = async (id: string) => { if (confirm('确定要删除这个用户吗?')) { await deleteUser(id) fetchUsers() } } return (

用户管理

管理系统和各个客户端(Plant, Radio等)的用户访问权限。

用户列表
setSearch({ ...search, account: e.target.value })} onKeyDown={e => e.key === 'Enter' && handleSearch()} />
setSearch({ ...search, name: e.target.value })} onKeyDown={e => e.key === 'Enter' && handleSearch()} />
账号 姓名 手机号 客户端来源 角色 创建时间 操作 {loading ? ( 加载中... ) : users.length === 0 ? ( 暂无数据 ) : ( users.map(user => ( {user.account} {user.name} {user.phone || '-'} {user.clientId ? ( {user.clientId} ) : ( System )}
{user.roles?.map(r => ( {r.name} )) || 无角色}
{new Date(user.createdAt).toLocaleDateString('zh-CN')} 操作 openEditDialog(user)}> 编辑信息 handleDelete(user.id)} className="text-red-500 focus:text-red-500 focus:bg-red-50 dark:focus:bg-red-950"> 删除用户
)) )}
{/* Simple Pagination Footer */}
共 {total} 条记录
{/* Dialog for Create/Edit */} {editingUser ? '编辑用户' : '新增用户'} {editingUser ? '修改用户信息和客户端绑定。' : '在系统中创建一个新用户账号。'}
setFormData({ ...formData, account: e.target.value })} className="col-span-3" disabled={!!editingUser} />
setFormData({ ...formData, name: e.target.value })} className="col-span-3" />
setFormData({ ...formData, phone: e.target.value })} className="col-span-3" />
setFormData({ ...formData, clientId: e.target.value })} className="col-span-3" />
) }