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> 
 | 
    ); 
 | 
}; 
 |