'use client'; import { useEffect, useState } from 'react'; import { API_BASE } from '@/lib/config'; interface User { id: number; phone: string; nickname: string; email: string; status: string; memberPlan: string; createdAt: string; } export default function UsersPage() { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [search, setSearch] = useState(''); const [showForm, setShowForm] = useState(false); const [form, setForm] = useState({ nickname: '', phone: '', email: '', password: '' }); const [editId, setEditId] = useState(null); useEffect(() => { loadUsers(); }, [search]); async function loadUsers() { setLoading(true); try { const token = localStorage.getItem('adminToken'); const params = search ? `?search=${encodeURIComponent(search)}` : ''; const res = await fetch(`${API_BASE}/admin/users${params}`, { headers: { Authorization: `Bearer ${token}` }, }); if (res.ok) { const data = await res.json(); setUsers(data.items || []); } } catch {} setLoading(false); } async function createUser() { if (!form.phone || !form.password) return alert('手机号和密码必填'); const token = localStorage.getItem('adminToken'); await fetch(`${API_BASE}/admin/users`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify(form), }); setShowForm(false); setForm({ nickname: '', phone: '', email: '', password: '' }); loadUsers(); } async function updateUser() { if (!editId) return; const token = localStorage.getItem('adminToken'); await fetch(`${API_BASE}/admin/users/${editId}`, { method: 'PUT', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ nickname: form.nickname, email: form.email }), }); setEditId(null); setShowForm(false); setForm({ nickname: '', phone: '', email: '', password: '' }); loadUsers(); } async function deleteUser(id: number) { if (!confirm('确定删除该用户?')) return; const token = localStorage.getItem('adminToken'); await fetch(`${API_BASE}/admin/users/${id}`, { method: 'DELETE', headers: { Authorization: `Bearer ${token}` }, }); loadUsers(); } async function toggleStatus(id: number, currentStatus: string) { const token = localStorage.getItem('adminToken'); const newStatus = currentStatus === 'ACTIVE' ? 'BANNED' : 'ACTIVE'; await fetch(`${API_BASE}/admin/users/${id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ status: newStatus }), }); loadUsers(); } function openEdit(user: User) { setEditId(user.id); setForm({ nickname: user.nickname || '', phone: user.phone || '', email: user.email || '', password: '' }); setShowForm(true); } if (loading) return
加载中...
; return (

用户管理

管理平台用户

setSearch(e.target.value)} placeholder="搜索用户名或手机号..." className="px-4 py-2 border border-border rounded-lg bg-background text-foreground w-64" />
{showForm && (
setForm({...form, phone: e.target.value})} disabled={!!editId} className="w-full px-3 py-2 border border-border rounded-lg bg-background text-foreground disabled:opacity-50" />
setForm({...form, nickname: e.target.value})} className="w-full px-3 py-2 border border-border rounded-lg bg-background text-foreground" />
setForm({...form, email: e.target.value})} className="w-full px-3 py-2 border border-border rounded-lg bg-background text-foreground" />
{!editId && (
setForm({...form, password: e.target.value})} className="w-full px-3 py-2 border border-border rounded-lg bg-background text-foreground" />
)}
)}
{users.map(user => ( ))}
ID 手机号 昵称 邮箱 状态 会员 注册时间 操作
{user.id} {user.phone || '-'} {user.nickname || '-'} {user.email || '-'} {user.status === 'ACTIVE' ? '正常' : '禁用'} {user.memberPlan || 'FREE'} {user.createdAt?.slice(0, 10)}
); }