浏览代码

个人认证完成,待测试

yee 8 年之前
父节点
当前提交
04b12ca188
共有 39 个文件被更改,包括 2923 次插入55 次删除
  1. 1 1
      build/admin/servicesManage/patent.js
  2. 1 1
      build/user/account/index.js
  3. 5 5
      build/user/account/services.js
  4. 5 5
      build/user/account/set.js
  5. 1 1
      build/user/certify.css
  6. 1 1
      build/user/certify.html
  7. 19 2
      build/user/certify.js
  8. 1 0
      build/user/groupCertify.css
  9. 32 0
      build/user/groupCertify.html
  10. 23 0
      build/user/groupCertify.js
  11. 1 1
      build/user/index.js
  12. 2 2
      build/user/login.js
  13. 3 3
      build/user/signIn.js
  14. 2 2
      build/vendors.js
  15. 1 6
      js/component/account/set/base.jsx
  16. 1 1
      js/component/account/topTab.jsx
  17. 85 0
      js/component/certify/audit.jsx
  18. 151 0
      js/component/certify/bank.jsx
  19. 147 1
      js/component/certify/certify.less
  20. 165 0
      js/component/certify/confirm.jsx
  21. 111 13
      js/component/certify/content.jsx
  22. 129 0
      js/component/certify/money.jsx
  23. 299 7
      js/component/certify/personal.jsx
  24. 95 0
      js/component/certify/result.jsx
  25. 1 1
      js/component/certify/top.jsx
  26. 85 0
      js/component/groupCertify/audit.jsx
  27. 203 0
      js/component/groupCertify/bank.jsx
  28. 302 0
      js/component/groupCertify/certify.less
  29. 161 0
      js/component/groupCertify/confirm.jsx
  30. 157 0
      js/component/groupCertify/content.jsx
  31. 15 0
      js/component/groupCertify/footer.jsx
  32. 129 0
      js/component/groupCertify/money.jsx
  33. 417 0
      js/component/groupCertify/personal.jsx
  34. 95 0
      js/component/groupCertify/result.jsx
  35. 29 0
      js/component/groupCertify/top.jsx
  36. 12 0
      js/component/tools.js
  37. 17 0
      js/user/groupCertify.js
  38. 11 1
      webpack.config.js
  39. 8 1
      webpack.config.pro.js

文件差异内容过多而无法显示
+ 1 - 1
build/admin/servicesManage/patent.js


文件差异内容过多而无法显示
+ 1 - 1
build/user/account/index.js


文件差异内容过多而无法显示
+ 5 - 5
build/user/account/services.js


文件差异内容过多而无法显示
+ 5 - 5
build/user/account/set.js


文件差异内容过多而无法显示
+ 1 - 1
build/user/certify.css


+ 1 - 1
build/user/certify.html

@@ -4,7 +4,7 @@
 <head>
     <meta charset="utf-8">
     <title>
-        用户认证
+        个人用户认证
     </title>
     <script>
         // window.userData = {

文件差异内容过多而无法显示
+ 19 - 2
build/user/certify.js


文件差异内容过多而无法显示
+ 1 - 0
build/user/groupCertify.css


+ 32 - 0
build/user/groupCertify.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <title>
+        团体用户认证
+    </title>
+    <script>
+        // window.userData = {
+        //     mobile: "13600000000",
+        //     nickname: "Lina",
+        //     number: "80000",
+        //     type: "0",
+        //     email: "test@aft.com",
+        //     createTime: "123456789000",
+        //     lvl: "0"
+        // }
+        // window.globalConfig = {
+        //     context: "//aft.hnzhiming.com:8080/aft",
+        //     staticHost: "//aft.hnzhiming.com",
+        //     uploadPath: "/data/wwwroot/aft/upload",
+        //     uploadPrivatePath: "/data/upload"
+        // }
+    </script>
+<link href="../user/groupCertify.css" rel="stylesheet"></head>
+
+<body>
+    <div id="root"></div>
+<script type="text/javascript" src="../vendors.js"></script><script type="text/javascript" src="../user/groupCertify.js"></script></body>
+
+</html>

文件差异内容过多而无法显示
+ 23 - 0
build/user/groupCertify.js


+ 1 - 1
build/user/index.js

@@ -1 +1 @@
-webpackJsonp([8],[function(e,t,n){"use strict";function u(e){return e&&e.__esModule?e:{default:e}}var l=n(1),d=u(l),r=n(28),a=u(r);a.default.render(d.default.createElement("div",null,d.default.createElement("span",null,"this is user-index")),document.getElementById("root"))}]);
+webpackJsonp([9],[function(e,t,n){"use strict";function u(e){return e&&e.__esModule?e:{default:e}}var l=n(1),d=u(l),r=n(28),a=u(r);a.default.render(d.default.createElement("div",null,d.default.createElement("span",null,"this is user-index")),document.getElementById("root"))}]);

文件差异内容过多而无法显示
+ 2 - 2
build/user/login.js


文件差异内容过多而无法显示
+ 3 - 3
build/user/signIn.js


文件差异内容过多而无法显示
+ 2 - 2
build/vendors.js


+ 1 - 6
js/component/account/set/base.jsx

@@ -51,11 +51,6 @@ class Avatar extends React.Component {
             this.props.urlData(info.file.response.data);
         }
     }
-    theObj() {
-        return {
-            'sign': this.props.name
-        }
-    }
     render() {
         const imageUrl = this.state.imageUrl;
         return (
@@ -64,7 +59,7 @@ class Avatar extends React.Component {
                 name={this.props.name}
                 showUploadList={false}
                 action={globalConfig.context + "/api/user/identity/upload"}
-                data={this.theObj.bind(this)}
+                data={{'sign': this.props.name}}
                 beforeUpload={beforeUpload}
                 onChange={this.handleChange.bind(this)}
                 >

+ 1 - 1
js/component/account/topTab.jsx

@@ -27,7 +27,7 @@ const TopTab = React.createClass({
             <div className="account-top" >
                 <div className="acc-top-user">
                     <span className="acc-top-user-name">欢迎您, {userData.nickname || userData.number || this.state.username} <a onClick={this.logOut}>[ 退出 ]</a></span>
-                    <span className="acc-top-user-toindex"><a href="../index.html">返回首页</a></span>
+                    <span className="acc-top-user-toindex"><a href={userData.type == 1 ? "../groupCertify.html" : "../certify.html" }>实名认证</a>&nbsp;&nbsp;&nbsp;<a href="../index.html">返回首页</a></span>
                 </div>
                 <div className="acc-index">
                     <div className="acc-index-imgbox">

+ 85 - 0
js/component/certify/audit.jsx

@@ -0,0 +1,85 @@
+import React from 'react';
+import { Input, Button, Form, Icon, Spin, message, } from 'antd';
+import './certify.less';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+
+const Content = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/user/userNextPro",
+            data: {
+                process: 4
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+                this.props.changeStep(5);
+            } else {
+                message.warning(data.error[0].message);
+            }
+        }.bind(this)).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    componentWillMount() {
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/userPro",
+            success: function (data) {
+                if (data.data) {
+                    this.setState({
+                        bankCardNumber : data.data.bankCardNumber
+                    });
+                } else {
+                    message.warning(data.error[0].message);
+                };
+            }.bind(this),
+        });
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 4 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Spin spinning={this.state.loading} className="certify-spin">
+                <Form horizontal onSubmit={this.handleSubmit} className="certify-form">
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <p className="certify-title">信息提交成功</p>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 18, offset: 4 }}>
+                        <span>
+                            认证系统将会在1-2个工作日内给您的银行卡{this.state.bankCardNumber}转入一笔1元以下的确认金额,
+                            然后在下方正确填写正确的金额数目。
+                            若打款成功,认证系统将会通过短信的方式通知您
+                        </span>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <Button className="set-submit" type="primary" htmlType="submit">输入打款金额</Button>
+                    </FormItem>
+                </Form >
+            </Spin >
+        );
+    },
+}));
+
+export default Content;

+ 151 - 0
js/component/certify/bank.jsx

@@ -0,0 +1,151 @@
+import React from 'react';
+import { Input, Button, Form, Icon, Spin, message, } from 'antd';
+import './certify.less';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+
+const Content = Form.create()(React.createClass({
+    getData() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/userPro",
+            success: function (data) {
+                if (data.data) {
+                    this.state.username = data.data.username;
+                } else {
+                    message.warning(data.error[0].message);
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.setState({
+                    loading: true
+                });
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/api/user/userNextPro",
+                    data: {
+                        bankName: this.state.username,
+                        bankAccount: values.bankAccount,
+                        bankCardNumber: values.bankCardNumber,
+                        process: 2
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.changeStep(3);
+                    } else {
+                        message.warning(data.error[0].message);
+                    }
+                }.bind(this)).always(function () {
+                    this.setState({
+                        loading: false
+                    });
+                }.bind(this));
+            }
+        });
+    },
+    checkBankCardNum(rule, value, callback) {
+        if (!/(^\d{15,}$)/.test(value)) {
+            callback('请输入正确的银行卡号!');
+        } else {
+            callback();
+        }
+    },
+    getIdCardUrl1(e) {
+        this.state.idCardUrl1 = e;
+    },
+    getIdCardUrl2(e) {
+        this.state.idCardUrl2 = e;
+    },
+    componentDidMount() {
+        this.getData();
+    },
+    changeStep() {
+        this.props.changeStep(1);
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 4 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Spin spinning={this.state.loading} className="certify-spin">
+                <Form horizontal onSubmit={this.handleSubmit} className="certify-form">
+                    <FormItem wrapperCol={{ span: 20, offset: 4 }}>
+                        <p className="certify-title">请填写您的银行卡信息,该银行卡仅用于认证您的身份。</p>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="银行开户名"
+                        extra={<span><Icon type="exclamation-circle" /> 必须使用以“{this.state.username}”为开户名的银行卡进行认证</span>}
+                    >
+                        {getFieldDecorator('username')(
+                            <span>{this.state.username}</span>
+                        )}
+                        <a style={{ 'color': '#ea0862' }} onClick={_me.changeStep}>修改</a>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="开户银行"
+                        extra={<span><Icon type="exclamation-circle" /> 不支持信用卡和存折进行认证</span>}
+                    >
+                        {getFieldDecorator('bankAccount', {
+                            initialValue: this.state.bankAccount || null,
+                            rules: [{ required: true, message: '请输入开户银行名称!' }]
+                        })(
+                            <Input placeholder="请输入开户银行名称" />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="银行卡号"
+                        extra={
+                            <span style={{ 'color': '#ea0862' }}>
+                                <Icon type="exclamation-circle" />
+                                认证系统会给该银行卡打入一笔1元以下的确认金额,您需要通过银行柜台并在
+                                步骤4输入该银行卡收到的阿凡提打款金额数目
+                            </span>}
+                    >
+                        {getFieldDecorator('bankCardNumber', {
+                            initialValue: this.state.bankCardNumber || null,
+                            rules: [{
+                                validator: this.checkIdcardnum,
+                            }],
+                        })(
+                            <Input placeholder="请输入银行卡号" />
+                            )}
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <Button className="set-submit" type="primary" htmlType="submit">下一步</Button>
+                    </FormItem>
+                </Form >
+            </Spin >
+        );
+    },
+}));
+
+export default Content;

