Browse Source

Accept Merge Request #38 merge 1.0.33 : (test -> prod)

Merge Request: merge 1.0.33
Created By: @seirios
Accepted By: @seirios
URL: https://coding.net/t/aft/p/AFT-WEB/git/merge/38
seirios 7 years ago
parent
commit
dcd19e0214
57 changed files with 831 additions and 412 deletions
  1. 2 5
      css/sign.less
  2. 27 0
      js/component/account/content.less
  3. 3 1
      js/component/account/index/normal.jsx
  4. 1 1
      js/component/account/services/achievement.jsx
  5. 1 1
      js/component/account/services/activity.jsx
  6. 2 2
      js/component/account/services/activityCostList.jsx
  7. 2 2
      js/component/account/services/annualReport.jsx
  8. 1 1
      js/component/account/services/cognizance.jsx
  9. 0 32
      js/component/account/services/cognizance.less
  10. 11 5
      js/component/account/services/contract/contractAdd.jsx
  11. 4 4
      js/component/account/services/evaluate/info.jsx
  12. 20 6
      js/component/account/services/leftTab.jsx
  13. 4 0
      js/component/account/services/orgTechCenter.jsx
  14. 7 0
      js/component/account/services/standard.jsx
  15. 0 28
      js/component/account/services/technology.less
  16. 1 1
      js/component/account/set/ablt.less
  17. 5 5
      js/component/account/set/base.jsx
  18. 24 9
      js/component/account/set/changeMobile.jsx
  19. 19 4
      js/component/account/set/changeModal.less
  20. 3 7
      js/component/account/set/company.jsx
  21. 18 35
      js/component/account/set/edu.jsx
  22. 4 0
      js/component/account/set/pfs.jsx
  23. 13 60
      js/component/account/set/tech.jsx
  24. 41 13
      js/component/login/forgetPw.jsx
  25. 44 32
      js/component/login/loginForm.jsx
  26. 5 5
      js/component/manageCenter/achievement/achievementOrder.jsx
  27. 1 1
      js/component/manageCenter/achievement/techAchievementDesc.jsx
  28. 6 4
      js/component/manageCenter/demand/demandOrder.jsx
  29. 1 9
      js/component/manageCenter/demand/techDemand.jsx
  30. 25 0
      js/component/manageCenter/demand/techDemandDesc.jsx
  31. 10 2
      js/component/manageCenter/servicesManage/contract/contractAdd.jsx
  32. 1 1
      js/component/manageCenter/servicesManage/highTech/fosterDesc/ablt.less
  33. 1 1
      js/component/manageCenter/servicesManage/highTech/fosterDesc/activity.jsx
  34. 1 1
      js/component/manageCenter/servicesManage/highTech/fosterDesc/activityCostList.jsx
  35. 7 0
      js/component/manageCenter/servicesManage/highTech/fosterDesc/standard.jsx
  36. 1 1
      js/component/manageCenter/servicesManage/highTech/highTechApply.jsx
  37. 146 0
      js/component/manageCenter/userManage/batchImport.jsx
  38. 8 0
      js/component/manageCenter/userManage/content.jsx
  39. 37 28
      js/component/manageCenter/userManage/customerList.jsx
  40. 2 2
      js/component/manageCenter/userManage/customerSearch.jsx
  41. 216 0
      js/component/manageCenter/userManage/highTechSearch.jsx
  42. 4 1
      js/component/manageCenter/userManage/leftTab.jsx
  43. 26 37
      js/component/manageCenter/userManage/orgDesc.jsx
  44. 3 3
      js/component/manageCenter/userManage/orgList.jsx
  45. 19 34
      js/component/manageCenter/userManage/userDesc.jsx
  46. 10 5
      js/component/manageCenter/userManage/userList.jsx
  47. 1 1
      js/component/portal/portal.less
  48. 7 1
      js/component/portal/search/achievement.jsx
  49. 5 1
      js/component/portal/search/demand.jsx
  50. 10 4
      js/component/portal/search/subscriber.jsx
  51. 2 4
      js/component/portal/top.jsx
  52. 8 1
      js/component/sign/account.jsx
  53. 1 1
      js/component/sign/account.less
  54. 1 1
      js/component/sign/groupAccount.jsx
  55. 7 6
      js/component/subscriberDetail/content.jsx
  56. 1 2
      js/component/yearSelect.jsx
  57. 1 1
      package.json

+ 2 - 5
css/sign.less

@@ -2,8 +2,7 @@
     min-height: 1000px;
     .signIn-form {
         width: 1000px;
-        margin: 20px auto;
-        //antd
+        margin: 20px auto; //antd
         .ant-tabs-bar {
             height: 60px;
             margin-bottom: 0;
@@ -32,9 +31,7 @@
             }
         }
         .ant-tabs-content {
-            .ant-tabs-tabpane {
-                background: #fff;
-            }
+            background: #fff;
         }
     }
 }

+ 27 - 0
js/component/account/content.less

@@ -42,4 +42,31 @@
         float: right;
         margin-right: 20px;
     }
+}
+
+.ant-modal-body {
+    .half-item {
+        float: left;
+        width: 50%;
+        margin-bottom: 10px;
+    }
+    .third-item {
+        float: left;
+        width: 33%;
+        margin-bottom: 10px;
+        >p {
+            line-height: 30px;
+        }
+    }
+    .item-title {
+        line-height: 30px;
+        font-size: 14px;
+        color: #666;
+        min-width: 100px;
+        display: inline-block;
+    }
+    .form-title {
+        font-size: 16px;
+        color: #333;
+    }
 }

+ 3 - 1
js/component/account/index/normal.jsx

