aigc/src/pages/User/Login/index.tsx
2025-05-08 23:34:55 +08:00

210 lines
5.3 KiB
TypeScript

import { Footer } from '@/components';
import {
LockOutlined,
UserOutlined,
} from '@ant-design/icons';
import {
LoginForm,
ProFormText,
} from '@ant-design/pro-components';
import { Helmet, history, Link, useModel } from '@umijs/max';
import { message, Tabs } from 'antd';
import { createStyles } from 'antd-style';
import React, { useState,useEffect } from 'react';
import { flushSync } from 'react-dom';
import Settings from '../../../../config/defaultSettings';
import { listChartByPageUsingPost } from '@/services/hebi/chartController';
import { getLoginUserUsingGet, userLoginUsingPost } from '@/services/hebi/userController';
const useStyles = createStyles(({ token }) => {
return {
action: {
marginLeft: '8px',
color: 'rgba(0, 0, 0, 0.2)',
fontSize: '24px',
verticalAlign: 'middle',
cursor: 'pointer',
transition: 'color 0.3s',
'&:hover': {
color: token.colorPrimaryActive,
},
},
lang: {
width: 42,
height: 42,
lineHeight: '42px',
position: 'fixed',
right: 16,
borderRadius: token.borderRadius,
':hover': {
backgroundColor: token.colorBgTextHover,
},
},
container: {
display: 'flex',
flexDirection: 'column',
height: '100vh',
overflow: 'auto',
backgroundImage:
"url('https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/V-_oS6r-i7wAAAAAAAAAAAAAFl94AQBr')",
backgroundSize: '100% 100%',
},
};
});
const Login: React.FC = () => {
const [type, setType] = useState<string>('account');
const { setInitialState } = useModel('@@initialState');
const { styles } = useStyles();
//获取用户的登录信息
const fetchUserInfo = async () => {
const userInfo = await getLoginUserUsingGet();
if (userInfo) {
flushSync(() => {
setInitialState((s) => ({
...s,
currentUser: userInfo,
}));
});
}
};
//测试
useEffect(()=>{
listChartByPageUsingPost({}).then(res=>{
console.error('res:',res)
})
})
const handleSubmit = async (values: API.UserLoginRequest) => {
try {
// 登录
const res = await userLoginUsingPost(values);
if (res.code === 0) {
const defaultLoginSuccessMessage = '登录成功!';
message.success(defaultLoginSuccessMessage);
await fetchUserInfo();
// 登录成功后,设置刷新标记并刷新页面
const urlParams = new URL(window.location.href).searchParams;
history.push(urlParams.get('redirect') || '/');
sessionStorage.setItem('avatar_refreshed', '1');
setTimeout(() => {
window.location.reload();
}, 1000);
return;
} else {
message.error(res.message);
}
} catch (error) {
const defaultLoginFailureMessage = '登录失败,请重试!';
console.log(error);
message.error(defaultLoginFailureMessage);
}
// 登录失败不需要刷新
};
return (
//登录页面
<div className={styles.container}>
<Helmet>
<title>
{'登录'}- {Settings.title}
</title>
</Helmet>
<div
style={{
flex: '1',
padding: '32px 0',
}}
>
<LoginForm
contentStyle={{
minWidth: 280,
maxWidth: '75vw',
}}
logo={<img alt="logo" src="/logo.svg" />}
title="基于AIGC的智能数据分析系统"
subTitle={'本系统助力于让数据分析变得简单高效'}
onFinish={async (values) => {
await handleSubmit(values as API.UserLoginRequest);
}}
>
<Tabs
activeKey={type}
onChange={setType}
centered
items={[
{
key: 'account',
label: '登录',
},
]}
/>
{type === 'account' && (
<>
<ProFormText
name="userAccount"
fieldProps={{
size: 'large',
prefix: <UserOutlined />,
}}
placeholder={'请输入用户名'}
rules={[
{
required: true,
message: '用户名是必填项!',
},
]}
/>
<ProFormText.Password
name="userPassword"
fieldProps={{
size: 'large',
prefix: <LockOutlined />,
}}
placeholder={'请输入密码'}
rules={[
{
required: true,
message: '密码是必填项!',
},
]}
/>
</>
)}
<div
style={{
marginBottom: 12,
display: 'flex',
// 元素靠右排列
justifyContent: 'flex-end',
// 设置元素之间的间距
gap: 16,
}}
>
<Link
to="/user/register"
>
</Link>
</div>
</LoginForm>
</div>
<Footer />
</div>
);
};
export default Login;