liting2017 6 years ago
parent
commit
21ac9bee43

+ 4 - 0
js/admin/index/content.jsx

@@ -11,6 +11,8 @@ import Policy from '@/administration/policy/policyList';
 import Order from '@/administration/order/order';
 import SystemMessage from '@/administration/messagePush/systemMessage';
 import Tags from '@/administration/tags/tags';
+import AuthLibrary from '@/administration/authentication/techAuth';
+import AuthExamine from '@/administration/authentication/authExamine';
 
 import {hashHistory,Route,Router} from 'react-router';
 import {Layout} from 'antd';
@@ -31,6 +33,8 @@ export default class ContentRouter extends React.Component {
             <Route path="/achievementExamine" component={AchievementExamine} />
             <Route path="/businessCategory" component={BusinessCategory} />
             <Route path="/businessProject" component={BusinessProject} />
+            <Route path="/authLibrary" component={AuthLibrary} />
+            <Route path="/authExamine" component={AuthExamine} />
             <Route path="/news" component={News} />
             <Route path="/policy" component={Policy} />
             <Route path="/order" component={Order} />

+ 1 - 1
js/admin/index/leftMenu.jsx

@@ -12,7 +12,7 @@ const LeftTab = React.createClass({
 			openKeys: [ 'sub1' ],
 			current: 'index',
 			switch: false,
-			rootSubmenuKeys :['sub1', 'sub2','sub3','sub4','sub5','sub6','sub7','sub8']
+			rootSubmenuKeys :['sub1', 'sub2','sub3','sub4','sub5','sub6','sub7','sub8','sub9']
 		};
 	},
 	menuClick(e) {

+ 9 - 0
js/admin/menu.jsx

@@ -36,6 +36,15 @@ module.exports = {
         ]
       },
       {
+        name: '专家顾问管理',
+        url: 'sub9',
+        icon: 'user',
+        children: [
+          { name: '专家顾问库', url: 'authLibrary' },
+          { name: '专家顾问审核', url: 'authExamine' },
+        ]
+      },
+      {
         name: '政策与新闻',
         url: 'sub5',
         icon: 'exception',

+ 3 - 0
js/component/account/bottom.less

@@ -14,4 +14,7 @@
     }
     #LRMINIBar{
         bottom: 65px!important;
+    }
+    #LR-BUBBLE{
+        margin-bottom: 0!important;
     }

+ 2 - 4
js/component/account/index/content.jsx

@@ -3,7 +3,6 @@ import React from 'react';
 import Account from '@/account/setAccount/account';
 import Unit from '@/account/setAccount/unit';
 import Personal from '@/account/setAccount/personal';
-import Patent from "@/account/setAccount/patent";
 import Contacts from '@/account/setAccount/contacts';
 import Expert from '@/account/setAccount/expert';
 //会员中心
@@ -48,12 +47,11 @@ export default class ContentRouter extends React.Component {
             <Route path="/consultList" component={ConsultList} />
             <Route path="/account" component={Account} />
             <Route path="/unit" component={Unit} />
-            <Route path="/personal" component={Personal} />
-            <Route path="/patent" component={Patent} />
+            <Route path="/personal" component={Expert} />
             <Route path="/contacts" component={Contacts} />
             <Route path="/demand" component={DemandList} />
             <Route path="/achievement" component={Achievement} />
-            <Route path="/expert" component={Expert} />
+            {/* <Route path="/expert" component={Expert} /> */}
             <Route path="/businessProject" component={BusinessProject} />
             <Route path="/memberOrderX" component={MemberOrderX} />
             <Route path="/memberOrderS" component={MemberOrderS} />

+ 1 - 2
js/component/account/index/leftMenu.jsx

@@ -109,14 +109,13 @@ const LeftTab = React.createClass({
 					menuList.push(item);
 				}
 			} else if (this.state.type == '1') {
-				if (item.url != 'personal'&&item.url!='patent') {
+				if (item.url != 'personal'&&item.url!='expert') {
 					menuList.push(item);
 				}
 			} 
 		});
 		if (this.state.type == '0' || this.state.type == '1') {
 			menu[1].children = menuList;
-			//newMenu = menu.concat(demandList);
 			newMenu=menu
 		}else{
 			newMenu=menuInit

+ 1 - 2
js/component/account/menu.jsx

@@ -18,8 +18,7 @@ module.exports = {
             { name: '账号管理', url: 'account' },
             { name: '企业资料', url: 'unit' },
             { name: '个人资料', url: 'personal' },
-            // { name: '知识产权顾问资料  ', url: 'patent' },
-            { name: '专家资料  ', url: 'expert' },
+            // { name: '专家资料  ', url: 'expert' },
             { name: '常用联系人', url: 'contacts' },
           ]
         },

+ 369 - 107
js/component/account/setAccount/expert.jsx

@@ -25,8 +25,8 @@ import $ from 'jquery/src/ajax';
 import moment from 'moment';
 import './unit.less';
 import { areaSelect } from '@/NewDicProvinceList';
-import { socialAttribute, industry } from '@/dataDic.js';
-import { splitUrl } from '@/tools.js';
+import { socialAttribute, industry,adviserType } from '@/dataDic.js';
+import { splitUrl,getAuthState,getAdviserType  } from '@/tools.js';
 const FormItem = Form.Item;
 const monthFormat = 'YYYY/MM';
 //图片组件
@@ -94,8 +94,10 @@ const Expert = React.createClass({
 			orgCodeUrl: [],
 			companyLogoUrl: [],
 			headPortraitUrl: [],
+			adviserUrl:[],
 			positiveIdUrl: [],
-			oppositeIdUrl: []
+			oppositeIdUrl: [],
+			authenticationState:undefined
 		};
 	},
 	loadInformation(record) {
@@ -127,11 +129,16 @@ const Expert = React.createClass({
 					InformationId: thisData.id,
                     InformationUid: thisData.uid,
                     expertAudit:thisData.expertAudit,
-                    type:thisData.type,
-                    authentication:thisData.authentication,
-					headPortraitUrl: thisData.headPortraitUrl
+					type:thisData.type,           //0-个人认证  1-企业认证 
+					authType:thisData.authType||'1',   //认证类型   0-专家认证  1-顾问认证
+					authMessage:thisData.authMessage||'消息不真实',
+					authState:thisData.authState||'0', //认证状态  0-未认证  1-认证审核中  2-认证失败 3-已认证
+					headPortraitUrl: thisData.headPortraitUrl //专家照片
 						? splitUrl(thisData.headPortraitUrl, ',', globalConfig.avatarHost + '/upload')
 						: [],
+					adviserUrl: thisData.adviserUrl		//顾问照片
+						? splitUrl(thisData.adviserUrl, ',', globalConfig.avatarHost + '/upload')
+						: [],
 					positiveIdUrl: thisData.positiveIdUrl
 						? splitUrl(thisData.positiveIdUrl, ',', globalConfig.avatarHost + '/upload')
 						: [],
@@ -141,7 +148,16 @@ const Expert = React.createClass({
 					data: thisData,
 					ProvinceCity: ProvinceCityArr[0] != null ? ProvinceCityArr : undefined,
 					yearMonth: month,
-					
+					workUnit:thisData.workUnit||'',
+					graduateSchool: thisData.graduateSchool||'',
+					professionalTitle: thisData.professionalTitle||'',
+					qualification: thisData.qualification||'',
+					majorCategory: thisData.majorCategory||'',
+					adviserType: thisData.adviserType||'',
+					headPortraitUrlCopy: thisData.headPortraitUrl,
+					adviserUrlCopy: thisData.adviserUrl,
+					positiveIdUrlCopy: thisData.positiveIdUrl,
+					oppositeIdUrlCopy:thisData.oppositeIdUrl
 				});
 			}.bind(this)
 		}).always(
@@ -196,55 +212,86 @@ const Expert = React.createClass({
 				});
 				thecompanyLogoUrls = picArr.join(',');
 			}
