Login.js 5.81 KB
Newer Older
1 2 3 4 5 6 7
import React, { Component } from 'react';
import { connect } from 'dva';
import { routerRedux, Link } from 'dva/router';
import { Form, Input, Tabs, Button, Icon, Checkbox, Row, Col, Alert } from 'antd';
import styles from './Login.less';

const FormItem = Form.Item;
afc163's avatar
afc163 committed
8
const { TabPane } = Tabs;
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

@connect(state => ({
  login: state.login,
}))
@Form.create()
export default class Login extends Component {
  state = {
    count: 0,
    type: 'account',
  }

  componentWillReceiveProps(nextProps) {
    if (nextProps.login.status === 'ok') {
      this.props.dispatch(routerRedux.push('/'));
    }
  }

  componentWillUnmount() {
    clearInterval(this.interval);
  }

  onSwitch = (key) => {
    this.setState({
      type: key,
    });
  }

  onGetCaptcha = () => {
    let count = 59;
    this.setState({ count });
    this.interval = setInterval(() => {
      count -= 1;
      this.setState({ count });
      if (count === 0) {
        clearInterval(this.interval);
      }
    }, 1000);
  }

  handleSubmit = (e) => {
    e.preventDefault();
    const { type } = this.state;
    this.props.form.validateFields({ force: true },
      (err, values) => {
        if (!err) {
          this.props.dispatch({
            type: `login/${type}Submit`,
            payload: values,
          });
        }
      }
    );
  }

afc163's avatar
afc163 committed
63 64 65
  renderMessage = (message) => {
    return (
      <Alert
ddcat1115's avatar
ddcat1115 committed
66
        style={{ marginBottom: 24 }}
afc163's avatar
afc163 committed
67 68 69 70 71
        message={message}
        type="error"
        showIcon
      />
    );
72 73 74 75 76 77 78 79 80
  }

  render() {
    const { form, login } = this.props;
    const { getFieldDecorator } = form;
    const { count, type } = this.state;
    return (
      <div className={styles.main}>
        <Form onSubmit={this.handleSubmit}>
nikogu's avatar
nikogu committed
81
          <Tabs animated={false} className={styles.tabs} activeKey={type} onChange={this.onSwitch}>
82
            <TabPane tab="账户密码登录" key="account">
ddcat1115's avatar
ddcat1115 committed
83 84 85 86
              {
                login.status === 'error' &&
                login.type === 'account' &&
                login.submitting === false &&
afc163's avatar
afc163 committed
87
                this.renderMessage('账户或密码错误')
ddcat1115's avatar
ddcat1115 committed
88
              }
89 90 91 92 93 94 95
              <FormItem>
                {getFieldDecorator('userName', {
                  rules: [{
                    required: type === 'account', message: '请输入账户名!',
                  }],
                })(
                  <Input
ddcat1115's avatar
ddcat1115 committed
96
                    size="large"
ddcat1115's avatar
ddcat1115 committed
97
                    prefix={<Icon type="user" className={styles.prefixIcon} />}
ddcat1115's avatar
ddcat1115 committed
98
                    placeholder="admin"
99 100 101 102 103 104 105 106 107 108
                  />
                )}
              </FormItem>
              <FormItem>
                {getFieldDecorator('password', {
                  rules: [{
                    required: type === 'account', message: '请输入密码!',
                  }],
                })(
                  <Input
ddcat1115's avatar
ddcat1115 committed
109
                    size="large"
ddcat1115's avatar
ddcat1115 committed
110
                    prefix={<Icon type="lock" className={styles.prefixIcon} />}
111
                    type="password"
ddcat1115's avatar
ddcat1115 committed
112
                    placeholder="888888"
113 114 115 116 117
                  />
                )}
              </FormItem>
            </TabPane>
            <TabPane tab="手机号登录" key="mobile">
ddcat1115's avatar
ddcat1115 committed
118 119 120 121
              {
                login.status === 'error' &&
                login.type === 'mobile' &&
                login.submitting === false &&
afc163's avatar
afc163 committed
122
                this.renderMessage('验证码错误')
ddcat1115's avatar
ddcat1115 committed
123
              }
124 125 126 127 128 129 130 131 132
              <FormItem>
                {getFieldDecorator('mobile', {
                  rules: [{
                    required: type === 'mobile', message: '请输入手机号!',
                  }, {
                    pattern: /^1\d{10}$/, message: '手机号格式错误!',
                  }],
                })(
                  <Input
ddcat1115's avatar
ddcat1115 committed
133
                    size="large"
ddcat1115's avatar
ddcat1115 committed
134
                    prefix={<Icon type="mobile" className={styles.prefixIcon} />}
135 136 137 138 139 140 141 142 143 144 145 146 147 148
                    placeholder="手机号"
                  />
                )}
              </FormItem>
              <FormItem>
                <Row gutter={8}>
                  <Col span={16}>
                    {getFieldDecorator('captcha', {
                      rules: [{
                        required: type === 'mobile', message: '请输入验证码!',
                      }],
                    })(
                      <Input
                        size="large"
ddcat1115's avatar
ddcat1115 committed
149
                        prefix={<Icon type="mail" className={styles.prefixIcon} />}
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
                        placeholder="验证码"
                      />
                    )}
                  </Col>
                  <Col span={8}>
                    <Button
                      disabled={count}
                      className={styles.getCaptcha}
                      size="large"
                      onClick={this.onGetCaptcha}
                    >
                      {count ? `${count} s` : '获取验证码'}
                    </Button>
                  </Col>
                </Row>
              </FormItem>
            </TabPane>
          </Tabs>
          <FormItem className={styles.additional}>
            {getFieldDecorator('remember', {
              valuePropName: 'checked',
              initialValue: true,
            })(
ddcat1115's avatar
ddcat1115 committed
173
              <Checkbox className={styles.autoLogin}>自动登录</Checkbox>
174 175
            )}
            <a className={styles.forgot} href="">忘记密码</a>
ddcat1115's avatar
ddcat1115 committed
176
            <Button size="large" loading={login.submitting} className={styles.submit} type="primary" htmlType="submit">
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
              登录
            </Button>
          </FormItem>
        </Form>
        <div className={styles.other}>
          其他登录方式
          {/* 需要加到 Icon 中 */}
          <span className={styles.iconAlipay} />
          <span className={styles.iconTaobao} />
          <span className={styles.iconWeibo} />
          <Link className={styles.register} to="/user/register">注册账户</Link>
        </div>
      </div>
    );
  }
}