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 { Checkbox } from '@/components/ui/checkbox' import { getUserList, createUser, updateUser, deleteUser, getUserDetail, assignUserRoles } from '@/api/system/user' import { getRoleList } from '@/api/system/role' import type { SystemUser, SystemRole } 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: '' }) // All Roles for assignment const [allRoles, setAllRoles] = useState([]) // Dialog State const [dialogOpen, setDialogOpen] = useState(false) const [editingUser, setEditingUser] = useState(null) const [formData, setFormData] = useState({ account: '', name: '', phone: '', clientId: '', roleIds: [] as string[] }) const fetchUsers = async () => { setLoading(true) try { const res = await getUserList({ current: 1, pageSize: 10, ...search }) if (res) { setUsers(res.list) setTotal(res.total) } } finally { setLoading(false) } } const fetchRoles = async () => { const res = await getRoleList({ current: 1, pageSize: 100 }) if (res) setAllRoles(res.list) } useEffect(() => { fetchUsers() fetchRoles() }, []) const handleSearch = () => fetchUsers() const handleReset = () => { setSearch({ account: '', name: '' }) setTimeout(() => fetchUsers(), 0) } const openCreateDialog = () => { setEditingUser(null) setFormData({ account: '', name: '', phone: '', clientId: '', roleIds: [] }) setDialogOpen(true) } const openEditDialog = async (user: SystemUser) => { setEditingUser(user) setFormData({ account: user.account, name: user.name, phone: user.phone || '', clientId: '', roleIds: [] }) setDialogOpen(true) const detail = await getUserDetail(user.id) if (detail) { setFormData(prev => ({ ...prev, roleIds: detail.roleIds || [] })) } } const handleSave = async () => { if (editingUser) { await updateUser({ id: editingUser.id, account: formData.account, name: formData.name, phone: formData.phone }) await assignUserRoles({ userId: editingUser.id, roleIds: formData.roleIds }) } else { await createUser({ ...formData, password: '123' }) } setDialogOpen(false) fetchUsers() } const handleDelete = async (id: string) => { if (confirm('确定要删除这个用户吗?')) { await deleteUser([id]) fetchUsers() } } const toggleRole = (roleId: string, checked: boolean) => { if (checked) { setFormData(prev => ({ ...prev, roleIds: [...prev.roleIds, roleId] })) } else { setFormData(prev => ({ ...prev, roleIds: prev.roleIds.filter(id => id !== roleId) })) } } 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.roles?.map(roleObj => { const name = typeof roleObj === 'string' ? roleObj : roleObj.name const key = typeof roleObj === 'string' ? roleObj : roleObj.id return ( {name} ) }) || 无角色}
{user.createdAt ? new Date(user.createdAt * 1000).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"> 删除用户
)) )}
共 {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" />
{/* Roles Assignment */}
{allRoles.map(role => (
toggleRole(role.id, checked as boolean)} />
))}
) }