import React, { useState, useEffect } from 'react'; import { Card, CardBody } from "@heroui/card"; import { Button } from "@heroui/button"; import { Modal, ModalContent, ModalHeader, ModalBody, ModalFooter, useDisclosure } from "@heroui/modal"; import { Input } from "@heroui/input"; import { toast } from 'react-hot-toast'; import { useNavigate } from 'react-router-dom'; import { isWebViewFunc } from '@/utils/panel'; import { siteConfig } from '@/config/site'; import { updatePassword } from '@/api'; import { safeLogout } from '@/utils/logout'; interface PasswordForm { newUsername: string; currentPassword: string; newPassword: string; confirmPassword: string; } interface MenuItem { path: string; label: string; icon: React.ReactNode; color: string; description: string; } export default function ProfilePage() { const navigate = useNavigate(); const { isOpen, onOpen, onOpenChange } = useDisclosure(); const [username, setUsername] = useState(''); const [isAdmin, setIsAdmin] = useState(false); const [passwordLoading, setPasswordLoading] = useState(false); const [passwordForm, setPasswordForm] = useState({ newUsername: '', currentPassword: '', newPassword: '', confirmPassword: '' }); useEffect(() => { // 获取用户信息 const name = localStorage.getItem('name') || 'Admin'; // 兼容处理:如果没有admin字段,根据role_id判断(0为管理员) let adminFlag = localStorage.getItem('admin') === 'true'; if (localStorage.getItem('admin') === null) { const roleId = parseInt(localStorage.getItem('role_id') || '1', 10); adminFlag = roleId === 0; // 补充设置admin字段,避免下次再次判断 localStorage.setItem('admin', adminFlag.toString()); } setUsername(name); setIsAdmin(adminFlag); }, []); // 管理员菜单项 const adminMenuItems: MenuItem[] = [ { path: '/limit', label: '限速管理', icon: ( ), color: 'bg-orange-100 dark:bg-orange-500/20 text-orange-600 dark:text-orange-400', description: '管理用户限速策略' }, { path: '/user', label: '用户管理', icon: ( ), color: 'bg-blue-100 dark:bg-blue-500/20 text-blue-600 dark:text-blue-400', description: '管理系统用户' }, { path: '/config', label: '网站配置', icon: ( ), color: 'bg-purple-100 dark:bg-purple-500/20 text-purple-600 dark:text-purple-400', description: '配置网站设置' } ]; // 退出登录 const handleLogout = () => { safeLogout(); navigate('/', { replace: true }); }; // 密码表单验证 const validatePasswordForm = (): boolean => { if (!passwordForm.newUsername.trim()) { toast.error('请输入新用户名'); return false; } if (passwordForm.newUsername.length < 3) { toast.error('用户名长度至少3位'); return false; } if (!passwordForm.currentPassword) { toast.error('请输入当前密码'); return false; } if (!passwordForm.newPassword) { toast.error('请输入新密码'); return false; } if (passwordForm.newPassword.length < 6) { toast.error('新密码长度不能少于6位'); return false; } if (passwordForm.newPassword !== passwordForm.confirmPassword) { toast.error('两次输入密码不一致'); return false; } return true; }; // 提交密码修改 const handlePasswordSubmit = async () => { if (!validatePasswordForm()) return; setPasswordLoading(true); try { const response = await updatePassword(passwordForm); if (response.code === 0) { toast.success('密码修改成功,请重新登录'); onOpenChange(); handleLogout(); } else { toast.error(response.msg || '密码修改失败'); } } catch (error) { toast.error('修改密码时发生错误'); console.error('修改密码错误:', error); } finally { setPasswordLoading(false); } }; // 重置密码表单 const resetPasswordForm = () => { setPasswordForm({ newUsername: '', currentPassword: '', newPassword: '', confirmPassword: '' }); }; return (
{/* 用户信息卡片 */}

{username}

{isAdmin ? '管理员' : '普通用户'} {new Date().toLocaleDateString('zh-CN')}
{/* 功能网格 */}
{/* 管理员功能 */} {isAdmin && adminMenuItems.map((item) => ( ))} {/* 修改密码 */} {/* 退出登录 */}

Powered by{' '} flux-panel

v{ isWebViewFunc() ? siteConfig.app_version : siteConfig.version}

{/* 修改密码弹窗 */} { onOpenChange(); resetPasswordForm(); }} size="2xl" scrollBehavior="outside" backdrop="blur" placement="center" > {(onClose: () => void) => ( <> 修改密码
) => setPasswordForm(prev => ({ ...prev, newUsername: e.target.value }))} variant="bordered" /> ) => setPasswordForm(prev => ({ ...prev, currentPassword: e.target.value }))} variant="bordered" /> ) => setPasswordForm(prev => ({ ...prev, newPassword: e.target.value }))} variant="bordered" /> ) => setPasswordForm(prev => ({ ...prev, confirmPassword: e.target.value }))} variant="bordered" />
)}
); }