-
+			//顾问照片
+			let adviserPic = [];
+			if (this.state.adviserUrl.length) {
+				let picArr = [];
+				this.state.adviserUrl.map(function(item) {
+					if (item.response && item.response.data && item.response.data.length) {
+						picArr.push(item.response.data);
+					}
+				});
+				adviserPic = picArr.join(',');
+			}
 			let years = [];
 			let yearMonth =
 				this.state.yearMonth != undefined ? new Date(this.state.yearMonth).toLocaleDateString() : '';
             years = yearMonth.split('/');
         this.setState({
             loading: true
-        });
+		});
+		let dataList={};
+		dataList={
+				id: this.state.InformationId,
+				uid: this.state.InformationUid,
+				type:this.state.type,
+				authType:'',
+				societyTag: values.societyTag,
+				identifyName: values.identifyName,
+				industry: values.industry,
+				dateOfBirthYear: years[0], //出生年
+				dateOfBirthMonth: years[1], //出生月
+				province: (values.ProvinceCity)[0], //省-
+				city:(values.ProvinceCity)[1], //市
+				area:(values.ProvinceCity)[2], //区
+				sex: values.sex,
+				mobile: values.mobile,
+				fixedTel: values.fixedTel,
+				qq: values.qq,
+				idNumber: values.idNumber,
+				email: values.email,
+				postalAddress: values.postalAddress,
+				introduction: values.introduction,
+				headPortraitUrl:this.state.headPortraitUrlCopy||'',
+				positiveIdUrl:this.state.positiveIdUrlCopy||'',
+				adviserUrl:this.state.adviserUrlCopy||'',
+				oppositeIdUrl:this.state.oppositeIdUrlCopy||'',
+				workUnit:this.state.workUnit||'',
+				graduateSchool:this.state.graduateSchool||'',
+				professionalTitle:this.state.professionalTitle||'',
+				qualification:this.state.qualification||'',
+				majorCategory:this.state.majorCategory||'',
+				adviserType:this.state.adviserType||''
+		}
+		if(this.state.authenticationState=='0'){
+				dataList.authType='0',
+				dataList.workUnit=values.workUnit;
+				dataList.professionalTitle=values.professionalTitle;
+				dataList.qualification=values.qualification;
+				dataList.majorCategory=values.majorCategory;
+				dataList.graduateSchool=values.graduateSchool;
+				dataList.headPortraitUrl=theorgCodeUrl.length != 0 ? theorgCodeUrl : '';
+				dataList.positiveIdUrl=thecompanyLogoUrl.length != 0 ? thecompanyLogoUrl : '';
+				dataList.oppositeIdUrl=thecompanyLogoUrls.length != 0 ? thecompanyLogoUrls : '';
+		}else if(this.state.authenticationState=='1'){
+				dataList.authType='1';
+				dataList.adviserType=values.adviserType;//顾问类型
+				dataList.adviserUrl=adviserPic;		//顾问照片
+				dataList.positiveIdUrl=thecompanyLogoUrl.length != 0 ? thecompanyLogoUrl : '';
+				dataList.oppositeIdUrl=thecompanyLogoUrls.length != 0 ? thecompanyLogoUrls : '';
+		}
         $.ajax({
             method: 'post',
             dataType: 'json',
-            url: globalConfig.context + '/api/user/updateExpertDetail',
-            data: {
-                id: this.state.InformationId,
-                uid: this.state.InformationUid,
-                type:this.state.type,
-                authentication:this.state.authentication,
-                societyTag: values.societyTag,
-                identifyName: values.identifyName,
-                industry: values.industry,
-                dateOfBirthYear: years[0], //出生年
-                dateOfBirthMonth: years[1], //出生月
-                province: (values.ProvinceCity)[0], //省-
-                city:(values.ProvinceCity)[1], //市
-                area:(values.ProvinceCity)[2], //区
-                sex: values.sex,
-                mobile: values.mobile,
-                fixedTel: values.fixedTel,
-                qq: values.qq,
-                idNumber: values.idNumber,
-                email: values.email,
-                postalAddress: values.postalAddress,
-                introduction: values.introduction,
-                positiveIdUrl: thecompanyLogoUrl.length != 0 ? thecompanyLogoUrl : '',
-                oppositeIdUrl: thecompanyLogoUrls.length != 0 ? thecompanyLogoUrls : '',
-                headPortraitUrl: theorgCodeUrl.length != 0 ? theorgCodeUrl : '',
-                graduateSchool:values.graduateSchool,
-                majorCategory:values.majorCategory,
-                qualification:values.qualification,
-                workUnit:values.workUnit,
-                professionalTitle:values.professionalTitle
-            }
+            url: globalConfig.context + '/api/user/updateUserDetail',
+            data:dataList,
         }).done(
             function(data) {
                 this.setState({
                     loading: false
                 });
                 if (!data.error.length) {
-                    message.success(this.state.expertAudit<1?'认证专家成功!':'保存成功');
+                    message.success(this.state.expertAudit<1?'认证审核提交成功,请等待审核结果!':'保存成功');
                     this.loadInformation();
                 } else {
                     message.warning(data.error[0].message);
@@ -256,15 +303,36 @@ const Expert = React.createClass({
         e.preventDefault();
         this.props.form.validateFields((err, values) => {
             if(!err){
-                if(this.state.expertAudit!='0'){
+                if(this.state.expertAudit!='0'&&this.state.authenticationState==undefined){
                     this.newSubmit(values)
                 }else{
+					if(this.state.authenticationState=='1'){
+						if(!(this.state.adviserUrl.length)){
+							message.warning('请上传顾问照片!')
+							return;
+						}
+						if(!(this.state.oppositeIdUrl.length)||!(this.state.positiveIdUrl.length)){
+							message.warning('请上传您的身份证正反照片!')
+							return;
+						}
+					}
+					if(this.state.authenticationState=='0'){
+						if(!(this.state.headPortraitUrl.length)){
+							message.warning('请上传专家照片!');
+							return;
+						}
+						if(!(this.state.oppositeIdUrl.length)||!(this.state.positiveIdUrl.length)){
+							message.warning('请上传您的身份证正反照片!');
+							return;
+						}
+					}
                     this.setState({
                         visible: true,
                         values :values
                     });
                 }
-            }
+			}
+			
         })
 	},
 	handleOk() {
@@ -309,7 +377,7 @@ const Expert = React.createClass({
 					<Spin spinning={this.state.loading}>
 						<Row style={{ marginBottom: 20 }}>
 							<Col offset={2} span={4}>
-								<h4 style={{ fontSize: 20 }}>专家资料</h4>
+								<h4 style={{ fontSize: 20 }}>个人资料</h4>
 							</Col>
 						</Row>
 						<div className="clearfix">
@@ -401,86 +469,280 @@ const Expert = React.createClass({
 									initialValue: theData.email
 								})(<Input placeholder="输入电子邮箱" maxLength={128}/>)}
 							</FormItem>
-							<FormItem className="half-item" {...formItemLayout} label="毕业院校">
-								{getFieldDecorator('graduateSchool', {
-									initialValue: theData.graduateSchool
-								})(<Input placeholder="输入毕业院校全称" maxLength={32}/>)}
-							</FormItem>
-							<FormItem className="half-item" {...formItemLayout} label="专业类别">
-								{getFieldDecorator('majorCategory', {
-									initialValue: theData.majorCategory
-								})(<Input placeholder="输入专业" maxLength={16}/>)}
-							</FormItem>
-							<FormItem className="half-item" {...formItemLayout} label="职业资格">
-								{getFieldDecorator('qualification', {
-									initialValue: theData.qualification
-								})(<Input placeholder="输入职业资格" maxLength={32} />)}
-							</FormItem>
-							<FormItem className="half-item" {...formItemLayout} label="就职单位">
-								{getFieldDecorator('workUnit', {
-									initialValue: theData.workUnit
-								})(<Input placeholder="输入就职单位全称" maxLength={64}/>)}
-							</FormItem>
-							<FormItem className="half-item" {...formItemLayout} label="职称">
-								{getFieldDecorator('professionalTitle', {
-									initialValue: theData.professionalTitle
-								})(<Input placeholder="输入职称" maxLength={32}/>)}
-							</FormItem>
 						</div>
 						<div className="clearfix">
 							<FormItem
 								labelCol={{ span: 3 }}
 								wrapperCol={{ span: 18 }}
-								label="专家简介"
+								label="个人简介"
 							>
 								{getFieldDecorator('introduction', {
 									initialValue: theData.introduction
-								})(<Input type="textarea" rows={4} maxLength={512}/>)}
+								})(<Input type="textarea" rows={4} maxLength={512} placeholder="输入个人简介"/>)}
 							</FormItem>
 						</div>
-						<div className="clearfix pictures">
-							<FormItem
-								className="picWidth"
-								labelCol={{ span: 10 }}
-								wrapperCol={{ span: 10 }}
-								label="身份证正面"
-							>
-								<PicturesWall fileList={this.getPositiveIdUrl} pictureUrl={this.state.positiveIdUrl} />
-								<p>建议:图片要清晰。</p>
+						{this.state.authState=='0'||this.state.authState=="2"&&this.state.type=='0'?
+						<div>
+							<div className="clearfix btnGrounp">
+								<Radio.Group 
+								value={this.state.authenticationState} 
+								onChange={(e)=>{this.setState({
+									authenticationState:e.target.value
+								})}}>
+									<Radio.Button value="0">专家认证</Radio.Button>
+									<Radio.Button value="1">顾问认证</Radio.Button>
+								</Radio.Group>	
+								<Button type="dashed" style={{marginLeft:20}} onClick={(e)=>{this.setState({authenticationState:undefined})}}>暂不认证</Button>
+								<span style={{marginLeft:10,color:'#f00'}}>{this.state.authState=='2'?"(认证失败:"+this.state.authMessage+')':''}</span>
+							</div>
+							{this.state.authenticationState=='0'?<div className="patentBody">
+								<FormItem className="half-item" {...formItemLayout} label="毕业院校">
+									{getFieldDecorator('graduateSchool', {
+										initialValue: theData.graduateSchool,
+										rules: [ { required: true, message: '此项为必填项!' } ],
+									})(<Input placeholder="输入毕业院校全称" maxLength={32}/>)}
+								</FormItem>
+								<FormItem className="half-item" {...formItemLayout} label="专业类别">
+									{getFieldDecorator('majorCategory', {
+										initialValue: theData.majorCategory,
+										rules: [ { required: true, message: '此项为必填项!' } ],
+									})(<Input placeholder="输入专业" maxLength={16}/>)}
+								</FormItem>
+								<FormItem className="half-item" {...formItemLayout} label="职业资格">
+									{getFieldDecorator('qualification', {
+										initialValue: theData.qualification,
+										rules: [ { required: true, message: '此项为必填项!' } ],
+									})(<Input placeholder="输入职业资格" maxLength={32} />)}
+								</FormItem>
+								<FormItem className="half-item" {...formItemLayout} label="就职单位">
+									{getFieldDecorator('workUnit', {
+										initialValue: theData.workUnit,
+										rules: [ { required: true, message: '此项为必填项!' } ],
+									})(<Input placeholder="输入就职单位全称" maxLength={64}/>)}
+								</FormItem>
+								<FormItem className="half-item" {...formItemLayout} label="职称">
+									{getFieldDecorator('professionalTitle', {
+										initialValue: theData.professionalTitle,
+										rules: [ { required: true, message: '此项为必填项!' } ],
+									})(<Input placeholder="输入职称" maxLength={32}/>)}
+								</FormItem>
+								<div className="clearfix">
+									<FormItem
+										className="picWidth"
+										labelCol={{ span: 9 }}
+										wrapperCol={{ span: 10 }}
+										label={<div style={{marginRight:10}}><strong style={{color:"#f00"}}>*</strong><span>专家照片 : </span></div> }
+									>
+										<PicturesWall
+											fileList={this.getHeadPortraitUrl}
+											pictureUrl={this.state.headPortraitUrl}
+										/>
+										<p>建议:图片要清晰。</p>
+									</FormItem>
+								</div>
+							</div>:this.state.authenticationState=='1'?
+							<div>
+								<FormItem className="half-item" {...formItemLayout} label="顾问类型">
+								{getFieldDecorator('adviserType', {
+									rules: [ { required: true, message: '此项为必填项!' } ],
+									initialValue: theData.adviserType
+								})(
+									<Select placeholder="选择类型">
+										{adviserType.map(function(item) {
+											return <Select.Option key={item.value}>{item.key}</Select.Option>;
+										})}
+									</Select>
+								)}
+								</FormItem>
+								<div className="clearfix">
+									<FormItem
+										className="picWidth"
+										labelCol={{ span: 9 }}
+										wrapperCol={{ span: 8 }}
+										label={<div style={{marginRight:10}}><strong style={{color:"#f00"}}>*</strong><span>顾问照片 : </span></div> }
+									>
+										<PicturesWall
+											fileList={(e)=>{this.setState({adviserUrl:e})}}
+											pictureUrl={this.state.adviserUrl}
+										/>
+										<p>建议:图片要清晰。</p>
+									</FormItem>
+								</div>
+							</div>:''}
+							{this.state.authenticationState=='1'||this.state.authenticationState=='0'?<div className="clearfix pictures">
+								<FormItem
+									className="picWidth"
+									labelCol={{ span: 9 }}
+									wrapperCol={{ span: 10 }}
+									label={<div style={{marginRight:10}}><strong style={{color:"#f00"}}>*</strong><span>身份证正面 : </span></div> }
+								>
+									<PicturesWall fileList={this.getPositiveIdUrl} pictureUrl={this.state.positiveIdUrl} />
+									<p>建议:图片要清晰。</p>
+								</FormItem>
+								<FormItem
+									className="picWidth"
+									labelCol={{ span: 9 }}
+									wrapperCol={{ span: 10 }}
+									label={<div style={{marginRight:10}}><strong style={{color:"#f00"}}>*</strong><span>身份证反面 : </span></div> }
+								>
+									<PicturesWall fileList={this.getOppositeIdUrl} pictureUrl={this.state.oppositeIdUrl} />
+									<p>建议:图片要清晰。</p>
+								</FormItem>
+							</div>:''}
+						</div>:this.state.authState=='3'||this.state.authState=='1'&&this.state.authType=='0'?
+					    <div>
+							<div className="authState">{this.state.authType=='0'?'专家认证':'顾问认证'}<span>({getAuthState(this.state.authState)})</span></div>
+							<FormItem className="half-item" {...formItemLayout} label="毕业院校">
+								<span>{theData.graduateSchool}</span>
 							</FormItem>
-							<FormItem
-								className="picWidth"
-								labelCol={{ span: 10 }}
-								wrapperCol={{ span: 10 }}
-								label="身份证反面"
-							>
-								<PicturesWall fileList={this.getOppositeIdUrl} pictureUrl={this.state.oppositeIdUrl} />
-								<p>建议:图片要清晰。</p>
+							<FormItem className="half-item" {...formItemLayout} label="专业类别">
+								<span>{theData.majorCategory}</span>
 							</FormItem>
-							<FormItem
-								className="picWidth"
-								labelCol={{ span: 10 }}
-								wrapperCol={{ span: 10 }}
-								label="专家照片"
-							>
-								<PicturesWall
-									fileList={this.getHeadPortraitUrl}
-									pictureUrl={this.state.headPortraitUrl}
-								/>
-								<p>建议:图片要清晰。</p>
+							<FormItem className="half-item" {...formItemLayout} label="职业资格">
+								<span>{theData.qualification}</span>
 							</FormItem>
+							<FormItem className="half-item" {...formItemLayout} label="就职单位">
+								<span>{theData.workUnit}</span>
+							</FormItem>
+							<FormItem className="half-item" {...formItemLayout} label="职称">
+								<span>{theData.professionalTitle}</span>
+							</FormItem>
+							<div className="clearfix">
+								<FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 13 }} label="专家照片">
+										<Upload className="demandDetailShow-upload"
+											listType="picture-card"
+											fileList={this.state.headPortraitUrl}                               
+											onPreview={(file) => {
+												this.setState({
+													previewImage: file.url || file.thumbUrl,
+													previewVisible: true,
+												});
+											}} >
+										</Upload>
+										<Modal maskClosable={false} footer={null}
+											visible={this.state.previewVisible}
+											onCancel={() => { this.setState({ previewVisible: false }) }}>
+											<img alt="" style={{ width: '100%' }} src={this.state.previewImage || ''} />
+										</Modal>
+								</FormItem>
+							</div>
+							<FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 10 }} label="身份证正面">
+								<div className="clearfix">
+									<Upload className="demandDetailShow-upload"
+										listType="picture-card"
+										fileList={this.state.positiveIdUrl}                               
+										onPreview={(file) => {
+											this.setState({
+												previewImage: file.url || file.thumbUrl,
+												previewVisible: true,
+											});
+										}} >
+									</Upload>
+									<Modal maskClosable={false} footer={null}
+										visible={this.state.previewVisible}
+										onCancel={() => { this.setState({ previewVisible: false }) }}>
+										<img alt="" style={{ width: '100%' }} src={this.state.previewImage || ''} />
+									</Modal>
+								</div>
+							</FormItem>
+							<FormItem labelCol={{ span:3 }} wrapperCol={{ span: 10 }} label="身份证反面">
+								<div className="clearfix">
+									<Upload className="demandDetailShow-upload"
+										listType="picture-card"
+										fileList={this.state.oppositeIdUrl}                               
+										onPreview={(file) => {
+											this.setState({
+												previewImage: file.url || file.thumbUrl,
+												previewVisible: true,
+											});
+										}} >
+									</Upload>
+									<Modal maskClosable={false} footer={null}
+										visible={this.state.previewVisible}
+										onCancel={() => { this.setState({ previewVisible: false }) }}>
+										<img alt="" style={{ width: '100%' }} src={this.state.previewImage || ''} />
+									</Modal>
+								</div>
+							</FormItem>				
+						</div>:this.state.authState=='3'||this.state.authState=='1'&&this.state.authType=='1'?
+						<div className="clearfix">
+							<div className="authState">{this.state.authType=='0'?'专家认证':'顾问认证'}<span>({getAuthState(this.state.authState)})</span></div>
+							<FormItem className="half-item" {...formItemLayout} label="顾问类型">
+								<span>{getAdviserType(theData.adviserType)}</span>
+							</FormItem>
+							<div className="clearfix">
+								<FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 13 }} label="顾问照片">
+										<Upload className="demandDetailShow-upload"
+											listType="picture-card"
+											fileList={this.state.adviserUrl}                               
+											onPreview={(file) => {
+												this.setState({
+													previewImage: file.url || file.thumbUrl,
+													previewVisible: true,
+												});
+											}} >
+										</Upload>
+										<Modal maskClosable={false} footer={null}
+											visible={this.state.previewVisible}
+											onCancel={() => { this.setState({ previewVisible: false }) }}>
+											<img alt="" style={{ width: '100%' }} src={this.state.previewImage || ''} />
+										</Modal>
+								</FormItem>
+							</div>
+							<FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 10 }} label="身份证正面">
+								<div className="clearfix">
+									<Upload className="demandDetailShow-upload"
+										listType="picture-card"
+										fileList={this.state.positiveIdUrl}                               
+										onPreview={(file) => {
+											this.setState({
+												previewImage: file.url || file.thumbUrl,
+												previewVisible: true,
+											});
+										}} >
+									</Upload>
+									<Modal maskClosable={false} footer={null}
+										visible={this.state.previewVisible}
+										onCancel={() => { this.setState({ previewVisible: false }) }}>
+										<img alt="" style={{ width: '100%' }} src={this.state.previewImage || ''} />
+									</Modal>
+								</div>
+							</FormItem>
+							<FormItem labelCol={{ span:3 }} wrapperCol={{ span: 10 }} label="身份证反面">
+								<div className="clearfix">
+									<Upload className="demandDetailShow-upload"
+										listType="picture-card"
+										fileList={this.state.oppositeIdUrl}                               
+										onPreview={(file) => {
+											this.setState({
+												previewImage: file.url || file.thumbUrl,
+												previewVisible: true,
+											});
+										}} >
+									</Upload>
+									<Modal maskClosable={false} footer={null}
+										visible={this.state.previewVisible}
+										onCancel={() => { this.setState({ previewVisible: false }) }}>
+										<img alt="" style={{ width: '100%' }} src={this.state.previewImage || ''} />
+									</Modal>
+								</div>
+							</FormItem>	
+						</div>:''}
+						<div className="clearfix">
+							<Row style={{ marginBottom: 20 }} >
+								<Col offset={3} span={4}>
+									<Button size="large" className="set-submit" type="primary" htmlType="submit">
+										保存
+									</Button>
+								</Col>
+							</Row>
 						</div>
