import { useState, useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { Form, Input, Button, Card, Tabs, Checkbox } from 'antd' import { UserOutlined, LockOutlined, MailOutlined } from '@ant-design/icons' import { login, register } from '@/api/auth' import { getUserMenus } from '@/api/menu' import useUserStore from '@/stores/userStore' import Toast from '@/components/Toast/Toast' import './Login.css' function Login() { const [loading, setLoading] = useState(false) const [activeTab, setActiveTab] = useState('login') const [rememberMe, setRememberMe] = useState(false) const [loginForm] = Form.useForm() const navigate = useNavigate() const { setUser, setToken } = useUserStore() // 组件加载时检查是否有保存的用户名 useEffect(() => { const savedUsername = localStorage.getItem('remembered_username') if (savedUsername) { loginForm.setFieldsValue({ username: savedUsername }) setRememberMe(true) } }, []) const handleLogin = async (values) => { setLoading(true) try { const res = await login(values) Toast.success('登录成功') // 处理"记住用户" if (rememberMe) { localStorage.setItem('remembered_username', values.username) } else { localStorage.removeItem('remembered_username') } // 保存 token 和用户信息 localStorage.setItem('access_token', res.data.access_token) localStorage.setItem('user_info', JSON.stringify(res.data.user)) setToken(res.data.access_token) setUser(res.data.user) // 获取用户菜单并跳转到第一个菜单 try { const menuRes = await getUserMenus() if (menuRes.data && menuRes.data.length > 0) { const firstMenu = menuRes.data[0] // 如果第一个菜单有子菜单,跳转到第一个子菜单 if (firstMenu.children && firstMenu.children.length > 0) { navigate(firstMenu.children[0].path) } else if (firstMenu.path) { navigate(firstMenu.path) } else { // 如果都没有路径,默认跳转到项目列表 navigate('/projects') } } else { // 如果没有菜单,默认跳转到项目列表 navigate('/projects') } } catch (menuError) { console.error('Load menus error:', menuError) // 如果加载菜单失败,默认跳转到项目列表 navigate('/projects') } } catch (error) { console.error('Login error:', error) const errorMsg = error.response?.data?.detail || error.message || '登录失败,请检查用户名和密码' Toast.error('登录失败', errorMsg) } finally { setLoading(false) } } const handleRegister = async (values) => { setLoading(true) try { await register(values) Toast.success('注册成功', '请使用您的账号登录') setActiveTab('login') } catch (error) { console.error('Register error:', error) const errorMsg = error.response?.data?.detail || error.message || '注册失败' Toast.error('注册失败', errorMsg) } finally { setLoading(false) } } return (

NEX Docus

团队协作文档管理平台

} placeholder="用户名" /> } placeholder="密码" /> setRememberMe(e.target.checked)} > 记住用户
} placeholder="用户名" /> } placeholder="邮箱(选填)" /> } placeholder="密码" /> ({ validator(_, value) { if (!value || getFieldValue('password') === value) { return Promise.resolve() } return Promise.reject(new Error('两次输入的密码不一致')) }, }), ]} > } placeholder="确认密码" />

重置密码请联系管理员

) } export default Login