| 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, | 
|   LoginFormPage, | 
|   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 Settings from '../../../../config/defaultSettings'; | 
| 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' | 
|   | 
| 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: '登录页', | 
|           })} | 
|           - {Settings.title} | 
|         </title> | 
|       </Helmet> | 
|       <Lang /> | 
|       <div style={{ flex: '1', padding: '32px 0', }} > | 
|         <LoginFormPage | 
|           // backgroundVideoUrl="https://gw.alipayobjects.com/v/huamei_gcee1x/afts/video/jXRBRK_VAwoAAAAAAAAAAAAAK4eUAQBr" | 
|           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> | 
|         </LoginFormPage> | 
|       </div> | 
|       <Footer /> | 
|     </div> | 
|   ); | 
| }; | 
|   | 
| export default Login; |