-						<Row style={{ marginBottom: 20 }}>
-							<Col offset={3} span={4}>
-								<Button size="large" className="set-submit" type="primary" htmlType="submit">
-									保存
-								</Button>
-							</Col>
-						</Row>
 					</Spin>
 				</Form>
 				<Modal visible={this.state.visible} onOk={this.handleOk} onCancel={this.handleCancel}>
-					<p>是否申请专家认证?</p>
+					{this.state.authenticationState=='0'&&<p>是否申请专家认证?注意:认证成功后,您的信息将在本平台展示。</p>}
+					{this.state.authenticationState=='1'&&<p>是否申请顾问认证?注意:认证成功后,您的信息将在本平台展示。</p>}
+					{this.state.type!='1'&&this.state.type!='0'?<p>是否申请个人认证?</p>:''}
 				</Modal>
 			</div>
 		);

+ 0 - 555
js/component/account/setAccount/patent.jsx

@@ -1,555 +0,0 @@
-/* 
-	@author:李霆
-	@update:2018/05/29
-	@descript:复制粘贴,拿起来就是干!!
-*/
-
-import React from 'react';
-import {
-	Radio,
-	Icon,
-	Button,
-	Cascader,
-	Input,
-	Select,
-	Spin,
-	message,
-	DatePicker,
-	Modal,
-	Upload,
-	Form,
-	Row,
-	Col,
-} from 'antd';
-
-import $ from 'jquery/src/ajax';
-import moment from 'moment';
-import './unit.less';
-import { areaSelect } from '@/NewDicProvinceList';
-import {
-	socialAttribute,
-	industry,
-	
-} from '@/dataDic.js';
-import {
-	splitUrl,
-} from '@/tools.js';
-const FormItem = Form.Item;
-const monthFormat = 'YYYY/MM';
-//图片组件
-const PicturesWall = React.createClass({
-	getInitialState() {
-		return {
-			previewVisible: false,
-			previewImage: '',
-			fileList: []
-		};
-	},
-	handleCancel() {
-		this.setState({
-			previewVisible: false
-		});
-	},
-	handlePreview(file) {
-		this.setState({
-			previewImage: file.url || file.thumbUrl,
-			previewVisible: true
-		});
-	},
-	handleChange(info) {
-		let fileList = info.fileList;
-		this.setState({
-			fileList
-		});
-		this.props.fileList(fileList);
-	},
-	componentWillReceiveProps(nextProps) {
-		this.state.fileList = nextProps.pictureUrl;
-	},
-	render() {
-		const { previewVisible, previewImage, fileList } = this.state;
-		const uploadButton = (
-			<div>
-				<Icon type="plus" />
-				<div className="ant-upload-text">点击上传</div>
-			</div>
-		);
-		return (
-			<div style={{ display: 'inline-block' }}>
-				<Upload
-					action={globalConfig.context + '/api/user/uploadPicture'}
-					data={{ sign: 'user_picture' }}
-					listType="picture-card"
-					fileList={fileList}
-					onPreview={this.handlePreview}
-					onChange={this.handleChange}
-				>
-					{fileList.length >= 1 ? null : uploadButton}
-				</Upload>
-				<Modal maskClosable={false} visible={previewVisible} footer={null} onCancel={this.handleCancel}>
-					<img alt="example" style={{ width: '100%' }} src={previewImage} />
-				</Modal>
-			</div>
-		);
-	}
-});
-
-const Personal = React.createClass({
-	getInitialState() {
-		return {
-			loading: false,
-			orgCodeUrl: [],
-			companyLogoUrl: [],
-			headPortraitUrl: [],
-			positiveIdUrl: [],
-			oppositeIdUrl: []
-		};
-	},
-	loadInformation(record) {
-		this.setState({
-			loading: true
-		});
-		$.ajax({
-			method: 'get',
-			dataType: 'json',
-			crossDomain: false,
-			url: globalConfig.context + '/api/user/getUserDetail',
-			success: function(data) {
-				let thisData = data.data;
-				if (!thisData) {
-					if (data.error && data.error.length) {
-						message.warning(data.error[0].message);
-					}
-					thisData = {};
-				}
-				let ProvinceCityArr = [];
-				let ProvinceS = thisData.province; //getprovince
-				let citys = thisData.city;
-				let Areas = thisData.area;
-				ProvinceCityArr.push(ProvinceS, citys, Areas);
-				let month = thisData.dateOfBirthYear
-					? thisData.dateOfBirthYear + '/' + thisData.dateOfBirthMonth
-					: undefined;
-				this.setState({
-					InformationId: thisData.id,
-					InformationUid: thisData.uid,
-					identifyName: thisData.identifyName,
-					headPortraitUrl: thisData.headPortraitUrl
-						? splitUrl(thisData.headPortraitUrl, ',', globalConfig.avatarHost + '/upload')
-						: [],
-					positiveIdUrl: thisData.positiveIdUrl
-						? splitUrl(thisData.positiveIdUrl, ',', globalConfig.avatarHost + '/upload')
-						: [],
-					oppositeIdUrl: thisData.oppositeIdUrl
-						? splitUrl(thisData.oppositeIdUrl, ',', globalConfig.avatarHost + '/upload')
-						: [],
-					dataInformation: thisData,
-					idNumber: thisData.idNumber,
-					mobile:thisData.mobile,
-					ProvinceCity: ProvinceCityArr[0] != null ? ProvinceCityArr : undefined,
-					industry: thisData.industry ? String(thisData.industry) : undefined,
-					societyTag: thisData.societyTag || undefined,
-					sex: thisData.sex,
-					yearMonth: month,
-					postalAddress: thisData.postalAddress,
-					fixedTel: thisData.fixedTel,
-					email: thisData.email,
-					qq: thisData.qq,
-					mobile:thisData.mobile,
-					introduction: thisData.introduction,
-					type:thisData.type,
-					authentication:thisData.authentication
-				});
-			}.bind(this)
-		}).always(
-			function() {
-				this.setState({
-					loading: false
-				});
-			}.bind(this)
-		);
-	},
-	//图片
-	getOrgCodeUrl(e) {
-		this.setState({
-			orgCodeUrl: e
-		});
-	},
-	getCompanyLogoUrl(e) {
-		this.setState({
-			companyLogoUrl: e
-		});
-	},
-	//基本信息提交
-	newSubmit(e) {
-        if(!this.state.identifyName){
-            message.warning("请填写姓名!")
-            return;
-        }
-		if (!this.state.industry) {
-			message.warning('请选择行业!');
-			return false;
-		}
-		if (!this.state.societyTag) {
-			message.warning('请选择社会性质!');
-			return false;
-		}
-		if (!this.state.ProvinceCity||!this.state.ProvinceCity.length) {
-			message.warning('请选择地区!');
-			return false;
-        }
-        
-        if(!this.state.mobile){
-            message.warning("请填写手机号码!")
-            return;
-        }
-		this.state.data = [];
-		this.setState({
-			selectedRowKeys: []
-		});
-
-		let theorgCodeUrl = [];
-		if (this.state.headPortraitUrl.length) {
-			let picArr = [];
-			this.state.headPortraitUrl.map(function(item) {
-				if (item.response && item.response.data && item.response.data.length) {
-					picArr.push(item.response.data);
-				}
-			});
-			theorgCodeUrl = picArr.join(',');
-		}
-		let thecompanyLogoUrl = [];
-		if (this.state.positiveIdUrl.length) {
-			let picArr = [];
-			this.state.positiveIdUrl.map(function(item) {
-				if (item.response && item.response.data && item.response.data.length) {
-					picArr.push(item.response.data);
-				}
-			});
-			thecompanyLogoUrl = picArr.join(',');
-		}
-		let thecompanyLogoUrls = [];
-		if (this.state.oppositeIdUrl.length) {
-			let picArr = [];
-			this.state.oppositeIdUrl.map(function(item) {
-				if (item.response && item.response.data && item.response.data.length) {
-					picArr.push(item.response.data);
-				}
-			});
-			thecompanyLogoUrls = picArr.join(',');
-		}
-
-		let years = [];
-		let yearMonth = this.state.yearMonth != undefined ? new Date(this.state.yearMonth).toLocaleDateString() : '';
-		years = yearMonth.split('/');
-		this.setState({
-			loading: true
-		});
-		$.ajax({
-			method: 'post',
-			dataType: 'json',
-			url: globalConfig.context + '/api/user/updateUserDetail',
-			data: {
-				id: this.state.InformationId,
-				uid: this.state.InformationUid,
-				societyTag: this.state.societyTag,
-				identifyName: this.state.identifyName,
-				industry: this.state.industry,
-				dateOfBirthYear: years[0], //出生年
-				dateOfBirthMonth: years[1], //出生月
-				province: this.state.ProvinceCity[0], //省-
-				city: this.state.ProvinceCity[1], //市
-				area: this.state.ProvinceCity[2], //区
-				sex: this.state.sex,
-				mobile:this.state.mobile,
-				fixedTel: this.state.fixedTel,
-				qq: this.state.qq,
-				idNumber: this.state.idNumber,
-				email: this.state.email,
-				postalAddress: this.state.postalAddress,
-				introduction: this.state.introduction,
-				positiveIdUrl: thecompanyLogoUrl.length != 0 ? thecompanyLogoUrl : '',
-				oppositeIdUrl: thecompanyLogoUrls.length != 0 ? thecompanyLogoUrls : '',
-				headPortraitUrl: theorgCodeUrl.length != 0 ? theorgCodeUrl : '',
-				authentication:this.state.authentication,
-				type:this.state.type
-			}
-		}).done(
-			function(data) {
-				this.setState({
-					loading: false
-				});
-				if (!data.error.length) {
-					if(this.state.type!='0'){
-						message.success('个人认证成功,1s后回到首页.')
-						setTimeout(()=>{
-							window.location.href = globalConfig.context + "/user/account/index.html";
-						},1000)  
-					}else{
-						message.success('保存成功!');
-						this.loadInformation();
-					}
-				} else {
-					message.warning(data.error[0].message);
-				}
-			}.bind(this)
-		);
-	},
-	subFun(){
-		if(this.state.type=='0'||this.state.type=='1'){
-			this.newSubmit()
-		}else{
-			this.setState({
-				visible:true
-			})
-		}
-	},
-	handleOk(){
-		this.newSubmit();
-		this.setState({
-			visible:false
-		})
-	},
-	handleCancel(){
-		this.setState({
-			visible:false
-		})
-	},
-	getHeadPortraitUrl(e) {
-		this.setState({ headPortraitUrl: e });
-	},
-	getPositiveIdUrl(e) {
-		this.setState({ positiveIdUrl: e });
-	},
-	getOppositeIdUrl(e) {
-		this.setState({ oppositeIdUrl: e });
-	},
-	componentWillMount() {
-		this.loadInformation();
-	},
-	componentWillReceiveProps(nextProps) {},
-	render() {
-		const { RangePicker, MonthPicker } = DatePicker;
-		const formItemLayout = {
-			labelCol: {
-				span: 6
-			},
-			wrapperCol: {
-				span: 14
-			}
-		};
-		return (
-			<div className="unit-wrap">
-				<Form layout="horizontal" onSubmit={this.newSubmit} id="demand-form" style={{width:'80%'}}>
-					<Spin spinning={this.state.loading}>
-						<Row style={{ marginBottom: 20 }}>
-							<Col offset={2} span={4}>
-								<h4 style={{fontSize:20}}>专利代理人资料</h4>
-							</Col>
-						</Row>
-						<div className="clearfix">
-							<FormItem className="half-item" {...formItemLayout} label={<span><span className="color-red"> * </span>姓名</span>}>
-								<Input
-									placeholder="输入姓名"
-									value={this.state.identifyName}
-									onChange={(e) => {
-										this.setState({ identifyName: e.target.value });
-									}}
-								/>
-							</FormItem>
-							<FormItem className="half-item" {...formItemLayout} label="性别">
-								<Radio.Group
-									value={this.state.sex}
-									onChange={(e) => {
-										this.setState({ sex: e.target.value });
-									}}
-								>
-									<Radio value={'男'}>男</Radio>
-									<Radio value={'女'}>女</Radio>
-								</Radio.Group>
-							</FormItem>
-						</div>
-						<div className="clearfix">
-							<FormItem className="half-item" {...formItemLayout} label={<span><span className="color-red"> * </span>行业</span>}>
-								<Select
-									placeholder="选择行业"
-									value={this.state.industry}
-									onChange={(e) => {
-										this.setState({ industry: e });
-									}}
-								>
-									{industry.map(function(item) {
-										return <Select.Option key={item.value}>{item.key}</Select.Option>;
-									})}
-								</Select>
-							</FormItem>
-							<FormItem className="half-item" {...formItemLayout} label={<span><span className="color-red"> * </span>社会属性</span>}>
-								<Select
-									placeholder="客户社会属性"
-									value={this.state.societyTag}
-									onChange={(e) => {
-										this.setState({ societyTag: e });
-									}}
-								>
-									{socialAttribute.map(function(item) {
-										return <Select.Option key={item.value}>{item.key}</Select.Option>;
-									})}
-								</Select>
-							</FormItem>
-							<FormItem className="half-item" {...formItemLayout} label="出生日期">
-								{!this.state.yearMonth ? (
-									<MonthPicker
-										placeholder="选择出生年月"
-										value={this.state.yearMonth}
-										onChange={(time) => {
-											this.setState({ yearMonth: time });
-										}}
-									/>
-								) : (
-									<MonthPicker
-										value={moment(this.state.yearMonth, monthFormat)}
-										format={monthFormat}
-										onChange={(time) => {
-											this.setState({ yearMonth: time });
-										}}
-									/>
-								)}
-							</FormItem>
-							<FormItem className="half-item" {...formItemLayout} label="身份证号码">
-								<Input
-									placeholder="身份证号码"
-									value={this.state.idNumber}
-									onChange={(e) => {
-										this.setState({ idNumber: e.target.value });
-									}}
-								/>
-							</FormItem>
-                        </div>
-                        <div className="clearfix">
-                            <FormItem className="half-item" {...formItemLayout} label={<span><span className="color-red"> * </span>省-市-区</span>}>
-                                <Cascader
-                                    options={areaSelect()}
-                                    value={this.state.ProvinceCity}
-                                    placeholder="选择城市"
-                                    onChange={(e, pre) => {
-                                        this.setState({ ProvinceCity: e });
-                                    }}
-                                />
-                            </FormItem>
-                            <FormItem className="half-item" {...formItemLayout} label="通信地址">
-                                <Input
-                                    placeholder="客户通信地址"
-                                    value={this.state.postalAddress}
-                                    onChange={(e, pre) => {
-                                        this.setState({ postalAddress: e.target.value });
-                                    }}
-                                />
-                            </FormItem>
-                            <FormItem className="half-item" {...formItemLayout} label={<span><span className="color-red"> * </span>手机号码</span>}>
-                                <Input
-                                    placeholder="手机号码"
-                                    value={this.state.mobile}
-                                    onChange={(e) => {
-                                        this.setState({ mobile: e.target.value });
-                                    }}
-                                />
-                            </FormItem>
-                            <FormItem className="half-item" {...formItemLayout} label="固定电话">
-                                <Input
-                                    placeholder="客户固定电话"
-                                    value={this.state.fixedTel}
-                                    onChange={(e) => {
-                                        this.setState({ fixedTel: e.target.value });
-                                    }}
-                                />
-                            </FormItem>
-                            <FormItem className="half-item" {...formItemLayout} label="QQ">
-                                <Input
-                                    placeholder="QQ"
-                                    value={this.state.qq}
-                                    onChange={(e) => {
-                                        this.setState({ qq: e.target.value });
-                                    }}
-                                />
-                            </FormItem>
-                            <FormItem className="half-item" {...formItemLayout} label="电子邮箱">
-                                <Input
-                                    placeholder="客户电子邮箱"
-                                    value={this.state.email}
-                                    onChange={(e) => {
-                                        this.setState({ email: e.target.value });
-                                    }}
-                                />
-                            </FormItem>
-                        </div>
-                        <div className="clearfix">
-                            <FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 18 }} label="专家简介">
-                                <Input
-                                    type="textarea"
-                                    rows={4}
-                                    value={this.state.introduction}
-                                    onChange={(e, pre) => {
-                                        this.setState({ introduction: e.target.value });
-                                    }}
-                                />
-                            </FormItem>
-                        </div>
-                        <div className="clearfix pictures">
-                            <FormItem
-                                className="picWidth"
-                                labelCol={{ span: 10 }}
-                                wrapperCol={{ span: 10 }}
-                                label="身份证正面"
-                            >
-                                <PicturesWall
-                                    fileList={this.getPositiveIdUrl}
-                                    pictureUrl={this.state.positiveIdUrl}
-                                />
-                                <p>建议:图片要清晰。</p>
-                            </FormItem>
-                            <FormItem
-                                className="picWidth"
-                                labelCol={{ span: 10 }}
-                                wrapperCol={{ span: 10 }}
-                                label="身份证反面"
-                            >
-                                <PicturesWall
-                                    fileList={this.getOppositeIdUrl}
-                                    pictureUrl={this.state.oppositeIdUrl}
-                                />
-                                <p>建议:图片要清晰。</p>
-                            </FormItem>
-                            <FormItem
-                                className="picWidth"
-                                labelCol={{ span: 10 }}
-                                wrapperCol={{ span: 10 }}
-                                label="客户照片"
-                            >
-                                <PicturesWall
-                                    fileList={this.getHeadPortraitUrl}
-                                    pictureUrl={this.state.headPortraitUrl}
-                                />
-                                <p>建议:图片要清晰。</p>
-                            </FormItem>
-                        </div>
-                        <Row style={{ marginBottom: 20 }}>
-                            <Col offset={3} span={4}>
-                                <Button size="large" className="set-submit" type="primary"  onClick={this.subFun}>
-                                    保存
-                                </Button>
-                            </Col>
-                        </Row>
-					</Spin>
-				</Form>
-				<Modal
-					visible={this.state.visible}
-					onOk={this.handleOk}
-					onCancel={this.handleCancel}
-					>
-						<p>是否申请个人用户认证?</p>
-				</Modal>
-			</div>
-		);
-	}
-});
-export default Personal;

