| import { | 
|     LockOutlined, | 
|     MobileOutlined, | 
|     UserOutlined, | 
| } from '@ant-design/icons'; | 
| import { | 
|     LoginFormPage, | 
|     ProConfigProvider, | 
|     ProFormCaptcha, | 
|     ProFormCheckbox, | 
|     ProFormText, | 
|     ProFormSelect | 
| } from '@ant-design/pro-components'; | 
| import { Button, Divider, Alert, Tabs, message, theme, Form } from 'antd'; | 
| import { useState, useEffect } from 'react'; | 
| import { FormattedMessage, history, SelectLang, useIntl, useModel, request } from '@umijs/max'; | 
| import { flushSync } from 'react-dom'; | 
| import { createStyles } from 'antd-style'; | 
| import { setToken } from '@/utils/token-util' | 
| import { PROJECT_NAME } from '@/config/setting' | 
| import Http from '@/utils/http'; | 
|   | 
| import logo from '/public/img/logo.png' | 
| import logoBg from '/public/login-bg.mp4' | 
|   | 
| const useStyles = createStyles(({ token }) => { | 
|     return { | 
|         lang: { | 
|   | 
|         } | 
|     } | 
| }) | 
|   | 
| const LoginMessage = ({ content }) => { | 
|     return ( | 
|         <Alert | 
|             style={{ | 
|                 marginBottom: 24, | 
|             }} | 
|             message={content} | 
|             type="error" | 
|             showIcon | 
|         /> | 
|     ); | 
| }; | 
|   | 
| const Lang = () => { | 
|     const { styles } = useStyles(); | 
|     return ( | 
|         <div className={styles.lang} data-lang> | 
|             {SelectLang && <SelectLang />} | 
|         </div> | 
|     ); | 
| }; | 
|   | 
| const Page = () => { | 
|     const intl = useIntl(); | 
|     const { initialState, setInitialState } = useModel('@@initialState'); | 
|     const { token } = theme.useToken(); | 
|   | 
|     const [form] = Form.useForm(); | 
|     const [loginType, setLoginType] = useState('account'); | 
|     const [status, setStatus] = useState(200); | 
|     const [errDesc, setErrDesc] = useState(''); | 
|     const [rememberMe, setRememberMe] = useState(() => { | 
|         const storedValue = localStorage.getItem('rememberMe'); | 
|         return storedValue !== null ? JSON.parse(storedValue) : true; | 
|     }); | 
|     const [rememberData, setRememberData] = useState(() => { | 
|         const storedValue = localStorage.getItem('rememberData'); | 
|         return storedValue !== null ? JSON.parse(storedValue) : true; | 
|     }); | 
|     const [hostList, setHostList] = useState([]); | 
|   | 
|     useEffect(() => { | 
|         form.setFieldsValue({ | 
|             autoLogin: rememberMe | 
|         }); | 
|         localStorage.setItem('rememberMe', JSON.stringify(rememberMe)); | 
|     }, [rememberMe]) | 
|   | 
|     useEffect(() => { | 
|         form.setFieldsValue({ | 
|             username: rememberData.username, | 
|             password: rememberData.password | 
|         }); | 
|         localStorage.setItem('rememberData', JSON.stringify(rememberData)); | 
|     }, [rememberData]) | 
|   | 
|     useEffect(() => { | 
|         const fetchHostList = async () => { | 
|             const resp = await Http.doGet('api/auth/host'); | 
|             const list = resp.data.map(item => ({ | 
|                 label: item.name, | 
|                 value: item.id | 
|             })); | 
|             setHostList(list); | 
|             if (list && list.length > 0) { | 
|                 form.setFieldsValue({ | 
|                     hostId: list[0].value | 
|                 }); | 
|             } | 
|         } | 
|         fetchHostList(); | 
|     }, []); | 
|   | 
|     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) { | 
|                 localStorage.removeItem("rememberData"); | 
|                 if (rememberMe) { | 
|                     setRememberData({ | 
|                         username: values.username, | 
|                         password: values.password | 
|                     }) | 
|                 } | 
|                 message.success(intl.formatMessage({ | 
|                     id: '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; | 
|             } | 
|             setStatus(r.code); | 
|             setErrDesc(r.msg); | 
|         } catch (error) { | 
|             console.log(error); | 
|             message.error(intl.formatMessage({ | 
|                 id: 'login.failure', | 
|                 defaultMessage: '登录失败,请重试!', | 
|             })); | 
|         } | 
|     } | 
|   | 
|     return ( | 
|         <div | 
|             style={{ | 
|                 backgroundColor: 'white', | 
|                 height: '100vh', | 
|             }} | 
|         > | 
|             <LoginFormPage | 
|                 form={form} | 
|                 logo={logo} | 
|                 backgroundVideoUrl={logoBg} | 
|                 // title="陆晓涛" | 
|                 // subTitle="陆晓涛..." | 
|                 containerStyle={{ | 
|                     backgroundColor: 'rgba(0, 0, 0,0.65)', | 
|                     backdropFilter: 'blur(4px)', | 
|                 }} | 
|                 onFinish={async (values) => { | 
|                     await handleSubmit(values); | 
|                 }} | 
|                 initialValue={{ | 
|                 }} | 
|             > | 
|                 <Tabs | 
|                     centered | 
|                     activeKey={loginType} | 
|                     onChange={(activeKey) => setLoginType(activeKey)} | 
|                 > | 
|                     <Tabs.TabPane key={'account'} tab={intl.formatMessage({ | 
|                         id: 'login.accountLogin.tab', | 
|                         defaultMessage: '账户密码登录', | 
|                     })} /> | 
|                     <Tabs.TabPane key={'phone'} tab={intl.formatMessage({ | 
|                         id: 'login.phoneLogin.tab', | 
|                         defaultMessage: '手机号登录', | 
|                     })} /> | 
|                 </Tabs> | 
|                 {loginType === 'account' && ( | 
|                     <> | 
|                         <ProFormSelect | 
|                             className="centered-select" | 
|                             name="hostId" | 
|                             placeholder={intl.formatMessage({ | 
|                                 id: 'login.host', | 
|                                 defaultMessage: '机构:', | 
|                             })} | 
|                             rules={[ | 
|                                 { | 
|                                     required: true, | 
|                                     message: intl.formatMessage({ | 
|                                         id: 'login.rule.host', | 
|                                         defaultMessage: '请选择机构!', | 
|                                     }), | 
|                                 }, | 
|                             ]} | 
|                             options={hostList} | 
|                         /> | 
|                         <ProFormText | 
|                             name="username" | 
|                             fieldProps={{ | 
|                                 size: 'large', | 
|                                 prefix: ( | 
|                                     <UserOutlined | 
|                                         style={{ | 
|                                             color: token.colorText, | 
|                                         }} | 
|                                         className={'prefixIcon'} | 
|                                     /> | 
|                                 ), | 
|                             }} | 
|                             placeholder={intl.formatMessage({ | 
|                                 id: 'login.username', | 
|                                 defaultMessage: '用户名: ', | 
|                             })} | 
|                             rules={[ | 
|                                 { | 
|                                     required: true, | 
|                                     message: intl.formatMessage({ | 
|                                         id: 'login.rule.username', | 
|                                         defaultMessage: '请输入用户名!', | 
|                                     }), | 
|                                 }, | 
|                             ]} | 
|                         /> | 
|                         <ProFormText.Password | 
|                             name="password" | 
|                             fieldProps={{ | 
|                                 size: 'large', | 
|                                 prefix: ( | 
|                                     <LockOutlined | 
|                                         style={{ | 
|                                             color: token.colorText, | 
|                                         }} | 
|                                         className={'prefixIcon'} | 
|                                     /> | 
|                                 ), | 
|                             }} | 
|                             placeholder={intl.formatMessage({ | 
|                                 id: 'login.password', | 
|                                 defaultMessage: '密码: ', | 
|                             })} | 
|                             rules={[ | 
|                                 { | 
|                                     required: true, | 
|                                     message: intl.formatMessage({ | 
|                                         id: 'login.rule.password', | 
|                                         defaultMessage: '请输入密码!!', | 
|                                     }), | 
|                                 }, | 
|                             ]} | 
|                         /> | 
|                     </> | 
|                 )} | 
|                 {status !== 200 && loginType === 'account' && ( | 
|                     <LoginMessage | 
|                         content={intl.formatMessage({ | 
|                             id: 'login.accountLogin.errorMessage', | 
|                             defaultMessage: '账户或密码错误', | 
|                         })} | 
|                     /> | 
|                 )} | 
|                 {loginType === 'phone' && ( | 
|                     <> | 
|                         <ProFormSelect | 
|                             className="centered-select" | 
|                             name="hostId" | 
|                             placeholder={intl.formatMessage({ | 
|                                 id: 'login.host', | 
|                                 defaultMessage: '机构:', | 
|                             })} | 
|                             rules={[ | 
|                                 { | 
|                                     required: true, | 
|                                     message: intl.formatMessage({ | 
|                                         id: 'login.rule.host', | 
|                                         defaultMessage: '请选择机构!', | 
|                                     }), | 
|                                 }, | 
|                             ]} | 
|                             options={hostList} | 
|                         /> | 
|                         <ProFormText | 
|                             fieldProps={{ | 
|                                 size: 'large', | 
|                                 prefix: ( | 
|                                     <MobileOutlined | 
|                                         style={{ | 
|                                             color: token.colorText, | 
|                                         }} | 
|                                         className={'prefixIcon'} | 
|                                     /> | 
|                                 ), | 
|                             }} | 
|                             name="mobile" | 
|                             placeholder={intl.formatMessage({ | 
|                                 id: 'login.phoneNumber.placeholder', | 
|                                 defaultMessage: '手机号', | 
|                             })} | 
|                             rules={[ | 
|                                 { | 
|                                     required: true, | 
|                                     message: | 
|                                         <FormattedMessage | 
|                                             id="login.phoneNumber.required" | 
|                                             defaultMessage="请输入手机号!" | 
|                                         />, | 
|                                 }, | 
|                                 { | 
|                                     pattern: /^1\d{10}$/, | 
|                                     message: | 
|                                         <FormattedMessage | 
|                                             id="login.phoneNumber.invalid" | 
|                                             defaultMessage="手机号格式错误!" | 
|                                         />, | 
|                                 }, | 
|                             ]} | 
|                         /> | 
|                         <ProFormCaptcha | 
|                             fieldProps={{ | 
|                                 size: 'large', | 
|                                 prefix: ( | 
|                                     <LockOutlined | 
|                                         style={{ | 
|                                             color: token.colorText, | 
|                                         }} | 
|                                         className={'prefixIcon'} | 
|                                     /> | 
|                                 ), | 
|                             }} | 
|                             captchaProps={{ | 
|                                 size: 'large', | 
|                             }} | 
|                             placeholder={intl.formatMessage({ | 
|                                 id: 'login.captcha.placeholder', | 
|                                 defaultMessage: '请输入验证码', | 
|                             })} | 
|                             captchaTextRender={(timing, count) => { | 
|                                 if (timing) { | 
|                                     return `${count} ${intl.formatMessage({ | 
|                                         id: 'pages.getCaptchaSecondText', | 
|                                         defaultMessage: 'sec(秒)', | 
|                                     })}`; | 
|                                 } | 
|                                 return intl.formatMessage({ | 
|                                     id: 'login.phoneLogin.getVerificationCode', | 
|                                     defaultMessage: '获取验证码', | 
|                                 }); | 
|                             }} | 
|                             name="captcha" | 
|                             rules={[ | 
|                                 { | 
|                                     required: true, | 
|                                     message: | 
|                                         <FormattedMessage | 
|                                             id="login.captcha.required" | 
|                                             defaultMessage="请输入验证码!" | 
|                                         />, | 
|                                 }, | 
|                             ]} | 
|                             onGetCaptcha={async () => { | 
|                                 message.warning(intl.formatMessage({ | 
|                                     id: 'login.phoneLogin.none', | 
|                                     defaultMessage: '未开启手机号登录', | 
|                                 })); | 
|                             }} | 
|                         /> | 
|                     </> | 
|                 )} | 
|                 <div | 
|                     style={{ | 
|                         display: 'flex', | 
|                         justifyContent: 'space-between', | 
|                         alignItems: 'center', | 
|                         marginBlockEnd: 24, | 
|                     }} | 
|                 > | 
|                     <ProFormCheckbox | 
|                         noStyle | 
|                         name="autoLogin" | 
|                         onChange={(e) => { | 
|                             setRememberMe(e.target.checked); | 
|                         }} | 
|                     > | 
|                         {intl.formatMessage({ | 
|                             id: 'login.rememberMe', | 
|                             defaultMessage: '自动登录', | 
|                         })} | 
|                     </ProFormCheckbox> | 
|                     <Lang /> | 
|                 </div> | 
|             </LoginFormPage> | 
|         </div> | 
|     ); | 
| }; | 
|   | 
| export default () => { | 
|     return ( | 
|         <ProConfigProvider dark> | 
|             <Page /> | 
|         </ProConfigProvider> | 
|     ); | 
| }; |