From 5a5bc96c37cc0a68dc46e872dda977199e04081b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=87=E9=98=B3?= <3311118881@qq.com> Date: Sun, 4 Aug 2024 18:44:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=99=BB=E5=BD=95=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 67 ++++++++++++++++++----------- src/api/User.ts | 3 +- src/pages/Login/index.tsx | 90 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 26 deletions(-) create mode 100644 src/pages/Login/index.tsx diff --git a/src/App.tsx b/src/App.tsx index da9614c..433c4df 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -7,6 +7,8 @@ import ECommerce from './pages/Dashboard/ECommerce'; import Create from './pages/Create'; import Cate from './pages/Cate'; import DefaultLayout from './layout/DefaultLayout'; +import Login from './pages/Login'; + import { ConfigProvider } from 'antd'; function App() { @@ -21,6 +23,8 @@ function App() { setTimeout(() => setLoading(false), 1000); }, []); + const isLoginRoute = pathname === '/login'; + return loading ? ( ) : ( @@ -33,41 +37,54 @@ function App() { }, }} > - + {isLoginRoute ? ( - - - - } - /> - - - - - } - /> - - - - + } /> - - + ) : ( + + + + + + + } + /> + + + + + } + /> + + + + + + } + /> + + + )} + ); } diff --git a/src/api/User.ts b/src/api/User.ts index 74701ff..6814fed 100644 --- a/src/api/User.ts +++ b/src/api/User.ts @@ -1,7 +1,8 @@ +import { account, editUser, Login, UserInfo } from '@/types/user' import Request from '@/utils/request' // 登录 -export const loginDataAPI = (data: Login) => Request("POST", "/login", data) +export const loginDataAPI = (data: Login) => Request("POST", "/user/login", data) // 获取用户信息 export const getUserDataAPI = (id?: number) => Request("GET", `/user/${id}`) diff --git a/src/pages/Login/index.tsx b/src/pages/Login/index.tsx new file mode 100644 index 0000000..c08fca2 --- /dev/null +++ b/src/pages/Login/index.tsx @@ -0,0 +1,90 @@ +import React, { useState } from 'react'; +import { useNavigate, useLocation } from 'react-router-dom'; +import { useForm } from 'antd/es/form/Form'; +import { Button, Form, Input, notification } from 'antd'; +import { UserOutlined, LockOutlined, EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'; +import { loginDataAPI } from '@/api/User'; +import { useUserStore } from '@/stores'; + +const LoginForm: React.FC = () => { + const [form] = useForm(); + const [isPassVisible, setIsPassVisible] = useState(false); + const store = useUserStore(); + const navigate = useNavigate(); + const location = useLocation(); + const returnUrl = new URLSearchParams(location.search).get('returnUrl') || '/home'; + + const onSubmit = async () => { + try { + const values = await form.validateFields(); + const { data } = await loginDataAPI(values); + store.token = data.token; + store.user = data.user; + + notification.success({ + message: 'success', + description: `Hello ${data.user.name} 欢迎回来 🎉`, + }); + + navigate(returnUrl); + } catch (error) { + console.error('Failed to login:', error); + } + }; + + return ( +
+
+
+

Thrive

+

现代化博客管理系统

+
+ +
+ + } placeholder="请输入用户名" /> + + + + } + type={isPassVisible ? 'text' : 'password'} + placeholder="请输入密码" + iconRender={visible => + visible ? ( + setIsPassVisible(!isPassVisible)} /> + ) : ( + setIsPassVisible(!isPassVisible)} /> + ) + } + /> + + + + + +
+
+
+ ); +}; + +export default LoginForm;