+ 147 - 1
js/component/certify/certify.less

@@ -52,6 +52,7 @@
                 }
             }
             .certify-content {
+                min-height: 600px;
                 .certify-step {
                     width: 1030px;
                     height: 60px;
@@ -140,13 +141,158 @@
                         }
                     }
                 }
+                .certify-form-box {
+                    width: 600px;
+                    margin: 0 auto;
+                    .certify-form {
+                        #address {
+                            select {
+                                height: 32px;
+                                border: 1px solid #d9d9d9;
+                                border-radius: 4px;
+                                margin-right: 6px;
+                            }
+                        }
+                        .ant-form-explain {
+                            span {
+                                line-height: 26px;
+                            }
+                        }
+                        .idCard-text {
+                            display: inline-block;
+                            width: 150px;
+                            margin-right: 20px;
+                            text-align: center;
+                        }
+                        .idcard-img {
+                            >div {
+                                float: left;
+                                padding: 20px;
+                                border: 1px solid #c9c9c9;
+                                margin-right: 20px;
+                                >.idcard-imgbox {
+                                    width: 142px;
+                                    height: 90px;
+                                    padding-top: 90px;
+                                    position: relative;
+                                    img {
+                                        width: 142px;
+                                        height: 90px;
+                                        position: absolute;
+                                        top: 0;
+                                        left: 0;
+                                        border: 1px solid #c9c9c9;
+                                        border-radius: 6px;
+                                    }
+                                }
+                            }
+                        }
+                        .getVcode {
+                            height: 32px;
+                            width: 100%;
+                            padding-top: 32px;
+                            position: relative;
+                            overflow: hidden;
+                            img {
+                                position: absolute;
+                                top: 0;
+                                left: 0;
+                                width: 100%;
+                                height: 32px;
+                            }
+                        }
+                        .set-submit {
+                            min-width: 100px;
+                        }
+                        .exit {
+                            width: 160px;
+                            margin-left: 20px;
+                            color: #fff;
+                            background: #ff6500;
+                            border: none;
+                        }
+                        .ant-form-item-label {
+                            >label {
+                                &:before {
+                                    content: ''
+                                }
+                            }
+                        }
+                        .certify-title {
+                            font-size: 20px;
+                        }
+                        .fromItem-postfix {
+                            position: absolute;
+                            margin-left: 10px;
+                        }
+                    }
+                    .certify-result-box {
+                        .certify-title {
+                            font-size: 20px;
+                        }
+                        .certify-result-state {
+                            position: relative;
+                            padding-left: 46px;
+                            margin: 20px auto;
+                            width: 400px;
+                            i {
+                                width: 40px;
+                                height: 40px;
+                                border-radius: 50%;
+                                background: #58a3ff;
+                                color: #fff;
+                                text-align: center;
+                                line-height: 40px;
+                                font-size: 33px;
+                                position: absolute;
+                                top: 6px;
+                                left: 0;
+                            }
+                            p {
+                                line-height: 24px;
+                            }
+                            button {
+                                margin-top:10px; 
+                            }
+                        }
+                    }
+                    .avatar-uploader,
+                    .avatar-uploader-trigger,
+                    .avatar {
+                        width: 150px;
+                        height: 150px;
+                    }
+                    .avatar-uploader {
+                        display: block;
+                        padding: 1px;
+                        border: 1px dashed #d9d9d9;
+                        border-radius: 6px;
+                        cursor: pointer;
+                        position: relative;
+                        img {
+                            position: absolute;
+                            top: -1px;
+                            left: -1px;
+                            height: 150px;
+                        }
+                        //
+                        float: left;
+                        margin-right: 20px;
+                    }
+                    .avatar-uploader-trigger {
+                        display: table-cell;
+                        vertical-align: middle;
+                        font-size: 28px;
+                        color: #999;
+                    }
+                }
             }
             .footer {
                 padding: 10px 0;
                 text-align: center;
                 background: #f0f0f0;
                 p {
-                    margin: 10px 0;
+                    line-height: 24px;
                 }
             }
         }

+ 165 - 0
js/component/certify/confirm.jsx

@@ -0,0 +1,165 @@
+import React from 'react';
+import { Input, Button, Form, Icon, Spin, message, } from 'antd';
+import './certify.less';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+
+const Content = Form.create()(React.createClass({
+    getData() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/userPro",
+            success: function (data) {
+                if (data.data) {
+                    this.setState({
+                        username: data.data.username,
+                        idNumber: data.data.idNumber,
+                        contactMobile: data.data.contactMobile,
+                        bankName: data.data.bankName,
+                        bankAccount: data.data.bankAccount,
+                        bankCardNumber: data.data.bankCardNumber,
+                        positiveIdUrl:data.data.positiveIdUrl,
+                        oppositeIdUrl:data.data.oppositeIdUrl
+                    });
+                } else {
+                    message.warning(data.error[0].message);
+                }
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/user/userNextPro",
+            data: {
+                process: 3
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+                this.props.changeStep(4);
+            } else {
+                message.warning(data.error[0].message);
+            }
+        }.bind(this)).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    componentWillMount() {
+        this.getData();
+    },
+    changeStep() {
+        this.props.changeStep(1);
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 4 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Spin spinning={this.state.loading} className="certify-spin">
+                <Form horizontal onSubmit={this.handleSubmit} className="certify-form">
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <p className="certify-title">请确认个人信息</p>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="真实姓名"
+                    >
+                        <span>{this.state.username}</span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="身份证号码"
+                    >
+                        <span>{this.state.idNumber}</span>
+                    </FormItem>
+                    <FormItem
+                        labelCol={{ span: 4 }}
+                        wrapperCol={{ span: 18 }}
+                        label="身份证图片"
+                    >
+                        <div className="idcard-img clearfix">
+                            <div>
+                                <div className="idcard-imgbox">
+                                    <img src={globalConfig.context + '/open/writeImage?path=' + this.state.positiveIdUrl } alt="" 
+                                    onClick={(e)=>{window.open(e.target.src)}}/>
+                                </div>
+                            </div>
+                            <div>
+                                <div className="idcard-imgbox">
+                                    <img src={globalConfig.context + '/open/writeImage?path=' + this.state.oppositeIdUrl} alt="" 
+                                    onClick={(e)=>{window.open(e.target.src)}}/>
+                                </div>
+                            </div>
+                        </div>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="联系方式"
+                    >
+                        <span>{this.state.contactMobile}</span>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <p className="certify-title">请确认银行卡信息</p>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="银行开户名"
+                    >
+                        <span>{this.state.bankName}</span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="开户银行"
+                    >
+                        <span>{this.state.bankAccount}</span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="银行卡号"
+                    >
+                        <span>{this.state.bankCardNumber}</span>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 18, offset: 4 }}>
+                        <span style={{ 'color': '#ea0862' }}>
+                            <Icon type="exclamation-circle" />
+                            提醒:银行卡号、身份证号码,认证成功之前,最多只能申请认证3次,
+                            认证成功后,不能再申请认证。
+                        </span>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <Button className="set-submit" type="primary" htmlType="submit">下一步</Button>
+                        <Button className="exit" type="ghost" onClick={_me.changeStep}>返回修改</Button>
+                    </FormItem>
+                </Form >
+            </Spin >
+        );
+    },
+}));
+
+export default Content;

+ 111 - 13
js/component/certify/content.jsx

@@ -3,22 +3,110 @@ import { Icon } from 'antd';
 import './certify.less';
 
 import Personal from './personal.jsx';
