fangmingyue 1 rok temu
rodzic
commit
46bb9cdd92

+ 43
- 0
src/components/Upload/UploadFile.jsx Wyświetl plik

1
+import React, { useState } from 'react';
2
+import { LoadingOutlined, PlusOutlined } from '@ant-design/icons';
3
+import { useTranslation } from 'react-i18next';
4
+import Upload from './Upload';
5
+
6
+export default (props) => {
7
+  const { value, onChange } = props;
8
+  const { t } = useTranslation();
9
+
10
+  const [loading, setLoading] = useState(false);
11
+
12
+  const UploadButton = (props) => (
13
+    <div style={{ textAlign: 'center' }}>
14
+      {props.loading ? <LoadingOutlined /> : <PlusOutlined />}
15
+      <div style={{ marginTop: 8 }}>{t('authentication.uploadText')}</div>
16
+    </div>
17
+  );
18
+
19
+  const handleChange = info => {
20
+    if (info.file.status === 'uploading') {
21
+      setLoading(true);
22
+      return;
23
+    }
24
+    if (info.file.status === 'error') {
25
+      setLoading(false);
26
+      return;
27
+    }
28
+
29
+    if (info.file.status === 'done') {
30
+      setLoading(false);
31
+      const { url, fileType } = info.file.response;
32
+    }
33
+  };
34
+
35
+  return (
36
+    <Upload
37
+      accept=".pdf"
38
+      onChange={handleChange}
39
+    >
40
+      {value ? '' : <UploadButton loading={loading} />}
41
+    </Upload>
42
+  )
43
+}

+ 26
- 6
src/layouts/AuthLayout/components/Header/Language.jsx Wyświetl plik

1
 import { Select } from "antd";
1
 import { Select } from "antd";
2
 import React, { useMemo } from "react";
2
 import React, { useMemo } from "react";
3
-import { useModel } from "@/store";
3
+// import { useModel } from "@/store";
4
+import i18n from '@/locale/config'
5
+
6
+let defaultLang = navigator.language;
7
+if (defaultLang.indexOf('zh') == 0) {
8
+  if (defaultLang == 'zh-CN' || defaultLang == 'zh') {
9
+    defaultLang = 'zh';
10
+  } else {
11
+    defaultLang = 'zht';
12
+  }
13
+} else {
14
+  defaultLang = 'en';
15
+}
16
+
4
 export default (props) => {
17
 export default (props) => {
5
   const { style } = props;
18
   const { style } = props;
6
 
19
 
7
   const styles = useMemo(() => {
20
   const styles = useMemo(() => {
8
     return { ...style, width: 120 };
21
     return { ...style, width: 120 };
9
   }, []);
22
   }, []);
23
+
24
+
10
   console.log(styles)
25
   console.log(styles)
11
-  const { lang } = useModel("language");
26
+
12
   const language = [
27
   const language = [
13
-    { label: "中文简体", value: "zh-CN" },
14
-    { label: "中文繁体", value: "zh-Tw" },
15
-    { label: "英文", value: "en-Us" },
28
+    { label: "中文简体", value: "zh" },
29
+    { label: "中文繁体", value: "zht" },
30
+    { label: "英文", value: "en" },
16
   ];
31
   ];
17
-  return <Select defaultValue={lang} style={styles} options={language} />;
32
+
33
+  const onChange = (v) => {
34
+    i18n.changeLanguage(v);
35
+  }
36
+
37
+  return <Select defaultValue={defaultLang} style={styles} options={language} onChange={onChange} />;
18
 };
38
 };

+ 12
- 1
src/locale/config.js Wyświetl plik

16
     },
16
     },
17
 };
17
 };
18
 
18
 
