'use client' import { useState, useEffect } from 'react' import { Card, Button, Table, Badge, Modal, Input, Select } from '@/components/ui' import { Plus, Pencil, Trash2 } from 'lucide-react' interface User { id: number username: string display_name: string email: string | null role: string is_active: number created_at: string } export default function UsersPage() { const [users, setUsers] = useState([]) const [loading, setLoading] = useState(true) const [modalOpen, setModalOpen] = useState(false) const [editUser, setEditUser] = useState(null) const [form, setForm] = useState({ username: '', password: '', display_name: '', email: '', role: 'viewer' }) const [error, setError] = useState('') const fetchUsers = () => { fetch('/api/users').then(r => r.json()).then(d => { if (d.users) setUsers(d.users) }).catch(() => {}).finally(() => setLoading(false)) } useEffect(() => { fetchUsers() }, []) const openCreate = () => { setEditUser(null) setForm({ username: '', password: '', display_name: '', email: '', role: 'viewer' }) setError('') setModalOpen(true) } const openEdit = (u: User) => { setEditUser(u) setForm({ username: u.username, password: '', display_name: u.display_name, email: u.email || '', role: u.role }) setError('') setModalOpen(true) } const handleSave = async () => { setError('') try { if (editUser) { const body: Record = { display_name: form.display_name, email: form.email, role: form.role } if (form.password) body.password = form.password const res = await fetch(`/api/users/${editUser.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }) if (!res.ok) { const d = await res.json(); setError(d.error || '更新失败'); return } } else { if (!form.username || !form.password || !form.display_name) { setError('请填写必填项'); return } const res = await fetch('/api/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(form) }) if (!res.ok) { const d = await res.json(); setError(d.error || '创建失败'); return } } setModalOpen(false) fetchUsers() } catch { setError('操作失败') } } const handleDelete = async (id: number) => { if (!confirm('确定删除此用户?')) return const res = await fetch(`/api/users/${id}`, { method: 'DELETE' }) if (res.ok) fetchUsers() } const handleToggleActive = async (u: User) => { await fetch(`/api/users/${u.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ is_active: u.is_active ? 0 : 1 }) }) fetchUsers() } const roleLabel: Record = { admin: '管理员', operator: '运维人员', viewer: '查看者' } return (

用户管理

系统用户与账号管理

{loading ? (
加载中...
) : ( {users.map(u => ( ))}
{u.username} {u.display_name} {u.email || '-'} {roleLabel[u.role] || u.role} {u.created_at || '-'}
)} setModalOpen(false)} title={editUser ? '编辑用户' : '新建用户'}>
{!editUser && setForm(p => ({ ...p, username: e.target.value }))} required />} setForm(p => ({ ...p, display_name: e.target.value }))} required /> setForm(p => ({ ...p, password: e.target.value }))} /> setForm(p => ({ ...p, email: e.target.value }))} />