+import Bank from './bank.jsx';
+import Confirm from './confirm.jsx';
+import Audit from './audit.jsx';
+import Money from './money.jsx';
+import Result from './result.jsx';
 
 const Content = React.createClass({
+    stepNumSwith(num) {
+        switch (num) {
+            case 1:
+                this.setState({
+                    step0Class: 'step-done',
+                    step1Class: 'step-doing',
+                    step2Class: 'step-none',
+                    step3Class: 'step-none',
+                    step4Class: 'step-none',
+                    step5Class: 'step-none',
+                    step6Class: 'step-none'
+                });
+                break;
+            case 2:
+                this.setState({
+                    step0Class: 'step-off',
+                    step1Class: 'step-done',
+                    step2Class: 'step-doing',
+                    step3Class: 'step-none',
+                    step4Class: 'step-none',
+                    step5Class: 'step-none',
+                    step6Class: 'step-none'
+                });
+                break;
+            case 3:
+                this.setState({
+                    step0Class: 'step-off',
+                    step1Class: 'step-off',
+                    step2Class: 'step-done',
+                    step3Class: 'step-doing',
+                    step4Class: 'step-none',
+                    step5Class: 'step-none',
+                    step6Class: 'step-none'
+                });
+                break;
+            case 4:
+                this.setState({
+                    step0Class: 'step-off',
+                    step1Class: 'step-off',
+                    step2Class: 'step-off',
+                    step3Class: 'step-done',
+                    step4Class: 'step-doing',
+                    step5Class: 'step-none',
+                    step6Class: 'step-none'
+                });
+                break;
+            case 5:
+                this.setState({
+                    step0Class: 'step-off',
+                    step1Class: 'step-off',
+                    step2Class: 'step-off',
+                    step3Class: 'step-off',
+                    step4Class: 'step-done',
+                    step5Class: 'step-doing',
+                    step6Class: 'step-none'
+                });
+                break;
+            case 6:
+                this.setState({
+                    step0Class: 'step-off',
+                    step1Class: 'step-off',
+                    step2Class: 'step-off',
+                    step3Class: 'step-off',
+                    step4Class: 'step-off',
+                    step5Class: 'step-done',
+                    step6Class: 'step-doing'
+                });
+                break;
+        };
+    },
+    getData() {
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/userPro",
+            success: function (data) {
+                if (data.data) {
+                    this.state.stepNum = data.data.process + 1
+                } else {
+                    message.warning(data.error[0].message);
+                };
+            }.bind(this),
+        });
+    },
     getInitialState() {
         return {
             loading: false,
-            theKey: 'personal',
-            stepNum: 1,
-            step0Class:'step-done',
-            step1Class:'step-doing',
-            step2Class:'step-none',
-            step3Class:'step-none',
-            step4Class:'step-none',
-            step5Class:'step-none',
-            step6Class:'step-none',
+            stepNum: 3
         };
     },
+    componentWillMount() {
+        this.stepNumSwith(this.state.stepNum);
+    },
+    changeStep(i) {
+        this.state.stepNum = i;
+        this.stepNumSwith(i)
+    },
     render() {
         return (
             <div className="certify-content">
@@ -43,11 +131,21 @@ const Content = React.createClass({
                         {this.state.stepNum > 6 ? <Icon type="check" /> : <i>6</i>}<div>认证结果</div>
                     </div>
                 </div>
-                <div className="certify-form">
+                <div className="certify-form-box">
                     {(() => {
-                        switch (this.state.leftKey) {
-                            case 'personal':
-                                return <Personal />;
+                        switch (this.state.stepNum) {
+                            case 1:
+                                return <Personal changeStep={this.changeStep} />;
+                            case 2:
+                                return <Bank changeStep={this.changeStep} />;
+                            case 3:
+                                return <Confirm changeStep={this.changeStep} />;
+                            case 4:
+                                return <Audit changeStep={this.changeStep} />;
+                            case 5:
+                                return <Money changeStep={this.changeStep} />;
+                            case 6:
+                                return <Result changeStep={this.changeStep} />;
                         };
                     })()}
                 </div>

+ 129 - 0
js/component/certify/money.jsx

@@ -0,0 +1,129 @@
+import React from 'react';
+import { Input, Button, Form, Icon, Spin, message, } from 'antd';
+import './certify.less';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+
+const Content = Form.create()(React.createClass({
+    getData() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/userPro",
+            success: function (data) {
+                if (data.data) {
+                    this.setState({
+                        bankAccount: bankAccount,
+                        bankCardNumber: bankCardNumber
+                    });
+                } else {
+                    message.warning(data.error[0].message);
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.setState({
+                    loading: true
+                });
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/api/user/userNextPro",
+                    data: {
+                        amountMoney:values.amountMoney,
+                        process:5
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.change(6);
+                    } else {
+                        if ( data.amountError.length ) {
+                            message.warning(data.amountError[0].message);
+                        } else if ( data.error.length) {
+                            message.warning(data.error[0].message);
+                        }; 
+                    }
+                }.bind(this)).always(function () {
+                    this.setState({
+                        loading: false
+                    });
+                }.bind(this));
+            }
+        });
+    },
+    componentWillMount() {
+        this.getData();
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 4 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Spin spinning={this.state.loading} className="certify-spin">
+                <Form horizontal onSubmit={this.handleSubmit} className="certify-form">
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <p className="certify-title">输入打款金额</p>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 18, offset: 4 }}>
+                        <span>
+                            请在下方输入银行卡{this.state.bankCardNumber}收到的认证打款,
+                            务必在收到打款5日内完成,否则将无法完成
+                        </span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="开户银行"
+                    >
+                        <span>{this.state.bankAccount}</span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="银行卡号"
+                    >
+                        <span>{this.state.bankCardNumber}</span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="打款金额"
+                        extra={<span style={{ 'color': '#ea0862' }}><Icon type="exclamation-circle" /> 仅有3次输入机会,如3次输入有误,需更换银行卡重新认证</span>}
+                    >
+                        {getFieldDecorator('amountMoney', {
+                            rules: [{ required: true, message: '请输入金额!' }]
+                        })(
+                            <Input />
+                            )}
+                            <span className="fromItem-postfix">元</span>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <Button className="set-submit" type="primary" htmlType="submit">确认</Button>
+                    </FormItem>
+                </Form >
+            </Spin >
+        );
+    },
+}));
+
+export default Content;

+ 299 - 7
js/component/certify/personal.jsx

@@ -1,14 +1,306 @@
 import React from 'react';
-import {Input } from 'antd';
+import { Input, Button, Form, Upload, Icon, Spin, message, Row, Col } from 'antd';
+import './certify.less';
+import { addressInit, getBase64, beforeUpload } from '../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
 
-const Content = React.createClass({
+import card1 from '../../../image/idcard1.jpg';
+import card2 from '../../../image/idcard2.jpg';
+
+class Avatar extends React.Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            imageUrl: ''
+        }
+    }
+
+    handleChange(info) {
+        if (info.file.status === 'done') {
+            // Get this url from response in real world.
+            getBase64(info.file.originFileObj, imageUrl => this.setState({ imageUrl }));
+            this.props.urlData(info.file.response.data);
+        }
+    }
     render() {
+        const imageUrl = this.state.imageUrl;
         return (
-            <div>
-                <Input />
-            </div>
-        )
+            <Upload
+                className="avatar-uploader"
+                name={this.props.name}
+                showUploadList={false}
+                action={globalConfig.context + "/api/user/identity/upload"}
+                data={{ 'sign': this.props.name }}
+                beforeUpload={beforeUpload}
+                onChange={this.handleChange.bind(this)}
+            >
+                {
+                    imageUrl ?
+                        <img src={imageUrl} role="presentation" id={this.props.name} /> :
+                        <Icon type="plus" className="avatar-uploader-trigger" />
+                }
+            </Upload>
+        );
     }
-});
+};
+
+
+const Content = Form.create()(React.createClass({
+    getData() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/userPro",
+            success: function (data) {
+                if (data.data) {
+                    addressInit('cmbProvince', 'cmbCity', 'cmbArea',
+                        data.data.province, data.data.city, data.data.area);
+                    this.setState({
+                        aftUsername: data.data.aftUsername,
+                        username: data.data.username,
+                        idNumber: data.data.idNumber,
+                        contactMobile: data.data.contactMobile
+                    });
+                } else {
+                    message.warning(data.error[0].message);
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            //地址值
+            let cmbP = document.getElementById('cmbProvince').value;
+            let cmbC = document.getElementById('cmbCity').value;
+            let cmbA = document.getElementById('cmbArea').value;
+            if (cmbP || cmbC || cmbA) {
+                message.warning("请选择所在地!");
+                return;
+            };
+            if (this.state.idCardUrl1 || this.state.idCardUrl2) {
+                message.warning("请上传身份证!");
+                return;
+            };
+            if (!err) {
+                this.setState({
+                    loading: true
+                });
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/api/user/userNextPro",
+                    data: {
+                        verificationCode: values.captcha,
+                        aftUsername: values.aftUsername,
+                        username: values.username,
+                        idNumber: values.idNumber,
+                        positiveIdUrl: this.state.idCardUrl1,
+                        oppositeIdUrl: this.state.idCardUrl2,
+                        province: cmbP,
+                        city: cmbC,
+                        area: cmbA,
+                        contactMobile: values.contactMobile,
+                        process: 1
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.changeStep(2);
+                    } else {
+                        message.warning(data.error[0].message);
+                    }
+                }.bind(this)).always(function () {
+                    this.setState({
+                        loading: false
+                    });
+                }.bind(this));
+            }
+        });
+    },
+    checkPhone(rule, value, callback) {
+        const form = this.props.form;
+        const _me = this;
+        if (!(/^1[34578]\d{9}$/.test(value))) {
+            callback('请输入正确的手机号码!');
+            _me.setState({
+                getCodeButton: true
+            });
+        } else {
+            callback();
+            _me.setState({
+                getCodeButton: false
+            });
+        }
+    },
+    checkIdcardnum(rule, value, callback) {
+        if (!/(^\d{15}$)|(^\d{17}(\d|X)$)/.test(value)) {
+            callback('请输入正确的身份证号!');
+        } else {
+            callback();
+        }
+    },
+    getIdCardUrl1(e) {
+        this.state.idCardUrl1 = e;
+    },
+    getIdCardUrl2(e) {
+        this.state.idCardUrl2 = e;
+    },
+    componentDidMount() {
+        addressInit('cmbProvince', 'cmbCity', 'cmbArea');
+        this.getData();
+    },
+    reloadVCode(e) {
+        e.target.src = globalConfig.context + '/open/getVCode?t=' + Math.random();
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 4 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Spin spinning={this.state.loading} className="certify-spin">
+                <Form horizontal onSubmit={this.handleSubmit} className="certify-form">
+                    <FormItem
+                        {...formItemLayout}
+                        label="用户名"
+                        extra={<span><Icon type="exclamation-circle" /> 建议字母、数字和符号两种以上组合,6-20个字符</span>}
+                    >
+                        {getFieldDecorator('aftUsername', {
+                            initialValue: this.state.aftUsername || null,
+                            rules: [{ required: true, message: '请输入用户名!' }]
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="真实姓名"
+                    >
+                        {getFieldDecorator('username', {
+                            initialValue: this.state.username || null,
+                            rules: [{ required: true, message: '请输入真实姓名!' }]
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="所在地"
+                    >
+                        {getFieldDecorator('address')(
+                            <div>
+                                <select id="cmbProvince" name="cmbProvince"></select>
+                                <select id="cmbCity" name="cmbCity"></select>
+                                <select id="cmbArea" name="cmbArea"></select>
+                            </div>
+                        )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="身份证号"
+                    >
+                        {getFieldDecorator('idNumber', {
+                            rules: [{
+                                validator: this.checkIdcardnum,
+                            }],
+                            initialValue: this.state.idNumber || null
+                        })(
+                            <Input placeholder="请输入真实有效的身份证号码" />
+                            )}
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 21, offset: 4 }}>
+                        <p>请上传清晰的个人身份证正反面原件照片/扫描件 (不能截图、图片内容要求完整 ),</p>
+                        <p>要求2M 以下的jpg、jpeg、gif、png格式的图片。该资料不会公开展示,仅作为审核材料使用。</p>
+                    </FormItem>
+                    <FormItem
+                        labelCol={{ span: 4 }}
+                        wrapperCol={{ span: 18 }}
+                        label="身份证图片"
+                    >
+                        {getFieldDecorator('idcard')(
+                            <div>
+                                <Avatar name="idcard1" urlData={this.getIdCardUrl1} />
+                                <Avatar name="idcard2" urlData={this.getIdCardUrl2} />
+                            </div>
+                        )}
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 18, offset: 4 }}>
+                        <span className="idCard-text">上传身份证正面</span>
+                        <span className="idCard-text">上传身份证反面</span>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 21, offset: 4 }}>
+                        <p className="acc-title">示例</p>
+                        <div className="idcard-img clearfix">
+                            <div>
+                                <div className="idcard-imgbox">
+                                    <img src={card1} alt="" />
+                                </div>
+                            </div>
+                            <div>
+                                <div className="idcard-imgbox">
+                                    <img src={card2} alt="" />
+                                </div>
+                            </div>
+                        </div>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="联系方式"
+                        extra={<span><Icon type="exclamation-circle" /> 请输入正确的手机号,暂不支持海外手机注册</span>}
+                    >
+                        {getFieldDecorator('contactMobile', {
+                            initialValue: this.state.contactMobile || null,
+                            rules: [{ validator: this.checkPhone }]
+                        })(
+                            <Input placeholder="建议使用常用手机" />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="验证码"
+                        extra={<span style={{ 'color': '#ea0862' }}><Icon type="exclamation-circle" /> 看不清?点击图片更换验证码</span>}
+                    >
+                        <Row gutter={8}>
+                            <Col span={16}>
+                                {getFieldDecorator('captcha', {
+                                    rules: [{ required: true, message: '请输入图片中的验证码' }],
+                                })(
+                                    <Input />
+                                    )}
+                            </Col>
+                            <Col span={8}>
+                                <div className="getVcode">
+                                    <img id="VCode" src={globalConfig.context + '/open/getVCode'} alt="" onClick={this.reloadVCode} />
+                                </div>
+                            </Col>
+                        </Row>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <Button className="set-submit" type="primary" htmlType="submit">下一步</Button>
+                        <Button className="exit" type="ghost">退出实名认证</Button>
+                    </FormItem>
+                </Form >
+            </Spin >
+        );
+    },
+}));
 
 export default Content;

