update nginx

Change-Id: Ia5695f05d68dcae340c97a9cdd923ce5b56455d7
diff --git a/src/pages/register/index.jsx b/src/pages/register/index.jsx
new file mode 100644
index 0000000..a91d63b
--- /dev/null
+++ b/src/pages/register/index.jsx
@@ -0,0 +1,115 @@
+import React, { useState } from 'react'
+import { connect } from 'dva'
+import { history } from 'umi'
+import { Form, Input, Button, message } from 'antd'
+import { UserOutlined, LockOutlined } from '@ant-design/icons'
+import styles from './index.less'
+
+const RegisterPage = ({ dispatch, register }) => {
+  const [form] = Form.useForm()
+  
+  const onFinish = values => {
+    dispatch({
+      type: 'register/submit',
+      payload: values
+    }).then(() => {
+      if (!register.error) {
+        message.success('注册成功')
+        history.push('/user/login')
+      } else {
+        message.error(register.error)
+      }
+    })
+  }
+  
+  return (
+    <div className={styles.container}>
+      <div className={styles.content}>
+        <div className={styles.top}>
+          <div className={styles.header}>
+            <span className={styles.title}>用户注册</span>
+          </div>
+        </div>
+        
+        <div className={styles.main}>
+          <Form
+            form={form}
+            name="register"
+            onFinish={onFinish}
+            scrollToFirstError
+          >
+            <Form.Item
+              name="username"
+              rules={[
+                { required: true, message: '请输入用户名!' },
+                { min: 4, message: '用户名至少4个字符' },
+                { max: 20, message: '用户名最多20个字符' },
+                { pattern: /^[a-zA-Z0-9_]+$/, message: '用户名只能包含字母、数字和下划线' }
+              ]}
+            >
+              <Input
+                prefix={<UserOutlined className={styles.prefixIcon} />}
+                placeholder="用户名"
+                size="large"
+              />
+            </Form.Item>
+            
+            <Form.Item
+              name="password"
+              rules={[
+                { required: true, message: '请输入密码!' },
+                { min: 6, message: '密码至少6个字符' },
+                { max: 20, message: '密码最多20个字符' }
+              ]}
+            >
+              <Input.Password
+                prefix={<LockOutlined className={styles.prefixIcon} />}
+                type="password"
+                placeholder="密码"
+                size="large"
+              />
+            </Form.Item>
+            
+            <Form.Item
+              name="confirmPassword"
+              dependencies={['password']}
+              rules={[
+                { required: true, message: '请确认密码!' },
+                ({ getFieldValue }) => ({
+                  validator(_, value) {
+                    if (!value || getFieldValue('password') === value) {
+                      return Promise.resolve()
+                    }
+                    return Promise.reject(new Error('两次输入的密码不一致!'))
+                  }
+                })
+              ]}
+            >
+              <Input.Password
+                prefix={<LockOutlined className={styles.prefixIcon} />}
+                type="password"
+                placeholder="确认密码"
+                size="large"
+              />
+            </Form.Item>
+            
+            <Form.Item>
+              <Button
+                type="primary"
+                htmlType="submit"
+                size="large"
+                className={styles.submit}
+                loading={register.submitting}
+                block
+              >
+                注册
+              </Button>
+            </Form.Item>
+          </Form>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default connect(({ register }) => ({ register }))(RegisterPage)
\ No newline at end of file