+ 37 - 1
js/component/account/setAccount/unit.less

@@ -7,6 +7,9 @@
         display: inline-block;
         margin-bottom: 10px;
     }
+    .clearfix{
+        clear: both;
+    }
     #demand-form{
         padding-top: 20px;
         .subBtn{
@@ -26,5 +29,38 @@
         width: 33.33%;
         display: inline-block;
     }
-   
+    .btnGrounp{
+        margin-left: 166px;
+        margin-bottom: 15px;
+        .ant-radio-button-wrapper{
+            width: 200px;
+            height: 40px;
+            line-height: 36px;
+            text-align: center;
+            font-size: 16px;
+            border: 2px solid #80b9ff;
+            margin-right: 10px;
+            color: #80b9ff
+         }
+         .ant-radio-button-wrapper-checked{
+             background: #80b9ff;
+             color:#fff
+         }
+         .patentBody{
+             overflow: hidden;
+             background: #ccc;
+
+         }
+         
+    }
+    .authState{
+        margin-left: 100px;
+        font-size: 20px;
+        margin-bottom: 15px;
+        span{
+            font-size: 14px;
+            color: green
+        }
+    }
+    
 }

+ 62 - 0
js/component/administration/authentication/authDesc.jsx

@@ -0,0 +1,62 @@
+import React from 'react';
+import { Modal, Spin } from 'antd';
+import AuthDetaiel from '@/administration/authentication/authDetaiel';
+
+class DemandDesc extends React.Component {
+	constructor(props) {
+		super(props);
+		this.state = {
+			loading: false,
+			pictureUrl: [],
+			showState:false
+		};
+	}
+	handleCancel() {
+		this.setState({
+			visible: false,
+		});
+		this.props.closeDesc(false, false);
+	}
+	handOk() {
+		this.setState({
+			visible: false,
+		});
+		this.props.closeDesc(false, true);
+	}
+	componentWillReceiveProps(nextProps) {
+		this.state.visible = nextProps.showDesc;
+
+	}
+	render() {
+		let data = this.props.data || {releaseStatus:0};
+		return (
+			<div className="patent-desc">
+				<Modal
+					maskClosable={false}
+					visible={this.state.visible}
+					onOk={this.handOk.bind(this)}
+					onCancel={this.handleCancel.bind(this)}
+					width="1000px"
+					title='专家顾问详情'
+					footer=""
+					className="admin-desc-content"
+				>
+					<div>
+						<div>
+							<AuthDetaiel
+							    examineState={this.props.examineState}
+								closeDesc={this.handleCancel.bind(this)}
+								data={this.props.data}
+								demandTypeOption={this.props.demandTypeOption}
+								visible={this.state.visible}
+								handOk={this.handOk.bind(this)}
+							/>
+						</div>
+					</div>
+				</Modal>
+			</div>
+		);
+	}
+}
+
+export default DemandDesc;