+ 95 - 0
js/component/certify/result.jsx

@@ -0,0 +1,95 @@
+import React from 'react';
+import { Input, Button, Form, Icon, Spin, message, } from 'antd';
+import './certify.less';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+
+const Content = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false,
+            auditStatus: 3
+        };
+    },
+    handleSubmit() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/user/userNextPro",
+            data: {
+                process: 4
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+                this.props.changeStep(5);
+            } else {
+                message.warning(data.error[0].message);
+            }
+        }.bind(this)).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    componentWillMount() {
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/userPro",
+            success: function (data) {
+                if (data.data) {
+                    this.setState({
+                        auditStatus: data.data.auditStatus
+                    });
+                } else {
+                    message.warning(data.error[0].message);
+                };
+            }.bind(this),
+        });
+    },
+    render() {
+        const _me = this;
+        return (
+            <Spin spinning={this.state.loading} className="certify-spin">
+                {(() => {
+                    switch (this.state.auditStatus) {
+                        case 2:
+                            return <div className="certify-result-box">
+                                <p className="certify-title"
+                                    style={{ 'textAlign': 'center' }}
+                                >输入的金额正确后,即时审核您填写的身份信息,请耐心等待2秒钟;如审核通过,即认证申请成功</p>
+                                <div className="certify-result-state">
+                                    <Icon type="check" />
+                                    <p>您已通过了实名认证</p>
+                                    <p>建议您下载数字证书,保障您的支付安全。</p>
+                                </div>
+                            </div>;
+                        case 3:
+                            return <div className="certify-result-box">
+                                <p className="certify-title"
+                                    style={{ 'textAlign': 'center' }}
+                                >若输入金额错误,则实名认证不通过。可重新申请实名认证。</p>
+                                <div className="certify-result-state">
+                                    <Icon type="exclamation-circle" />
+                                    <p>您未能通过实名认证审核</p>
+                                    <p>可能的原因是:</p>
+                                    <p>您提交的认证资料不符合要求,未能通过实名认证;</p>
+                                    <p>您输入的金额有误,未能通过实名认证;</p>
+                                    <p>您未及时在规定的5天期限内输入金额,未能通过实名认证;</p>
+                                    <Button className="set-submit" type="primary" htmlType="submit">重新申请实名认证</Button>
+                                </div>
+                            </div>;
+                    };
+                })()}
+            </Spin >
+        );
+    },
+}));
+
+export default Content;

+ 1 - 1
js/component/certify/top.jsx

@@ -14,7 +14,7 @@ const LoginTop = React.createClass({
                         <span className="alink">
                             <a href="./index.html">返回首页</a>
                             <a href="">尊敬的{ userData.nickname || userData.number || this.state.username}</a>
-                            <a href="./index.html">退出</a>
+                            <a href="./login.html">退出</a>
                             <a href="./index.html">交易管理中心</a>
                             <a href="./index.html">消息</a>
                             <a href="./index.html">帮助中心</a>

+ 85 - 0
js/component/groupCertify/audit.jsx

@@ -0,0 +1,85 @@
+import React from 'react';
+import { Input, Button, Form, Icon, Spin, message, } from 'antd';
+import './certify.less';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+
+const Content = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/user/userNextPro",
+            data: {
+                process: 4
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+                this.props.changeStep(5);
+            } else {
+                message.warning(data.error[0].message);
+            }
+        }.bind(this)).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    componentWillMount() {
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/userPro",
+            success: function (data) {
+                if (data.data) {
+                    this.setState({
+                        bankCardNumber : data.data.bankCardNumber
+                    });
+                } else {
+                    message.warning(data.error[0].message);
+                };
+            }.bind(this),
+        });
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 4 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Spin spinning={this.state.loading} className="certify-spin">
+                <Form horizontal onSubmit={this.handleSubmit} className="certify-form">
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <p className="certify-title">信息提交成功</p>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 18, offset: 4 }}>
+                        <span>
+                            认证系统将会在1-2个工作日内给您的银行卡{this.state.bankCardNumber}转入一笔1元以下的确认金额,
+                            然后在下方正确填写正确的金额数目。
+                            若打款成功,认证系统将会通过短信的方式通知您
+                        </span>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <Button className="set-submit" type="primary" htmlType="submit">输入打款金额</Button>
+                    </FormItem>
+                </Form >
+            </Spin >
+        );
+    },
+}));
+
+export default Content;

+ 203 - 0
js/component/groupCertify/bank.jsx

