| import { Footer } from '@/components'; | 
| import { login } from '@/services/ant-design-pro/api'; | 
| import { getFakeCaptcha } from '@/services/ant-design-pro/login'; | 
| import { | 
|     LockOutlined, | 
|     MobileOutlined, | 
|     UserOutlined, | 
| } from '@ant-design/icons'; | 
| import { | 
|     LoginForm, | 
|     ProFormCaptcha, | 
|     ProFormCheckbox, | 
|     ProFormText, | 
| } from '@ant-design/pro-components'; | 
| import { FormattedMessage, history, SelectLang, useIntl, useModel, Helmet } from '@umijs/max'; | 
| import { Alert, message, Tabs } from 'antd'; | 
| import React, { useState } from 'react'; | 
| import { flushSync } from 'react-dom'; | 
| import { createStyles } from 'antd-style'; | 
| import { request } from '@umijs/max'; | 
| import { setToken } from '@/utils/token-util' | 
| import { PROJECT_NAME } from '@/config/setting' | 
|   | 
| 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 Lang = () => { | 
|     const { styles } = useStyles(); | 
|   | 
|     return ( | 
|         <div className={styles.lang} data-lang> | 
|             {SelectLang && <SelectLang />} | 
|         </div> | 
|     ); | 
| }; | 
|   | 
| const LoginMessage = ({ content }) => { | 
|     return ( | 
|         <Alert | 
|             style={{ | 
|                 marginBottom: 24, | 
|             }} | 
|             message={content} | 
|             type="error" | 
|             showIcon | 
|         /> | 
|     ); | 
| }; | 
|   | 
| const Login = () => { | 
|     const [userLoginState, setUserLoginState] = useState({}); | 
|     const [type, setType] = useState('account'); | 
|     const { initialState, setInitialState } = useModel('@@initialState'); | 
|     const { styles } = useStyles(); | 
|     const intl = useIntl(); | 
|   | 
|     console.log(initialState.memo); | 
|   | 
|     const fetchUserInfo = async () => { | 
|         const userInfo = await initialState?.fetchUserInfo?.(); | 
|         if (userInfo) { | 
|             flushSync(() => { | 
|                 setInitialState((s) => ({ | 
|                     ...s, | 
|                     currentUser: userInfo, | 
|                 })); | 
|             }); | 
|         } | 
|     }; | 
|   | 
|     const handleSubmit = async (values) => { | 
|         try { | 
|             const r = await request('/api/login', { | 
|                 method: 'POST', | 
|                 headers: { | 
|                     'Content-Type': 'application/json' | 
|                 }, | 
|                 data: values | 
|             }) | 
|   | 
|             if (r.code === 200) { | 
|                 message.success(intl.formatMessage({ | 
|                     id: 'pages.login.success', | 
|                     defaultMessage: '登录成功!', | 
|                 })); | 
|                 setToken(r.data.accessToken, values.autoLogin); | 
|                 await fetchUserInfo(); | 
|                 const urlParams = new URL(window.location.href).searchParams; | 
|                 history.push(urlParams.get('redirect') || '/'); | 
|                 return; | 
|             } | 
|             setUserLoginState({ | 
|                 status: r.code, | 
|                 type: type, | 
|             }) | 
|   | 
|             // 登录 | 
|             // const msg = await login({ ...values, type }); | 
|             // if (msg.status === 'ok') { | 
|             //   const defaultLoginSuccessMessage = intl.formatMessage({ | 
|             //     id: 'pages.login.success', | 
|             //     defaultMessage: '登录成功!', | 
|             //   }); | 
|             //   message.success(defaultLoginSuccessMessage); | 
|             //   await fetchUserInfo(); | 
|             //   const urlParams = new URL(window.location.href).searchParams; | 
|             //   history.push(urlParams.get('redirect') || '/'); | 
|             //   return; | 
|             // } | 
|             // // 如果失败去设置用户错误信息 | 
|             // setUserLoginState(msg); | 
|         } catch (error) { | 
|             console.log(error); | 
|             message.error(intl.formatMessage({ | 
|                 id: 'pages.login.failure', | 
|                 defaultMessage: '登录失败,请重试!', | 
|             })); | 
|         } | 
|     }; | 
|     const { status, type: loginType } = userLoginState; | 
|     return ( | 
|         <div className={styles.container}> | 
|             <Helmet> | 
|                 <title> | 
|                     {intl.formatMessage({ | 
|                         id: 'menu.login', | 
|                         defaultMessage: '登录页', | 
|                     })} | 
|                     - {PROJECT_NAME} | 
|                 </title> | 
|             </Helmet> | 
|             <Lang /> | 
|             <div style={{ flex: '1', padding: '32px 0', }} > | 
|                 <LoginForm | 
|                     contentStyle={{ | 
|                         minWidth: 280, | 
|                         maxWidth: '75vw', | 
|                     }} | 
|                     logo={<img alt="logo" src="/logo.svg" />} | 
|                     title="Ant Design" | 
|                     subTitle={intl.formatMessage({ id: 'pages.layouts.userLayout.title' })} | 
|                     initialValues={{ | 
|                         autoLogin: true, | 
|                     }} | 
|                     onFinish={async (values) => { | 
|                         await handleSubmit(values); | 
|                     }} | 
|                 > | 
|                     <Tabs | 
|                         activeKey={type} | 
|                         onChange={setType} | 
|                         centered | 
|                         items={[ | 
|                             { | 
|                                 key: 'account', | 
|                                 label: intl.formatMessage({ | 
|                                     id: 'pages.login.accountLogin.tab', | 
|                                     defaultMessage: '账户密码登录', | 
|                                 }), | 
|                             }, | 
|                             { | 
|                                 key: 'mobile', | 
|                                 label: intl.formatMessage({ | 
|                                     id: 'pages.login.phoneLogin.tab', | 
|                                     defaultMessage: '手机号登录', | 
|                                 }), | 
|                             }, | 
|                         ]} | 
|                     /> | 
|   | 
|                     {status !== 200 && loginType === 'account' && ( | 
|                         <LoginMessage | 
|                             content={intl.formatMessage({ | 
|                                 id: 'pages.login.accountLogin.errorMessage', | 
|                                 defaultMessage: '账户或密码错误', | 
|                             })} | 
|                         /> | 
|                     )} | 
|                     {type === 'account' && ( | 
|                         <> | 
|                             <ProFormText | 
|                                 name="username" | 
|                                 fieldProps={{ | 
|                                     size: 'large', | 
|                                     prefix: <UserOutlined />, | 
|                                 }} | 
|                                 placeholder={intl.formatMessage({ | 
|                                     id: 'pages.login.username.placeholder', | 
|                                     defaultMessage: '用户名:', | 
|                                 })} | 
|                                 rules={[ | 
|                                     { | 
|                                         required: true, | 
|                                         message: ( | 
|                                             <FormattedMessage | 
|                                                 id="pages.login.username.required" | 
|                                                 defaultMessage="请输入用户名!" | 
|                                             /> | 
|                                         ), | 
|                                     }, | 
|                                 ]} | 
|                             /> | 
|                             <ProFormText.Password | 
|                                 name="password" | 
|                                 fieldProps={{ | 
|                                     size: 'large', | 
|                                     prefix: <LockOutlined />, | 
|                                 }} | 
|                                 placeholder={intl.formatMessage({ | 
|                                     id: 'pages.login.password.placeholder', | 
|                                     defaultMessage: '密码:', | 
|                                 })} | 
|                                 rules={[ | 
|                                     { | 
|                                         required: true, | 
|                                         message: ( | 
|                                             <FormattedMessage | 
|                                                 id="pages.login.password.required" | 
|                                                 defaultMessage="请输入密码!" | 
|                                             /> | 
|                                         ), | 
|                                     }, | 
|                                 ]} | 
|                             /> | 
|                         </> | 
|                     )} | 
|   | 
|                     {status !== 200 && loginType === 'mobile' && <LoginMessage content="验证码错误" />} | 
|                     {type === 'mobile' && ( | 
|                         <> | 
|                             <ProFormText | 
|                                 fieldProps={{ | 
|                                     size: 'large', | 
|                                     prefix: <MobileOutlined />, | 
|                                 }} | 
|                                 name="mobile" | 
|                                 placeholder={intl.formatMessage({ | 
|                                     id: 'pages.login.phoneNumber.placeholder', | 
|                                     defaultMessage: '手机号', | 
|                                 })} | 
|                                 rules={[ | 
|                                     { | 
|                                         required: true, | 
|                                         message: ( | 
|                                             <FormattedMessage | 
|                                                 id="pages.login.phoneNumber.required" | 
|                                                 defaultMessage="请输入手机号!" | 
|                                             /> | 
|                                         ), | 
|                                     }, | 
|                                     { | 
|                                         pattern: /^1\d{10}$/, | 
|                                         message: ( | 
|                                             <FormattedMessage | 
|                                                 id="pages.login.phoneNumber.invalid" | 
|                                                 defaultMessage="手机号格式错误!" | 
|                                             /> | 
|                                         ), | 
|                                     }, | 
|                                 ]} | 
|                             /> | 
|                             <ProFormCaptcha | 
|                                 fieldProps={{ | 
|                                     size: 'large', | 
|                                     prefix: <LockOutlined />, | 
|                                 }} | 
|                                 captchaProps={{ | 
|                                     size: 'large', | 
|                                 }} | 
|                                 placeholder={intl.formatMessage({ | 
|                                     id: 'pages.login.captcha.placeholder', | 
|                                     defaultMessage: '请输入验证码', | 
|                                 })} | 
|                                 captchaTextRender={(timing, count) => { | 
|                                     if (timing) { | 
|                                         return `${count} ${intl.formatMessage({ | 
|                                             id: 'pages.getCaptchaSecondText', | 
|                                             defaultMessage: '获取验证码', | 
|                                         })}`; | 
|                                     } | 
|                                     return intl.formatMessage({ | 
|                                         id: 'pages.login.phoneLogin.getVerificationCode', | 
|                                         defaultMessage: '获取验证码', | 
|                                     }); | 
|                                 }} | 
|                                 name="captcha" | 
|                                 rules={[ | 
|                                     { | 
|                                         required: true, | 
|                                         message: ( | 
|                                             <FormattedMessage | 
|                                                 id="pages.login.captcha.required" | 
|                                                 defaultMessage="请输入验证码!" | 
|                                             /> | 
|                                         ), | 
|                                     }, | 
|                                 ]} | 
|                                 onGetCaptcha={async (phone) => { | 
|                                     const result = await getFakeCaptcha({ | 
|                                         phone, | 
|                                     }); | 
|                                     if (!result) { | 
|                                         return; | 
|                                     } | 
|                                     message.success('获取验证码成功!验证码为:1234'); | 
|                                 }} | 
|                             /> | 
|                         </> | 
|                     )} | 
|                     <div | 
|                         style={{ | 
|                             marginBottom: 24, | 
|                         }} | 
|                     > | 
|                         <ProFormCheckbox noStyle name="autoLogin"> | 
|                             <FormattedMessage id="pages.login.rememberMe" defaultMessage="自动登录" /> | 
|                         </ProFormCheckbox> | 
|                     </div> | 
|                 </LoginForm> | 
|             </div> | 
|             <Footer /> | 
|         </div> | 
|     ); | 
| }; | 
|   | 
| export default Login; |