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