@@ -0,0 +1,203 @@
+import React from 'react';
+import { Input, Button, Form, Icon, Spin, message, } from 'antd';
+import { addressInit } from '../tools.js';
+import './certify.less';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+
+const Content = Form.create()(React.createClass({
+    getData() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/orgProcess",
+            success: function (data) {
+                if (data.data) {
+                    addressInit('cmbProvince', 'cmbCity', 'cmbArea',
+                        data.data.locationProvince, data.data.locationCity, data.data.locationArea);
+                    this.setState({
+                        contactMobile: data.data.contactMobile,
+                        username: data.data.username,
+                        banks: data.data.banks,
+                        banksBranch:data.data.banksBranch,
+                        bankCardNumber: data.data.bankCardNumber,
+                    });
+                } else {
+                    message.warning(data.error[0].message);
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            let cmbP = document.getElementById('cmbProvince').value;
+            let cmbC = document.getElementById('cmbCity').value;
+            let cmbA = document.getElementById('cmbArea').value;
+            if ( !cmbP || !cmbC || !cmbA) {
+                message.warning("请选择所在地!");
+                return;
+            };
+            debugger
+            if (!err) {
+                this.setState({
+                    loading: true
+                });
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/api/user/orgNextPro",
+                    data: {
+                        bankAccount: data.data.username,
+                        banks: values.banks,
+                        banksBranch:values.banksBranch,
+                        bankCardNumber: values.bankCardNumber,
+                        locationProvince:cmbP,
+                        locationCity:cmbC,
+                        locationArea:cmbA,
+                        process: 2
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.changeStep(3);
+                    } else {
+                        message.warning(data.error[0].message);
+                    }
+                }.bind(this)).always(function () {
+                    this.setState({
+                        loading: false
+                    });
+                }.bind(this));
+            }
+        });
+    },
+    checkBankCardNum(rule, value, callback) {
+        if (!/(^\d{15,}$)/.test(value)) {
+            callback('请输入正确的银行卡号!');
+        } else {
+            callback();
+        }
+    },
+    componentDidMount() {
+        addressInit('cmbProvince', 'cmbCity', 'cmbArea');
+        this.getData();
+    },
+    changeStep() {
+        this.props.changeStep(1);
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 6 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Spin spinning={this.state.loading} className="certify-spin">
+                <Form horizontal onSubmit={this.handleSubmit} className="certify-form">
+                    <FormItem wrapperCol={{ span: 20, offset: 6 }}>
+                        <p className="certify-title">请填写您的银行卡信息,该银行卡仅用于认证您的身份。</p>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="银行开户名"
+                        extra={<span><Icon type="exclamation-circle" /> 必须使用以“{this.state.username}”为开户名的银行卡进行认证</span>}
+                    >
+                        {getFieldDecorator('username')(
+                            <span>{this.state.username}</span>
+                        )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="开户银行"
+                        extra={<span><Icon type="exclamation-circle" /> 不支持信用卡和存折进行认证</span>}
+                    >
+                        {getFieldDecorator('banks', {
+                            initialValue: this.state.banks || null,
+                            rules: [{ required: true, message: '请输入开户银行名称!' }]
+                        })(
+                            <Input placeholder="请输入开户银行名称" />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="开户银行所在地"
+                    >
+                        {getFieldDecorator('address')(
+                            <div>
+                                <select id="cmbProvince" name="cmbProvince"></select>
+                                <select id="cmbCity" name="cmbCity"></select>
+                                <select id="cmbArea" name="cmbArea"></select>
+                            </div>
+                        )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="银行开户支行名称"
+                    >
+                        {getFieldDecorator('banksBranch', {
+                            initialValue: this.state.banksBranch || null,
+                            rules: [{ required: true, message: '请输入银行开户支行名称!' }]
+                        })(
+                            <Input placeholder="请输入银行开户支行名称"/>
+                        )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="银行卡号"
+                        extra={
+                            <span style={{ 'color': '#ea0862' }}>
+                                <Icon type="exclamation-circle" />
+                                认证系统会给该银行卡打入一笔1元以下的确认金额,您需要通过银行柜台并在
+                                步骤4输入该银行卡收到的阿凡提打款金额数目
+                            </span>}
+                    >
+                        {getFieldDecorator('bankCardNumber', {
+                            initialValue: this.state.bankCardNumber || null,
+                            rules: [{
+                                validator: this.checkIdcardnum,
+                            }],
+                        })(
+                            <Input placeholder="请输入银行卡号" />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="联系方式"
+                        extra={
+                            <span style={{ 'color': '#ea0862' }}>
+                                <Icon type="exclamation-circle" />
+                                 我们会将重要进度以短信形式通知您
+                            </span>}
+                    >
+                        {getFieldDecorator('contactMobile')(
+                            <span>{this.state.contactMobile}</span>
+                        )}
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 12, offset: 6 }}>
+                        <Button className="set-submit" type="primary" htmlType="submit">下一步</Button>
+                        <Button className="exit" type="ghost" onClick={_me.changeStep}>返回修改</Button>
+                    </FormItem>
+                </Form >
+            </Spin >
+        );
+    },
+}));
+
+export default Content;

+ 302 - 0
js/component/groupCertify/certify.less

@@ -0,0 +1,302 @@
+        .wrap {
+            width: 100%;
+            margin: 0 auto;
+            background: #ffffff;
+            .certify-header {
+                background: #f8f8f8;
+                width: 100%;
+                .certify-logo {
+                    width: 100%;
+                    margin: 0 auto;
+                    padding: 10px 0;
+                    .logo {
+                        width: 12%;
+                        padding-top: 60px;
+                        float: left;
+                        margin-left: 40px;
+                        position: relative;
+                        overflow: hidden;
+                        img {
+                            position: absolute;
+                            top: 0;
+                            left: 0;
+                            height: 60px;
+                            width: 120px;
+                        }
+                    }
+                    .certify-text {
+                        width: 84%;
+                        float: left;
+                        line-height: 60px;
+                        font-size: 24px;
+                        .text {
+                            border-left: 1px solid #999999;
+                        }
+                        .alink {
+                            float: right;
+                            font-size: 14px;
+                            line-height: 60px;
+                            a {
+                                color: #333;
+                                padding: 0 8px;
+                                border-left: 1px solid #999999;
+                                &:first-child {
+                                    border: none;
+                                }
+                            }
+                        }
+                        span {
+                            padding-left: 10px;
+                        }
+                    }
+                }
+            }
+            .certify-content {
+                min-height: 600px;
+                .certify-step {
+                    width: 1030px;
+                    height: 60px;
+                    margin: 40px auto;
+                    border-radius: 8px;
+                    background: #c1c1c1;
+                    overflow: hidden;
+                    >div {
+                        width: 150px;
+                        height: 60px;
+                        display: table;
+                        color: #fff;
+                        float: left;
+                        padding: 0 22px 0 10px;
+                        >div {
+                            vertical-align: middle;
+                            display: table-cell;
+                            font-size: 15px;
+                        }
+                        &:first-child {
+                            padding-left: 6px;
+                        }
+                        &:last-child {
+                            width: 130px;
+                            background-image: none;
+                        }
+                        >i {
+                            margin-top: 17px;
+                            display: inline-block;
+                            height: 26px;
+                            width: 26px;
+                            border-radius: 50%;
+                            background: #fff;
+                            overflow: hidden;
+                            text-align: center;
+                            line-height: 26px;
+                            font-size: 20px;
+                            font-style: normal;
+                        }
+                    }
+                    .step-done {
+                        background: #ff6500;
+                        background-image: url(../../../image/scd.png);
+                        background-repeat: no-repeat;
+                        background-position-x: right;
+                        background-size: 22px;
+                        >i {
+                            color: #ff6500;
+                        }
+                    }
+                    .step-doing {
+                        background: #ff8a33;
+                        background-image: url(../../../image/trd.png);
+                        background-repeat: no-repeat;
+                        background-position-x: right;
+                        background-size: 22px;
+                        >i {
+                            color: #ff8a33;
+                        }
+                    }
+                    .step-off {
+                        background: #ff6500;
+                        background-image: url(../../../image/fst.png);
+                        background-repeat: no-repeat;
+                        background-position-x: right;
+                        background-size: 22px;
+                        >i {
+                            color: #ff6500;
+                        }
+                    }
+                    .step-none {
+                        background: #c1c1c1;
+                        background-image: url(../../../image/none.png);
+                        background-repeat: no-repeat;
+                        background-position-x: right;
+                        background-size: 22px;
+                        >i {
+                            color: #c1c1c1;
+                        }
+                    }
+                    .step-last {
+                        background: #c1c1c1;
+                        width: 130px;
+                        >i {
+                            color: #c1c1c1;
+                        }
+                    }
+                }
+                .certify-form-box {
+                    width: 600px;
+                    margin: 0 auto;
+                    .certify-form {
+                        #address {
+                            select {
+                                height: 32px;
+                                border: 1px solid #d9d9d9;
+                                border-radius: 4px;
+                                margin-right: 6px;
+                            }
+                        }
+                        .ant-form-explain {
+                            span {
+                                line-height: 26px;
+                            }
+                        }
+                        .ant-form-extra {
+                            width:560px;
+                        }
+                        .idCard-text {
+                            display: inline-block;
+                            width: 150px;
+                            margin-right: 20px;
+                            text-align: center;
+                        }
+                        .idcard-img {
+                            >div {
+                                float: left;
+                                padding: 20px;
+                                border: 1px solid #c9c9c9;
+                                margin-right: 20px;
+                                >.idcard-imgbox {
+                                    width: 142px;
+                                    height: 90px;
+                                    padding-top: 90px;
+                                    position: relative;
+                                    img {
+                                        width: 142px;
+                                        height: 90px;
+                                        position: absolute;
+                                        top: 0;
+                                        left: 0;
+                                        border: 1px solid #c9c9c9;
+                                        border-radius: 6px;
+                                    }
+                                }
+                            }
+                        }
+                        .getVcode {
+                            height: 32px;
+                            width: 100%;
+                            padding-top: 32px;
+                            position: relative;
+                            overflow: hidden;
+                            img {
+                                position: absolute;
+                                top: 0;
+                                left: 0;
+                                width: 100%;
+                                height: 32px;
+                            }
+                        }
+                        .set-submit {
+                            min-width: 100px;
+                        }
+                        .exit {
+                            width: 160px;
+                            margin-left: 20px;
+                            color: #fff;
+                            background: #ff6500;
+                            border: none;
+                        }
+                        .ant-form-item-label {
+                            >label {
+                                &:before {
+                                    content: ''
+                                }
+                            }
+                        }
+                        .certify-title {
+                            font-size: 20px;
+                        }
+                        .fromItem-postfix {
+                            position: absolute;
+                            margin-left: 10px;
+                            right: -36px;
+                        }
+                    }
+                    .certify-result-box {
+                        .certify-title {
+                            font-size: 20px;
+                        }
+                        .certify-result-state {
+                            position: relative;
+                            padding-left: 46px;
+                            margin: 20px auto;
+                            width: 400px;
+                            i {
+                                width: 40px;
+                                height: 40px;
+                                border-radius: 50%;
+                                background: #58a3ff;
+                                color: #fff;
+                                text-align: center;
+                                line-height: 40px;
+                                font-size: 33px;
+                                position: absolute;
+                                top: 6px;
+                                left: 0;
+                            }
+                            p {
+                                line-height: 24px;
+                            }
+                            button {
+                                margin-top:10px; 
+                            }
+                        }
+                    }
+                    .avatar-uploader,
+                    .avatar-uploader-trigger,
+                    .avatar {
+                        width: 150px;
+                        height: 150px;
+                    }
+                    .avatar-uploader {
+                        display: block;
+                        padding: 1px;
+                        border: 1px dashed #d9d9d9;
+                        border-radius: 6px;
+                        cursor: pointer;
+                        position: relative;
+                        img {
+                            position: absolute;
+                            top: -1px;
+                            left: -1px;
+                            height: 150px;
+                        }
+                        //
+                        float: left;
+                        margin-right: 20px;
+                    }
+                    .avatar-uploader-trigger {
+                        display: table-cell;
+                        vertical-align: middle;
+                        font-size: 28px;
+                        color: #999;
+                    }
+                }
+            }
+            .footer {
+                padding: 10px 0;
+                text-align: center;
+                background: #f0f0f0;
+                p {
+                    line-height: 24px;
+                }
+            }
+        }

