import React, { useState, useMemo, useEffect } from 'react'; import { adminAPI } from '@/api'; import { mockUsers, mockMembershipPlans } from '@/mock/data'; import type { User, RegisterSettings } from '@/types'; import './Users.css'; // ===== SVG Icons ===== const IconSearch = () => ( ); const IconEye = () => ( ); const IconCheck = () => ( ); const IconX = () => ( ); const IconShield = () => ( ); const IconPhone = () => ( ); const IconMail = () => ( ); const IconServer = () => ( ); const IconClose = () => ( ); // ===== Helpers ===== const realNameStatusMap: Record = { verified: { label: '已实名', color: 'var(--color-success)', bg: 'var(--color-success-light)' }, pending: { label: '审核中', color: 'var(--color-warning)', bg: 'var(--color-warning-light)' }, unverified: { label: '未实名', color: 'var(--color-text-tertiary)', bg: 'var(--color-bg-tertiary)' }, }; const statusMap: Record = { active: { label: '正常', color: 'var(--color-success)', bg: 'var(--color-success-light)' }, banned: { label: '已封禁', color: 'var(--color-error)', bg: 'var(--color-error-light)' }, }; // ===== User Detail Modal ===== interface UserDetailModalProps { user: User; onClose: () => void; } const UserDetailModal: React.FC = ({ user, onClose }) => { const plan = mockMembershipPlans.find(p => p.id === user.membership?.planId); const rn = realNameStatusMap[user.realNameStatus || 'unverified']; return (
e.stopPropagation()}>

用户详情

{user.username.charAt(0).toUpperCase()}

{user.username}

{rn.label} {statusMap[user.status].label} {user.role === 'admin' ? '管理员' : '普通用户'}
用户ID {user.id}
邮箱 {user.email}
手机号 {user.phone || '未绑定'}
实名姓名 {user.realName || '--'}
实名状态 {rn.label}
会员等级 {user.membership?.planName || '免费版'}
会员到期 {user.membership?.expireAt ? new Date(user.membership.expireAt).toLocaleDateString('zh-CN') : '--'}
注册时间 {new Date(user.createdAt).toLocaleString('zh-CN')}
); }; // ===== Main Component ===== const UsersPage: React.FC = () => { const [searchQuery, setSearchQuery] = useState(''); const [statusFilter, setStatusFilter] = useState('all'); const [levelFilter, setLevelFilter] = useState('all'); const [realNameFilter, setRealNameFilter] = useState('all'); const [selectedUser, setSelectedUser] = useState(null); const [localUsers, setLocalUsers] = useState(mockUsers); // Register settings state const [registerSettings, setRegisterSettings] = useState({ phoneRequired: true, phoneSmsRequired: true, emailRequired: true, emailVerifyRequired: true, realNameRequired: false, aliyunAccessKey: '', aliyunSecretKey: '', aliyunEndpoint: 'https://cloudauth.aliyuncs.com', }); const [settingsSaving, setSettingsSaving] = useState(false); const [settingsMsg, setSettingsMsg] = useState<{ type: string; text: string } | null>(null); // 加载注册设置 useEffect(() => { loadRegisterSettings(); }, []); const loadRegisterSettings = async () => { try { const res = await adminAPI.getRegisterSettings(); const data = res?.data || res; if (data && typeof data === 'object') { setRegisterSettings({ phoneRequired: data.phone_required !== undefined ? data.phone_required : true, phoneSmsRequired: data.phone_sms_required !== undefined ? data.phone_sms_required : true, emailRequired: data.email_required !== undefined ? data.email_required : true, emailVerifyRequired: data.email_verify_required !== undefined ? data.email_verify_required : true, realNameRequired: data.real_name_required || false, aliyunAccessKey: data.aliyun_access_key || '', aliyunSecretKey: data.aliyun_secret_key || '', aliyunEndpoint: data.aliyun_endpoint || 'https://dysmsapi.aliyuncs.com', smsSignName: data.sms_sign_name || '', smsTemplateCode: data.sms_template_code || '', }); } } catch (e) { console.error('加载注册设置失败', e); } }; const filteredUsers = useMemo(() => { let result = localUsers.filter(u => u.role === 'user'); if (searchQuery.trim()) { const q = searchQuery.toLowerCase(); result = result.filter(u => u.username.toLowerCase().includes(q) || u.email.toLowerCase().includes(q) || (u.phone && u.phone.includes(q)) || (u.realName && u.realName.includes(q)) ); } if (statusFilter !== 'all') result = result.filter(u => u.status === statusFilter); if (levelFilter !== 'all') result = result.filter(u => (u.membership?.level ?? 0).toString() === levelFilter); if (realNameFilter !== 'all') result = result.filter(u => u.realNameStatus === realNameFilter); return result; }, [localUsers, searchQuery, statusFilter, levelFilter, realNameFilter]); const handleToggleSetting = (key: keyof RegisterSettings) => { setRegisterSettings(prev => ({ ...prev, [key]: !prev[key as keyof RegisterSettings], })); }; const handleSettingChange = (key: keyof RegisterSettings, value: string) => { setRegisterSettings(prev => ({ ...prev, [key]: value })); }; const handleSaveRegisterSettings = async () => { setSettingsSaving(true); setSettingsMsg(null); try { await adminAPI.updateRegisterSettings({ phone_required: registerSettings.phoneRequired, phone_sms_required: registerSettings.phoneSmsRequired, email_required: registerSettings.emailRequired, email_verify_required: registerSettings.emailVerifyRequired, real_name_required: registerSettings.realNameRequired, aliyun_access_key: registerSettings.aliyunAccessKey, aliyun_secret_key: registerSettings.aliyunSecretKey, aliyun_endpoint: registerSettings.aliyunEndpoint, sms_sign_name: registerSettings.smsSignName, sms_template_code: registerSettings.smsTemplateCode, }); setSettingsMsg({ type: 'success', text: '注册设置已保存' }); setTimeout(() => setSettingsMsg(null), 3000); } catch (e: any) { setSettingsMsg({ type: 'error', text: e?.message || e?.detail || '保存失败' }); } finally { setSettingsSaving(false); } }; const handleToggleUserStatus = (userId: string) => { setLocalUsers(prev => prev.map(u => u.id === userId ? { ...u, status: u.status === 'active' ? 'banned' as const : 'active' as const, } : u) ); }; return (

