|
|
@@ -1,11 +1,11 @@
|
|
|
-import { LockTwoTone, UserOutlined } from '@ant-design/icons'
|
|
|
-import { Alert, Tabs } from 'antd'
|
|
|
+import { LockOutlined, UserOutlined } from '@ant-design/icons'
|
|
|
+import { Alert, message, Tabs } from 'antd'
|
|
|
import React, { useState } from 'react'
|
|
|
import ProForm, { ProFormCheckbox, ProFormText } from '@ant-design/pro-form'
|
|
|
-import { connect, useIntl, FormattedMessage } from 'umi'
|
|
|
-// import { getFakeCaptcha } from '@/services/login'
|
|
|
+import { useIntl, Link, history, FormattedMessage, SelectLang, useModel } from 'umi'
|
|
|
+
|
|
|
import styles from './index.less'
|
|
|
-import consts from '@/consts'
|
|
|
+import { apiLogin } from '@/services/login'
|
|
|
|
|
|
const LoginMessage = ({ content }) => (
|
|
|
<Alert
|
|
|
@@ -18,131 +18,194 @@ const LoginMessage = ({ content }) => (
|
|
|
/>
|
|
|
)
|
|
|
|
|
|
-const Login = props => {
|
|
|
- const { userLogin = {}, submitting } = props
|
|
|
- const { loginStatus: status } = userLogin
|
|
|
+/** 此方法会跳转到 redirect 参数所在的位置 */
|
|
|
+const goto = () => {
|
|
|
+ if (!history) return
|
|
|
+ setTimeout(() => {
|
|
|
+ const { query } = history.location
|
|
|
+ const { redirect } = query
|
|
|
+ history.push(redirect || '/')
|
|
|
+ }, 10)
|
|
|
+}
|
|
|
+
|
|
|
+const Login = () => {
|
|
|
+ const [submitting, setSubmitting] = useState(false)
|
|
|
+ const [userLoginState, setUserLoginState] = useState({})
|
|
|
const [type, setType] = useState('account')
|
|
|
+ const { initialState, setInitialState } = useModel('@@initialState')
|
|
|
+
|
|
|
const intl = useIntl()
|
|
|
|
|
|
- const handleSubmit = values => {
|
|
|
- const { dispatch } = props
|
|
|
- dispatch({
|
|
|
- type: 'user/login',
|
|
|
- payload: { ...values, type }
|
|
|
- })
|
|
|
- // dispatch({
|
|
|
- // type: 'user/fetchCurrent'
|
|
|
- // })
|
|
|
+ const fetchUserInfo = async () => {
|
|
|
+ const userInfo = await initialState?.fetchUserInfo?.()
|
|
|
+ if (userInfo) {
|
|
|
+ setInitialState({ ...initialState, ...userInfo })
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ const handleSubmit = async values => {
|
|
|
+ setSubmitting(true)
|
|
|
+ try {
|
|
|
+ // 登录
|
|
|
+ const msg = await apiLogin({ ...values })
|
|
|
+ if (msg.code === 0) {
|
|
|
+ const defaultLoginSuccessMessage = intl.formatMessage({
|
|
|
+ id: 'pages.login.success',
|
|
|
+ defaultMessage: '登录成功!'
|
|
|
+ })
|
|
|
+ message.success(defaultLoginSuccessMessage)
|
|
|
+ await fetchUserInfo()
|
|
|
+ /** 此方法会跳转到 redirect 参数所在的位置 */
|
|
|
+ return goto()
|
|
|
+ }
|
|
|
+ // 如果失败去设置用户错误信息
|
|
|
+ setUserLoginState(msg)
|
|
|
+ } catch (error) {
|
|
|
+ const defaultLoginFailureMessage = intl.formatMessage({
|
|
|
+ id: 'pages.login.failure',
|
|
|
+ defaultMessage: '登录失败,请重试!'
|
|
|
+ })
|
|
|
+
|
|
|
+ return message.error(defaultLoginFailureMessage)
|
|
|
+ }
|
|
|
+ return setSubmitting(false)
|
|
|
+ }
|
|
|
+ const { status, type: loginType } = userLoginState
|
|
|
+
|
|
|
return (
|
|
|
- <div className={styles.main}>
|
|
|
- <ProForm
|
|
|
- initialValues={{
|
|
|
- autoLogin: true
|
|
|
- }}
|
|
|
- submitter={{
|
|
|
- render: (_, dom) => dom.pop(),
|
|
|
- submitButtonProps: {
|
|
|
- loading: submitting,
|
|
|
- size: 'large',
|
|
|
- style: {
|
|
|
- width: '100%'
|
|
|
- }
|
|
|
- }
|
|
|
- }}
|
|
|
- onFinish={async values => {
|
|
|
- handleSubmit(values)
|
|
|
- return Promise.resolve()
|
|
|
- }}>
|
|
|
- <Tabs activeKey={type} onChange={setType} className={styles.tabMargin}>
|
|
|
- <Tabs.TabPane
|
|
|
- key="account"
|
|
|
- tab={intl.formatMessage({
|
|
|
- id: 'pages.login.accountLogin.tab',
|
|
|
- defaultMessage: '账户密码登录'
|
|
|
- })}
|
|
|
- />
|
|
|
- {/* <Tabs.TabPane
|
|
|
- key="mobile"
|
|
|
- tab={intl.formatMessage({
|
|
|
- id: 'pages.login.phoneLogin.tab',
|
|
|
- defaultMessage: '手机号登录',
|
|
|
- })}
|
|
|
- /> */}
|
|
|
- </Tabs>
|
|
|
+ <div className={styles.container}>
|
|
|
+ <div className={styles.lang} data-lang>
|
|
|
+ {SelectLang && <SelectLang />}
|
|
|
+ </div>
|
|
|
+ <div className={styles.content}>
|
|
|
+ <div className={styles.top}>
|
|
|
+ <div className={styles.header}>
|
|
|
+ <Link to="/">
|
|
|
+ <img alt="logo" className={styles.logo} src="/logo.svg" />
|
|
|
+ <span className={styles.title}>Ant Design</span>
|
|
|
+ </Link>
|
|
|
+ </div>
|
|
|
+ <div className={styles.desc}>
|
|
|
+ {intl.formatMessage({ id: 'pages.layouts.userLayout.title' })}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
- {status && status !== consts.RET_CODE.SUCCESS && !submitting ? (
|
|
|
- <LoginMessage
|
|
|
- content={intl.formatMessage({
|
|
|
- id: 'pages.login.accountLogin.errorMessage',
|
|
|
- defaultMessage: '账户或密码错误'
|
|
|
- })}
|
|
|
- />
|
|
|
- ) : null}
|
|
|
- {type === 'account' && (
|
|
|
- <>
|
|
|
- <ProFormText
|
|
|
- name="username"
|
|
|
- fieldProps={{
|
|
|
+ <div className={styles.main}>
|
|
|
+ <ProForm
|
|
|
+ initialValues={{
|
|
|
+ autoLogin: true
|
|
|
+ }}
|
|
|
+ submitter={{
|
|
|
+ searchConfig: {
|
|
|
+ submitText: intl.formatMessage({
|
|
|
+ id: 'pages.login.submit',
|
|
|
+ defaultMessage: '登录'
|
|
|
+ })
|
|
|
+ },
|
|
|
+ render: (_, dom) => dom.pop(),
|
|
|
+ submitButtonProps: {
|
|
|
+ loading: submitting,
|
|
|
size: 'large',
|
|
|
- prefix: <UserOutlined className={styles.prefixIcon} />
|
|
|
- }}
|
|
|
- placeholder={'账号:'}
|
|
|
- rules={[
|
|
|
- {
|
|
|
- required: true,
|
|
|
- message: (
|
|
|
- <FormattedMessage
|
|
|
- id="pages.login.username.required"
|
|
|
- defaultMessage="请输入用户名!"
|
|
|
- />
|
|
|
- )
|
|
|
+ style: {
|
|
|
+ width: '100%'
|
|
|
}
|
|
|
- ]}
|
|
|
- />
|
|
|
- <ProFormText.Password
|
|
|
- name="password"
|
|
|
- fieldProps={{
|
|
|
- size: 'large',
|
|
|
- prefix: <LockTwoTone className={styles.prefixIcon} />
|
|
|
- }}
|
|
|
- placeholder={'密码:'}
|
|
|
- className="pi-bg-gray"
|
|
|
- rules={[
|
|
|
- {
|
|
|
- required: true,
|
|
|
- message: (
|
|
|
- <FormattedMessage
|
|
|
- id="pages.login.password.required"
|
|
|
- defaultMessage="请输入密码!"
|
|
|
- />
|
|
|
- )
|
|
|
- }
|
|
|
- ]}
|
|
|
- />
|
|
|
- </>
|
|
|
- )}
|
|
|
- <div
|
|
|
- style={{
|
|
|
- marginBottom: 24
|
|
|
- }}>
|
|
|
- <ProFormCheckbox noStyle name="autoLogin">
|
|
|
- <FormattedMessage id="pages.login.rememberMe" defaultMessage="自动登录" />
|
|
|
- </ProFormCheckbox>
|
|
|
- <a
|
|
|
- style={{
|
|
|
- float: 'right'
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ onFinish={async values => {
|
|
|
+ handleSubmit(values)
|
|
|
}}>
|
|
|
- <FormattedMessage id="pages.login.forgotPassword" defaultMessage="忘记密码" />
|
|
|
- </a>
|
|
|
+ <Tabs activeKey={type} onChange={setType}>
|
|
|
+ <Tabs.TabPane
|
|
|
+ key="account"
|
|
|
+ tab={intl.formatMessage({
|
|
|
+ id: 'pages.login.accountLogin.tab',
|
|
|
+ defaultMessage: '账户密码登录'
|
|
|
+ })}
|
|
|
+ />
|
|
|
+ {/* <Tabs.TabPane
|
|
|
+ key="mobile"
|
|
|
+ tab={intl.formatMessage({
|
|
|
+ id: 'pages.login.phoneLogin.tab',
|
|
|
+ defaultMessage: '手机号登录',
|
|
|
+ })}
|
|
|
+ /> */}
|
|
|
+ </Tabs>
|
|
|
+
|
|
|
+ {status === 'error' && loginType === 'account' && (
|
|
|
+ <LoginMessage
|
|
|
+ content={intl.formatMessage({
|
|
|
+ id: 'pages.login.accountLogin.errorMessage',
|
|
|
+ defaultMessage: '账户或密码错误'
|
|
|
+ })}
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ {type === 'account' && (
|
|
|
+ <>
|
|
|
+ <ProFormText
|
|
|
+ name="username"
|
|
|
+ fieldProps={{
|
|
|
+ size: 'large',
|
|
|
+ prefix: <UserOutlined className={styles.prefixIcon} />
|
|
|
+ }}
|
|
|
+ placeholder={intl.formatMessage({
|
|
|
+ id: 'pages.login.username.placeholder',
|
|
|
+ defaultMessage: '用户名: admin or user'
|
|
|
+ })}
|
|
|
+ rules={[
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: (
|
|
|
+ <FormattedMessage
|
|
|
+ id="pages.login.username.required"
|
|
|
+ defaultMessage="请输入用户名!"
|
|
|
+ />
|
|
|
+ )
|
|
|
+ }
|
|
|
+ ]}
|
|
|
+ />
|
|
|
+ <ProFormText.Password
|
|
|
+ name="password"
|
|
|
+ fieldProps={{
|
|
|
+ size: 'large',
|
|
|
+ prefix: <LockOutlined className={styles.prefixIcon} />
|
|
|
+ }}
|
|
|
+ placeholder={intl.formatMessage({
|
|
|
+ id: 'pages.login.password.placeholder',
|
|
|
+ defaultMessage: '密码: ant.design'
|
|
|
+ })}
|
|
|
+ rules={[
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: (
|
|
|
+ <FormattedMessage
|
|
|
+ id="pages.login.password.required"
|
|
|
+ defaultMessage="请输入密码!"
|
|
|
+ />
|
|
|
+ )
|
|
|
+ }
|
|
|
+ ]}
|
|
|
+ />
|
|
|
+ </>
|
|
|
+ )}
|
|
|
+ <div
|
|
|
+ style={{
|
|
|
+ marginBottom: 24
|
|
|
+ }}>
|
|
|
+ <ProFormCheckbox noStyle name="autoLogin">
|
|
|
+ <FormattedMessage id="pages.login.rememberMe" defaultMessage="自动登录" />
|
|
|
+ </ProFormCheckbox>
|
|
|
+ <a
|
|
|
+ style={{
|
|
|
+ float: 'right'
|
|
|
+ }}>
|
|
|
+ <FormattedMessage id="pages.login.forgotPassword" defaultMessage="忘记密码" />
|
|
|
+ </a>
|
|
|
+ </div>
|
|
|
+ </ProForm>
|
|
|
</div>
|
|
|
- </ProForm>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
)
|
|
|
}
|
|
|
|
|
|
-export default connect(({ user, loading }) => ({
|
|
|
- userLogin: user,
|
|
|
- submitting: loading.effects['user/login']
|
|
|
-}))(Login)
|
|
|
+export default Login
|