Login.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import React, { Component } from 'react';
  2. import { connect } from 'dva';
  3. import { Link } from 'dva/router';
  4. import { Checkbox, Alert, Icon } from 'antd';
  5. import Login from 'components/Login';
  6. import styles from './Login.less';
  7. const { Tab, UserName, Password, Mobile, Captcha, Submit } = Login;
  8. @connect(({ login, loading }) => ({
  9. login,
  10. submitting: loading.effects['login/login'],
  11. }))
  12. export default class LoginPage extends Component {
  13. state = {
  14. type: 'account',
  15. autoLogin: true,
  16. };
  17. onTabChange = type => {
  18. this.setState({ type });
  19. };
  20. onGetCaptcha = () => {
  21. return new Promise((resolve, reject) => {
  22. this.loginForm.validateFields(['mobile'], {}, (err, values) => {
  23. if (err) {
  24. reject(err);
  25. } else {
  26. const { dispatch } = this.props;
  27. dispatch({
  28. type: 'login/getCaptcha',
  29. payload: values.mobile,
  30. })
  31. .then(resolve)
  32. .catch(reject);
  33. }
  34. });
  35. });
  36. };
  37. handleSubmit = (err, values) => {
  38. const { type } = this.state;
  39. if (!err) {
  40. const { dispatch } = this.props;
  41. dispatch({
  42. type: 'login/login',
  43. payload: {
  44. ...values,
  45. type,
  46. },
  47. });
  48. }
  49. };
  50. changeAutoLogin = e => {
  51. this.setState({
  52. autoLogin: e.target.checked,
  53. });
  54. };
  55. renderMessage = content => {
  56. return <Alert style={{ marginBottom: 24 }} message={content} type="error" showIcon />;
  57. };
  58. render() {
  59. const { login, submitting } = this.props;
  60. const { type, autoLogin } = this.state;
  61. return (
  62. <div className={styles.main}>
  63. <Login
  64. defaultActiveKey={type}
  65. onTabChange={this.onTabChange}
  66. onSubmit={this.handleSubmit}
  67. ref={form => {
  68. this.loginForm = form;
  69. }}
  70. >
  71. <Tab key="account" tab="账户密码登录">
  72. {login.status === 'error' &&
  73. login.type === 'account' &&
  74. !submitting &&
  75. this.renderMessage('账户或密码错误(admin/888888)')}
  76. <UserName name="userName" placeholder="admin/user" />
  77. <Password
  78. name="password"
  79. placeholder="888888/123456"
  80. onPressEnter={() => this.loginForm.validateFields(this.handleSubmit)}
  81. />
  82. </Tab>
  83. <Tab key="mobile" tab="手机号登录">
  84. {login.status === 'error' &&
  85. login.type === 'mobile' &&
  86. !submitting &&
  87. this.renderMessage('验证码错误')}
  88. <Mobile name="mobile" />
  89. <Captcha name="captcha" countDown={120} onGetCaptcha={this.onGetCaptcha} />
  90. </Tab>
  91. <div>
  92. <Checkbox checked={autoLogin} onChange={this.changeAutoLogin}>
  93. 自动登录
  94. </Checkbox>
  95. <a style={{ float: 'right' }} href="">
  96. 忘记密码
  97. </a>
  98. </div>
  99. <Submit loading={submitting}>登录</Submit>
  100. <div className={styles.other}>
  101. 其他登录方式
  102. <Icon className={styles.icon} type="alipay-circle" />
  103. <Icon className={styles.icon} type="taobao-circle" />
  104. <Icon className={styles.icon} type="weibo-circle" />
  105. <Link className={styles.register} to="/User/Register">
  106. 注册账户
  107. </Link>
  108. </div>
  109. </Login>
  110. </div>
  111. );
  112. }
  113. }