+ 161 - 0
js/component/groupCertify/confirm.jsx

@@ -0,0 +1,161 @@
+import React from 'react';
+import { Input, Button, Form, Icon, Spin, message, } from 'antd';
+import './certify.less';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+
+const Content = Form.create()(React.createClass({
+    getData() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/orgProcess",
+            success: function (data) {
+                if (data.data) {
+                    this.setState({
+                        unitName: data.data.unitName,
+                        idNumber: data.data.idNumber,
+                        contactMobile: data.data.contactMobile,
+                        bankName: data.data.bankName,
+                        bankAccount: data.data.bankAccount,
+                        bankCardNumber: data.data.bankCardNumber
+                    });
+                } else {
+                    message.warning(data.error[0].message);
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/user/orgNextPro",
+            data: {
+                process: 3
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+                this.props.changeStep(4);
+            } else {
+                message.warning(data.error[0].message);
+            }
+        }.bind(this)).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    componentWillMount() {
+        this.getData();
+    },
+    changeStep() {
+        this.props.changeStep(1);
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 4 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Spin spinning={this.state.loading} className="certify-spin">
+                <Form horizontal onSubmit={this.handleSubmit} className="certify-form">
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <p className="certify-title">请确认提交的企业信息</p>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="企业名称"
+                    >
+                        <span>{this.state.unitName}</span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="营业执照注册号"
+                    >
+                        <span>{this.state.licenceNumber}</span>
+                    </FormItem>
+                    <FormItem
+                        labelCol={{ span: 4 }}
+                        wrapperCol={{ span: 18 }}
+                        label="营业执照副本扫描件"
+                    >
+                        <div className="idcard-img clearfix">
+                            <div className="idcard-imgbox">
+                                <img src={globalConfig.context + '/open/writeImage?path=' + this.state.positiveIdUrl } alt="" 
+                                onClick={(e)=>{window.open(e.target.src)}}/>
+                            </div>
+                        </div>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <p className="certify-title">请确认银行卡信息</p>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="银行开户名"
+                    >
+                        <span>{this.state.bankAccount}</span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="开户银行"
+                    >
+                        <span>{this.state.banks}</span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="开户行支行名称"
+                    >
+                        <span>{this.state.bankBranch}</span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="银行卡号"
+                    >
+                        <span>{this.state.bankCardNumber}</span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="联系方式"
+                    >
+                        <span>{this.state.contactMobile}</span>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 18, offset: 4 }}>
+                        <span style={{ 'color': '#ea0862' }}>
+                            <Icon type="exclamation-circle" />
+                            提醒:银行卡号、身份证号码,认证成功之前,最多只能申请认证3次,
+                            认证成功后,不能再申请认证。
+                        </span>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <Button className="set-submit" type="primary" htmlType="submit">下一步</Button>
+                        <Button className="exit" type="ghost" onClick={_me.changeStep}>返回修改</Button>
+                    </FormItem>
+                </Form >
+            </Spin >
+        );
+    },
+}));
+
+export default Content;

+ 157 - 0
js/component/groupCertify/content.jsx

@@ -0,0 +1,157 @@
+import React from 'react';
+import { Icon } from 'antd';
+import './certify.less';
+
+import Personal from './personal.jsx';
+import Bank from './bank.jsx';
+import Confirm from './confirm.jsx';
+import Audit from './audit.jsx';
+import Money from './money.jsx';
+import Result from './result.jsx';
+
+const Content = React.createClass({
+    stepNumSwith(num) {
+        switch (num) {
+            case 1:
+                this.setState({
+                    step0Class: 'step-done',
+                    step1Class: 'step-doing',
+                    step2Class: 'step-none',
+                    step3Class: 'step-none',
+                    step4Class: 'step-none',
+                    step5Class: 'step-none',
+                    step6Class: 'step-none'
+                });
+                break;
+            case 2:
+                this.setState({
+                    step0Class: 'step-off',
+                    step1Class: 'step-done',
+                    step2Class: 'step-doing',
+                    step3Class: 'step-none',
+                    step4Class: 'step-none',
+                    step5Class: 'step-none',
+                    step6Class: 'step-none'
+                });
+                break;
+            case 3:
+                this.setState({
+                    step0Class: 'step-off',
+                    step1Class: 'step-off',
+                    step2Class: 'step-done',
+                    step3Class: 'step-doing',
+                    step4Class: 'step-none',
+                    step5Class: 'step-none',
+                    step6Class: 'step-none'
+                });
+                break;
+            case 4:
+                this.setState({
+                    step0Class: 'step-off',
+                    step1Class: 'step-off',
+                    step2Class: 'step-off',
+                    step3Class: 'step-done',
+                    step4Class: 'step-doing',
+                    step5Class: 'step-none',
+                    step6Class: 'step-none'
+                });
+                break;
+            case 5:
+                this.setState({
+                    step0Class: 'step-off',
+                    step1Class: 'step-off',
+                    step2Class: 'step-off',
+                    step3Class: 'step-off',
+                    step4Class: 'step-done',
+                    step5Class: 'step-doing',
+                    step6Class: 'step-none'
+                });
+                break;
+            case 6:
+                this.setState({
+                    step0Class: 'step-off',
+                    step1Class: 'step-off',
+                    step2Class: 'step-off',
+                    step3Class: 'step-off',
+                    step4Class: 'step-off',
+                    step5Class: 'step-done',
+                    step6Class: 'step-doing'
+                });
+                break;
+        };
+    },
+    getData() {
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/userPro",
+            success: function (data) {
+                if (data.data) {
+                    this.state.stepNum = data.data.process + 1
+                } else {
+                    message.warning(data.error[0].message);
+                };
+            }.bind(this),
+        });
+    },
+    getInitialState() {
+        return {
+            loading: false,
+            stepNum: 3
+        };
+    },
+    componentWillMount() {
+        this.stepNumSwith(this.state.stepNum);
+    },
+    changeStep(i) {
+        this.state.stepNum = i;
+        this.stepNumSwith(i)
+    },
+    render() {
+        return (
+            <div className="certify-content">
+                <div className="certify-step clearfix">
+                    <div className={this.state.step0Class}><div>企业实名认证流程</div></div>
+                    <div className={this.state.step1Class}>
+                        {this.state.stepNum > 1 ? <Icon type="check" /> : <i>1</i>}<div><p>填写</p><p>企业信息</p></div>
+                    </div>
+                    <div className={this.state.step2Class}>
+                        {this.state.stepNum > 2 ? <Icon type="check" /> : <i>2</i>}<div><p>填写</p><p>银行卡信息</p></div>
+                    </div>
+                    <div className={this.state.step3Class}>
+                        {this.state.stepNum > 3 ? <Icon type="check" /> : <i>3</i>}<div>确认信息</div>
+                    </div>
+                    <div className={this.state.step4Class}>
+                        {this.state.stepNum > 4 ? <Icon type="check" /> : <i>4</i>}<div>信息审核</div>
+                    </div>
+                    <div className={this.state.step5Class}>
+                        {this.state.stepNum > 5 ? <Icon type="check" /> : <i>5</i>}<div><p>填写打入</p><p>卡内金额</p></div>
+                    </div>
+                    <div className={this.state.step6Class}>
+                        {this.state.stepNum > 6 ? <Icon type="check" /> : <i>6</i>}<div>认证结果</div>
+                    </div>
+                </div>
+                <div className="certify-form-box">
+                    {(() => {
+                        switch (this.state.stepNum) {
+                            case 1:
+                                return <Personal changeStep={this.changeStep} />;
+                            case 2:
+                                return <Bank changeStep={this.changeStep} />;
+                            case 3:
+                                return <Confirm changeStep={this.changeStep} />;
+                            case 4:
+                                return <Audit changeStep={this.changeStep} />;
+                            case 5:
+                                return <Money changeStep={this.changeStep} />;
+                            case 6:
+                                return <Result changeStep={this.changeStep} />;
+                        };
+                    })()}
+                </div>
+            </div>
+        )
+    }
+});
+
+export default Content;

+ 15 - 0
js/component/groupCertify/footer.jsx

@@ -0,0 +1,15 @@
+import React from 'react';
+import './certify.less';
+
+const Footer = React.createClass({
+    render() {
+        return (
+            <div className="footer">
+                <p>公司地址   联系方式公司地址  公司地址   联系方式 公司地址 公司地址   联系方式 公司地址</p>
+                <p>公司地址   联系方式公司地址 公司地址   联系方式公司地址</p>
+            </div>
+        )
+    }
+});
+
+export default Footer;

+ 129 - 0
js/component/groupCertify/money.jsx

@@ -0,0 +1,129 @@
+import React from 'react';
+import { Input, Button, Form, Icon, Spin, message, } from 'antd';
+import './certify.less';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+
+const Content = Form.create()(React.createClass({
+    getData() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/userPro",
+            success: function (data) {
+                if (data.data) {
+                    this.setState({
+                        bankAccount: bankAccount,
+                        bankCardNumber: bankCardNumber
+                    });
+                } else {
+                    message.warning(data.error[0].message);
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            if (!err) {
+                this.setState({
+                    loading: true
+                });
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/api/user/userNextPro",
+                    data: {
+                        amountMoney:values.amountMoney,
+                        process:5
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.change(6);
+                    } else {
+                        if ( data.amountError.length ) {
+                            message.warning(data.amountError[0].message);
+                        } else if ( data.error.length) {
+                            message.warning(data.error[0].message);
+                        }; 
+                    }
+                }.bind(this)).always(function () {
+                    this.setState({
+                        loading: false
+                    });
+                }.bind(this));
+            }
+        });
+    },
+    componentWillMount() {
+        this.getData();
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 4 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Spin spinning={this.state.loading} className="certify-spin">
+                <Form horizontal onSubmit={this.handleSubmit} className="certify-form">
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <p className="certify-title">输入打款金额</p>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 18, offset: 4 }}>
+                        <span>
+                            请在下方输入银行卡{this.state.bankCardNumber}收到的认证打款,
+                            务必在收到打款5日内完成,否则将无法完成
+                        </span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="开户银行"
+                    >
+                        <span>{this.state.bankAccount}</span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="银行卡号"
+                    >
+                        <span>{this.state.bankCardNumber}</span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="打款金额"
+                        extra={<span style={{ 'color': '#ea0862' }}><Icon type="exclamation-circle" /> 仅有3次输入机会,如3次输入有误,需更换银行卡重新认证</span>}
+                    >
+                        {getFieldDecorator('amountMoney', {
+                            rules: [{ required: true, message: '请输入金额!' }]
+                        })(
+                            <Input />
+                            )}
+                            <span className="fromItem-postfix">元</span>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 12, offset: 4 }}>
+                        <Button className="set-submit" type="primary" htmlType="submit">确认</Button>
+                    </FormItem>
+                </Form >
+            </Spin >
+        );
+    },
+}));
+
+export default Content;

