|
@@ -1,24 +1,47 @@
|
|
|
import React from 'react';
|
|
|
-import { Row, Col, Form, Input, Button, Card } from 'antd';
|
|
|
+import { Row, Col, Form, Input, Button, Card, message } from 'antd';
|
|
|
+import { useDispatch } from 'react-redux';
|
|
|
+import { login as loginApi } from '../../API/security/userActions';
|
|
|
+import { setUserInfo, type UserInfoState } from '../../states/user_info'; // 同时导入 setUserInfo 和类型 UserInfoState
|
|
|
|
|
|
const Login: React.FC = () => {
|
|
|
const [form] = Form.useForm();
|
|
|
+ const dispatch = useDispatch();
|
|
|
|
|
|
- // type LoginFormValues = {
|
|
|
- // username: string;
|
|
|
- // password: string;
|
|
|
- // };
|
|
|
+ // 2. 登录请求函数
|
|
|
+ const loginRequest = async (values: {
|
|
|
+ username: string;
|
|
|
+ password: string;
|
|
|
+ }) => {
|
|
|
+ const res = await loginApi(values.username, values.password);
|
|
|
+ return res.data;
|
|
|
+ };
|
|
|
|
|
|
- interface LoginResponse {
|
|
|
- token: string;
|
|
|
- expire: string;
|
|
|
- uid: string;
|
|
|
- name: string;
|
|
|
- avatar: string;
|
|
|
- }
|
|
|
- const handleFinish = (values: LoginResponse) => {
|
|
|
- // TODO: 登录逻辑
|
|
|
- console.log('Login:', values);
|
|
|
+ // 3. handleFinish 处理流程
|
|
|
+ const handleFinish = async (values: {
|
|
|
+ username: string;
|
|
|
+ password: string;
|
|
|
+ }) => {
|
|
|
+ try {
|
|
|
+ const result = await loginRequest(values);
|
|
|
+ if (result.code === '0x000000') {
|
|
|
+ // 4. 转换为 UserInfoState 类型
|
|
|
+ const userInfo: UserInfoState = {
|
|
|
+ token: result.data.token,
|
|
|
+ expire: result.data.expire,
|
|
|
+ uid: result.data.uid,
|
|
|
+ name: result.data.name,
|
|
|
+ avatar: result.data.avatar,
|
|
|
+ };
|
|
|
+ // 5. 分发 redux action
|
|
|
+ dispatch(setUserInfo(userInfo));
|
|
|
+ message.success('登录成功'); //todo 更详细的提示与异步过程
|
|
|
+ } else {
|
|
|
+ message.error(result.description || '登录失败');
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ message.error(`网络错误: ${e instanceof Error ? e.message : '未知错误'}`);
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
return (
|