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