+ 335 - 0
js/component/administration/authentication/authDetaiel.jsx

@@ -0,0 +1,335 @@
+import React from 'react';
+import $ from 'jquery/src/ajax';
+import {
+	Modal,
+	message,
+	Spin,
+	Upload,
+	Input,
+	Button,
+	Form
+} from 'antd';
+
+import { getAdviserType,getIndustry,getSocialAttribute } from '@/tools.js';
+import { getProvince } from '@/NewDicProvinceList';
+const AuthDetail = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+            pictureUrl: [],
+            headPortraitUrl: [],
+			adviserUrl:[],
+			positiveIdUrl: [],
+			oppositeIdUrl: [],
+        };
+    },
+    loadData(id) {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context +  '/api/user/demand/demandDetail' ,
+            data: {
+                id: id
+            },
+            success: function (data) {
+                let thisData = data.data;
+                if (!thisData) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                    thisData = {};
+                };
+                let provice;
+                provice=getProvince(thisData.province,thisData.city,thisData.area);
+                this.setState({
+                    id:thisData.id,
+                    data: thisData,
+                    ProvinceCity:provice,
+					headPortraitUrl: thisData.headPortraitUrl //专家照片
+						? splitUrl(thisData.headPortraitUrl, ',', globalConfig.avatarHost + '/upload')
+						: [],
+					adviserUrl: thisData.adviserUrl		//顾问照片
+						? splitUrl(thisData.adviserUrl, ',', globalConfig.avatarHost + '/upload')
+						: [],
+					positiveIdUrl: thisData.positiveIdUrl
+						? splitUrl(thisData.positiveIdUrl, ',', globalConfig.avatarHost + '/upload')
+						: [],
+					oppositeIdUrl: thisData.oppositeIdUrl
+						? splitUrl(thisData.oppositeIdUrl, ',', globalConfig.avatarHost + '/upload')
+						: [],
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+	cancelFun(){
+		this.props.closeDesc();
+    },
+    //审核通过/拒绝
+    updateFun(index){
+        this.setState({
+            loading:true
+        })
+        $.ajax({
+            method: "get",
+            dataType: "JSON",
+            crossDomain: false,
+            url: globalConfig.context +  '/api/admin/demand/auditDemand',
+            data: {
+                id: this.state.id,
+                auditResult:index,
+                auditInfo:this.state.refuseValue
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('操作成功!');
+                this.setState({
+                    loading: false,
+                });
+                this.props.handOk()
+            } else {
+                message.warning(data.error[0].message);
+            };
+        }.bind(this));
+    },
+    //审核拒绝
+    refuse(){
+        this.setState({
+            refuseValue:'',
+            refuseVisible:true
+        })
+    },
+    refuseOk(){
+        if(!this.state.refuseValue){
+            message.warning('请填写拒绝原因。')
+            return;
+        }
+        this.setState({
+            refuseVisible:false
+        })
+        this.updateFun(0)
+    },
+    refuseCancel(){
+        this.setState({
+            refuseValue:'',
+            refuseVisible:false
+        })
+    },
+    componentWillMount() {
+        if (this.props.data.id) {
+            this.loadData(this.props.data.id);
+        } else {
+            this.state.data = {};
+        };
+    },
+    componentWillReceiveProps(nextProps) {
+        if (!this.props.visible && nextProps.visible) {
+            if (nextProps.data.id) {
+                this.loadData(nextProps.data.id);
+            } else {
+				this.state.data = {};
+            };
+            this.props.form.resetFields();
+        };
+    },
+    render() {
+        const theData = this.state.data || {};
+        const FormItem = Form.Item
+        const formItemLayout = {
+            labelCol: { span: 6 },
+            wrapperCol: { span: 12 },
+        };
+        return (
+			<div className='login'>
+			<Form layout="horizontal" id="demand-form">
+				<Spin spinning={this.state.loading}>
+                    <div className="clearfix">
+						<FormItem className="half-item" {...formItemLayout} label="姓名">
+                            <span>{theData.identifyName}</span>
+                        </FormItem>
+						<FormItem className="half-item" {...formItemLayout} label="行业">
+                            <span>{getIndustry(theData.industry)}</span>
+						</FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="社会属性">
+                            <span>{getSocialAttribute(theData.societyTag)}</span>
+                        </FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="性别">
+                            <span>{theData.sex}</span>
+                        </FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="出生日期">
+                            <span>{theData.dateOfBirthYear?theData.dateOfBirthYear + '/' + theData.dateOfBirthMonth:''}</span>
+                        </FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="身份证号码">
+                            <span>{theData.idNumber}</span>
+                        </FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="省-市-区">
+                            <span>{this.state.ProvinceCity}</span>
+                        </FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="通信地址">
+                            <span>{theData.postalAddress}</span>
+                        </FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="手机号码">
+                            <span>{theData.mobile}</span>
+                        </FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="固定电话">
+                            <span>{theData.fixedTel}</span>
+                        </FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="QQ">
+                            <span>{theData.qq}</span>
+                        </FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="电子邮箱">
+                            <span>{theData.email}</span>
+                        </FormItem>
+                    </div>
+                    <div className="clearfix">
+                        <FormItem 
+                            labelCol={{ span: 3 }}
+                            wrapperCol={{ span: 18 }} 
+                            label="个人简介">
+                            <span>{theData.introduction}</span>
+                        </FormItem>     
+                    </div>
+                    <p style={{fontSize:16}}>{theData.authType=='0'?'专家认证':'顾问认证'}</p>
+                    {theData.authType=='0'?<div>
+                        <FormItem className="half-item" {...formItemLayout} label="毕业院校">
+                            <span>{theData.graduateSchool}</span>
+                        </FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="专业类别">
+                            <span>{theData.majorCategory}</span>
+                        </FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="职业资格">
+                            <span>{theData.qualification}</span>
+                        </FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="就职单位">
+                            <span>{theData.workUnit}</span>
+                        </FormItem>
+                        <FormItem className="half-item" {...formItemLayout} label="职称">
+                            <span>{theData.professionalTitle}</span>
+                        </FormItem>
+                        <div className="clearfix">
+                            <FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 13 }} label="专家照片">
+                                    <Upload className="demandDetailShow-upload"
+                                        listType="picture-card"
+                                        fileList={this.state.headPortraitUrl}                               
+                                        onPreview={(file) => {
+                                            this.setState({
+                                                previewImage: file.url || file.thumbUrl,
+                                                previewVisible: true,
+                                            });
+                                        }} >
+                                    </Upload>
+                                    <Modal maskClosable={false} footer={null}
+                                        visible={this.state.previewVisible}
+                                        onCancel={() => { this.setState({ previewVisible: false }) }}>
+                                        <img alt="" style={{ width: '100%' }} src={this.state.previewImage || ''} />
+                                    </Modal>
+                            </FormItem>
+                        </div>
+                    </div>:<div>
+                        <FormItem className="half-item" {...formItemLayout} label="顾问类型">
+                            <span>{getAdviserType(theData.adviserType)}</span>
+                        </FormItem>
+                        <div className="clearfix">
+                            <FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 13 }} label="顾问照片">
+                                    <Upload className="demandDetailShow-upload"
+                                        listType="picture-card"
+                                        fileList={this.state.adviserUrl}                               
+                                        onPreview={(file) => {
+                                            this.setState({
+                                                previewImage: file.url || file.thumbUrl,
+                                                previewVisible: true,
+                                            });
+                                        }} >
+                                    </Upload>
+                                    <Modal maskClosable={false} footer={null}
+                                        visible={this.state.previewVisible}
+                                        onCancel={() => { this.setState({ previewVisible: false }) }}>
+                                        <img alt="" style={{ width: '100%' }} src={this.state.previewImage || ''} />
+                                    </Modal>
+                            </FormItem>
+                        </div>
+                    </div>}
+                    <div>
+                        <FormItem labelCol={{ span: 3 }} wrapperCol={{ span: 10 }} label="身份证正面">
+                            <div className="clearfix">
+                                <Upload className="demandDetailShow-upload"
+                                    listType="picture-card"
+                                    fileList={this.state.positiveIdUrl}                               
+                                    onPreview={(file) => {
+                                        this.setState({
+                                            previewImage: file.url || file.thumbUrl,
+                                            previewVisible: true,
+                                        });
+                                    }} >
+                                </Upload>
+                                <Modal maskClosable={false} footer={null}
+                                    visible={this.state.previewVisible}
+                                    onCancel={() => { this.setState({ previewVisible: false }) }}>
+                                    <img alt="" style={{ width: '100%' }} src={this.state.previewImage || ''} />
+                                </Modal>
+                            </div>
+                        </FormItem>
+                        <FormItem labelCol={{ span:3 }} wrapperCol={{ span: 10 }} label="身份证反面">
+                            <div className="clearfix">
+                                <Upload className="demandDetailShow-upload"
+                                    listType="picture-card"
+                                    fileList={this.state.oppositeIdUrl}                               
+                                    onPreview={(file) => {
+                                        this.setState({
+                                            previewImage: file.url || file.thumbUrl,
+                                            previewVisible: true,
+                                        });
+                                    }} >
+                                </Upload>
+                                <Modal maskClosable={false} footer={null}
+                                    visible={this.state.previewVisible}
+                                    onCancel={() => { this.setState({ previewVisible: false }) }}>
+                                    <img alt="" style={{ width: '100%' }} src={this.state.previewImage || ''} />
+                                </Modal>
+                            </div>
+                        </FormItem>	   
+                    </div>
+					<div className="clearfix">
+						{this.props.examineState&&<FormItem wrapperCol={{ span: 12, offset: 3 }}>
+							<Button className="set-submit" type="primary"  onClick={(e)=>{this.updateFun(1)}} >
+								审核通过
+							</Button>
+							<Button type="danger" style={{marginRight:20}} onClick={(e)=>{this.refuse()}}>
+								审核拒绝
+							</Button>
+							<Button className="set-submit" type="ghost" onClick={this.cancelFun}>
+								取消
+							</Button>
+						</FormItem>}
+					</div>
+				</Spin>
+			</Form>   
+            <Modal
+                title="审核拒绝"
+                visible={this.state.refuseVisible}
+                onOk={this.refuseOk}
+                onCancel={this.refuseCancel}
+                >   
+                    <div>
+                        <FormItem labelCol={{ span: 4 }} wrapperCol={{ span: 18 }} label="拒绝原因">
+                            <Input type="textarea" rows={4} value={this.state.refuseValue} placeholder="输入拒绝原因" onChange={(e)=>{this.setState({refuseValue:e.target.value})}}/>
+                        </FormItem>
+                    </div>
+                </Modal> 
+		</div>
+        )
+    }
+}));
+export default AuthDetail;
+
+
+
+