用户管理

{/* ===== 用户列表 ===== */}

用户列表

共 {filteredUsers.length} 个用户
{/* 搜索和筛选 */}
setSearchQuery(e.target.value)} />
{/* 用户表格 */}
{filteredUsers.map(u => { const rn = realNameStatusMap[u.realNameStatus || 'unverified']; const st = statusMap[u.status || 'active']; return ( ); })}
用户名 邮箱 手机号 实名状态 会员等级 注册时间 状态 操作
{u.username.charAt(0).toUpperCase()}
{u.username}
{u.email} {u.phone || '--'} {rn.label} {u.membership?.planName || '免费版'} {new Date(u.createdAt).toLocaleDateString('zh-CN')} {st.label}
{filteredUsers.length === 0 && (
无匹配的用户记录
)}
{/* ===== 注册用户设置 ===== */}

注册用户设置

配置用户注册方式与认证策略
{/* 手机号注册 */}

手机号注册

手机号必填 要求用户注册时填写手机号码
短信验证码激活 注册时发送短信验证码验证手机号
{/* 邮箱注册 */}

邮箱注册

邮箱必填 要求用户注册时填写邮箱地址
邮箱认证激活 发送验证邮件到用户邮箱完成激活
{/* 实名认证 */}

实名认证

强制实名认证 要求用户完成实名认证后方可使用全部功能
阿里云短信API配置(用于实名认证短信验证)
handleSettingChange('aliyunAccessKey', e.target.value)} />
handleSettingChange('aliyunSecretKey', e.target.value)} />
handleSettingChange('smsSignName', e.target.value)} />
handleSettingChange('smsTemplateCode', e.target.value)} />
{settingsMsg && (
{settingsMsg.text}
)}
{/* User Detail Modal */} {selectedUser && ( setSelectedUser(null)} /> )}
); }; export default UsersPage;