19
+let defaultLang = navigator.language;
20
+if (defaultLang.indexOf('zh') == 0) {
21
+    if (defaultLang == 'zh-CN' || defaultLang == 'zh') {
22
+        defaultLang = 'zh';
23
+    } else {
24
+        defaultLang = 'zht';
25
+    }
26
+} else {
27
+    defaultLang = 'en';
28
+}
29
+
19
 i18n.use(initReactI18next).init({
30
 i18n.use(initReactI18next).init({
20
     resources,
31
     resources,
21
     // 默认语言  zh/en/zht  中文/英文/繁体
32
     // 默认语言  zh/en/zht  中文/英文/繁体
22
-    lng: 'en',
33
+    lng: defaultLang,
23
     interpolation: {
34
     interpolation: {
24
         escapeValue: false,
35
         escapeValue: false,
25
     },
36
     },

+ 12
- 1
src/locale/en.json Wyświetl plik

1
 {
1
 {
2
   "language": "Language",
2
   "language": "Language",
3
-  "switch": "Switch"
3
+  "switch": "Switch",
4
+  "accountmanagement": {
5
+    "title": "asdbasdfa"
6
+  },
7
+  "authentication": {
8
+    "title": "Real name authentication process",
9
+    "stepsTitle1": "Fill in the basic information of the enterprise",
10
+    "stepsTitle2": "Fill in the information of the company's directors",
11
+    "stepsTitle3": "Fill in the information of the beneficial owner of the enterprise",
12
+    "stepsTitle4": "Face recognition",
13
+    "stepsTitle5": "Confirm submission"
14
+  }
4
 }
15
 }

+ 71
- 1
src/locale/zh.json Wyświetl plik

1
 {
1
 {
2
   "language": "语言",
2
   "language": "语言",
3
-  "switch": "选择"
3
+  "switch": "选择",
4
+  "accountmanagement": {
5
+    "title": "qqq"
6
+  },
7
+  "authentication": {
8
+    "titleLeft": "实名认证流程",
9
+    "titleRight": "填写企业基础信息",
10
+    "stepsTitle1": "填写企业基础信息",
11
+    "stepsTitle2": "填写企业董事信息",
12
+    "stepsTitle3": "填写企业受益所有人信息",
13
+    "stepsTitle4": "人脸识别",
14
+    "stepsTitle5": "确认提交",
15
+
16
+    "rightTopSubTitle": "信息驳回",
17
+    "rightTopText": "基础信息:(1)请提供最新版公司商业登记证影印件; (2)请提供最新版NAR1文件,需彩色版本原件,如没有彩色版本原件,请补充缴费小票或收据",
18
+    "subTitleRight": "请上传如下文件",
19
+    "uploadText": "选择文件上传",
20
+    "uploadTitle1": "公司注册证书",
21
+    "uploadTitle2": "公司商业登记证",
22
+    "uploadTitle3": "NNC1/最新NAR1",
23
+    "uploadTitle4": "其他附件(选填,如变更文件等)",
24
+    "uploadPromptText1": "1.照片彩色、清晰、完整",
25
+    "uploadPromptText2": "2.支持PDF、JPG、JPEG、PNG、ZIP、RAR、XLSX、XLS格式",
26
+    "uploadPromptText3": "3.多份文件请打包压缩上传,文件大小不超过20MB",
27
+    "uploadPromptTextII4": "请上传彩色原件照片或扫描件,如五色彩版请补充缴费小票或收据",
28
+    "uploadPromptTextIII4": "4.若注册时间至今大于一年请提供最新的NAR1文件",
29
+    "uploadBtnText": "查看示例",
30
+    "enterpriseTypeRadio1": "私人股份有限公司",
31
+    "enterpriseTypeRadio2": "公众股份有限公司",
32
+    "enterpriseTypeRadio3": "有股本的公共无限公司",
33
+    "enterpriseTypeRadio4": "有股本的私人无限公司",
34
+    "formRightSelect1": "中国香港(地区)",
35
+    "formRightSelectPlaceholder1": "州/State/Province/Region",
36
+    "formRightSelectPlaceholderII1": "国家/地区",
37
+    "formRightInputPlaceholder2": "市/City",
38
+    "formRightInputPlaceholder3": "具体地址(如区、街道、建筑、门牌号)/Address Line",
39
+    "formRightInputPlaceholder4": "邮政编码/Postal Code",
40
+    "formRightInputPlaceholder5": "请选择雇员人数",
41
+    "formRightInputPlaceholder6": "请选择经营场所类型",
42
+    "formRightLabel1": "企业类型",
43
+    "formRightLabel2": "商业登记号码",
44
+    "formRightLabel3": "注册地址",
45
+    "formRightLabel4": "实际经营地址",
46
+    "formRightLabel5": "雇员人数",
47
+    "formRightLabel6": "经营场所类型",
48
+    "foundationInfoNextBtn": "下一步",
49
+
50
+    "subTitleRight2": "您的身份为",
51
+    "directorInfoRadioValue1": "企业董事",
52
+    "directorInfoRadioText1": "您本人为该企业的负责人,能够代表企业行驶职权",
53
+    "directorInfoRadioValue2": "被授权人",
54
+    "directorInfoRadioText2": "您本人被企业授权,能够代表企业处理事务",
55
+    "directorInfoLabel1": "国家",
56
+    "directorInfoLabel2": "证件类型",
57
+    "directorInfoSelectValue1": "中国大陆",
58
+    "directorInfoRadioValue": "身份证",
59
+    "directorInfoTitle": "请用手机扫描二维码拍摄上传",
60
+    "directorInfoContent1": "1.请用手机扫描二维码,或用手机打开分享链接,拍照上传证件照片",
61
+    "directorInfoContent2": "2.拍照上传图片保持清晰可见、完整,照片需要包含证件四角,无反光",
62
+    "directorInfoContent3": "3.如需修改上传图片,请重新扫描上传或重新打开分享链接",
63
+    "directorInfoContent4": "4.请拍摄证件原件,翻拍电子屏幕上的证件照片无发通过审核",
64
+    "directorInfoSubTitle1": "身份证人像面照片",
65
+    "directorInfoSubTitle2": "身份证国徽面照片",
66
+    "directorInfoIDCardRightText": "请用手机扫描二维码拍照上传",
67
+    "directorInfoLabel3": "中文姓名",
68
+    "directorInfoLabel4": "证件号码",
69
+    "directorInfoInputPlaceholder1": "请输入董事姓氏",
70
+    "directorInfoInputPlaceholder2": "请输入董事名称",
71
+    "directorInfoInputPlaceholder3": "请输入董事证件号码",
72
+    "directorInfoOtherDirectors": "其他董事"
73
+  }
4
 }
74
 }

+ 2
- 0
src/main.jsx Wyświetl plik

11
 import enUS from "antd/es/locale/en_US";
11
 import enUS from "antd/es/locale/en_US";
12
 import "moment/dist/locale/zh-cn";
12
 import "moment/dist/locale/zh-cn";
13
 
13
 
14
+import "@/locale/config";
15
+
14
 ReactDOM.createRoot(document.getElementById("root")).render(
16
 ReactDOM.createRoot(document.getElementById("root")).render(
15
   <ConfigProvider locale={zhCN} >
17
   <ConfigProvider locale={zhCN} >
16
     <Provider>
18
     <Provider>

+ 46
- 3
src/pages/accountmanagement/index.jsx Wyświetl plik

1
 import React from "react";
1
 import React from "react";
2
+import { Divider, Card, Steps } from "antd";
3
+import Page from "@/components/Page";
4
+// import i18n from "@/locale/config";
5
+import { useTranslation } from 'react-i18next';
6
+import "./style.less";
7
+
2
 export default (props) => {
8
 export default (props) => {
3
-  return <div>11111111</div>;
9
+
10
+  const { t } = useTranslation();
11
+
12
+  return (
13
+    <Page title={t('accountmanagement.title')}>
14
+      <Card bordered={false}>
15
+        <div className="accountmanagement-box">
16
+          <div className="accountmanagement-left">
17
+            <Steps
18
+              progressDot
19
+              current={1}
20
+              direction="vertical"
21
+              items={[
22
+                {
23
+                  title: '确认账户需求',
24
+                },
25
+                {
26
+                  title: 'Finished'
27
+                },
28
+                {
29
+                  title: 'In Progress',
30
+                  description: 'This is a description. This is a description.',
31
+                },
32
+                {
33
+                  title: 'Waiting',
34
+                  description: 'This is a description.',
35
+                },
36
+                {
37
+                  title: 'Waiting',
38
+                  description: 'This is a description.',
39
+                },
40
+              ]}
41
+            />
42
+          </div>
43
+          <div style={{ flex: 1.5 }}>22</div>
44
+        </div>
45
+      </Card>
46
+    </Page>
47
+  )
4
 };
48
 };
5
-                                               
6
 
49
 
7
 
50
 
8
 
51
 
11
 
54
 
12
 
55
 
13
 
56
 
14
-              
57
+

+ 8
- 0
src/pages/accountmanagement/style.less Wyświetl plik

1
+.accountmanagement-box {
2
+  display: flex;
3
+  align-items: stretch;
4
+  height: 100%;
5
+  .accountmanagement-left {
6
+    flex: 0.5;
7
+  }
8
+}

+ 3
- 3
src/pages/accountsettings/index.jsx Wyświetl plik

1
 import React from 'react'
1
 import React from 'react'
2
 export default (props) => {
2
 export default (props) => {
3
-return (
4
-<div></div>
5
-)
3
+  return (
4
+    <div></div>
5
+  )
6
 }
6
 }

+ 92
- 0
src/pages/authentication/components/DirectorInfo.jsx Wyświetl plik

1
+import React from "react";
2
+import { Divider, Card, Steps, Button, Radio, Form, Input, Row, Col, Select, Image } from "antd";
3
+import { useTranslation } from 'react-i18next';
4
+import "../style.less";
5
+
6
+export default (props) => {
7
+  const { t } = useTranslation();
8
+  const [form] = Form.useForm();
9
+
10
+  const onFinish = () => {
11
+
12
+  };
13
+
14
+  const url = "data:image/png;base64,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"
15
+
16
+  return (
17
+    <>
18
+      <div style={{ fontSize: '24px', fontWeight: '400' }}>{t('authentication.stepsTitle2')}</div>
19
+      <Form
20
+        form={form}
21
+        layout="vertical"
22
+        onFinish={onFinish}
23
+      >
24
+        <Card bordered={false} style={{ width: '900px', marginBottom: '24px' }}>
25
+          {/* 您的身份为 */}
26
+          <div style={{ fontSize: '16px', fontWeight: '600' }}>{t('authentication.subTitleRight2')}</div>
27
+          <Form.Item>
28
+            <div style={{ marginBottom: '24px' }}>
29
+              <Radio style={{ fontSize: '16px' }}>{t('authentication.directorInfoRadioValue1')}</Radio>
30
+              <div>{t('authentication.directorInfoRadioText1')}</div>
31
+            </div>
32
+            <div style={{ marginBottom: '24px' }}>
33
+              <Radio style={{ fontSize: '16px' }}>{t('authentication.directorInfoRadioValue2')}</Radio>
34
+              <div>{t('authentication.directorInfoRadioText2')}</div>
35
+            </div>
36
+          </Form.Item>
37
+          {/* 企业董事 */}
38
+          <div style={{ fontSize: '16px', fontWeight: '600' }}>{t('authentication.directorInfoRadioValue1')}</div>
39
+          <Form.Item label={t('authentication.directorInfoLabel1')}>
40
+            <Select defaultValue={t('authentication.directorInfoSelectValue1')}>
41
+              <Select.Option>{t('authentication.directorInfoSelectValue1')}</Select.Option>
42
+            </Select>
43
+          </Form.Item>
44
+          <Form.Item label={t('authentication.directorInfoLabel2')}>
45
+            <Radio style={{ fontSize: '16px' }}>{t('authentication.directorInfoRadioValue')}</Radio>
46
+          </Form.Item>
47
+          {/* 企业董事 */}
48
+          <div style={{ fontSize: '16px', fontWeight: '600' }}>{t('authentication.directorInfoRadioValue1')}</div>
49
+          <Form.Item>
50
+            <div>{t('authentication.directorInfoContent1')}</div>
51
+            <div>{t('authentication.directorInfoContent2')}</div>
52
+            <div>{t('authentication.directorInfoContent3')}</div>
53
+            <div style={{ color: 'red' }}>{t('authentication.directorInfoContent4')}</div>
54
+            <Button type="link" style={{ padding: '4px 0' }}>{t('authentication.uploadBtnText')}</Button>
55
+          </Form.Item>
56
+          <Form.Item>
57
+            <div className="directorInfo-img-box">
58
+              <div style={{ fontSize: '16px' }}>{t('authentication.directorInfoSubTitle1')}</div>
59
+              <div>
60
+                <Image width={100} height={100} fallback={url} style={{ backgroundColor: '#00FA9A', opacity: '0.3' }} />
61
+                <div className="directorInfo-img-right-text">{t('authentication.directorInfoIDCardRightText')}</div>
62
+              </div>
63
+              <div style={{ marginTop: '24px', fontSize: '16px' }}>{t('authentication.directorInfoSubTitle2')}</div>
64
+              <div>
65
+                <Image width={100} height={100} fallback={url} style={{ backgroundColor: '#00FA9A', opacity: '0.3' }} />
66
+                <div className="directorInfo-img-right-text">{t('authentication.directorInfoIDCardRightText')}</div>
67
+              </div>
68
+            </div>
69
+          </Form.Item>
70
+          <Form.Item label={t('authentication.directorInfoLabel3')}>
71
+            <Input.Group>
72
+              <Row>
73
+                <Col span={8}>
74
+                  <Input placeholder={t('authentication.directorInfoInputPlaceholder1')} size="large" />
75
+                </Col>
76
+                <Col span={8} style={{ marginLeft: '36px' }}>
77
+                  <Input placeholder={t('authentication.directorInfoInputPlaceholder2')} size="large" />
78
+                </Col>
79
+              </Row>
80
+            </Input.Group>
81
+          </Form.Item>
82
+          <Form.Item label={t('authentication.directorInfoLabel4')} wrapperCol={{ span: 17 }}>
83
+            <Input placeholder={t('authentication.directorInfoInputPlaceholder3')} size="large" />
84
+          </Form.Item>
85
+          {/* 其他董事 */}
86
+          <div style={{ fontSize: '16px', fontWeight: '600' }}>{t('authentication.directorInfoOtherDirectors')}</div>
87
+        </Card>
88
+
89
+      </Form>
90
+    </>
91
+  )
92
+}

+ 163
- 0
src/pages/authentication/components/FoundationInfo.jsx Wyświetl plik

1
+import React from "react";
2
+import { Divider, Card, Steps, Button, Radio, Form, Input, Row, Col, Select } from "antd";
3
+import UploadFile from "@/components/Upload/UploadFile";
4
+import { useTranslation } from 'react-i18next';
5
+import "../style.less";
6
+
7
+export default (props) => {
8
+  const { index, setIndex } = props;
9
+  const [form] = Form.useForm();
10
+  const { t } = useTranslation();
11
+
12
+  const onFinish = () => {
13
+
14
+  };
15
+
16
+  const onNext = () => {
17
+    setIndex(index + 1)
18
+  }
19
+
20
+  return (
21
+    <>
22
+      <div style={{ fontSize: '24px', fontWeight: '400' }}>{t('authentication.titleRight')}</div>
23
+      <Card bordered={false} style={{ width: '900px', marginBottom: '24px' }}>
24
+        <div style={{ color: 'red', fontWeight: '600' }}>{t('authentication.rightTopSubTitle')}</div>
25
+        <div style={{ color: '#bfbfbf' }}>{t('authentication.rightTopText')}</div>
26
+      </Card>
27
+      <Form
28
+        form={form}
29
+        layout="vertical"
30
+        onFinish={onFinish}
31
+      >
32
+        <Card bordered={false} style={{ width: '900px', marginBottom: '24px' }}>
33
+          <Form.Item>
34
+            <div style={{ fontSize: '16px', fontWeight: '600' }}>{t('authentication.subTitleRight')}</div>
35
+            <div style={{ marginTop: '40px', fontSize: '16px' }}>{t('authentication.uploadTitle1')}</div>
36
+            <div style={{ display: 'flex', alignItem: 'stretch' }}>
37
+              <div className="authentication-right-upload-box">
38
+                <UploadFile />
39
+              </div>
40
+              <div style={{ flex: 1.2 }}>
41
+                <div style={{ padding: '0 15px' }}>{t('authentication.uploadPromptText1')}</div>
42
+                <div style={{ padding: '0 15px' }}>{t('authentication.uploadPromptText2')}</div>
43
+                <div style={{ padding: '0 15px' }}>{t('authentication.uploadPromptText3')}</div>
44
+                <Button type="link">{t('authentication.uploadBtnText')}</Button>
45
+              </div>
46
+            </div>
47
+          </Form.Item>
48
+          <Form.Item>
49
+            <div style={{ marginTop: '40px', fontSize: '16px' }}>{t('authentication.uploadTitle2')}</div>
50
+            <div style={{ display: 'flex', alignItem: 'stretch' }}>
51
+              <div className="authentication-right-upload-box">
52
+                <UploadFile />
53
+              </div>
54
+              <div style={{ flex: 1.2 }}>
55
+                <div style={{ padding: '0 15px' }}>{t('authentication.uploadPromptText1')}</div>
56
+                <div style={{ padding: '0 15px' }}>{t('authentication.uploadPromptText2')}</div>
57
+                <div style={{ padding: '0 15px' }}>{t('authentication.uploadPromptText3')}</div>
58
+                <div style={{ padding: '0 15px', fontWeight: '600' }}>4.{t('authentication.uploadPromptTextII4')}</div>
59
+                <Button type="link">{t('authentication.uploadBtnText')}</Button>
60
+              </div>
61
+            </div>
62
+          </Form.Item>
63
+          <Form.Item>
64
+            <div style={{ marginTop: '40px', fontSize: '16px' }}>{t('authentication.uploadTitle3')}</div>
65
+            <div style={{ display: 'flex', alignItem: 'stretch' }}>
66
+              <div className="authentication-right-upload-box">
67
+                <UploadFile />
68
+              </div>
69
+              <div style={{ flex: 1.2 }}>
70
+                <div style={{ padding: '0 15px' }}>{t('authentication.uploadPromptText1')}</div>
71
+                <div style={{ padding: '0 15px' }}>{t('authentication.uploadPromptText2')}</div>
72
+                <div style={{ padding: '0 15px' }}>{t('authentication.uploadPromptText3')}</div>
73
+                <div style={{ padding: '0 15px' }}>{t('authentication.uploadPromptTextIII4')}</div>
74
+                <div style={{ padding: '0 15px', fontWeight: '600' }}>5.{t('authentication.uploadPromptTextII4')}</div>
75
+                <Button type="link">{t('authentication.uploadBtnText')}</Button>
76
+              </div>
77
+            </div>
78
+          </Form.Item>
79
+          <Form.Item>
80
+            <div style={{ marginTop: '40px', fontSize: '16px' }}>{t('authentication.uploadTitle4')}</div>
81
+            <div style={{ display: 'flex', alignItem: 'stretch' }}>
82
+              <div className="authentication-right-upload-box">
83
+                <UploadFile />
84
+              </div>
85
+              <div style={{ flex: 1.2 }}>
86
+                <div style={{ padding: '0 15px' }}>{t('authentication.uploadPromptText1')}</div>
87
+                <div style={{ padding: '0 15px' }}>{t('authentication.uploadPromptText2')}</div>
88
+                <div style={{ padding: '0 15px' }}>{t('authentication.uploadPromptText3')}</div>
89
+                <Button type="link">{t('authentication.uploadBtnText')}</Button>
90
+              </div>
91
+            </div>
92
+          </Form.Item>
93
+        </Card>
94
+        <Card bordered={false} style={{ width: '900px', marginBottom: '24px' }}>
95
+          <Form.Item label={t('authentication.formRightLabel1')}>
96
+            <Radio style={{ fontSize: '16px', fontWeight: '600' }}>{t('authentication.enterpriseTypeRadio1')}</Radio>
97
+            <Radio style={{ fontSize: '16px', fontWeight: '600' }}>{t('authentication.enterpriseTypeRadio2')}</Radio>
98
+            <Radio style={{ fontSize: '16px', fontWeight: '600' }}>{t('authentication.enterpriseTypeRadio3')}</Radio>
99
+            <Radio style={{ fontSize: '16px', fontWeight: '600' }}>{t('authentication.enterpriseTypeRadio4')}</Radio>
100
+          </Form.Item>
101
+          <Form.Item label={t('authentication.formRightLabel2')}>
102
+            <Input.Group>
103
+              <Row>
104
+                <Col span={8}>
105
+                  <Input placeholder="12345678" size="large" />
106
+                </Col>
107
+                <Col span={4}><Input placeholder="000" size="large" /></Col>
108
+              </Row>
109
+            </Input.Group>
110
+          </Form.Item>
111
+
112
+
113
+          <Form.Item label={t('authentication.formRightLabel3')} wrapperCol={{ span: 8 }}>
114
+            <Select defaultValue={t('authentication.formRightSelect1')}>
115
+            </Select>
116
+          </Form.Item>
117
+
118
+          <Form.Item>
119
+            <Select placeholder={t('authentication.formRightSelectPlaceholder1')}>
120
+            </Select>
121
+          </Form.Item>
122
+          <Form.Item>
123
+            <Input placeholder={t('authentication.formRightInputPlaceholder2')} />
124
+          </Form.Item>
125
+          <Form.Item>
126
+            <Input placeholder={t('authentication.formRightInputPlaceholder3')} />
127
+          </Form.Item>
128
+          <Form.Item>
129
+            <Input placeholder={t('authentication.formRightInputPlaceholder4')} />
130
+          </Form.Item>
131
+          <Form.Item label={t('authentication.formRightLabel4')} wrapperCol={{ span: 8 }}>
132
+            <Select defaultValue={t('authentication.formRightSelectPlaceholderII1')}>
133
+            </Select>
134
+          </Form.Item>
135
+
136
+          <Form.Item>
137
+            <Select placeholder={t('authentication.formRightSelectPlaceholder1')}>
138
+            </Select>
139
+          </Form.Item>
140
+          <Form.Item>
141
+            <Input placeholder={t('authentication.formRightInputPlaceholder2')} />
142
+          </Form.Item>
143
+          <Form.Item>
144
+            <Input placeholder={t('authentication.formRightInputPlaceholder3')} />
145
+          </Form.Item>
146
+          <Form.Item>
147
+            <Input placeholder={t('authentication.formRightInputPlaceholder4')} />
148
+          </Form.Item>
149
+
150
+          <Form.Item label={t('authentication.formRightLabel5')}>
151
+            <Select placeholder={t('authentication.formRightInputPlaceholder5')}>
152
+            </Select>
153
+          </Form.Item>
154
+          <Form.Item label={t('authentication.formRightLabel6')}>
155
+            <Select placeholder={t('authentication.formRightInputPlaceholder6')}>
156
+            </Select>
157
+          </Form.Item>
158
+          <Button type="primary" onClick={onNext} >{t('authentication.foundationInfoNextBtn')}</Button>
159
+        </Card>
160
+      </Form>
161
+    </>
162
+  )
163
+}

+ 58
- 0
src/pages/authentication/index.jsx Wyświetl plik

1
+import React, { useState } from "react";
2
+import { Divider, Card, Steps, Button, Radio, Form, Input, Row, Col, Select } from "antd";
3
+import Page from "@/components/Page";
4
+import FoundationInfo from "./components/FoundationInfo";
5
+import DirectorInfo from "./components/DirectorInfo";
6
+import { useTranslation } from 'react-i18next';
7
+import "./style.less";
8
+
9
+export default (props) => {
10
+  const { t } = useTranslation();
11
+  const [index, setIndex] = useState(0);
12
+  return (
13
+    <Page>
14
+      <div className="authentication-box">
15
+        <div className="authentication-left">
16
+          <div style={{ fontSize: '24px', fontWeight: '400' }}>{t('authentication.titleLeft')}</div>
17
+          <Card bordered={false}>
18
+            <Steps
19
+              style={{ height: '360px' }}
20
+              progressDot
21
+              current={index}
22
+              direction="vertical"
23
+              items={[
24
+                {
25
+                  title: t('authentication.stepsTitle1'),
26
+                },
27
+                {
28
+                  title: t('authentication.stepsTitle2')
29
+                },
30
+                {
31
+                  title: t('authentication.stepsTitle3')
32
+                },
33
+                {
34
+                  title: t('authentication.stepsTitle4')
35
+                },
36
+                {
37
+                  title: t('authentication.stepsTitle5')
38
+                },
39
+              ]}
40
+            />
41
+          </Card>
42
+        </div>
43
+        <div style={{ flex: 1.5 }}>
44
+          {
45
+            index === 0 && (
46
+              <FoundationInfo index={index} setIndex={setIndex} />
47
+            )
48
+          },
49
+          {
50
+            index === 1 && (
51
+              <DirectorInfo />
52
+            )
53
+          }
54
+        </div>
55
+      </div>
56
+    </Page>
57
+  )
58
+}

+ 30
- 0
src/pages/authentication/style.less Wyświetl plik

1
+.authentication-box {
2
+  display: flex;
3
+  align-items: stretch;
4
+  height: 100%;
5
+  .authentication-left {
6
+    flex: 0.5;
7
+    margin-right: 36px;
8
+  }
9
+  .authentication-right-upload-box {
10
+    width: 200px;
11
+    height: 120px;
12
+    border-radius: 1em;
13
+    display: flex;
14
+    justify-content: center;
15
+    align-items: center;
16
+    border: 1px dashed;
17
+    display: 1;
18
+    flex: 0.8;
19
+  }
20
+  .directorInfo-img-right-text {
21
+    font-size: 16px;
22
+    padding-left: 1em;
23
+    display: inline-block;
24
+  }
25
+  .directorInfo-img-box {
26
+    padding: 12px;
27
+    width: 600px;
28
+    background-color: #bfbfbf;
29
+  }
30
+}

+ 14
- 5
src/routes/routes.jsx Wyświetl plik

9
 import AuthLayout from "@/layouts/AuthLayout";
9
 import AuthLayout from "@/layouts/AuthLayout";
10
 import Login from "@/pages/login";
10
 import Login from "@/pages/login";
11
 import Page404 from "@/pages/404";
11
 import Page404 from "@/pages/404";
12
+import Authentication from "@/pages/authentication";
12
 import HomePage from "@/pages/homepage";
13
 import HomePage from "@/pages/homepage";
13
 import AccountManagement from "@/pages/accountmanagement";
14
 import AccountManagement from "@/pages/accountmanagement";
14
 import QuickPass from "@/pages/quickpass";
15
 import QuickPass from "@/pages/quickpass";
45
     // index: true,
46
     // index: true,
46
     element: <Navigate to="/homepage" />,
47
     element: <Navigate to="/homepage" />,
47
   },
48
   },
48
-
49
+  // 实名认证流程
50
+  {
51
+    path: "/authentication",
52
+    element: <Authentication />,
53
+    meta: {
54
+      title: "",
55
+      hideInMenu: true
56
+    },
57
+  },
49
   {
58
   {
50
     path: "homepage",
59
     path: "homepage",
51
     element: <HomePage />,
60
     element: <HomePage />,
101
     element: <Outlet />,
110
     element: <Outlet />,
102
     meta: {
111
     meta: {
103
       title: "量子卡",
112
       title: "量子卡",
104
-      icon: <CreditCardOutlined/>,
113
+      icon: <CreditCardOutlined />,
105
     },
114
     },
106
     children: [
115
     children: [
107
       {
116
       {
117
         meta: {
126
         meta: {
118
           title: "量子额度卡",
127
           title: "量子额度卡",
119
         },
128
         },
120
-      },  {
129
+      }, {
121
         path: "transactioninquiry",
130
         path: "transactioninquiry",
122
         element: <TransactionInquiry />,
131
         element: <TransactionInquiry />,
123
         meta: {
132
         meta: {
203
   },
212
   },
204
 ];
213
 ];
205
 
214
 
206
-export function mergeAuthRoutes(r1, r2) {
215
+export function mergeAuthRoutes (r1, r2) {
207
   const r = r1.slice();
216
   const r = r1.slice();
208
   const children = r1[0].children.slice();
217
   const children = r1[0].children.slice();
209
   r[0].children = children.concat(r2);
218
   r[0].children = children.concat(r2);
213
 // 全部路由
222
 // 全部路由
214
 export const routes = mergeAuthRoutes(defaultRoutes, authRoutes);
223
 export const routes = mergeAuthRoutes(defaultRoutes, authRoutes);
215
 console.log(routes);
224
 console.log(routes);
216
-function getPath(parent = "/", current = "") {
225
+function getPath (parent = "/", current = "") {
217
   if (current.indexOf("/") === 0 || current.indexOf("http") === 0)
226
   if (current.indexOf("/") === 0 || current.indexOf("http") === 0)
218
     return current;
227
     return current;
219
   return `${parent}/${current}`.replace(/\/\//g, "/");
228
   return `${parent}/${current}`.replace(/\/\//g, "/");