@@ -68,7 +68,9 @@ const Content = React.createClass({
                     <div className="index-userdata clearfix">
                         <p className="acc-title">欢迎, No.<span>{this.state.number}</span>     </p>
                         <div className="userdata-img">
-                            <img src={globalConfig.avatarHost + "/upload" + (this.state.type == 0 ? this.state.personPortraitUrl : this.state.logoUrl)} alt="" />
+                            {this.state.personPortraitUrl || this.state.logoUrl ?
+                                <img src={globalConfig.avatarHost + "/upload" + (this.state.type == 0 ? this.state.personPortraitUrl : this.state.logoUrl)} alt="" />
+                                : <img src="" alt="" />}
                         </div>
                         <div className="userdata-content">
                             {(() => {

+ 1 - 1
js/component/account/services/achievement.jsx

@@ -21,7 +21,7 @@ const AchievementDescFrom = Form.create()(React.createClass({
         d = d.getFullYear();
         for (let i = d; i > d - 20; i--) {
             _me.state.yearOption.push(
-                <Select.Option value={i.toString()} key={i}>{i}</Select.Option>
+                <Select.Option key={i.toString()} >{i}</Select.Option>
             )
         };
         conversionFormList.map(function (item) {

+ 1 - 1
js/component/account/services/activity.jsx

@@ -174,7 +174,7 @@ const ActivityForm = Form.create()(React.createClass({
                                 label="技术领域"
                             >
                                 {getFieldDecorator('techField', {
-                                    initialValue: this.state.techField
+                                    initialValue: this.state.techField || []
                                 })(
                                     <Cascader
                                         style={{ width: 500 }}

+ 2 - 2
js/component/account/services/activityCostList.jsx

@@ -12,7 +12,7 @@ const ActivityDescFrom = Form.create()(React.createClass({
         return {
             loading: false,
             activityNumberOption: [],
-            activityNumberObj:{},
+            activityNumberObj: {},
             yearOption: []
         };
     },
@@ -77,7 +77,7 @@ const ActivityDescFrom = Form.create()(React.createClass({
                     url: globalConfig.context + "/api/user/cognizance/activityCost",
                     data: {
                         id: this.props.data.id,
-                        aid: this.props.data.aid,
+                        aid: values.activityNumber,
                         activityNumber: this.state.activityNumberObj[values.activityNumber],
                         year: values.year,
 

+ 2 - 2
js/component/account/services/annualReport.jsx

@@ -21,7 +21,7 @@ const AnnualReportDescFrom = Form.create()(React.createClass({
         d = d.getFullYear();
         for (let i = d; i > d - 20; i--) {
             _me.state.yearOption.push(
-                <Select.Option value={i.toString()} key={i}>{i}</Select.Option>
+                <Select.Option key={i.toString()} >{i}</Select.Option>
             )
         };
     },
@@ -457,7 +457,7 @@ const AnnualReportAdd = React.createClass({
         d = d.getFullYear();
         for (let i = d; i > d - 20; i--) {
             _me.state.yearOption.push(
-                <Select.Option value={i.toString()} key={i}>{i}</Select.Option>
+                <Select.Option key={i.toString()} >{i}</Select.Option>
             )
         };
     },

+ 1 - 1
js/component/account/services/cognizance.jsx

@@ -417,7 +417,7 @@ const CognizanceAdd = React.createClass({
         this.state.thisYear = d;
         for (let i = d; i < d + 20; i++) {
             _me.state.yearOption.push(
-                <Select.Option value={i.toString()} key={i}>{i}</Select.Option>
+                <Select.Option key={i.toString()} >{i}</Select.Option>
             )
         };
     },

+ 0 - 32
js/component/account/services/cognizance.less

@@ -1,36 +1,4 @@
-.ant-modal-body {
-    .half-item {
-        float: left;
-        width: 50%;
-    }
-}
 
-.ant-modal-body {
-    .half-item {
-        float: left;
-        width: 50%;
-        height: 36px;
-        margin-bottom: 10px;
-    }
-    .third-item {
-        float: left;
-        width: 33%;
-        height: 36px;
-        margin-bottom: 10px;
-        >p {
-            line-height: 30px;
-        }
-    }
-    .item-title {
-        line-height: 30px;
-        font-size: 14px;
-        color: #666;
-    }
-    .form-title {
-        font-size: 16px;
-        color: #333;
-    }
-}
 
 #highTechApply-form {
     >div {

+ 11 - 5
js/component/account/services/contract/contractAdd.jsx

@@ -53,7 +53,7 @@ const ContractAddFrom = Form.create()(React.createClass({
         d = d.getFullYear() - 1;
         for (let i = d; i < d + 20; i++) {
             theArr.push(
-                <Select.Option value={i.toString()} key={i}>{i}</Select.Option>
+                <Select.Option key={i.toString()}>{i}</Select.Option>
             )
         };
         this.state.yearOption = theArr;
@@ -85,6 +85,10 @@ const ContractAddFrom = Form.create()(React.createClass({
         e.preventDefault();
         this.props.form.validateFields((err, values) => {
             if (!err) {
+                if (!values.patentNum && !values.copyrightNum && !values.cognizanceYear && !values.techProjectNum) {
+                    message.warning('请至少选择一个申报项目!');
+                    return;
+                };
                 this.props.spinState(true);
                 $.ajax({
                     method: "POST",
@@ -127,13 +131,14 @@ const ContractAddFrom = Form.create()(React.createClass({
         };
         const _me = this;
         return (
-            <Form horizontal onSubmit={this.handleSave} id="CopyrightDesc-form">
+            <Form horizontal onSubmit={this.handleSave}>
                 <div className="clearfix">
                     <FormItem className="half-item"
                         {...formItemLayout}
                         label="联系人" >
                         {getFieldDecorator('contacts', {
-                            initialValue: theData.contacts
+                            initialValue: theData.contacts,
+                            rules: [{ required: true, message: '请选择联系人!' }],
                         })(
                             <Select placeholder="请选择联系人"
                                 style={{ width: 260 }}
@@ -146,7 +151,8 @@ const ContractAddFrom = Form.create()(React.createClass({
                         {...formItemLayout}
                         label="合同类型" >
                         {getFieldDecorator('type', {
-                            initialValue: theData.type
+                            initialValue: theData.type,
+                            rules: [{ required: true, message: '请选择合同类型!' }],
                         })(
                             <Select placeholder="请选择合同类型"
                                 style={{ width: 260 }}>
@@ -177,7 +183,7 @@ const ContractAddFrom = Form.create()(React.createClass({
                         {...formItemLayout}
                         label={"高企申请"} >
                         {getFieldDecorator('cognizanceYear', {
-                            initialValue: theData.cognizanceYear || undefined
+                            initialValue: theData.cognizanceYear ? theData.cognizanceYear.toString() : null
                         })(
                             <Select placeholder="请选择年份"
                                 style={{ width: 120 }}

+ 4 - 4
js/component/account/services/evaluate/info.jsx

@@ -365,13 +365,13 @@ const evaluateInfo = React.createClass({
       </div>
       <div className="report-page">
         <div className="report-subtitle">第一部分   声明</div>
-        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一、本系统在进行无形资产价值评估过程中,采用了通行的经济理论及通用的评估方法,评估流程参考了《资产评估准则-无形资产》,但本评估报告并非《中国资产评估法》及《资产评估准则-评估报告》所规定的评估报告,而是本在线系统出具的简式评估报告。</p>
+        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一、本系统在进行无形资产价值评估过程中,采用了通行的经济理论及通用的评估方法,评估流程参考了《资产评估准则-无形资产》,但本评估报告并非《中国资产评估法》及《资产评估准则-评估报告》所规定和约束的评估报告,而是本在线系统出具的简式评估报告。</p>
         <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二、本系统测算所依据的财务及技术资料均由客户填写,系统仅引用该数据进行目标价值之评估,对其填写内容的合法性、真实性、完整性、合理性我们未进行核实,也不承担任何责任。</p>
-        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;三、我们认为我们采用的公共信息、购买的非公开信息及行业统计信息都来自可靠的信息来源。但是因为我们并未对这些信息做进一步的验证,我们无法保证这些信息的准确性或完整性。</p>
+        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;三、本系统认为系统采用的公共信息、购买的非公开信息及行业统计信息都来自可靠的信息来源。但是因为本系统并未对这些信息做进一步的验证,无法保证这些信息的准确性或完整性。</p>
         <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;四、本评估结果仅作为指定目的下的价值参考,不应当被认为是对评估对象可实现价格的保证。</p>
         <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;五、本评估报告只能用于本报告载明的评估目的和用途,不供其他目的和用途使用。</p>
-        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;六、本评估报告内容系属机密,只能由评估报告载明的评估报告使用者使用。未经本公司书面同意,不得进行复印或以任何方式,将报告全数或任一部份传递予第三人。任何第三人也不因得到本评估报告而成为本报告的使用者。</p>
-        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;七、本评估报告之有效期限为评估基准日起三个月内({benchDate.join('/') + '~' + [limit.getFullYear(), getDateValue(limit.getMonth() + 1), getDateValue(limit.getDate())].join('/')})。</p>
+        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;六、本评估报告内容系属机密,只能由评估报告载明的评估报告使用者使用。任何第三人也不因得到本评估报告而成为本报告的使用者。</p>
+        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;七、本评估报告之有效期限为评估基准日起三个月内。</p>
         <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;八、本评估报告之结论基于以下假设条件得出:</p>
         <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、国家现行的有关法律法规及政策、国家宏观经济形势无重大变化,评估对象所处地区的政治、经济和社会环境无重大变化,无其他人力不可抗拒因素及不可预见因素造成的重大不利影响;</p>
         <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、区域经济政策和产业政策、财政和货币政策以及所执行的利率、汇率、赋税基准及税率、政策性征收费用等不发生重大变化;</p>

+ 20 - 6
js/component/account/services/leftTab.jsx

@@ -36,21 +36,20 @@ const LeftTab = React.createClass({
                 });
             });
             this.state.current = theKey;
-            if(theKey=='createEvaluate') {
+            if (theKey == 'createEvaluate') {
                 this.state.subKey = 'sub4'
                 this.state.current = 'evaluate';
             }
         };
     },
     render() {
-        return (
-            <Menu onClick={this.handleClick}
+        if (window.userData && window.userData.type == 1) {
+            return (<Menu onClick={this.handleClick}
                 selectedKeys={[this.state.current]}
                 defaultOpenKeys={[this.state.subKey]}
                 mode="vertical"
                 className="account-left"
-                mode="inline"
-            >
+                mode="inline" >
                 <SubMenu key="sub1" title={<span>知识产权管理</span>}>
                     <Menu.Item key="contract">
                         合同申请
@@ -114,7 +113,22 @@ const LeftTab = React.createClass({
                     </Menu.Item>
                 </SubMenu>
             </Menu>
-        );
+            );
+        } else {
+            return (<Menu onClick={this.handleClick}
+                selectedKeys={[this.state.current]}
+                defaultOpenKeys={[this.state.subKey]}
+                mode="vertical"
+                className="account-left"
+                mode="inline" >
+                <SubMenu key="sub4" title={<span>科技评估</span>}>
+                    <Menu.Item key="evaluate">
+                        科技评估管理
+                        </Menu.Item>
+                </SubMenu>
+            </Menu>
+            );
+        }
     }
 });
 

+ 4 - 0
js/component/account/services/orgTechCenter.jsx

@@ -386,6 +386,10 @@ const CenterList = React.createClass({
         };
     },
     saveCenterDetail() {
+        if (!this.state.centerName) {
+            message.warning('研发部门名称不能为空!');
+            return;
+        };
         this.setState({
             loading: true
         });

+ 7 - 0
js/component/account/services/standard.jsx

@@ -16,6 +16,13 @@ const StandardDesc = React.createClass({
         this.setState({
             loading: true,
         });
+        if (!this.state.standardName || !this.state.standardNumber || !this.state.year) {
+            message.warning('请输入正确信息!');
+            this.setState({
+                loading: false
+            });
+            return;
+        };
         $.ajax({
             method: "POST",
             dataType: "json",

+ 0 - 28
js/component/account/services/technology.less

@@ -31,34 +31,6 @@
     }
 }
 
-.ant-modal-body {
-    .half-item {
-        float: left;
-        width: 50%;
-        height: 36px;
-        margin-bottom: 10px;
-    }
-    .third-item {
-        float: left;
-        width: 33%;
-        height: 36px;
-        margin-bottom: 10px;
-        >p {
-            line-height: 30px;
-        }
-    }
-    .item-title {
-        line-height: 30px;
-        font-size: 14px;
-        color: #666;
-        min-width: 100px;
-        display: inline-block;
-    }
-    .form-title {
-        font-size: 16px;
-        color: #333;
-    }
-}
 
 #highTechApply-form {
     >div {

+ 1 - 1
js/component/account/set/ablt.less

@@ -1,6 +1,6 @@
 .set-ablt {
     background: #fff;
-    height: 100%;
+    margin-bottom: 48px;
     padding: 20px;
     .acc-title {
         color: #333;

+ 5 - 5
js/component/account/set/base.jsx

@@ -95,8 +95,8 @@ const BaseFrom = Form.create()(React.createClass({
                         sex: data.data.sex,
                         birth: d,
                         idnumber: data.data.idNumber,
-                        oppositeIdUrl: data.data.oppositeIdUrl,
-                        positiveIdUrl: data.data.positiveIdUrl,
+                        //oppositeIdUrl: data.data.oppositeIdUrl,
+                        //positiveIdUrl: data.data.positiveIdUrl,
                         auditStatus: data.data.auditStatus
                     })
                 };
@@ -133,8 +133,8 @@ const BaseFrom = Form.create()(React.createClass({
                         "dateOfBirthYear": values.birth ? values.birth._d.getFullYear() : undefined,
                         "dateOfBirthMonth": values.birth ? values.birth._d.getMonth() + 1 : undefined,
                         "idNumber": values.idcardnum,
-                        "positiveIdUrl": this.state.positiveIdUrl,
-                        "oppositeIdUrl": this.state.positiveIdUrl
+                        //"positiveIdUrl": this.state.positiveIdUrl,
+                        //"oppositeIdUrl": this.state.positiveIdUrl
                     }
                 }).done(function (data) {
                     if (!data.error.length) {
@@ -214,7 +214,7 @@ const BaseFrom = Form.create()(React.createClass({
                         )}
                 </FormItem>
                 <FormItem wrapperCol={{ span: 12, offset: 4 }}>
-                    {this.state.auditStatus == 5 ? <span></span> : <Button className="set-submit" type="primary" htmlType="submit">保存</Button>}
+                    <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
                 </FormItem>
             </Form >
         );

+ 24 - 9
js/component/account/set/changeMobile.jsx

@@ -9,7 +9,8 @@ const ChangePw = React.createClass({
         return {
             visible: false,
             getCodeButton: false,
-            checkMobile: false
+            checkMobile: false,
+            vsCodeSrc: globalConfig.context + '/open/getVCode'
         };
     },
     showModal() {
@@ -57,6 +58,11 @@ const ChangePw = React.createClass({
             visible: false,
         });
     },
+    reloadVCode() {
+        this.setState({
+            vsCodeSrc: globalConfig.context + '/open/getVCode?t=' + Math.random()
+        });
+    },
     newMobileChange(e) {
         this.state.mobile = e.target.value;
         if (/^1[34578]\d{9}$/.test(this.state.mobile)) {
@@ -75,11 +81,15 @@ const ChangePw = React.createClass({
                 dataType: "json",
                 url: globalConfig.context + "/open/getMCode",
                 data: {
-                    "mobile": this.state.mobile
+                    "mobile": this.state.mobile,
+                    "verificationCode": this.state.Vcode
                 },
                 success: function (data) {
                     let _me = this;
-                    if (data.error.length == 0) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                        this.reloadVCode();
+                    } else {
                         message.success('验证码发送成功!');
                         this.setState({
                             getCodeButton: true
@@ -90,8 +100,6 @@ const ChangePw = React.createClass({
                             });
                             clearInterval(interval);
                         }, 60000);
-                    } else {
-                        message.warning(data.error[0].message);
                     }
                 }.bind(this),
             });
@@ -108,10 +116,17 @@ const ChangePw = React.createClass({
                         <Button key="submit" type="primary" size="large" loading={this.state.loading} onClick={this.handleOk}>确认</Button>,
                         <Button key="back" type="ghost" size="large" onClick={this.handleCancel}>取消</Button>
                     ]}
-                    >
-                    <p><span>新手机号码:</span><Input onChange={this.newMobileChange} /></p>
-                    <p><span>验证码:</span><Input className="mixwidth" onChange={this.mcodeChange} />
-                        <Button onClick={this.getMCode} disabled={this.state.getCodeButton}>获取验证码</Button></p>
+                >
+                    <div><span>新手机号码:</span><Input onChange={this.newMobileChange} /></div>
+                    <div>
+                        <span>图形验证码:</span>
+                        <Input className="mixwidth" onChange={(e) => { this.state.Vcode = e.target.value; }} />
+                        <span className="getVcode">
+                            <img id="VCode" src={this.state.vsCodeSrc} alt="点击刷新验证码" onClick={this.reloadVCode} />
+                        </span>
+                    </div>
+                    <div><span>手机验证码:</span><Input className="mixwidth" onChange={this.mcodeChange} />
+                        <Button onClick={this.getMCode} disabled={this.state.getCodeButton}>获取验证码</Button></div>
                 </Modal>
             </div>
         );

+ 19 - 4
js/component/account/set/changeModal.less

@@ -12,16 +12,16 @@
     .ant-modal-body {
         padding: 20px;
         padding-bottom: 10px;
-        p { 
-            margin-bottom:10px; 
-            > span {
+        >div {
+            margin-bottom: 10px;
+            >span {
                 text-align: right;
                 padding-right: 6px;
                 display: inline-block;
                 width: 25%;
             }
             input {
-                width:70%;
+                width: 70%;
             }
             .mixwidth {
                 width: 38%;
@@ -36,5 +36,20 @@
                 margin-right: 6px;
             }
         }
+        .getVcode {
+            height: 28px;
+            width: 92px;
+            padding-top: 28px;
+            position: relative;
+            overflow: hidden;
+            vertical-align: top;
+            img {
+                position: absolute;
+                top: 0;
+                left: 0;
+                width: 100%;
+                height: 28px;
+            }
+        }
     }
 }

+ 3 - 7
js/component/account/set/company.jsx

@@ -230,28 +230,24 @@ const PersonFrom = Form.create()(React.createClass({
     },
     idttTypeChange(e) {
         if (e === '企业') {
-            this.props.form.setFieldsValue({ 'indentityType': e });
             this.setState({
                 companyDis: 'block',
                 schoolDis: 'none',
                 resDis: 'none'
             });
         } else if (e === '院校') {
-            this.props.form.setFieldsValue({ 'indentityType': e });
             this.setState({
                 companyDis: 'none',
                 schoolDis: 'block',
                 resDis: 'none'
             });
         } else if (e === '研究机构') {
-            this.props.form.setFieldsValue({ 'indentityType': e });
             this.setState({
                 companyDis: 'none',
                 schoolDis: 'none',
                 resDis: 'block'
             });
         } else {
-            this.props.form.setFieldsValue({ 'indentityType': e });
             this.setState({
                 companyDis: 'none',
                 schoolDis: 'none',
@@ -292,8 +288,8 @@ const PersonFrom = Form.create()(React.createClass({
                     })(
                         <Select className="acc-edu-lvl" onChange={this.idttTypeChange}>
                             {
-                                eduLevelList.map(function (item, i) {
-                                    return <Option key={i} value={item.value} >{item.key}</Option>
+                                eduLevelList.map(function (item) {
+                                    return <Option key={item.key} >{item.key}</Option>
                                 })
                             }
                         </Select>
@@ -314,7 +310,7 @@ const PersonFrom = Form.create()(React.createClass({
                     label="所在地"
                 >
                     {getFieldDecorator('province', {
-                        initialValue: this.state.province
+                        initialValue: this.state.province || []
                     })(
                         <Cascader options={areaSelect()} placeholder="请选择所在地" />
                         )}

+ 18 - 35
js/component/account/set/edu.jsx

@@ -1,33 +1,17 @@
 import React from 'react';
-import { Input, Button, Form, Select, Upload, Icon, Spin, message } from 'antd';
+import { Input, Button, Form, Select, Upload, Icon, Spin, message, Cascader } from 'antd';
 import './edu.less';
 import { edulvlArr } from '../../dataDic.js';
 import ajax from 'jquery/src/ajax/xhr.js'
 import $ from 'jquery/src/ajax';
 
-import EduPfsSelect from './eduPfsSelect.jsx';
+import { techFieldList } from '../../DicTechFieldList';
+import { getBase64, beforeUpload } from '../../tools'
 import YearSelect from '../../yearSelect.jsx';
 
 const FormItem = Form.Item;
 const Option = Select.Option;
 
-function getBase64(img, callback) {
-    const reader = new FileReader();
-    reader.addEventListener('load', () => callback(reader.result));
-    reader.readAsDataURL(img);
-};
-
-function beforeUpload(file) {
-    const isJPG = file.type === 'image/jpeg';
-    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;
-};
 
 class Avatar extends React.Component {
     constructor(props) {
@@ -80,11 +64,13 @@ const EduFrom = Form.create()(React.createClass({
             dataType: "json",
             url: globalConfig.context + "/api/user/educate",
             success: function (data) {
-                if (data.data) {
+                if (data.error && data.error.length) {
+                    message.warning(data.error[0].message);
+                } else {
                     this.setState({
-                        id:data.data.id,
+                        id: data.data.id,
                         edulvl: data.data.education,
-                        eduPfs: [parseInt(data.data.majorCategory), parseInt(data.data.majorName)],
+                        eduPfs: data.data.majorCategory ? data.data.majorCategory.split(',') : [],
                         schoolname: data.data.graduateSchool,
                         graduationTimeYear: data.data.graduationTimeYear,
                         edunum: data.data.diplomaCode,
@@ -102,7 +88,8 @@ const EduFrom = Form.create()(React.createClass({
         return {
             loading: false,
             xueweiPicUrl: '',
-            xueliPicUrl: ''
+            xueliPicUrl: '',
+            eduPfs: []
         };
     },
     componentDidMount() {
@@ -119,10 +106,9 @@ const EduFrom = Form.create()(React.createClass({
                     crossDomain: false,
                     url: globalConfig.context + "/api/user/userEdu",
                     data: {
-                        "id":this.state.id,
+                        "id": this.state.id,
                         "education": values.edulvl,
-                        "majorCategory": this.state.eduPfsA,
-                        "majorName": this.state.eduPfsB,
+                        "majorCategory": values.eduPfs.join(','),
                         "graduateSchool": values.schoolname,
                         "graduationTimeYear": this.state.graduationTimeYear,
                         "diplomaUrl": this.state.xueliPicUrl,
@@ -153,13 +139,8 @@ const EduFrom = Form.create()(React.createClass({
         this.state.xueliPicUrl = e;
     },
     xueweiPicUrl(e) {
-
         this.state.xueweiPicUrl = e;
     },
-    professional(e1, e2) {
-        this.state.eduPfsA = e1;
-        this.state.eduPfsB = e2;
-    },
     render() {
         const { getFieldDecorator } = this.props.form;
         const formItemLayout = {
@@ -188,11 +169,13 @@ const EduFrom = Form.create()(React.createClass({
                 </FormItem>
                 <FormItem
                     {...formItemLayout}
-                    label="专业"
+                    label="专业领域"
                 >
-                    {getFieldDecorator('edupfs')(
-                        <EduPfsSelect defValue={this.state.eduPfs} Professional={this.professional} />
-                    )}
+                    {getFieldDecorator('eduPfs', {
+                        initialValue: this.state.eduPfs || []
+                    })(
+                        <Cascader placeholder="请选择专业领域" options={techFieldList} style={{ width: 300 }} />
+                        )}
                 </FormItem>
                 <FormItem
                     {...formItemLayout}

+ 4 - 0
js/component/account/set/pfs.jsx

@@ -101,6 +101,10 @@ const PfsFrom = Form.create()(React.createClass({
         e.preventDefault();
         this.props.form.validateFields((err, values) => {
             if (!err) {
+                if (values.gongling < 0) {
+                    message.warning('工龄不能小于零!');
+                    return;
+                };
                 this.props.spinState(true);
                 $.ajax({
                     method: "POST",

+ 13 - 60
js/component/account/set/tech.jsx

@@ -1,10 +1,10 @@
 import React from 'react';
-import { Input, Button, Form, Select, Icon, Spin, InputNumber, Tag, message } from 'antd';
+import { Input, Button, Form, Select, Icon, Spin, InputNumber, Tag, message, Cascader } from 'antd';
 import './tech.less';
 import ajax from 'jquery/src/ajax/xhr.js';
 import $ from 'jquery/src/ajax';
 
-import TechSelect from './techSelect.jsx';
+import { techFieldList } from '../../DicTechFieldList';
 
 const TechFrom = Form.create()(React.createClass({
     getInitialState() {
@@ -25,9 +25,9 @@ const TechFrom = Form.create()(React.createClass({
             success: function (data) {
                 if (data.data) {
                     this.setState({
-                        id:data.data.id,
+                        id: data.data.id,
                         techpeople: data.data.technicalPeopleNum,
-                        techzoneArr: data.data.searchAreaCategory ? data.data.searchAreaCategory.split(",") : [],
+                        techField: data.data.searchAreaCategory ? data.data.searchAreaCategory.split(",") : [],
                         haveskill: data.data.specialty ? data.data.specialty.split(",") : []
                     });
                 };
@@ -41,7 +41,6 @@ const TechFrom = Form.create()(React.createClass({
     },
     handleSubmit(e) {
         e.preventDefault();
-        let searchArea = this.state.techzoneArr.join(",");
         let specialty = this.state.haveskill.join(",");
         this.props.form.validateFields((err, values) => {
             if (!err) {
@@ -52,9 +51,9 @@ const TechFrom = Form.create()(React.createClass({
                     crossDomain: false,
                     url: globalConfig.context + "/api/user/orgTech",
                     data: {
-                        "id":this.state.id,
+                        "id": this.state.id,
                         "technicalPeopleNum": values.techpeople,
-                        "searchAreaCategory": searchArea,
+                        "searchAreaCategory": values.techField.join(','),
                         "specialty": specialty
                     }
                 }).done(function (data) {
@@ -70,43 +69,6 @@ const TechFrom = Form.create()(React.createClass({
             }
         });
     },
-    techzone(x, y, z) {
-        this.state.selecttech = x + '/' + y + '/' + z;
-    },
-    addtechzone(e) {
-        let _me = this;
-        let newArr = _me.state.techzoneArr;
-        if (this.state.selecttech !== undefined) {
-            if (_me.state.techzoneArr.length > 0) {
-                let thebool = true;
-                _me.state.techzoneArr.map(function (item, i) {
-                    if (item === _me.state.selecttech) {
-                        thebool = false
-                    };
-                });
-                if (thebool) {
-                    newArr = _me.state.techzoneArr.concat(_me.state.selecttech);
-                }
-            } else if (_me.state.techzoneArr.length === 0) {
-                newArr = _me.state.techzoneArr.concat(_me.state.selecttech);
-            }
-            this.setState({
-                techzoneArr: newArr
-            });
-        };
-    },
-    deletetechzone(e) {
-        let _me = this.state;
-        let newArr = [];
-        _me.techzoneArr.map(function (item, i) {
-            if (item !== e) {
-                newArr.push(item);
-            }
-        });
-        this.setState({
-            techzoneArr: newArr
-        })
-    },
     addskill(e) {
         let _me = this;
         let theSkillArr = _me.state.haveskill;
@@ -162,24 +124,15 @@ const TechFrom = Form.create()(React.createClass({
                     <span>人</span>
                 </FormItem>
                 <FormItem
-                    labelCol={{ span: 4 }}
-                    wrapperCol={{ span: 14 }}
-                    label="重点研究领域"
+                    {...formItemLayout}
+                    label="专业领域"
                 >
-                    {getFieldDecorator('techzone')(
-                        <div>
-                            <TechSelect techzone={this.techzone} />
-                            <Button type="primary" onClick={this.addtechzone}>添加</Button>
-                        </div>
-                    )}
+                    {getFieldDecorator('techField', {
+                        initialValue: this.state.techField
+                    })(
+                        <Cascader placeholder="请选择专业领域" options={techFieldList} style={{ width: 380 }} />
+                        )}
                 </FormItem>
-                <div className="set-explain">
-                    {
-                        this.state.techzoneArr.map(function (item, i) {
-                            return <Tag key={item} closable afterClose={_me.deletetechzone.bind(this, item)}>{item}</Tag>
-                        }.bind(this))
-                    }
-                </div>
                 <FormItem
                     labelCol={{ span: 4 }}
                     wrapperCol={{ span: 14 }}

+ 41 - 13
js/component/login/forgetPw.jsx

@@ -10,7 +10,9 @@ const ChangePw = React.createClass({
             forgetPw: false,
             setPw: false,
             getCodeButton: false,
-            checkMobile: false
+            checkMobile: false,
+            mCodeText: '获取验证码',
+            vsCodeSrc: globalConfig.context + '/open/getVCode'
         };
     },
     showModal() {
@@ -26,7 +28,7 @@ const ChangePw = React.createClass({
                 method: "POST",
                 dataType: "json",
                 crossDomain: false,
-                url: globalConfig.context + "/api/user/checkMCode",
+                url: globalConfig.context + "/open/checkMCode",
                 data: {
                     "mobile": this.state.mobile,
                     "mobileCode": this.state.mcode
@@ -53,7 +55,7 @@ const ChangePw = React.createClass({
                 method: "POST",
                 dataType: "json",
                 crossDomain: false,
-                url: globalConfig.context + "/api/user/resetPwd",
+                url: globalConfig.context + "/open/resetPwd",
                 data: {
                     "mobile": this.state.mobile,
                     "type": this.props.theType,
@@ -63,7 +65,7 @@ const ChangePw = React.createClass({
             }).done(function (data) {
                 if (!data.error.length) {
                     message.success('修改成功!');
-                    this.handleCancel;
+                    this.handleCancel();
                 } else {
                     message.warning(data.error[0].message);
                 }
@@ -102,11 +104,14 @@ const ChangePw = React.createClass({
                 url: globalConfig.context + "/open/getMCode",
                 data: {
                     "mobile": this.state.mobile,
+                    "verificationCode": this.state.Vcode,
                     "type": this.props.theType,
                     "sign": true
                 },
                 success: function (data) {
-                    if (data.error.length == 0) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    } else {
                         message.success('验证码发送成功!');
                         this.state.uuid = data.data;
                         this.setState({
@@ -118,13 +123,29 @@ const ChangePw = React.createClass({
                             });
                             clearInterval(interval);
                         }, 60000);
-                    } else {
-                        message.warning(data.error[0].message);
+                        let i = 59;
+                        let countDown = setInterval(function () {
+                            _me.setState({
+                                mCodeText: '剩余' + i + '秒'
+                            });
+                            i--;
+                            if (i == 0) {
+                                clearInterval(countDown);
+                                _me.setState({
+                                    mCodeText: '获取验证码'
+                                });
+                            };
+                        }, 1000);
                     }
                 }.bind(this),
             });
         }
     },
+    reloadVCode() {
+        this.setState({
+            vsCodeSrc: globalConfig.context + '/open/getVCode?t=' + Math.random()
+        });
+    },
     render() {
         return (
             <div style={{ 'float': 'right', 'marginTop': '0' }}>
@@ -136,13 +157,20 @@ const ChangePw = React.createClass({
                         <Button key="submit" type="primary" size="large" loading={this.state.loading} onClick={this.forgetPwOk}>确认</Button>,
                         <Button key="back" type="ghost" size="large" onClick={this.handleCancel}>取消</Button>
                     ]}
-                    >
-                    <p><span>手机号码:</span><Input onChange={this.newMobileChange} /></p>
-                    <p>
+                >
+                    <div><span>手机号码:</span><Input onChange={this.newMobileChange} /></div>
+                    <div>
+                        <span>图形验证码:</span>
+                        <Input className="mixwidth" onChange={(e) => { this.state.Vcode = e.target.value; }} />
+                        <span className="getVcode">
+                            <img id="VCode" src={this.state.vsCodeSrc} alt="点击刷新验证码" onClick={this.reloadVCode} />
+                        </span>
+                    </div>
+                    <div>
                         <span>验证码:</span>
                         <Input className="mixwidth" onChange={this.mcodeChange} />
-                        <Button key="getCodeBtn" onClick={this.getMCode} disabled={this.state.getCodeButton}>获取验证码</Button>
-                    </p>
+                        <Button style={{ width: 92 }} key="getCodeBtn" onClick={this.getMCode} disabled={this.state.getCodeButton}>{this.state.mCodeText}</Button>
+                    </div>
                 </Modal>
                 <Modal maskClosable={false} key='2' className="change-modal" title="设置新密码" visible={this.state.setPw}
                     onOk={this.setPwOk} onCancel={this.handleCancel}
@@ -151,7 +179,7 @@ const ChangePw = React.createClass({
                         <Button key="submit" type="primary" size="large" loading={this.state.loading} onClick={this.setPwOk}>确认</Button>,
                         <Button key="back" type="ghost" size="large" onClick={this.handleCancel}>取消</Button>
                     ]}
-                    >
+                >
                     <p className="modal-intro"><Icon type="info-circle" />密码长度为6-20个字符,区分大小写</p>
                     <p><span>新密码:</span><Input type="password" onChange={this.newPwChange} /></p>
                     <p><span>确认密码:</span><Input type="password" onChange={this.confirmPwChange} /></p>

+ 44 - 32
js/component/login/loginForm.jsx

@@ -1,5 +1,5 @@
 import React from 'react';
-import { Form, Icon, Input, Button, Checkbox, Spin,message } from 'antd';
+import { Form, Icon, Input, Button, Checkbox, Spin, message } from 'antd';
 import './login.less';
 import ajax from 'jquery/src/ajax/xhr.js'
 import $ from 'jquery/src/ajax';
@@ -29,11 +29,23 @@ const LoginForm = Form.create()(React.createClass({
                         "type": this.props.loginProp,
                         "remember": values.remember
                     }
-                }).done(function (data) {
-                    if (!data.error.length) {
-                        window.location.href = globalConfig.context + "/user/account/index.html";
+                }).done(function (res) {
+                    if (!res.error.length) {
+                        let data = res.data;
+                        if (data && data.requestURI) {
+                            let path = globalConfig.context + data.requestURI
+                            if (data.queryString) {
+                                path += '?' + data.queryString;
+                            }
+                            if (window.location.hash) {
+                                path += window.location.hash;
+                            }
+                            window.location.href = path;
+                        } else {
+                            window.location.href = globalConfig.context + "/user/account/index.html";
+                        }
                     } else {
-                        message.warning(data.error[0].message);
+                        message.warning(res.error[0].message);
                     }
                 }.bind(this)).always(function () {
                     this.props.spinState(false);
@@ -44,34 +56,34 @@ const LoginForm = Form.create()(React.createClass({
     render() {
         const { getFieldDecorator } = this.props.form;
         return (
-                <Form onSubmit={this.handleSubmit} className="login-form">
-                    <FormItem>
-                        {getFieldDecorator('phone', {
-                            rules: [{ required: true, message: '请输入手机号!' }],
-                        })(
-                            <Input addonBefore={<Icon type="user" />} placeholder="手机号" />
-                            )}
-                    </FormItem>
-                    <FormItem>
-                        {getFieldDecorator('password', {
-                            rules: [{ required: true, message: '请输入密码!' }],
-                        })(
-                            <Input addonBefore={<Icon type="lock" />} type="password" placeholder="密码" />
-                            )}
-                    </FormItem>
-                    <FormItem>
-                        {getFieldDecorator('remember', {
-                            valuePropName: 'checked',
-                            initialValue: false,
-                        })(
-                            <Checkbox>记住我</Checkbox>
-                            )}
-                        <ForgetPw theType={this.props.loginProp}/>
-                        <Button type="primary" htmlType="submit" className="login-form-button">
-                            登录
+            <Form onSubmit={this.handleSubmit} className="login-form">
+                <FormItem>
+                    {getFieldDecorator('phone', {
+                        rules: [{ required: true, message: '请输入手机号!' }],
+                    })(
+                        <Input addonBefore={<Icon type="user" />} placeholder="手机号" />
+                        )}
+                </FormItem>
+                <FormItem>
+                    {getFieldDecorator('password', {
+                        rules: [{ required: true, message: '请输入密码!' }],
+                    })(
+                        <Input addonBefore={<Icon type="lock" />} type="password" placeholder="密码" />
+                        )}
+                </FormItem>
+                <FormItem>
+                    {getFieldDecorator('remember', {
+                        valuePropName: 'checked',
+                        initialValue: false,
+                    })(
+                        <Checkbox>记住我</Checkbox>
+                        )}
+                    <ForgetPw theType={this.props.loginProp} />
+                    <Button type="primary" htmlType="submit" className="login-form-button">
+                        登录
                     </Button>
-                    </FormItem>
-                </Form>
+                </FormItem>
+            </Form>
         );
     },
 }));

+ 5 - 5
js/component/manageCenter/achievement/achievementOrder.jsx

@@ -178,7 +178,7 @@ const AchievementDetail = React.createClass({
                                         return "正常"
                                     }
                                 })()}</Col>
-                                <Col span={3}>所有人名称:</Col>
+                                <Col span={3}>订单所有人:</Col>
                                 <Col span={9}>{theData.theName}</Col>
                             </Row>
                             <Row>
@@ -413,7 +413,7 @@ const AchievementOrderList = React.createClass({
                     dataIndex: 'achievementSerialNumber',
                     key: 'achievementSerialNumber',
                 }, {
-                    title: '成果所有人',
+                    title: '订单所有人',
                     dataIndex: 'theName',
                     key: 'theName',
                 }, {
@@ -536,11 +536,11 @@ const AchievementOrderList = React.createClass({
                     <AutoComplete
                         dataSource={this.state.searchData}
                         style={{ width: 200 }}
+                        value={this.state.searchName}
                         onSearch={this.state.therottleSearch}
                         placeholder="输入成果所有人"
-                        onSelect={(e) => {
-                            //this.setState({ searchName: e });
-                            this.state.searchName = e;
+                        onChange={(e) => {
+                            this.setState({ searchName: e });
                         }} />
                     <Button type="primary" onClick={this.search}>搜索</Button>
                     <Button onClick={this.reset}>重置</Button>

+ 1 - 1
js/component/manageCenter/achievement/techAchievementDesc.jsx

@@ -121,7 +121,7 @@ const PicturesWall = React.createClass({
                     fileList={fileList}
                     onPreview={this.handlePreview}
                     onChange={this.handleChange} >
-                    {fileList.length > 5 ? null : uploadButton}
+                    {fileList.length >= 5 ? null : uploadButton}
                 </Upload>
                 <Modal maskClosable={false} visible={previewVisible} footer={null} onCancel={this.handleCancel}>
                     <img alt="example" style={{ width: '100%' }} src={previewImage} />

+ 6 - 4
js/component/manageCenter/demand/demandOrder.jsx

@@ -179,7 +179,7 @@ const DemandDetail = React.createClass({
                                         return "正常"
                                     }
                                 })()}</Col>
-                                <Col span={2}>雇主名称:</Col>
+                                <Col span={2}>订单所有人:</Col>
                                 <Col span={10}>{theData.theName}</Col>
                             </Row>
                             <Row>
@@ -368,7 +368,7 @@ const DemandOrderList = React.createClass({
                     dataIndex: 'demandSerialNumber',
                     key: 'demandSerialNumber',
                 }, {
-                    title: '雇主名称',
+                    title: '订单所有人',
                     dataIndex: 'theName',
                     key: 'theName',
                 }, {
@@ -556,6 +556,7 @@ const DemandOrderList = React.createClass({
     reset() {
         this.state.searchName = undefined;
         this.state.status = undefined;
+        this.state.sert
         this.loadData();
     },
     render() {
@@ -582,11 +583,12 @@ const DemandOrderList = React.createClass({
                     </Select>
                     <AutoComplete
                         dataSource={this.state.searchData}
+                        value={this.state.searchName}
                         style={{ width: 200 }}
                         onSearch={this.state.therottleSearch}
                         placeholder="输入雇主名称"
-                        onSelect={(e) => {
-                            this.state.searchName = e;
+                        onChange={(e) => {
+                            this.setState({searchName : e});
                         }} />
                     <Button type="primary" onClick={this.search}>搜索</Button>
                     <Button onClick={this.reset}>重置</Button>

+ 1 - 9
js/component/manageCenter/demand/techDemand.jsx

@@ -182,18 +182,10 @@ const DemandList = React.createClass({
                     title: '发布时间',
                     dataIndex: 'releaseDateFormattedDate',
                     key: 'releaseDateFormattedDate',
-                }, {
-                    title: '管理员',
-                    dataIndex: 'principalId',
-                    key: 'principalId',
-                }, {
-                    title: '技术经纪人',
-                    dataIndex: 'techBrokerId',
-                    key: 'techBrokerId',
                 }
             ],
             dataSource: [],
-            searchTime: [,]
+            searchTime: []
         };
     },
     getCompanyList() {

+ 25 - 0
js/component/manageCenter/demand/techDemandDesc.jsx

@@ -176,6 +176,29 @@ const DemandDetailShow = Form.create()(React.createClass({
             });
         }.bind(this));
     },
+    getContactsList(theUid) {
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/getContacts",
+            data: {
+                uid: theUid
+            },
+            success: function (data) {
+                let theOption = [];
+                if (!data.data) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                } else {
+                    this.setState({
+                        contactsObj: data.data
+                    });
+                };
+            }.bind(this),
+        });
+    },
     offShelf() {
         this.setState({
             loading: true
@@ -272,10 +295,12 @@ const DemandDetailShow = Form.create()(React.createClass({
     },
     componentWillMount() {
         this.loadData(this.props.data.id, this.props.detailApiUrl);
+        this.getContactsList(this.props.data.employerId);
     },
     componentWillReceiveProps(nextProps) {
         if (!this.props.visible && nextProps.visible) {
             this.loadData(nextProps.data.id, nextProps.detailApiUrl);
+            this.getContactsList(nextProps.data.employerId);
             this.props.form.resetFields();
         };
     },

+ 10 - 2
js/component/manageCenter/servicesManage/contract/contractAdd.jsx

@@ -116,6 +116,14 @@ const ContractAddFrom = Form.create()(React.createClass({
         e.preventDefault();
         this.props.form.validateFields((err, values) => {
             if (!err) {
+                if (!values.uid || !values.contacts) {
+                    message.warning('请选择一个公司和联系人!');
+                    return;
+                }
+                if (!values.patentNum && !values.copyrightNum && !values.cognizanceYear && !values.techProjectNum) {
+                    message.warning('请至少选择一个申报项目!');
+                    return;
+                };
                 this.props.spinState(true);
                 $.ajax({
                     method: "POST",
@@ -153,11 +161,11 @@ const ContractAddFrom = Form.create()(React.createClass({
     handleSubmit() {
         this.props.form.validateFields((err, values) => {
             if (!err) {
-                this.props.spinState(true);
-                if (!values.principals || !values.recordTime ) {
+                if (!values.principals || !values.recordTime) {
                     message.warning('请填写审核信息!');
                     return;
                 };
+                this.props.spinState(true);
                 $.ajax({
                     method: "POST",
                     dataType: "json",

+ 1 - 1
js/component/manageCenter/servicesManage/highTech/fosterDesc/ablt.less

@@ -1,6 +1,6 @@
 .set-ablt {
     background: #fff;
-    height: 100%;
+    margin-bottom: 48px;
     padding: 20px;
     .acc-title {
         color: #333;

+ 1 - 1
js/component/manageCenter/servicesManage/highTech/fosterDesc/activity.jsx

@@ -171,7 +171,7 @@ const ActivityForm = Form.create()(React.createClass({
                                 label="技术领域"
                             >
                                 {getFieldDecorator('techField', {
-                                    initialValue: this.state.techField
+                                    initialValue: this.state.techField || []
                                 })(
                                     <Cascader
                                         style={{ width: 500 }}

+ 1 - 1
js/component/manageCenter/servicesManage/highTech/fosterDesc/activityCostList.jsx

@@ -20,7 +20,7 @@ const ActivityDescFrom = Form.create()(React.createClass({
         this.state.allCost = this.props.data.allCost;
         this.props.activityNumberList.map(function (item) {
             _me.state.activityNumberOption.push(
-                <Select.Option value={item.aid} key={item.uid}>{item.activityNumber}</Select.Option>
+                <Select.Option key={item.aid}>{item.activityNumber}</Select.Option>
             );
             _me.state.activityNumberObj[item.aid] = item.activityNumber;
         });

+ 7 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/standard.jsx

@@ -15,6 +15,13 @@ const StandardDesc = React.createClass({
         this.setState({
             loading: true,
         });
+        if (!this.state.standardName || !this.state.standardNumber || !this.state.year) {
+            message.warning('请输入正确信息!');
+            this.setState({
+                loading: false
+            });
+            return;
+        };
         $.ajax({
             method: "POST",
             dataType: "json",

+ 1 - 1
js/component/manageCenter/servicesManage/highTech/highTechApply.jsx

@@ -684,7 +684,7 @@ const CognizanceAdd = React.createClass({
         this.state.thisYear = d;
         for (let i = d; i < d + 20; i++) {
             _me.state.yearOption.push(
-                <Select.Option value={i.toString()} key={i}>{i}</Select.Option>
+                <Select.Option key={i.toString()}>{i}</Select.Option>
             )
         };
     },

+ 146 - 0
js/component/manageCenter/userManage/batchImport.jsx

@@ -0,0 +1,146 @@
+import React from 'react';
+import { Input, Modal, Button, message, Select } from 'antd';
+import { achievementCategoryList } from '../../dataDic.js';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+const BatchImport = React.createClass({
+    getInitialState: function () {
+        return {
+            loading: false
+        };
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleOk(e) {
+        this.setState({
+            visible: false,
+        });
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+    },
+    provinceChange(e) {
+        let theArr = [];
+        this.props.provinceList.map((item) => {
+            if (item.id == e) {
+                item.cityList.map((city) => {
+                    theArr.push(
+                        <Select.Option key={city.id}>{city.name}</Select.Option>
+                    )
+                });
+            }
+        });
+        this.setState({
+            cityOption: theArr,
+            province: e,
+            city: undefined
+        });
+    },
+    cityChange(e) {
+        this.setState({
+            city: e
+        });
+    },
+    //提交
+    handleSubmit() {
+        let theArr = this.state.inputValue.split(/[\r\n]/g);
+        if (!theArr.length) {
+            return;
+        };
+        if (theArr.length > 999) {
+            message.warning("数据条数不能多于1000条!");
+            return;
+        };
+        let unitName = theArr.join(',');
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + '/api/admin/cognizanceRecord/import',
+            data: {
+                unitName: unitName,
+                district: this.state.city || this.state.province,
+                year: this.state.year
+            }
+        }).done(function (data) {
+            this.setState({
+                loading: false
+            });
+            if (!data.error.length) {
+                message.success('导入成功!');
+                this.handleOk();
+            } else {
+                message.warning(data.error[0].message);
+            };
+        }.bind(this));
+    },
+    reset() {
+        this.setState({
+            province: undefined,
+            city: undefined,
+            year: undefined,
+            inputValue: undefined
+        });
+    },
+    render() {
+        return (
+            <div>
+                <Button type="primary" onClick={this.showModal}>批量导入</Button>
+                <Modal
+                    title="批量导入"
+                    visible={this.state.visible}
+                    onCancel={this.handleCancel}
+                    width='1000px'
+                    footer={[
+                        <Button key="ok" className="set-submit" type="primary" loading={this.state.loading} onClick={this.handleSubmit}>保存</Button>,
+                        <Button key="clancel" className="set-submit" type="ghost" onClick={this.handleCancel}>取消</Button>
+                    ]} >
+                    <div>
+                        <span style={{ marginRight: '10px' }}>地区</span>
+                        <Select style={{ width: '100px' }}
+                            value={this.state.province}
+                            placeholder="请选择省份"
+                            notFoundContent="未获取到省份列表"
+                            showSearch
+                            filterOption={this.props.companySearch}
+                            onChange={this.provinceChange}>
+                            {this.props.provinceOption}
+                        </Select>
+                        <Select style={{ width: '120px', marginLeft: '10px' }}
+                            value={this.state.city}
+                            placeholder="请选择城市"
+                            notFoundContent="未获取到城市列表"
+                            showSearch
+                            filterOption={this.props.companySearch}
+                            onChange={this.cityChange}>
+                            {this.state.cityOption}
+                        </Select>
+                        <span style={{ marginLeft: '10px', marginRight: '10px' }}>年份</span>
+                        <Select style={{ width: 80 }}
+                            value={this.state.year}
+                            onChange={(e) => { this.setState({ year: e }) }} >
+                            {this.props.yearOption}
+                        </Select>
+                        <Button style={{ marginLeft: '20px' }} type="ghost" onClick={this.reset}>重置</Button>
+                    </div>
+                    <div style={{ margin: '10px 0' }}>
+                        公司名称
+                    </div>
+                    <Input type="textarea" rows={12} value={this.state.inputValue}
+                        onChange={(e) => { this.setState({ inputValue: e.target.value }); }} />
+                </Modal>
+            </div>
+        );
+    }
+});
+
+export default BatchImport;

+ 8 - 0
js/component/manageCenter/userManage/content.jsx

@@ -53,6 +53,14 @@ class Content extends Component {
                     });
                 });
                 break;
+            case 'highTechSearch':
+                require.ensure([], () => {
+                    const HighTechSearch = require('./highTechSearch').default;
+                    this.setState({
+                        component: <HighTechSearch />,
+                    });
+                });
+                break;
         };
         window.location.hash = key;
     }

+ 37 - 28
js/component/manageCenter/userManage/customerList.jsx

@@ -177,11 +177,13 @@ const CustomerList = React.createClass({
             data: {
                 pageNo: pageNo || 1,
                 pageSize: this.state.pagination.pageSize,
+                type: this.state.type,
                 mobile: this.state.searchLoginId, //登录名
                 email: this.state.searchEmail,
-                createTime: this.state.searchTime,
+                startCreateTime: this.state.searchTime[0],
+                endCreateTime: this.state.searchTime[1],
                 number: this.state.searchAftId, //阿凡提号
-                unitName: this.state.searchUnitName,
+                auditName: this.state.searchName,
                 auditStatus: this.state.searchAuditStatus
             },
             success: function (data) {
@@ -189,24 +191,24 @@ const CustomerList = React.createClass({
                     if (data.error && data.error.length) {
                         message.warning(data.error[0].message);
                     }
-                    return;
-                };
-                for (let i = 0; i < data.data.length; i++) {
-                    let thisdata = data.data[i];
-                    this.state.data.push({
-                        key: i,
-                        id: thisdata.id,
-                        type: thisdata.type,
-                        mobile: thisdata.mobile,
-                        email: thisdata.email,
-                        createTime: thisdata.createTime,
-                        aftUsername: thisdata.aftUsername,
-                        number: thisdata.number,
-                        auditStatus: thisdata.type == 0 ? thisdata.userAuditStatus : thisdata.orgAuditStatus,
-                        createTimeFormattedDate: thisdata.createTimeFormattedDate,
-                        adminName: thisdata.adminName,
-                        theName: thisdata.type == 0 ? thisdata.username : thisdata.unitName
-                    });
+                } else {
+                    for (let i = 0; i < data.data.list.length; i++) {
+                        let thisdata = data.data.list[i];
+                        this.state.data.push({
+                            key: i,
+                            id: thisdata.id,
+                            type: thisdata.type,
+                            mobile: thisdata.mobile,
+                            email: thisdata.email,
+                            createTime: thisdata.createTime,
+                            aftUsername: thisdata.aftUsername,
+                            number: thisdata.number,
+                            auditStatus: thisdata.type == 0 ? thisdata.userAuditStatus : thisdata.orgAuditStatus,
+                            createTimeFormattedDate: thisdata.createTimeFormattedDate,
+                            adminName: thisdata.adminName,
+                            theName: thisdata.type == 0 ? thisdata.username : thisdata.unitName
+                        });
+                    };
                 };
                 this.state.pagination.current = data.data.pageNo;
                 this.state.pagination.total = data.data.totalCount;
@@ -226,7 +228,8 @@ const CustomerList = React.createClass({
             searchMore: true,
             data: [],
             loading: false,
-            searchTime: [,],
+            type: "1",
+            searchTime: [],
             pagination: {
                 defaultCurrent: 1,
                 defaultPageSize: 10,
@@ -250,8 +253,8 @@ const CustomerList = React.createClass({
                     key: 'mobile',
                 }, {
                     title: '用户名称',
-                    dataIndex: 'theName',
-                    key: 'theName',
+                    dataIndex: 'aftUsername',
+                    key: 'aftUsername',
                 }, {
                     title: '认证状态',
                     dataIndex: 'auditStatus',
@@ -263,8 +266,8 @@ const CustomerList = React.createClass({
                     key: 'createTimeFormattedDate',
                 }, {
                     title: '认证名称',
-                    dataIndex: 'aftUsername',
-                    key: 'aftUsername',
+                    dataIndex: 'theName',
+                    key: 'theName',
                 }, {
                     title: '联系方式',
                     dataIndex: 'email',
@@ -321,7 +324,7 @@ const CustomerList = React.createClass({
         this.state.searchAftId = undefined;
         this.state.searchLoginId = undefined;
         this.state.searchAuditStatus = undefined;
-        this.state.searchUnitName = undefined;
+        this.state.searchName = undefined;
         this.state.searchEmail = undefined;
         this.state.searchTime = [];
         this.loadData();
@@ -344,6 +347,12 @@ const CustomerList = React.createClass({
                     <UserAdd closeDesc={this.closeDesc} />
                 </div>
                 <div className="user-search">
+                    <Select placeholder="选择用户类型" style={{ width: 100 }}
+                        value={this.state.type}
+                        onChange={(e) => { this.setState({ type: e }) }}>
+                        <Select.Option value="1" >组织用户</Select.Option>
+                        <Select.Option value="0" >个人用户</Select.Option>
+                    </Select>
                     <Input placeholder="阿凡提号" value={this.state.searchAftId}
                         onChange={(e) => { this.setState({ searchAftId: e.target.value }); }} />
                     <Input placeholder="登录号" value={this.state.searchLoginId}
@@ -357,8 +366,8 @@ const CustomerList = React.createClass({
                             })
                         }
                     </Select>
-                    <Input placeholder="公司名称" value={this.state.searchUnitName}
-                        onChange={(e) => { this.setState({ searchUnitName: e.target.value }); }} />
+                    <Input placeholder="客户认证名称" value={this.state.searchName}
+                        onChange={(e) => { this.setState({ searchName: e.target.value }); }} />
                     <Input placeholder="联系方式" value={this.state.searchEmail}
                         onChange={(e) => { this.setState({ searchEmail: e.target.value }); }} />
                     <Button type="primary" onClick={this.search}>搜索</Button>

+ 2 - 2
js/component/manageCenter/userManage/customerSearch.jsx

@@ -3,7 +3,6 @@ import { Icon, Button, Input, Select, Spin, message, Col, Row } from 'antd';
 import ajax from 'jquery/src/ajax/xhr.js';
 import $ from 'jquery/src/ajax';
 import './userList.less';
-import { getSearchUrl } from '../../tools.js';
 
 const CustomerSearch = React.createClass({
     loadData(pageNo) {
@@ -25,7 +24,8 @@ const CustomerSearch = React.createClass({
                     message.warning(data.error[0].message);
                 }
                 this.setState({
-                    searchResult: data.data ? <span>名称为 {data.data} 的 {Number(this.state.searchType) ? '团体' : '个人'} 用户存在</span> : <span>未查找到该用户!</span>
+                    searchResult: data.data ? <span><Icon type="check-circle" style={{ color: '#58a3ff' }} /> 名称为[ {data.data} ]的 {Number(this.state.searchType) ? '[团体]' : '[个人]'} 用户存在</span>
+                        : <span> <Icon type="close-circle" style={{ color: '#ea0862' }} /> 未查找到该用户!</span>
                 })
             }.bind(this),
         }).always(function () {

+ 216 - 0
js/component/manageCenter/userManage/highTechSearch.jsx

@@ -0,0 +1,216 @@
+import React from 'react';
+import { Icon, Button, Input, Select, Spin, message, Col, Row, Table } from 'antd';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import './userList.less';
+import BatchImport from './batchImport';
+import { provinceList, getProvince } from '../../NewDicProvinceList';
+import { companySearch } from '../../tools';
+
+const HighTechSearch = React.createClass({
+    loadData(pageNo) {
+        if (!this.state.searchUnitName && !this.state.province && !this.state.city && !this.state.searchYear) {
+            message.warning('请选择至少一个搜索条件!');
+            return;
+        };
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/cognizanceRecord/search",
+            data: {
+                "district": this.state.city || this.state.province,
+                "unitName": this.state.searchUnitName,
+                "year": this.state.searchYear
+            },
+            success: function (data) {
+                let theArr = [];
+                if (data.error && data.error.length) {
+                    message.warning(data.error[0].message);
+                } else {
+                    for (let i = 0; i < data.data.list.length; i++) {
+                        let thisdata = data.data.list[i];
+                        theArr.push({
+                            key: i + 1,
+                            id: thisdata.id,
+                            district: thisdata.district,
+                            unitName: thisdata.unitName,
+                            year: thisdata.year
+                        });
+                    };
+                    this.state.pagination.current = data.data.pageNo;
+                    this.state.pagination.total = data.data.totalCount;
+                };
+                this.setState({
+                    dataSource: theArr,
+                    pagination: this.state.pagination
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            loading: false,
+            yearOption: [],
+            pagination: {
+                defaultCurrent: 1,
+                defaultPageSize: 10,
+                showQuickJumper: true,
+                pageSize: 10,
+                onChange: function (page) {
+                    this.loadData(page);
+                }.bind(this),
+                showTotal: function (total) {
+                    return '共' + total + '条数据';
+                }
+            },
+            columns: [
+                {
+                    title: '序号',
+                    dataIndex: 'key',
+                    key: 'key',
+                }, {
+                    title: '省份',
+                    dataIndex: 'district',
+                    key: 'district',
+                    render: (text) => { return getProvince(text) }
+                }, {
+                    title: '公司名称',
+                    dataIndex: 'unitName',
+                    key: 'unitName',
+                }, {
+                    title: '申报年份',
+                    dataIndex: 'year',
+                    key: 'year',
+                }
+            ],
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        let theProvinceArr = [];
+        let d = new Date();
+        let thisYear = d.getFullYear();
+
+        for (let i = thisYear; i >= 2000; i--) {
+            this.state.yearOption.push(<Select.Option key={i.toString()}>{i}</Select.Option>)
+        };
+        provinceList.map((item) => {
+            theProvinceArr.push(
+                <Select.Option key={item.id}>{item.name}</Select.Option>
+            )
+        });
+        this.state.provinceOption = theProvinceArr;
+        //this.loadData();
+    },
+    provinceChange(e) {
+        let theArr = [];
+        provinceList.map((item) => {
+            if (item.id == e) {
+                item.cityList.map((city) => {
+                    theArr.push(
+                        <Select.Option key={city.id}>{city.name}</Select.Option>
+                    )
+                });
+            }
+        });
+        this.setState({
+            cityOption: theArr,
+            province: e,
+            city: undefined
+        });
+    },
+    cityChange(e) {
+        this.setState({
+            city: e
+        });
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.setState({
+            city: undefined,
+            province: undefined,
+            searchUnitName: undefined,
+            searchYear: undefined,
+            dataSource: []
+        });
+    },
+    render() {
+        return (
+            <div className="user-content" >
+                <div className="content-title">
+                    <span>高企查询</span>
+                </div>
+                <Row className="clearfix" style={{ marginBottom: '20px' }}>
+                    <Col style={{ width: 60, float: 'left' }}>
+                        <span>企业名称</span>
+                    </Col>
+                    <Col span={5}>
+                        <Input placeholder="请输入用户全称"
+                            value={this.state.searchName}
+                            onChange={(e) => { this.setState({ searchName: e.target.value }) }} />
+                    </Col>
+                    <Col style={{ width: 20, float: 'left' }}></Col>
+                    <Col style={{ width: 40, float: 'left' }}>
+                        <span>地区</span>
+                    </Col>
+                    <Col span={6}>
+                        <Select style={{ width: '40%' }}
+                            value={this.state.province}
+                            placeholder="请选择省份"
+                            notFoundContent="未获取到省份列表"
+                            showSearch
+                            filterOption={companySearch}
+                            onChange={this.provinceChange}>
+                            {this.state.provinceOption}
+                        </Select>
+                        <Select style={{ width: '50%', marginLeft: '10px' }}
+                            value={this.state.city}
+                            placeholder="请选择城市"
+                            notFoundContent="未获取到城市列表"
+                            showSearch
+                            filterOption={companySearch}
+                            onChange={this.cityChange}>
+                            {this.state.cityOption}
+                        </Select>
+                    </Col>
+                    <Col style={{ width: 40, float: 'left' }}>
+                        <span>年份</span>
+                    </Col>
+                    <Col span={2}>
+                        <Select style={{ width: 80 }}
+                            value={this.state.searchYear}
+                            onChange={(e) => { this.setState({ searchYear: e }) }} >
+                            {this.state.yearOption}
+                        </Select>
+                    </Col>
+                    <Col span={4}>
+                        <Button style={{ marginRight: '20px' }} type="primary" onClick={this.search}>搜索</Button>
+                        <Button style={{ marginRight: '20px' }} type="ghost" onClick={this.reset}>重置</Button>
+                    </Col>
+                    <BatchImport
+                        yearOption={this.state.yearOption}
+                        provinceOption={this.state.provinceOption}
+                        provinceList={provinceList}
+                        companySearch={companySearch} />
+                </Row>
+                <Spin spinning={this.state.loading}>
+                    <Table columns={this.state.columns}
+                        dataSource={this.state.dataSource}
+                        pagination={this.state.pagination} />
+                </Spin>
+            </div >
+        );
+    }
+});
+
+export default HighTechSearch;

+ 4 - 1
js/component/manageCenter/userManage/leftTab.jsx

@@ -8,7 +8,7 @@ const MenuItemGroup = Menu.ItemGroup;
 const LeftTab = React.createClass({
     getInitialState() {
         return {
-            current: window.showCustomer ? 'userList' : 'customerList',
+            current: window.showCustomer ? 'customerList' : 'userList',
         };
     },
     handleClick(e) {
@@ -40,6 +40,9 @@ const LeftTab = React.createClass({
                 <Menu.Item style={{ display: window.showCustomer ? 'block' : 'none' }} key="customerSearch">
                     客户查询
                 </Menu.Item>
+                <Menu.Item style={{ display: window.showCustomer ? 'block' : 'none' }} key="highTechSearch">
+                    高企查询
+                </Menu.Item>
             </Menu>
         );
     },

+ 26 - 37
js/component/manageCenter/userManage/orgDesc.jsx

@@ -21,9 +21,7 @@ const OrgShow = Form.create()(React.createClass({
     },
     loadData(uid) {
         this.state.data = [];
-        this.setState({
-            loading: true
-        });
+        this.props.spinState(true);
         $.ajax({
             method: "get",
             dataType: "json",
@@ -93,15 +91,11 @@ const OrgShow = Form.create()(React.createClass({
                 this.props.form.resetFields();
             }.bind(this),
         }).always(function () {
-            this.setState({
-                loading: false
-            });
+            this.props.spinState(false);
         }.bind(this));
     },
     getAccountManagerList() {
-        this.setState({
-            loading: true
-        });
+        this.props.spinState(true);
         $.ajax({
             method: "get",
             dataType: "json",
@@ -126,15 +120,11 @@ const OrgShow = Form.create()(React.createClass({
                 });
             }.bind(this),
         }).always(function () {
-            this.setState({
-                loading: false
-            });
+            this.props.spinState(false);
         }.bind(this));
     },
     getTechnicianList() {
-        this.setState({
-            loading: true
-        });
+        this.props.spinState(true);
         $.ajax({
             method: "get",
             dataType: "json",
@@ -159,18 +149,14 @@ const OrgShow = Form.create()(React.createClass({
                 });
             }.bind(this),
         }).always(function () {
-            this.setState({
-                loading: false
-            });
+            this.props.spinState(false);
         }.bind(this));
     },
     handleSubmit(e) {
         e.preventDefault();
         this.props.form.validateFields((err, values) => {
             if (!err) {
-                this.setState({
-                    loading: true
-                });
+                this.props.spinState(true);
                 $.ajax({
                     method: "POST",
                     dataType: "json",
@@ -191,9 +177,7 @@ const OrgShow = Form.create()(React.createClass({
                         message.warning(data.error[0].message);
                     }
                 }.bind(this)).always(function () {
-                    this.setState({
-                        loading: false
-                    });
+                    this.props.spinState(false);
                     this.props.handleOk();
                 }.bind(this));
             }
@@ -471,7 +455,7 @@ const OrgShow = Form.create()(React.createClass({
                 </Tabs>
                 <FormItem wrapperCol={{ span: 12, offset: 4 }}>
                     <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
-                    <Button className="set-submit" type="ghost" onClick={() => { this.props.closeDesc }} >取消</Button>
+                    <Button className="set-submit" type="ghost" onClick={this.handleCancel} >取消</Button>
                 </FormItem>
             </Form >
         );
@@ -571,9 +555,7 @@ const OrgCertify = Form.create()(React.createClass({
         };
         this.props.form.validateFields((err, values) => {
             if (!err) {
-                this.setState({
-                    loading: true
-                });
+                this.props.spinState(true);
                 // //金额判断
                 // if (values.amountMoney && values.amountMoney < 0 && values.amountMoney > 100 && /^\d+(\.\d{2})?$/.test(values.amountMoney)) {
                 //     message.warning('请输入0-100以内的金额');
@@ -647,9 +629,9 @@ const OrgCertify = Form.create()(React.createClass({
                     }
                 }.bind(this)).always(function () {
                     this.setState({
-                        loading: false,
                         saveSign: "save"
                     });
+                    this.props.spinState(false);
                     this.props.handleOk();
                 }.bind(this));
             }
@@ -1068,30 +1050,37 @@ const OrgDesc = React.createClass({
     componentWillReceiveProps(nextProps) {
         this.state.visible = nextProps.showDesc;
     },
+    spinChange(e) {
+        this.setState({
+            loading: e
+        });
+    },
     render() {
         if (this.props.data) {
             return (
                 <div className="patent-desc">
-                    <Spin spinning={this.state.loading} className='spin-box'>
-                        <Modal maskClosable={false} title="用户详情" visible={this.state.visible}
-                            onCancel={this.handleCancel}
-                            width='600px'
-                            footer=''
-                            className="admin-desc-content">
+                    <Modal maskClosable={false} title="用户详情" visible={this.state.visible}
+                        onCancel={this.handleCancel}
+                        width='600px'
+                        footer=''
+                        className="admin-desc-content">
+                        <Spin spinning={this.state.loading} className='spin-box'>
                             {window.showAuditStatus ? <OrgShow
                                 uid={this.props.data.id}
                                 data={this.props.data}
                                 closeDesc={this.handleCancel}
+                                spinState={this.spinChange}
                                 visible={this.state.visible}
                                 handleOk={this.handleOk} />
                                 : <OrgCertify
                                     uid={this.props.data.id}
                                     data={this.props.data}
                                     closeDesc={this.handleCancel}
+                                    spinState={this.spinChange}
                                     visible={this.state.visible}
                                     handleOk={this.handleOk} />}
-                        </Modal>
-                    </Spin>
+                        </Spin>
+                    </Modal>
                 </div>
             );
         } else {

+ 3 - 3
js/component/manageCenter/userManage/orgList.jsx

@@ -169,7 +169,7 @@ const OrgList = React.createClass({
                     dataIndex: 'mobile',
                     key: 'mobile',
                 }, {
-                    title: '公司名称',
+                    title: '认证名称',
                     dataIndex: 'unitName',
                     key: 'unitName',
                 }, {
@@ -182,7 +182,7 @@ const OrgList = React.createClass({
                     dataIndex: 'createTimeFormattedDate',
                     key: 'createTimeFormattedDate',
                 }, {
-                    title: '认证名称',
+                    title: '公司名称',
                     dataIndex: 'aftUsername',
                     key: 'aftUsername',
                 }, {
@@ -261,7 +261,7 @@ const OrgList = React.createClass({
                             })
                         }
                     </Select>
-                    <Input placeholder="公司名称" value={this.state.searchUnitName}
+                    <Input placeholder="认证名称" value={this.state.searchUnitName}
                         onChange={(e) => { this.setState({ searchUnitName: e.target.value }); }} />
                     <Input placeholder="联系方式" value={this.state.searchEmail}
                         onChange={(e) => { this.setState({ searchEmail: e.target.value }); }} />

+ 19 - 34
js/component/manageCenter/userManage/userDesc.jsx

@@ -16,9 +16,7 @@ const UserShow = Form.create()(React.createClass({
         };
     },
     loadData(uid) {
-        this.setState({
-            loading: true
-        });
+        this.props.spinState(true);
         $.ajax({
             method: "get",
             dataType: "json",
@@ -65,15 +63,11 @@ const UserShow = Form.create()(React.createClass({
                 this.props.form.resetFields();
             }.bind(this),
         }).always(function () {
-            this.setState({
-                loading: false
-            });
+            this.props.spinState(false);
         }.bind(this));
     },
     getAccountManagerList() {
-        this.setState({
-            loading: true
-        });
+        this.props.spinState(true);
         $.ajax({
             method: "get",
             dataType: "json",
@@ -98,15 +92,11 @@ const UserShow = Form.create()(React.createClass({
                 });
             }.bind(this),
         }).always(function () {
-            this.setState({
-                loading: false
-            });
+            this.props.spinState(false);
         }.bind(this));
     },
     getTechnicianList() {
-        this.setState({
-            loading: true
-        });
+        this.props.spinState(true);
         $.ajax({
             method: "get",
             dataType: "json",
@@ -131,18 +121,14 @@ const UserShow = Form.create()(React.createClass({
                 });
             }.bind(this),
         }).always(function () {
-            this.setState({
-                loading: false
-            });
+            this.props.spinState(false);
         }.bind(this));
     },
     handleSubmit(e) {
         e.preventDefault();
         this.props.form.validateFields((err, values) => {
             if (!err) {
-                this.setState({
-                    loading: true
-                });
+                this.props.spinState(true);
                 $.ajax({
                     method: "POST",
                     dataType: "json",
@@ -163,9 +149,7 @@ const UserShow = Form.create()(React.createClass({
                         message.warning(data.error[0].message);
                     }
                 }.bind(this)).always(function () {
-                    this.setState({
-                        visible: false
-                    });
+                    this.props.spinState(false);
                     this.props.handleOk();
                 }.bind(this));
             }
@@ -349,9 +333,7 @@ const UserForm = Form.create()(React.createClass({
         };
     },
     loadData(uid) {
-        this.setState({
-            loading: true
-        });
+        this.props.spinState(true);
         $.ajax({
             method: "post",
             dataType: "json",
@@ -401,9 +383,7 @@ const UserForm = Form.create()(React.createClass({
                 this.props.form.resetFields();
             }.bind(this),
         }).always(function () {
-            this.setState({
-                loading: false
-            });
+            this.props.spinState(false);
         }.bind(this));
     },
     handleSubmit(e) {
@@ -421,9 +401,7 @@ const UserForm = Form.create()(React.createClass({
                 return;
             };
             if (!err) {
-                this.setState({
-                    loading: true
-                });
+                this.props.spinState(true);
                 $.ajax({
                     method: "POST",
                     dataType: "json",
@@ -463,9 +441,9 @@ const UserForm = Form.create()(React.createClass({
                     }
                 }.bind(this)).always(function () {
                     this.setState({
-                        visible: false,
                         saveSign: "save"
                     });
+                    this.props.spinState(false);
                     this.props.handleOk();
                 }.bind(this));
             }
@@ -693,6 +671,11 @@ const PatentDesc = React.createClass({
     componentWillReceiveProps(nextProps) {
         this.state.visible = nextProps.showDesc;
     },
+    spinChange(e) {
+        this.setState({
+            loading: e
+        });
+    },
     render() {
         if (this.props.data) {
             return (
@@ -708,12 +691,14 @@ const PatentDesc = React.createClass({
                                 data={this.props.data}
                                 closeDesc={this.handleCancel}
                                 visible={this.state.visible}
+                                spinState={this.spinChange}
                                 handleOk={this.handleOk} />
                                 : <UserForm
                                     uid={this.props.data.id}
                                     data={this.props.data}
                                     closeDesc={this.handleCancel}
                                     visible={this.state.visible}
+                                    spinState={this.spinChange}
                                     handleOk={this.handleOk} />}
                         </Modal>
                     </Spin>

+ 10 - 5
js/component/manageCenter/userManage/userList.jsx

@@ -37,7 +37,7 @@ const OrgAdd = React.createClass({
             url: globalConfig.context + "/api/admin/addNewUser",
             data: {
                 mobile: this.state.mobile,
-                username:this.state.username,
+                username: this.state.username,
                 type: 0
             }
         }).done(function (data) {
@@ -103,11 +103,11 @@ const UserList = React.createClass({
                 email: this.state.searchEmail,
                 createTime: this.state.searchTime,
                 number: this.state.searchAftId, //阿凡提号
-                aftUsername: this.state.searchAftUsername,
+                username: this.state.searchAftUsername,
                 auditStatus: this.state.searchAuditStatus
             },
             success: function (data) {
-                if ( !data.data || !data.data.list) {
+                if (!data.data || !data.data.list) {
                     if (data.error && data.error.length) {
                         message.warning(data.error[0].message);
                     };
@@ -121,6 +121,7 @@ const UserList = React.createClass({
                             email: thisdata.email,
                             createTime: thisdata.createTime,
                             aftUsername: thisdata.aftUsername,
+                            username: thisdata.username,
                             number: thisdata.number,
                             auditStatus: thisdata.auditStatus,
                             createTimeFormattedDate: thisdata.createTimeFormattedDate,
@@ -168,6 +169,10 @@ const UserList = React.createClass({
                     dataIndex: 'mobile',
                     key: 'mobile',
                 }, {
+                    title: '认证名称',
+                    dataIndex: 'username',
+                    key: 'username',
+                }, {
                     title: '认证状态',
                     dataIndex: 'auditStatus',
                     key: 'auditStatus',
@@ -177,7 +182,7 @@ const UserList = React.createClass({
                     dataIndex: 'createTimeFormattedDate',
                     key: 'createTimeFormattedDate',
                 }, {
-                    title: '认证名称',
+                    title: '用户名',
                     dataIndex: 'aftUsername',
                     key: 'aftUsername',
                 }, {
@@ -221,7 +226,7 @@ const UserList = React.createClass({
     reset() {
         this.state.searchAftId = null;
         this.state.searchLoginId = null;
-        this.state.searchAuditStatus = null;
+        this.state.searchAuditStatus = undefined;
         this.state.searchAftUsername = null;
         this.state.searchEmail = null;
         this.state.searchTime = [];

+ 1 - 1
js/component/portal/portal.less

@@ -9,7 +9,7 @@
         .portal-top {
             width: 1280px;
             line-height: 30px;
-            font-size: 14px;
+            font-size: 12px;
             margin: 0 auto;
             color: #999;
             .top-welcomeText {

+ 7 - 1
js/component/portal/search/achievement.jsx

@@ -179,6 +179,12 @@ const Content = React.createClass({
         this.state.categoryRadio = theCategoryArr;
         this.state.transferModeRadio = theTransferModeArr;
         this.state.maturityRadio = theMaturityArr;
+
+        if (window.location.search) {
+            let theUrl = window.location.search
+            this.state.keyword =theUrl.substring(1, theUrl.length);
+        };
+
         this.loadData();
     },
     industryChange(e) {
@@ -219,7 +225,7 @@ const Content = React.createClass({
             <div className="portal-body">
                 <div className="portal-nav clearfix">
                     <div className="nav-logoBox">
-                        <img src={logoImg} alt="" />
+                        <img onClick={() => { window.open(globalConfig.context + '/portal/index.html') }} src={logoImg} alt="" />
                     </div>
                     <ul className="nav-list clearfix">
                         <li className={this.props.searchType == 'achievement' ? 'active' : ''}><a href={"/portal/search/achievement.html"}>科技成果</a></li>

+ 5 - 1
js/component/portal/search/demand.jsx

@@ -159,6 +159,10 @@ const Content = React.createClass({
         });
         this.state.industryRadioA = theArr;
         this.state.demandTypeRadio = demandArr;
+        if (window.location.search) {
+            let theUrl = window.location.search
+            this.state.keyword =theUrl.substring(1, theUrl.length);
+        };
         this.loadData();
     },
     industryChange(e) {
@@ -199,7 +203,7 @@ const Content = React.createClass({
             <div className="portal-body">
                 <div className="portal-nav clearfix">
                     <div className="nav-logoBox">
-                        <img src={logoImg} alt="" />
+                        <img onClick={() => { window.open(globalConfig.context + '/portal/index.html') }} src={logoImg} alt="" />
                     </div>
                     <ul className="nav-list clearfix">
                         <li className={this.props.searchType == 'achievement' ? 'active' : ''}><a href={"/portal/search/achievement.html"}>科技成果</a></li>

+ 10 - 4
js/component/portal/search/subscriber.jsx

@@ -26,7 +26,7 @@ const SubContent = React.createClass({
             data: {
                 "level": this.state.level, //认证状态 (0--未认证,1--认证)
                 "type": this.state.type, //用户类型 (0--个人用户,1--组织用户)
-                "field": this.state.firstField ? ((this.state.firstField || '') + ',' + (this.state.secondField || '') + ',' + (this.state.thirdField || '')) : null,
+                "field": this.state.firstField ? ((this.state.firstField || '') + (this.state.secondField ? (',' + this.state.secondField) : '') + (this.state.thirdField ? (',' + this.state.thirdField) : '')) : null,
                 "province": this.state.province,
                 "city": this.state.city,
                 "area": this.state.area,
@@ -80,7 +80,7 @@ const SubContent = React.createClass({
             type: 0,
             pagination: {
                 pageNo: 1,
-                pageSize: 15,
+                pageSize: 12,
                 total: 0
             },
             dataSource: []
@@ -100,6 +100,12 @@ const SubContent = React.createClass({
         });
         this.state.fieldFirstOption = theFieldArr;
         this.state.provinceOption = theProvinceArr;
+
+        if (window.location.search) {
+            let theUrl = window.location.search
+            this.state.keyword = theUrl.substring(1, theUrl.length);
+        };
+
         this.loadData();
     },
     fieldFirstChange(e) {
@@ -204,7 +210,7 @@ const SubContent = React.createClass({
             <div className="portal-body">
                 <div className="portal-nav clearfix">
                     <div className="nav-logoBox">
-                        <img src={logoImg} alt="" />
+                        <img onClick={() => { window.open(globalConfig.context + '/portal/index.html') }} src={logoImg} alt="" />
                     </div>
                     <ul className="nav-list clearfix">
                         <li className={this.props.searchType == 'achievement' ? 'active' : ''}><a href={"/portal/search/achievement.html"}>科技成果</a></li>
@@ -285,7 +291,7 @@ const SubContent = React.createClass({
                             </Select>
                             <Select style={{ width: 160, marginRight: '10px', marginBottom: '10px' }}
                                 value={this.state.city}
-                                placeholder="请选择行业城市"
+                                placeholder="请选择城市"
                                 notFoundContent="未获取到城市列表"
                                 showSearch
                                 filterOption={companySearch}

+ 2 - 4
js/component/portal/top.jsx

@@ -19,15 +19,13 @@ const LoginTop = React.createClass({
                 <div className="portal-top clearfix">
                     <div className="top-welcomeText">欢迎您来到科技认知计算交易平台!</div>
                     <div className="top-alink">
-                        <a href={globalConfig.context + "/user/account/index.html"}>返回首页</a>
+                        <a href={globalConfig.context + "/portal/index.html"}>返回首页</a>
                         {window.userData.number ?
                             <span>
                                 <a href={globalConfig.context + "/user/account/index"}>尊敬的{userData.nickname || userData.number}</a>
-                                <a href="./index.html">交易管理中心</a>
-                                <a href="./index.html">消息</a>
+                                <a onClick={this.logOut}>退出</a>
                             </span>
                             : <a href={globalConfig.context + "/user/login/index"}>请登录</a>}
-                        <a onClick={this.logOut}>退出</a>
                         <a href="./index.html">帮助中心</a>
                     </div>
                 </div>

+ 8 - 1
js/component/sign/account.jsx

@@ -91,6 +91,13 @@ const LoginContent = Form.create()(React.createClass({
     getMCode() {
         const _me = this;
         const form = this.props.form;
+        if (!form.getFieldValue('captcha')) {
+            message.warning('图形验证码不能为空!');
+            return;
+        };
+        this.setState({
+            loading: true
+        });
         $.ajax({
             method: "get",
             dataType: "json",
@@ -146,7 +153,7 @@ const LoginContent = Form.create()(React.createClass({
         callback();
     },
     reloadVCode() {
-        this.state.vCodeUrl = globalConfig.context + '/open/getVCode?t=' + Math.random();
+        this.setState({ vCodeUrl: globalConfig.context + '/open/getVCode?t=' + Math.random() })
     },
     closeModal() {
         this.setState({ showDesc: false });

+ 1 - 1
js/component/sign/account.less

@@ -1,5 +1,5 @@
 .account-content {
-    margin-top: 50px;
+    padding-top: 50px;
     height: 580px;
     .account-left {
         width: 540px;

+ 1 - 1
js/component/sign/groupAccount.jsx

@@ -143,7 +143,7 @@ const Group = Form.create()(React.createClass({
         callback();
     },
     reloadVCode() {
-        this.state.vCodeUrl = globalConfig.context + '/open/getVCode?t=' + Math.random();
+        this.setState({ vCodeUrl: globalConfig.context + '/open/getVCode?t=' + Math.random() });
     },
     closeModal() {
         this.setState({ showDesc: false });

+ 7 - 6
js/component/subscriberDetail/content.jsx

@@ -79,7 +79,7 @@ const Content = React.createClass({
                             serialNumber: thisdata.serialNumber,
                             dataCategory: thisdata.dataCategory,
                             name: thisdata.name,
-                            transferPrice:thisdata.transferPrice,
+                            transferPrice: thisdata.transferPrice,
                             fieldA: thisdata.fieldA,
                             fieldB: thisdata.fieldB,
                             bargainingMode: thisdata.bargainingMode,
@@ -133,14 +133,14 @@ const Content = React.createClass({
                             id: thisdata.id,
                             serialNumber: thisdata.serialNumber,
                             dataCategory: thisdata.dataCategory,
-                            problemDes:thisdata.problemDes,
-                            budgetCost:thisdata.budgetCost,
+                            problemDes: thisdata.problemDes,
+                            budgetCost: thisdata.budgetCost,
                             name: thisdata.name,
                             keyword: thisdata.keyword,
                             releaseDate: thisdata.releaseDate,
                             demandType: thisdata.demandType,
-                            industryCategoryA:thisdata.industryCategoryA,
-                            industryCategoryB:thisdata.industryCategoryB,
+                            industryCategoryA: thisdata.industryCategoryA,
+                            industryCategoryB: thisdata.industryCategoryB,
                             validityPeriod: thisdata.validityPeriod,
                             validityPeriodFormattedDate: thisdata.validityPeriodFormattedDate,
                             releaseDateFormattedDate: thisdata.releaseDateFormattedDate
@@ -314,7 +314,8 @@ const Content = React.createClass({
                     <div className="column-img clearfix">
                         {this.state.theImgsrc.map((item, i) => {
                             return <div className="img-box" key={i}>
-                                <img src={globalConfig.avatarHost + "/upload" + item} alt="" />
+                                <img src={globalConfig.avatarHost + "/upload" + item} alt=""
+                                    onClick={() => { window.open(globalConfig.avatarHost + "/upload" + item) }} />
                             </div>
                         })}
                     </div>

+ 1 - 2
js/component/yearSelect.jsx

@@ -23,10 +23,9 @@ const Yearselect = React.createClass({
         this.state.defYear = this.state.thisYear.toString();
     },
     componentWillUpdate(nextProps) {
-        if (nextProps.defValue) {
+        if (this.props.defValue != nextProps.defValue) {
             this.state.Year = nextProps.defValue;
         };
-        this.state.Year = nextProps.value;
     },
     render() {
         return (

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "afanti",
-  "version": "1.0.31",
+  "version": "1.0.33",
   "description": "",
   "main": "index.js",
   "scripts": {