+ 417 - 0
js/component/groupCertify/personal.jsx

@@ -0,0 +1,417 @@
+import React from 'react';
+import { Input, Button, Form, Upload, Icon, Spin, message, Row, Col } from 'antd';
+import './certify.less';
+import { addressInit, getBase64, beforeUpload, beforeUploadFile } from '../tools.js';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+import card1 from '../../../image/idcard1.jpg';
+import card2 from '../../../image/idcard2.jpg';
+
+class Avatar extends React.Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            imageUrl: ''
+        }
+    }
+
+    handleChange(info) {
+        if (info.file.status === 'done') {
+            // Get this url from response in real world.
+            getBase64(info.file.originFileObj, imageUrl => this.setState({ imageUrl }));
+            this.props.urlData(info.file.response.data);
+        }
+    }
+    render() {
+        const imageUrl = this.state.imageUrl;
+        return (
+            <Upload
+                className="avatar-uploader"
+                name={this.props.name}
+                showUploadList={false}
+                action={globalConfig.context + "/api/user/identity/upload"}
+                data={{ 'sign': this.props.name }}
+                beforeUpload={beforeUpload}
+                onChange={this.handleChange.bind(this)}
+            >
+                {
+                    imageUrl ?
+                        <img src={imageUrl} role="presentation" id={this.props.name} /> :
+                        <Icon type="plus" className="avatar-uploader-trigger" />
+                }
+            </Upload>
+        );
+    }
+};
+class UploadFile extends React.Component {
+    constructor(props) {
+        super(props);
+    }
+
+    handleChange(info) {
+        if (info.file.status === 'done') {
+            this.props.urlData(info.file.response.data);
+        }
+    }
+    render() {
+        return (
+            <Upload
+                name={this.props.name}
+                showUploadList={false}
+                action={globalConfig.context + "/api/user/identity/upload"}
+                data={{ 'sign': this.props.name }}
+                beforeUpload={beforeUploadFile}
+                onChange={this.handleChange.bind(this)}
+            >
+                <Button><Icon type="upload" />上传</Button>
+            </Upload>
+        );
+    }
+};
+
+const Content = Form.create()(React.createClass({
+    getData() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/orgProcess",
+            success: function (data) {
+                if (data.data) {
+                    addressInit('cmbProvince', 'cmbCity', 'cmbArea',
+                        data.data.licenceProvince, data.data.licenceCity, data.data.licenceArea);
+                    this.setState({
+                        contactMobile: data.data.contactMobile,
+                        aftUsername: data.data.aft,
+                        unitName: data.data.unitName,
+                        registeredCapital: data.data.registeredCapital,
+                        licenceNumber: data.data.licenceNumber,
+                        orgCode: data.data.orgCode,
+                        legalPerson:data.data.legalPerson,
+                        legalPersonIdNumber:data.data.legalPersonIdNumber
+                    });
+                } else {
+                    message.warning(data.error[0].message);
+                };
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            loading: false
+        };
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            //地址值
+            let cmbP = document.getElementById('cmbProvince').value;
+            let cmbC = document.getElementById('cmbCity').value;
+            let cmbA = document.getElementById('cmbArea').value;
+            if (cmbP || cmbC || cmbA) {
+                message.warning("请选择所在地!");
+                return;
+            };
+            if (this.state.licenceScanningUrl) {
+                message.warning("请上传营业执照副本!");
+                return;
+            };
+            if (this.state.orgCodeUrl) {
+                message.warning("请上传组织机构代码证!");
+                return;
+            };
+            if (this.state.lastYearTaxReportUrl) {
+                message.warning("请上传上年度纳税报表!");
+                return;
+            };
+            if (!err) {
+                this.setState({
+                    loading: true
+                });
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: globalConfig.context + "/api/user/orgNextPro",
+                    data: {
+                        contacts:values.contacts,
+                        contactMobile: values.contactMobile,
+                        aftUsername: values.aft,
+                        unitName: values.unitName,
+                        registeredCapital: values.registeredCapital,
+                        licenceNumber: values.licenceNumber,
+                        licenceProvince: cmbP,
+                        licenceCity: cmbC,
+                        licenceArea: cmbA,
+                        licenceScanningUrl: this.state.licenceScanningUrl,
+                        orgCode: values.orgCode,
+                        orgCodeUrl: this.state.orgCodeUrl,
+                        lastYearTaxReportUrl: this.state.lastYearTaxReportUrl,
+                        legalPerson:values.legalPerson,
+                        legalPersonIdNumber:values.legalPersonIdNumber,
+                        captcha:values.captcha,
+                        process: 1
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.props.changeStep(2);
+                    } else {
+                        message.warning(data.error[0].message);
+                    }
+                }.bind(this)).always(function () {
+                    this.setState({
+                        loading: false
+                    });
+                }.bind(this));
+            }
+        });
+    },
+    checkIdcardnum(rule, value, callback) {
+        if (!/(^\d{15}$)|(^\d{17}(\d|X)$)/.test(value)) {
+            callback('请输入正确的身份证号!');
+        } else {
+            callback();
+        }
+    },
+    checkPhone(rule, value, callback) {
+        const form = this.props.form;
+        const _me = this;
+        if (!(/^1[34578]\d{9}$/.test(value))) {
+            callback('请输入正确的手机号码!');
+            _me.setState({
+                getCodeButton: true
+            });
+        } else {
+            callback();
+            _me.setState({
+                getCodeButton: false
+            });
+        }
+    },
+    checkNumber(rule, value, callback) {
+        if (!/(^\d{15}$)/.test(value)) {
+            callback('请输入正确的营业执照注册号!');
+        } else {
+            callback();
+        }
+    },
+    getLicenceScanningUrl(e) {
+        this.state.licenceScanningUrl = e;
+    },
+    getOrgCodeUrl(e) {
+        this.state.orgCodeUrl = e;
+    },
+    getLastYearTaxReportUrl(e) {
+        this.state.lastYearTaxReportUrl = e;
+    },
+    componentDidMount() {
+        addressInit('cmbProvince', 'cmbCity', 'cmbArea');
+        this.getData();
+    },
+    reloadVCode(e) {
+        e.target.src = globalConfig.context + '/open/getVCode?t=' + Math.random();
+    },
+    render() {
+        const FormItem = Form.Item;
+        const { getFieldDecorator } = this.props.form;
+        const formItemLayout = {
+            labelCol: { span: 6 },
+            wrapperCol: { span: 12 },
+        };
+        const _me = this;
+        return (
+            <Spin spinning={this.state.loading} className="certify-spin">
+                <Form horizontal onSubmit={this.handleSubmit} className="certify-form">
+                    <FormItem
+                        {...formItemLayout}
+                        label="用户名"
+                        extra={<span><Icon type="exclamation-circle" /> 建议字母、数字和符号两种以上组合,6-20个字符</span>}
+                    >
+                        {getFieldDecorator('aftUsername', {
+                            initialValue: this.state.aftUsername || null,
+                            rules: [{ required: true, message: '请输入用户名!' }]
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="企业名称"
+                    >
+                        {getFieldDecorator('unitName', {
+                            initialValue: this.state.unitName || null,
+                            rules: [{ required: true, message: '请输入企业名称!' }]
+                        })(
+                            <Input placeholder="请输入企业名称" />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="注册资金"
+                    >
+                        {getFieldDecorator('registeredCapital', {
+                            initialValue: this.state.registeredCapital || null,
+                            rules: [{ required: true, message: '请输入注册资金!' }]
+                        })(
+                            <Input />
+                            )}
+                        <span className="fromItem-postfix">万元</span>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="联系人"
+                    >
+                        {getFieldDecorator('contacts', {
+                            initialValue: this.state.contacts || null,
+                            rules: [{ required: true, message: '请输入联系人姓名!' }]
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="联系方式"
+                        extra={<span><Icon type="exclamation-circle" /> 请填写联系人手机号码,我们会将重要进度以短信形式通知您</span>}
+                    >
+                        {getFieldDecorator('contactMobile', {
+                            initialValue: this.state.contactMobile || null,
+                            rules: [{ validator: this.checkPhone }]
+                        })(
+                            <Input placeholder="建议使用常用手机" />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="法人姓名"
+                    >
+                        {getFieldDecorator('contacts', {
+                            initialValue: this.state.contacts || null,
+                            rules: [{ required: true, message: '请输入联系人姓名!' }]
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="身份证号"
+                    >
+                        {getFieldDecorator('idNumber', {
+                            rules: [{
+                                validator: this.checkIdcardnum,
+                            }],
+                            initialValue: this.state.idNumber || null
+                        })(
+                            <Input placeholder="请输入真实有效的身份证号码" />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="营业执照注册号"
+                    >
+                        {getFieldDecorator('licenceNumber', {
+                            initialValue: this.state.licenceNumber || null,
+                            rules: [{
+                                validator: this.checkNumber,
+                            }],
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="营业执照所在地"
+                    >
+                        {getFieldDecorator('address')(
+                            <div>
+                                <select id="cmbProvince" name="cmbProvince"></select>
+                                <select id="cmbCity" name="cmbCity"></select>
+                                <select id="cmbArea" name="cmbArea"></select>
+                            </div>
+                        )}
+                    </FormItem>
+                    <FormItem
+                        labelCol={{ span: 6 }}
+                        wrapperCol={{ span: 18 }}
+                        label="营业执照副本扫描件"
+                    >
+                        {getFieldDecorator('licenceScanningUrl')(
+                            <Avatar name="licenceScanningUrl" urlData={this.getLicenceScanningUrl} />
+                        )}
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 21, offset: 6 }}>
+                        <p>1.企业营业执照副本复印件加盖企业公章后,扫描或拍照上传,图片大小不超过2M以内,仅支持jpg格式。</p>
+                        <p>2.若已办理三证合一,请输入统一社会信用代码并上传营业执照副本复印件(加盖企业公章)。</p>
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="组织机构代码证号码"
+                        extra={<span><Icon type="exclamation-circle" /> 如机构已五证合一,社会统一注册号的第九位至倒数第二位,即为您单位的组织机构代码证号码。</span>}
+                    >
+                        {getFieldDecorator('orgCode', {
+                            initialValue: this.state.orgCode || null,
+                            rules: [{ required: true, message: '请输入组织机构代码证号码!' }]
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem
+                        labelCol={{ span: 6 }}
+                        wrapperCol={{ span: 18 }}
+                        label="组织机构代码证扫描件"
+                    >
+                        {getFieldDecorator('orgCodeUrl')(
+                            <Avatar name="orgCodeUrl" urlData={this.getOrgCodeUrl} />
+                        )}
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 21, offset: 6 }}>
+                        <p>1.组织机构代码证副本复印件加盖企业公章后,扫描或拍照上传,图片大小不超过2M以内,仅支持jpg格式。</p>
+                        <p>2.若已办理三证合一,请输入统一社会信用代码并上传营业执照副本复印件(加盖企业公章)。</p>
+                    </FormItem>
+                    <FormItem
+                        labelCol={{ span: 6 }}
+                        wrapperCol={{ span: 18 }}
+                        label="上年度纳税报表"
+                    >
+                        {getFieldDecorator('lastYearTaxReportUrl')(
+                            <UploadFile name="lastYearTaxReportUrl" urlData={this.getLastYearTaxReportUrl} />
+                        )}
+                    </FormItem>
+                    <FormItem
+                        {...formItemLayout}
+                        label="验证码"
+                        extra={<span style={{ 'color': '#ea0862' }}><Icon type="exclamation-circle" /> 看不清?点击图片更换验证码</span>}
+                    >
+                        <Row gutter={8}>
+                            <Col span={16}>
+                                {getFieldDecorator('captcha', {
+                                    rules: [{ required: true, message: '请输入图片中的验证码' }],
+                                })(
+                                    <Input />
+                                    )}
+                            </Col>
+                            <Col span={8}>
+                                <div className="getVcode">
+                                    <img id="VCode" src={globalConfig.context + '/open/getVCode'} alt="" onClick={this.reloadVCode} />
+                                </div>
+                            </Col>
+                        </Row>
+                    </FormItem>
+                    <FormItem wrapperCol={{ span: 12, offset: 6 }}>
+                        <Button className="set-submit" type="primary" htmlType="submit">下一步</Button>
+                        <Button className="exit" type="ghost">退出实名认证</Button>
+                    </FormItem>
+                </Form >
+            </Spin >
+        );
+    },
+}));
+
+export default Content;

+ 95 - 0
js/component/groupCertify/result.jsx

@@ -0,0 +1,95 @@
+import React from 'react';
+import { Input, Button, Form, Icon, Spin, message, } from 'antd';
+import './certify.less';
+import ajax from 'jquery/src/ajax/xhr.js'
+import $ from 'jquery/src/ajax';
+
+
+const Content = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            loading: false,
+            auditStatus: 3
+        };
+    },
+    handleSubmit() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/user/userNextPro",
+            data: {
+                process: 4
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('保存成功!');
+                this.props.changeStep(5);
+            } else {
+                message.warning(data.error[0].message);
+            }
+        }.bind(this)).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    componentWillMount() {
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/userPro",
+            success: function (data) {
+                if (data.data) {
+                    this.setState({
+                        auditStatus: data.data.auditStatus
+                    });
+                } else {
+                    message.warning(data.error[0].message);
+                };
+            }.bind(this),
+        });
+    },
+    render() {
+        const _me = this;
+        return (
+            <Spin spinning={this.state.loading} className="certify-spin">
+                {(() => {
+                    switch (this.state.auditStatus) {
+                        case 2:
+                            return <div className="certify-result-box">
+                                <p className="certify-title"
+                                    style={{ 'textAlign': 'center' }}
+                                >输入的金额正确后,即时审核您填写的身份信息,请耐心等待2秒钟;如审核通过,即认证申请成功</p>
+                                <div className="certify-result-state">
+                                    <Icon type="check" />
+                                    <p>您已通过了实名认证</p>
+                                    <p>建议您下载数字证书,保障您的支付安全。</p>
+                                </div>
+                            </div>;
+                        case 3:
+                            return <div className="certify-result-box">
+                                <p className="certify-title"
+                                    style={{ 'textAlign': 'center' }}
+                                >若输入金额错误,则实名认证不通过。可重新申请实名认证。</p>
+                                <div className="certify-result-state">
+                                    <Icon type="exclamation-circle" />
+                                    <p>您未能通过实名认证审核</p>
+                                    <p>可能的原因是:</p>
+                                    <p>您提交的认证资料不符合要求,未能通过实名认证;</p>
+                                    <p>您输入的金额有误,未能通过实名认证;</p>
+                                    <p>您未及时在规定的5天期限内输入金额,未能通过实名认证;</p>
+                                    <Button className="set-submit" type="primary" htmlType="submit">重新申请实名认证</Button>
+                                </div>
+                            </div>;
+                    };
+                })()}
+            </Spin >
+        );
+    },
+}));
+
+export default Content;

+ 29 - 0
js/component/groupCertify/top.jsx

@@ -0,0 +1,29 @@
+import React from 'react';
+import './certify.less';
+
+const LoginTop = React.createClass({
+    render() {
+        return (
+            <div className="certify-header">
+                <div className="certify-logo clearfix">
+                    <div className="logo">
+                        <img src="" alt="" />
+                    </div>
+                    <div className="certify-text">
+                        <span className="text">实名认证</span>
+                        <span className="alink">
+                            <a href="./index.html">返回首页</a>
+                            <a href="">尊敬的{ userData.nickname || userData.number || this.state.username}</a>
+                            <a href="./login.html">退出</a>
+                            <a href="./index.html">交易管理中心</a>
+                            <a href="./index.html">消息</a>
+                            <a href="./index.html">帮助中心</a>
+                        </span>
+                    </div>
+                </div>
+            </div>
+        )
+    }
+});
+
+export default LoginTop;

+ 12 - 0
js/component/tools.js

@@ -92,6 +92,18 @@ module.exports = {
         // }
         // return isJPG && isLt2M;
     },
+    beforeUploadFile: function (file) {
+        // debugger
+        // const isJPG = file.type === 'image/jpeg/document';
+        // if (!isJPG) {
+        //     message.error('You can only upload JPG file!');
+        // }
+        // const isLt2M = file.size / 1024 / 1024 < 2;
+        // if (!isLt2M) {
+        //     message.error('Image must smaller than 2MB!');
+        // }
+        // return isJPG && isLt2M;
+    },
     getTime: function (e, t) {
         if (e && !t) {
             var d = new Date(e);

+ 17 - 0
js/user/groupCertify.js

@@ -0,0 +1,17 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import '../../css/base.less';
+import '../../css/login.less';
+
+import Top from '../component/groupCertify/top.jsx';
+import Content from '../component/groupCertify/content.jsx';
+import Footer from '../component/groupCertify/footer.jsx';
+
+ReactDOM.render(
+    <div className="wrap">
+        <Top />
+        <Content />
+        <Footer />
+    </div>,
+    document.getElementById('root')
+)

+ 11 - 1
webpack.config.js

@@ -28,6 +28,10 @@ module.exports = {
             'webpack/hot/only-dev-server',
             './js/user/certify.js'
         ],
+        'user/groupCertify': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
+            'webpack/hot/only-dev-server',
+            './js/user/groupCertify.js'
+        ],
         //user-account
         'user/account/index': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
             'webpack/hot/only-dev-server',
@@ -127,11 +131,17 @@ module.exports = {
             chunks: ['user/signIn', 'vendors']
         }),
         new HtmlWebpackPlugin({
-            title: '用户认证',
+            title: '个人用户认证',
             filename: 'user/certify.html',
             template: './template/template.html',
             chunks: ['user/certify', 'vendors']
         }),
+        new HtmlWebpackPlugin({
+            title: '团体用户认证',
+            filename: 'user/groupCertify.html',
+            template: './template/template.html',
+            chunks: ['user/groupCertify', 'vendors']
+        }),
         //user-account
         new HtmlWebpackPlugin({
             title: '用户中心-首页',

+ 8 - 1
webpack.config.pro.js

@@ -15,6 +15,7 @@ module.exports = {
         'user/login': './js/user/login.js',
         'user/signIn': './js/user/signIn.js',
         'user/certify': './js/user/certify.js',
+        'user/groupCertify': './js/user/groupCertify.js',
         //user-account
         'user/account/index': './js/user/account/index.js',
         'user/account/set': './js/user/account/set.js',
@@ -100,11 +101,17 @@ module.exports = {
             chunks: ['user/signIn', 'vendors']
         }),
         new HtmlWebpackPlugin({
-            title: '用户认证',
+            title: '个人用户认证',
             filename: 'user/certify.html',
             template: './template/template.html',
             chunks: ['user/certify', 'vendors']
         }),
+        new HtmlWebpackPlugin({
+            title: '团体用户认证',
+            filename: 'user/groupCertify.html',
+            template: './template/template.html',
+            chunks: ['user/groupCertify', 'vendors']
+        }),
         //user-account
         new HtmlWebpackPlugin({
             title: '用户中心-首页',