blob: a91d63b71a7d4a965404645898c8830e8a7b5d30 [file] [log] [blame]
liangjiabao5e1dbd32025-06-07 16:28:19 +08001import React, { useState } from 'react'
2import { connect } from 'dva'
3import { history } from 'umi'
4import { Form, Input, Button, message } from 'antd'
5import { UserOutlined, LockOutlined } from '@ant-design/icons'
6import styles from './index.less'
7
8const RegisterPage = ({ dispatch, register }) => {
9 const [form] = Form.useForm()
10
11 const onFinish = values => {
12 dispatch({
13 type: 'register/submit',
14 payload: values
15 }).then(() => {
16 if (!register.error) {
17 message.success('注册成功')
18 history.push('/user/login')
19 } else {
20 message.error(register.error)
21 }
22 })
23 }
24
25 return (
26 <div className={styles.container}>
27 <div className={styles.content}>
28 <div className={styles.top}>
29 <div className={styles.header}>
30 <span className={styles.title}>用户注册</span>
31 </div>
32 </div>
33
34 <div className={styles.main}>
35 <Form
36 form={form}
37 name="register"
38 onFinish={onFinish}
39 scrollToFirstError
40 >
41 <Form.Item
42 name="username"
43 rules={[
44 { required: true, message: '请输入用户名!' },
45 { min: 4, message: '用户名至少4个字符' },
46 { max: 20, message: '用户名最多20个字符' },
47 { pattern: /^[a-zA-Z0-9_]+$/, message: '用户名只能包含字母、数字和下划线' }
48 ]}
49 >
50 <Input
51 prefix={<UserOutlined className={styles.prefixIcon} />}
52 placeholder="用户名"
53 size="large"
54 />
55 </Form.Item>
56
57 <Form.Item
58 name="password"
59 rules={[
60 { required: true, message: '请输入密码!' },
61 { min: 6, message: '密码至少6个字符' },
62 { max: 20, message: '密码最多20个字符' }
63 ]}
64 >
65 <Input.Password
66 prefix={<LockOutlined className={styles.prefixIcon} />}
67 type="password"
68 placeholder="密码"
69 size="large"
70 />
71 </Form.Item>
72
73 <Form.Item
74 name="confirmPassword"
75 dependencies={['password']}
76 rules={[
77 { required: true, message: '请确认密码!' },
78 ({ getFieldValue }) => ({
79 validator(_, value) {
80 if (!value || getFieldValue('password') === value) {
81 return Promise.resolve()
82 }
83 return Promise.reject(new Error('两次输入的密码不一致!'))
84 }
85 })
86 ]}
87 >
88 <Input.Password
89 prefix={<LockOutlined className={styles.prefixIcon} />}
90 type="password"
91 placeholder="确认密码"
92 size="large"
93 />
94 </Form.Item>
95
96 <Form.Item>
97 <Button
98 type="primary"
99 htmlType="submit"
100 size="large"
101 className={styles.submit}
102 loading={register.submitting}
103 block
104 >
105 注册
106 </Button>
107 </Form.Item>
108 </Form>
109 </div>
110 </div>
111 </div>
112 )
113}
114
115export default connect(({ register }) => ({ register }))(RegisterPage)