+ 236 - 0
js/component/administration/authentication/authExamine.jsx

@@ -0,0 +1,236 @@
+import React from 'react';
+import {  Button, Input, Select, Spin, Table, Switch, message, DatePicker } from 'antd';
+import $ from 'jquery/src/ajax';
+import moment from 'moment';
+import './techDemand.less';
+import TechDemandDesc from './authDesc.jsx';
+import {industry} from '@/dataDic.js';
+import { getIndustry } from '@/tools.js';
+
+const DemandList = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/demand/list",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                identifyName: this.state.nameSearch,
+                industry:this.state.demandTypeSearch,
+                authType: this.state.statusSearch
+            },
+            success: function (data) {
+                let theArr = [];
+                if (!data.data || !data.data.list) {
+                    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,
+                            id: thisdata.id,
+                            serialNumber: thisdata.serialNumber,
+                            status: thisdata.status,
+                            name: thisdata.name,
+                            demandType: thisdata.demandType,
+                            auditStatus: thisdata.auditStatus,
+                            isHot: thisdata.isHot,
+                            isUrgent: thisdata.isUrgent,
+                            employerName:thisdata.employerName,
+                            createTime:thisdata.createTime?(new Date(thisdata.createTime)).toLocaleString():'',
+                            releaseDate:thisdata.releaseDate?(new Date(thisdata.releaseDate)).toLocaleString():''
+                        });
+                    };
+                }
+                this.state.pagination.current = data.data.pageNo;
+                this.state.pagination.total = data.data.totalCount;
+                if(data.data&&data.data.list&&!data.data.list.length){
+					this.state.pagination.current=0
+					this.state.pagination.total=0
+				}
+                this.setState({
+                    dataSource: theArr,
+                    pagination: this.state.pagination
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            searchMore: true,
+            validityPeriodDate: [],
+            releaseDate: [],
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: false,
+            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: 'serialNumber',
+                    key: 'serialNumber',
+                }, {
+                    title: '姓名',
+                    dataIndex: 'identifyName',
+                    key: 'identifyName',
+                    render:text=>{
+                        return text&&text.length>16?text.substr(0,16)+'...':text
+                    }
+                },
+                 {
+                    title: '手机号码',
+                    dataIndex: 'mobile',
+                    key: 'mobile',
+                },
+                 {
+                    title: '行业',
+                    dataIndex: 'industry',
+                    key: 'industry',
+                    render: (text) => { return getIndustry(text); }
+                },
+                
+                {
+                    title: '认证类型',
+                    dataIndex: 'authType',
+                    key: 'authType',
+                    render: text => { return text=='0'?'专家认证':text=='1'?'顾问认证':'未认证' }
+                },
+                {
+                    title: '认证审核',
+                    dataIndex: 'caozuo',
+                    key: 'caozuo',
+                    render:(text,recard) => {
+                        return  <div className="btnRight">
+                                   <Button type="primary" onClick={(e)=>{e.stopPropagation();this.tableRowClick(recard)}}>审核</Button>
+                                </div>
+                    }
+                }
+            ],
+            dataSource: [],
+            searchTime: [,]
+        };
+    },
+    componentWillMount() {
+        let theArr = [];
+        industry.map(function (item) {
+            theArr.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        this.state.demandTypeOption = theArr;
+        this.loadData();
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        this.setState({
+            showDesc: true,
+            examineState:true
+        });
+    },
+    closeDesc(e, s) {
+        this.state.showDesc = e;
+        if (s) {
+            if(this.state.pagination.total%10==1){
+                this.loadData((this.state.page)-1);
+            }else{
+                this.loadData(this.state.page);
+            }
+        };
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.nameSearch = '';
+        this.state.demandTypeSearch = undefined;
+        this.state.auditStatus = undefined;
+        this.state.statusSearch = undefined;
+        this.state.employerNameSearch='';
+        this.state.releaseDate = [];
+        this.loadData();
+    },
+    searchSwitch() {
+        this.setState({
+            searchMore: !this.state.searchMore
+        });
+    },
+    render() {
+        const rowSelection = {
+            selectedRowKeys: this.state.selectedRowKeys,
+            onChange: (selectedRowKeys, selectedRows) => {
+                this.setState({
+                    selectedRows: selectedRows.slice(-1),
+                    selectedRowKeys: selectedRowKeys.slice(-1)
+                });
+            }
+        };
+        const hasSelected = this.state.selectedRowKeys.length > 0;
+        const { RangePicker } = DatePicker;
+        return (
+            <div className="user-content" >
+                <div className="content-title">
+                    <span>专家顾问认证审核</span>
+                </div>
+                <div className="user-search">
+                    <Input placeholder="姓名"
+                        value={this.state.nameSearch}
+                        onChange={(e) => { this.setState({ nameSearch: e.target.value }); }} />
+                    <Select placeholder="行业"
+                        style={{ width: 120 }}
+                        value={this.state.demandTypeSearch}
+                        onChange={(e) => { this.setState({ demandTypeSearch: e }) }}>
+                        {this.state.demandTypeOption}
+                    </Select>
+                    <Select placeholder="认证类型" style={{ width: 160 }}
+                        value={this.state.statusSearch}
+                        onChange={(e) => { this.setState({ statusSearch: e }) }}>
+                        <Select.Option value="0" >专家认证</Select.Option>
+                        <Select.Option value="1" >顾问认证</Select.Option>
+                    </Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            rowSelection={rowSelection}
+                            pagination={this.state.pagination}
+                             />
+                    </Spin>
+                </div>
+                <TechDemandDesc
+                    data={this.state.RowData}
+                    demandTypeOption={this.state.demandTypeOption}
+                    examineState={this.state.examineState}
+                    showDesc={this.state.showDesc}
+                    closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default DemandList;

+ 235 - 0
js/component/administration/authentication/techAuth.jsx

@@ -0,0 +1,235 @@
+import React from 'react';
+import {Button, Input, Select, Spin, Table, Switch, message, DatePicker } from 'antd';
+import $ from 'jquery/src/ajax';
+import moment from 'moment';
+import './techDemand.less';
+import TechDemandDesc from './authDesc.jsx';
+import { industry,authState } from '@/dataDic.js';
+import { getAuthState,getIndustry } from '@/tools.js';
+
+const DemandList = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            page:pageNo,
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/demand/list",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                identifyName: this.state.nameSearch,
+                auditStatus:this.state.auditStatusSearch,
+                industry:this.state.demandTypeSearch,
+                authType: this.state.statusSearch,
+                authState:this.state.authState
+            },
+            success: function (data) {
+                let theArr = [];
+                if (!data.data || !data.data.list) {
+                    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,
+                            id: thisdata.id,
+                            serialNumber: thisdata.serialNumber,
+                            status: thisdata.status,
+                            name: thisdata.name,
+                        });
+                    };
+                }
+                this.state.pagination.current = data.data.pageNo;
+                this.state.pagination.total = data.data.totalCount;
+                if(data.data&&data.data.list&&!data.data.list.length){
+					this.state.pagination.current=0
+					this.state.pagination.total=0
+				}
+                this.setState({
+                    dataSource: theArr,
+                    pagination: this.state.pagination
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            searchMore: true,
+            validityPeriodDate: [],
+            releaseDate: [],
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: false,
+            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: 'serialNumber',
+                    key: 'serialNumber',
+                }, {
+                    title: '姓名',
+                    dataIndex: 'identifyName',
+                    key: 'identifyName',
+                    render:text=>{
+                        return text&&text.length>16?text.substr(0,16)+'...':text
+                    }
+                },
+                {
+                    title: '手机号码',
+                    dataIndex: 'mobile',
+                    key: 'mobile',
+                },
+                {
+                    title: '行业',
+                    dataIndex: 'industry',
+                    key: 'industry',
+                    render: (text) => { return getIndustry(text); }
+                },
+                {
+                    title: '认证类型',
+                    dataIndex: 'authType',
+                    key: 'authType',
+                    render: text => { return text=='0'?'专家认证':text=='1'?'顾问认证':'未认证' }
+                },
+                {
+                    title:'认证状态',
+                    dataIndex:'authState',
+                    key: 'authState',
+                    render:(text)=>{
+                        return getAuthState(text)
+                    }
+                }
+            ],
+            dataSource: [],
+            searchTime: [,]
+        };
+    },
+    componentWillMount() {
+        let theArr = [];
+        industry.map(function (item) {
+            theArr.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        let authList = [];
+        authState.map(function (item) {
+            authList.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        this.state.demandTypeOption = theArr;
+        this.state.authStateList = authList
+        this.loadData();
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        this.setState({
+            showDesc: true,
+            examineState:false
+        });
+    },
+    closeDesc(e, s) {
+        this.state.showDesc = e;
+        if (s) {
+            this.loadData(this.state.page);
+        };
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.nameSearch = '';
+        this.state.demandTypeSearch = undefined;
+        this.state.auditStatusSearch = undefined;
+        this.state.statusSearch = undefined;
+        this.state.authState=undefined;
+        this.loadData();
+    },
+    searchSwitch() {
+        this.setState({
+            searchMore: !this.state.searchMore
+        });
+    },
+    render() {
+        const rowSelection = {
+            selectedRowKeys: this.state.selectedRowKeys,
+            onChange: (selectedRowKeys, selectedRows) => {
+                this.setState({
+                    selectedRows: selectedRows.slice(-1),
+                    selectedRowKeys: selectedRowKeys.slice(-1)
+                });
+            }
+        };
+        const hasSelected = this.state.selectedRowKeys.length > 0;
+        return (
+            <div className="user-content" >
+                <div className="content-title">
+                    <span>专家顾问库</span>
+                </div>
+                <div className="user-search">
+                <Input placeholder="姓名"
+                        value={this.state.nameSearch}
+                        onChange={(e) => { this.setState({ nameSearch: e.target.value }); }} />
+                    <Select placeholder="行业"
+                        style={{ width: 120 }}
+                        value={this.state.demandTypeSearch}
+                        onChange={(e) => { this.setState({ demandTypeSearch: e }) }}>
+                        {this.state.demandTypeOption}
+                    </Select>
+                    <Select placeholder="认证类型" style={{ width: 160 }}
+                        value={this.state.statusSearch}
+                        onChange={(e) => { this.setState({ statusSearch: e }) }}>
+                        <Select.Option value="0" >专家认证</Select.Option>
+                        <Select.Option value="1" >顾问认证</Select.Option>
+                    </Select>
+                    <Select placeholder="认证状态" style={{ width: 160 }}
+                        value={this.state.authState}
+                        onChange={(e) => { this.setState({ authState: e }) }}>
+                        {this.state.authStateList}
+                    </Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            rowSelection={rowSelection}
+                            pagination={this.state.pagination}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <TechDemandDesc
+                    data={this.state.RowData}
+                    examineState={this.state.examineState}
+                    demandTypeOption={this.state.demandTypeOption}
+                    showDesc={this.state.showDesc}
+                    closeDesc={this.closeDesc} />
+            </div>
+        );
+    }
+});
+
+export default DemandList;

+ 98 - 0
js/component/administration/authentication/techDemand.less

@@ -0,0 +1,98 @@
+.user-content {
+    background: #fff;
+    padding: 20px;
+    .content-title {
+        color: #333;
+        font-size: 16px;
+    }
+    .user-search {
+        margin-bottom: 10px;
+        >input {
+            width: 140px;
+        }
+        >input,
+        >button,
+        .ant-select {
+            margin-right: 10px;
+            margin-top: 10px;
+        }
+        .ant-switch {
+            margin-left: 10px;
+        }
+        
+        .search-more {
+            margin: 10px 0;
+            span {
+                margin-right: 10px
+            }
+        }
+    }
+}
+button:focus,button:active{
+    outline: none
+}
+.btnRight button{
+    margin-right: 10px;
+}
+.patent-addNew {
+    float: right;
+    margin-left: 20px;
+    button {
+        background: #ea0862;
+        color: #fff;
+        border: none;
+        border-radius: 4px;
+        padding: 6px 10px;
+        margin-left: 20px;
+    }
+    button:hover {
+        background: #ea0862;
+    }
+}
+
+#demand-form {
+    .half-item {
+        float: left;
+        width: 50%;
+        margin-bottom: 10px;
+    }
+    .item-title {
+        line-height: 30px;
+        font-size: 14px;
+        color: #666;
+    }
+    .form-title {
+        font-size: 16px;
+        color: #333;
+    }
+    .keyWord-tips {
+        >button {
+            vertical-align: middle;
+        }
+    }
+    .set-submit {
+        margin-right: 20px;
+    }
+    .demandDetailShow-upload {
+        .anticon-eye-o {
+            margin-left: -8px;
+        }
+        .anticon-delete {
+            display: none
+        }
+    }
+}
+
+.ant-modal-content {
+    .modal-submit {
+        margin-left: 20px;
+    }
+}
+
+.ant-table-thead {
+    .ant-table-selection-column {
+        .ant-checkbox-wrapper {
+            display: none;
+        }
+    }
+}

+ 3 - 0
js/component/administration/business/businessCategory.jsx

@@ -383,6 +383,9 @@ const BusinessCategory=Form.create()(React.createClass({
         return (
             <div className="user-content" >
                 <div className="content-title">
+                    <div className="content-title">
+                        <span>项目业务管理</span>
+                    </div>
 	                <div className="user-search">
 	                    <Input placeholder="业务品类名称" style={{width:'150px',marginRight:'10px',marginBottom:'10px'}}
 	                        value={this.state.nameSearch}

+ 1 - 0
js/component/administration/business/businessProject.jsx

@@ -497,6 +497,7 @@ const BusinessProject = Form.create()(
 			return (
 				<div className="user-content">
 					<div className="content-title">
+							<span>项目业务审核</span>
 						<div className="user-search">
 							<Input
 								placeholder="业务项目名称"

+ 33 - 0
js/component/dataDic.js

@@ -2302,5 +2302,38 @@ module.exports = {
 	        value: "99",
 	        key: "技淘观点"
         }
+    ],
+    //顾问类型
+    adviserType:[
+        {
+	        value: "0",
+	        key: "专利代理人"
+	    },{
+	        value: "1",
+	        key: "专利顾问"
+	    }, {
+	        value: "2",
+	        key: "版权顾问"
+        }, {
+	        value: "3",
+	        key: "商标顾问"
+        }
+    ],
+    //认证状态
+    authState:[
+        {
+	        value: "0",
+	        key: "未认证"
+	    },{
+	        value: "1",
+	        key: "认证审核中"
+	    }, {
+	        value: "2",
+	        key: "认证失败"
+        }, {
+	        value: "3",
+	        key: "已认证"
+        }
     ]
+
 };

+ 29 - 1
js/component/tools.js

@@ -80,7 +80,9 @@ import {
     transaction,
     newsPosition,
     policyPosition,
-    newType
+    newType,
+    adviserType,
+    authState
 } from './dataDic.js';
 
 import { provinceList} from './NewDicProvinceList.js';
@@ -1484,5 +1486,31 @@ module.exports = {
             });
             return theType;
         }
+     },
+     //顾问类型
+     getAdviserType:function(e){
+        if (e||e==0) {
+            let str=e.toString();
+            let theType = '';
+            adviserType.map(function (item) {
+                if (item.value == str) {
+                    theType = item.key;
+                };
+            });
+            return theType;
+        }
+     },
+     //认证状态
+     getAuthState:function(e){
+        if (e||e==0) {
+            let str=e.toString();
+            let theType = '';
+            authState.map(function (item) {
+                if (item.value == str) {
+                    theType = item.key;
+                };
+            });
+            return theType;
+        }
      }
 }