yee 7 years ago
parent
commit
6ca3305c69

BIN
image/avatar1.png


BIN
image/avatar2.png


BIN
image/avatar3.png


BIN
image/avatar4.png


BIN
image/avatarImg.png


File diff suppressed because it is too large
+ 1047 - 1004
js/component/DicTechFieldList.js


+ 131 - 3
js/component/account/index/collection.jsx

@@ -5,6 +5,8 @@ import $ from 'jquery/src/ajax';
 import DemandDesc from '../../portal/search/demandDesc';
 import AchievementDesc from '../../portal/search/achievementDesc';
 
+import avatarImg from '../../../../image/avatarImg.png';
+
 import './content.less';
 
 const TabPane = Tabs.TabPane;
@@ -111,10 +113,66 @@ const Content = React.createClass({
             });
         }.bind(this));
     },
+    subscriberLoadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/user/interest/interestUserList",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.subscriberPagination.pageSize
+            },
+            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,
+                            interestId: thisdata.interestId,  //关注ID  /api/user/interest/interestUser接口 interestId
+                            uid: thisdata.uid,  //被关注人ID
+                            username: thisdata.username,  //个人用户名称
+                            unitName: thisdata.unitName, //组织用户名称
+                            name: thisdata.type == 0 ? thisdata.username : thisdata.unitName,
+                            userProvince: thisdata.userProvince, //个人用户省份
+                            orgProvince: thisdata.orgProvince, 		//组织用户省份
+                            province: thisdata.type == 0 ? thisdata.userProvince : thisdata.orgProvince,
+                            createTime: thisdata.createTime,
+                            type: thisdata.type, 	//被关注人类型 (0--个人用户,1--组织用户)
+                            demandNum: thisdata.demandNum, 	//科技需求数量
+                            achievementNum: thisdata.achievementNum, 	//科技成果数量
+                            personPortraitUrl: thisdata.personPortraitUrl,// 个人用户头像URL
+                            logoUrl: thisdata.logoUrl, //公司LOGO URL
+                            avaterUrl: thisdata.type == 0 ? thisdata.personPortraitUrl : thisdata.logoUrl,
+                            createTimeFormattedDate: thisdata.createTimeFormattedDate, //关注时间
+                        });
+                    };
+                }
+                this.state.subscriberPagination.current = data.data.pageNo;
+                this.state.subscriberPagination.total = data.data.totalCount;
+                this.setState({
+                    subscriberDataSource: theArr,
+                    subscriberPagination: this.state.subscriberPagination
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
     getInitialState() {
         return {
             loading: false,
-            demandShowDesc: false,
             achievementShowDesc: false,
             achievementPagination: {
                 defaultCurrent: 1,
@@ -161,6 +219,7 @@ const Content = React.createClass({
                 }
             ],
             achievementDataSource: [],
+            demandShowDesc: false,
             demandPagination: {
                 defaultCurrent: 1,
                 defaultPageSize: 10,
@@ -208,14 +267,77 @@ const Content = React.createClass({
                 }
             ],
             demandDataSource: [],
+            subscriberShowDesc: false,
+            subscriberPagination: {
+                defaultCurrent: 1,
+                defaultPageSize: 10,
+                showQuickJumper: true,
+                pageSize: 10,
+                onChange: function (page) {
+                    this.subscriberLoadData(page);
+                }.bind(this),
+                showTotal: function (total) {
+                    return '共' + total + '条数据';
+                }
+            },
+            subscriberColumns: [
+                {
+                    title: null,
+                    dataIndex: 'avaterUrl',
+                    key: 'avaterUrl',
+                    width: 120,
+                    render: text => {
+                        return <div className="avatar-box">
+                            <img src={text ? (globalConfig.avatarHost + '/upload' + text) : avatarImg} alt="" />
+                        </div>
+                    }
+                }, {
+                    title: '名称',
+                    dataIndex: 'name',
+                    key: 'name',
+                }, {
+                    title: '地区',
+                    dataIndex: 'province',
+                    key: 'province',
+                }, {
+                    title: '类型',
+                    dataIndex: 'type',
+                    key: 'type',
+                    render: (text) => {
+                        if (text == 0) {
+                            return "个人用户"
+                        } else if (text == 1) {
+                            return "组织用户"
+                        }
+                    }
+                }, {
+                    title: '科技成果数量',
+                    dataIndex: 'achievementNum',
+                    key: 'achievementNum',
+                }, {
+                    title: '科技需求数量',
+                    dataIndex: 'demandNum',
+                    key: 'demandNum',
+                }, {
+                    title: '关注时间',
+                    dataIndex: 'createTimeFormattedDate',
+                    key: 'createTimeFormattedDate',
+                }
+            ],
+            subscriberDataSource: [],
         };
     },
     componentWillMount() {
         this.achievementLoadData();
-        this.demandLoadData();
     },
     tabChange(key) {
-
+        if (key == 1) {
+            this.achievementLoadData();
+        } else if (key == 2) {
+            this.demandLoadData();
+        } else if (key == 3) {
+            this.subscriberLoadData();
+        }
     },
     demandRowClick(record, index) {
         this.state.demandRowData = record;
@@ -262,6 +384,12 @@ const Content = React.createClass({
                                 pagination={this.state.demandPagination}
                                 onRowClick={this.demandRowClick} />
                         </TabPane>
+                        <TabPane tab="我感兴趣的用户" key="3">
+                            <Table columns={this.state.subscriberColumns}
+                                dataSource={this.state.subscriberDataSource}
+                                pagination={this.state.subscriberPagination}
+                                onRowClick={this.subscriberRowClick} />
+                        </TabPane>
                     </Tabs>
                 </Spin>
                 <DemandDesc data={this.state.demandRowData}

+ 14 - 0
js/component/account/index/content.less

@@ -129,4 +129,18 @@
     .collection {
         background: #fff;
         padding: 20px;
+        .avatar-box {
+            height: 80px;
+            width: 80px;
+            padding-top: 80px;
+            margin: 0 auto;
+            position: relative;
+            img {
+                position: absolute;
+                top: 0;
+                left: 0;
+                height: 80px;
+                width: auto;
+            }
+        }
     }

+ 2 - 9
js/component/account/index/leftTab.jsx

@@ -27,19 +27,12 @@ const LeftTab = React.createClass({
             <Menu onClick={this.handleClick}
                 selectedKeys={[this.state.current]}
                 mode="vertical"
-                className="account-left"
-                >
+                className="account-left">
                 <Menu.Item key="normal">
                     常用功能
                 </Menu.Item>
-                <Menu.Item key="achievement">
-                    成果发布
-                </Menu.Item>
-                <Menu.Item key="demand">
-                    需求发布
-                </Menu.Item>
                 <Menu.Item key="collection">
-                    我的收藏
+                    我感兴趣
                 </Menu.Item>
                 <Menu.Item key="orderList">
                     我的订单

+ 5 - 4
js/component/account/index/normal.jsx

@@ -68,7 +68,7 @@ const Content = React.createClass({
                     <div className="index-userdata clearfix">
                         <p className="acc-title">欢迎, {this.state.number}</p>
                         <div className="userdata-img">
-                            <img src={globalConfig.avatarHost + "/upload/" + (this.state.type == 0 ? this.state.personPortraitUrl : this.state.logoUrl)} alt="" />
+                            <img src={globalConfig.avatarHost + "/upload" + (this.state.type == 0 ? this.state.personPortraitUrl : this.state.logoUrl)} alt="" />
                         </div>
                         <div className="userdata-content">
                             {(() => {
@@ -78,9 +78,10 @@ const Content = React.createClass({
                                     return <p className="userdata-lvl"><span>用户未认证</span><a style={{ marginLeft: '20px' }} href={userData.type == 1 ? globalConfig.context + "/user/groupCertify.html" : globalConfig.context + "/user/certify.html"}>进行实名认证</a></p>;
                                 };
                             })()}
-                            <p><a href={globalConfig.avatarHost + "/user/account/set.html"}>填写完整资料</a>,有助于提高您的资信</p>
-                            <a href={globalConfig.context + "/portal/search/achievement.html"}>成果搜索</a>
-                            <a href={globalConfig.context + "/portal/search/demand.html"}>需求搜索</a>
+                            <p><a href={globalConfig.context + "/user/account/set.html"}>填写完整资料</a>,有助于提高您的资信</p>
+                            <p><a href={globalConfig.context + "/portal/search/achievement.html"}>成果搜索</a></p>
+                            <p><a href={globalConfig.context + "/portal/search/demand.html"}>需求搜索</a></p>
+                            <p><a href={globalConfig.context + "/portal/search/subscriber.html"}>用户搜索</a></p>
                             <p className="userdata-relate" style={{ 'display': 'none' }}>
                                 <Button className="relateqq"><img src={qq} alt="" /> QQ账号登录</Button>
                                 <Button className="relateweibo"><img src={weibo} alt="" />微博账号登录</Button>

+ 10 - 10
js/component/account/set/pfs.jsx

@@ -1,5 +1,5 @@
 import React from 'react';
-import { Input, Button, Form, Select, Upload, Icon, Spin, message, Radio, InputNumber } from 'antd';
+import { Input, Button, Form, Select, Upload, Icon, Spin, message, Radio, InputNumber, Cascader } from 'antd';
 import './pfs.less';
 import ajax from 'jquery/src/ajax/xhr.js'
 import $ from 'jquery/src/ajax';
@@ -7,6 +7,8 @@ import $ from 'jquery/src/ajax';
 import YearSelect from '../../yearSelect.jsx';
 import { getBase64, beforeUpload } from '../../tools.js';
 import { jingli_yuanxiao, jingli_shehui, chengjiu_yuanxiao, chengjiu_shehui } from '../../dataDic.js';
+import { techFieldList } from '../../DicTechFieldList';
+
 
 const FormItem = Form.Item;
 const RadioButton = Radio.Button;
@@ -66,7 +68,7 @@ const PfsFrom = Form.create()(React.createClass({
                 if (data.data) {
                     this.setState({
                         id: data.data.id,
-                        lingyu: data.data.engagedField,
+                        field: data.data.engagedField ? data.data.engagedField.split(',') : [],
                         gongling: data.data.workingAge,
                         zhichengname: data.data.professionalTitle,
                         zhichengyear: data.data.professionalTitleGettime,
@@ -107,7 +109,7 @@ const PfsFrom = Form.create()(React.createClass({
                     url: globalConfig.context + "/api/user/userCareer",
                     data: {
                         "id": this.state.id,
-                        "engagedField": values.lingyu,
+                        "engagedField": values.field ? values.field.join(',') : '',
                         "workingAge": values.gongling,
                         "professionalTitle": values.zhichengname,
                         "professionalTitleGettime": this.state.zhichengyear,
@@ -183,15 +185,13 @@ const PfsFrom = Form.create()(React.createClass({
         const _me = this;
         return (
             <Form horizontal onSubmit={this.handleSubmit} className="pfs-form">
-                <FormItem
+                <FormItem className="half-item"
                     {...formItemLayout}
-                    label="从事领域"
-                    help={'请输入所从事领域的名称,多个领域请以逗号隔开'}
-                >
-                    {getFieldDecorator('lingyu', {
-                        initialValue: this.state.lingyu || null
+                    label="从事领域" >
+                    {getFieldDecorator('field', {
+                        initialValue: this.state.field
                     })(
-                        <Input />
+                        <Cascader placeholder="请选择一个领域" options={techFieldList} />
                         )}
                 </FormItem>
                 <FormItem

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

@@ -27,7 +27,7 @@ const TopTab = React.createClass({
             <div className="account-top" >
                 <div className="acc-top-user">
                     <span className="acc-top-user-name">欢迎您, {userData.nickname || userData.number || this.state.username} <a onClick={this.logOut}>[ 退出 ]</a></span>
-                    <span className="acc-top-user-toindex"><a href={globalConfig.avatarHost + "/portal/index.html"}>返回首页</a></span>
+                    <span className="acc-top-user-toindex"><a href={globalConfig.context + "/portal/index.html"}>返回首页</a></span>
                 </div>
                 <div className="acc-index">
                     <div className="acc-index-imgbox">

+ 2 - 2
js/component/certify/footer.jsx

@@ -5,8 +5,8 @@ const Footer = React.createClass({
     render() {
         return (
             <div className="footer">
-                <p>公司地址   联系方式公司地址  公司地址   联系方式 公司地址 公司地址   联系方式 公司地址</p>
-                <p>公司地址   联系方式公司地址 公司地址   联系方式公司地址</p>
+                <p>阿凡提科技</p>
+                <p>技术支持@湖南智明</p>
             </div>
         )
     }

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

@@ -13,7 +13,7 @@ const LoginTop = React.createClass({
                     <div className="certify-text">
                         <span className="text">实名认证</span>
                         <span className="alink">
-                            <a href={globalConfig.avatarHost + "/portal/index.html"}>返回首页</a>
+                            <a href={globalConfig.context + "/portal/index.html"}>返回首页</a>
                             <a href="./account/index">尊敬的{userData.nickname || userData.number || this.state.username}</a>
                             <a href="./login.html">退出</a>
                             <a href="./index.html">交易管理中心</a>

+ 2 - 2
js/component/groupCertify/footer.jsx

@@ -5,8 +5,8 @@ const Footer = React.createClass({
     render() {
         return (
             <div className="footer">
-                <p>公司地址   联系方式公司地址  公司地址   联系方式 公司地址 公司地址   联系方式 公司地址</p>
-                <p>公司地址   联系方式公司地址 公司地址   联系方式公司地址</p>
+                <p>阿凡提科技</p>
+                <p>技术支持@湖南智明</p>
             </div>
         )
     }

+ 23 - 9
js/component/groupCertify/personal.jsx

@@ -2,8 +2,9 @@ import React from 'react';
 import { Input, Button, Form, Upload, Icon, Spin, message, Row, Col, DatePicker, Select, Radio, Cascader } from 'antd';
 import './certify.less';
 import { getBase64, beforeUpload, beforeUploadFile } from '../tools.js';
-import { areaSelect } from '../NewDicProvinceList'
-import ajax from 'jquery/src/ajax/xhr.js'
+import { areaSelect } from '../NewDicProvinceList';
+import { techFieldList } from '../DicTechFieldList';
+import ajax from 'jquery/src/ajax/xhr.js';
 import $ from 'jquery/src/ajax';
 import moment from 'moment';
 
@@ -76,7 +77,8 @@ const Content = Form.create()(React.createClass({
                         listedDate: data.data.listedDateFormattedDate,
                         listedType: data.data.listedType,
                         stockCode: data.data.stockCode,
-                        auditStatus: data.data.auditStatus
+                        auditStatus: data.data.auditStatus,
+                        field: data.data.field ? data.data.field.split(",") : []
                     });
                 };
             }.bind(this),
@@ -94,6 +96,7 @@ const Content = Form.create()(React.createClass({
     getInitialState() {
         return {
             loading: false,
+            field: [],
             vsCodeSrc: globalConfig.context + '/open/getVCode'
         };
     },
@@ -138,6 +141,7 @@ const Content = Form.create()(React.createClass({
                         licenceProvince: values.address[0],
                         licenceCity: values.address[1],
                         licenceArea: values.address[2],
+                        field: values.field ? values.field.join(',') : '',
                         licenceScanningUrl: this.state.licenceScanningUrl,
                         orgCode: values.orgCode,
                         orgCodeUrl: this.state.orgCodeUrl,
@@ -249,14 +253,24 @@ const Content = Form.create()(React.createClass({
                     </FormItem>
                     <FormItem
                         {...formItemLayout}
-                        label="注册资金"
-                    >   {getFieldDecorator('registeredCapital', {
-                        initialValue: this.state.registeredCapital || null
-                    })(
-                        <Input />
-                        )}
+                        label="注册资金" >
+                        {getFieldDecorator('registeredCapital', {
+                            initialValue: this.state.registeredCapital || null
+                        })(
+                            <Input />
+                            )}
                         <span className="fromItem-postfix">万元</span>
                     </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="领域" >
+                        {getFieldDecorator('field', {
+                            rules: [{ type: 'array', required: true, message: '此项为必填项!' }],
+                            initialValue: this.state.field
+                        })(
+                            <Cascader placeholder="请选择一个领域" options={techFieldList} />
+                            )}
+                    </FormItem>
                     <FormItem
                         {...formItemLayout}
                         label="是否上市"

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

@@ -13,7 +13,7 @@ const LoginTop = React.createClass({
                     <div className="certify-text">
                         <span className="text">实名认证</span>
                         <span className="alink">
-                            <a href={globalConfig.avatarHost + "/portal/index.html"}>返回首页</a>
+                            <a href={globalConfig.context + "/portal/index.html"}>返回首页</a>
                             <a href="./account/index.html">尊敬的{userData.nickname || userData.number || this.state.username}</a>
                             <a href="./login.html">退出</a>
                             <a href="./index.html">交易管理中心</a>

+ 1 - 1
js/component/login/loginTop.jsx

@@ -12,7 +12,7 @@ const LoginTop = React.createClass({
                     </div>
                     <div className="logo-text">
                         <span>科技交易认知计算平台</span>
-                        <span className="back"><a href={globalConfig.avatarHost + "/portal/index.html"}>返回首页</a></span>
+                        <span className="back"><a href={globalConfig.context + "/portal/index.html"}>返回首页</a></span>
                     </div>
                 </div>
             </div>

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

@@ -439,7 +439,7 @@ const TopTab = React.createClass({
                         };
                         this.setState({ userModalShow: true });
                     }}> {adminData.name || adminData.mobile} </a> : <a onClick={this.logOut}>{this.state.username}</a>} <a onClick={this.logOut}>[ 退出 ]</a></span>
-                    <span className="acc-top-user-toindex"><a href={globalConfig.avatarHost + "/portal/index.html"}>返回首页</a></span>
+                    <span className="acc-top-user-toindex"><a href={globalConfig.context + "/portal/index.html"}>返回首页</a></span>
                     <a onClick={() => { this.setState({ messageModalShow: true }); }} className="user-badge">
                         <Icon type="mail" />
                         {(() => {

+ 34 - 3
js/component/manageCenter/userManage/orgDesc.jsx

@@ -6,7 +6,8 @@ import $ from 'jquery/src/ajax';
 import moment from 'moment';
 import { eduLevelList, auditStatusList, certifyStepList } from '../../dataDic.js'
 import { beforeUploadFile, getAuditState } from '../../tools.js';
-import { areaSelect, getProvince } from '../../NewDicProvinceList'
+import { areaSelect, getProvince } from '../../NewDicProvinceList';
+import { getTechField, techFieldList } from '../../DicTechFieldList';
 
 const OrgShow = Form.create()(React.createClass({
     getInitialState() {
@@ -14,7 +15,8 @@ const OrgShow = Form.create()(React.createClass({
             loading: false,
             tabKey: "1",
             eduLvlOption: [],
-            eduLvlObj: {}
+            eduLvlObj: {},
+            field: []
         };
     },
     loadData(uid) {
@@ -63,6 +65,7 @@ const OrgShow = Form.create()(React.createClass({
                     secondMobile: thisData.secondMobile,
                     thirdContacts: thisData.thirdContacts,
                     thirdMobile: thisData.thirdMobile,
+                    field: thisData.field ? thisData.field.split(',') : [],
 
                     legalPerson: thisData.legalPerson,
                     legalPersonIdCard: thisData.legalPersonIdCard,
@@ -82,6 +85,7 @@ const OrgShow = Form.create()(React.createClass({
                     paymentDateFormattedDate: thisData.paymentDateFormattedDate,
                     lastYearTaxReportUrl: thisData.lastYearTaxReportUrl,
                     auditStatus: thisData.auditStatus,
+                    level: thisData.level,
 
                     aid: thisData.aid,   //业务员ID
                     mid: thisData.mid  //客户经理ID
@@ -176,7 +180,7 @@ const OrgShow = Form.create()(React.createClass({
                         uid: this.props.uid,
                         id: this.state.id,
                         auditStatus: values.auditStatus,
-                        level: this.state.level,
+                        //level: this.state.level,
                         aid: values.aid, //指派业务员ID
                         mid: values.mid, //指派客户经理ID
                     }
@@ -240,6 +244,13 @@ const OrgShow = Form.create()(React.createClass({
                                 <span>{this.state.aftUsername}</span>
                                 )}
                         </FormItem>
+                        <FormItem className="half-item"
+                            {...formItemLayout}
+                            label="领域" >
+                            {getFieldDecorator('field')(
+                                <span>{getTechField(this.state.field[0], this.state.field[1], this.state.field[2])}</span>
+                            )}
+                        </FormItem>
                         <FormItem
                             {...formItemLayout}
                             label="身份类型" >
@@ -413,6 +424,13 @@ const OrgShow = Form.create()(React.createClass({
                         </FormItem>
                         <FormItem
                             {...formItemLayout}
+                            label="用户等级" >
+                            {getFieldDecorator('level')(
+                                <span>{"Lv." + (this.state.level || 0)}</span>
+                            )}
+                        </FormItem>
+                        <FormItem
+                            {...formItemLayout}
                             label="认证状态" >
                             {getFieldDecorator('auditStatus', {
                                 initialValue: this.state.auditStatus
@@ -504,6 +522,9 @@ const OrgCertify = Form.create()(React.createClass({
                     aftUsername: thisData.aftUsername,
                     unitName: thisData.unitName,
                     identityType: thisData.identityType, //组织性质
+
+                    field: thisData.field ? thisData.field.split(',') : [],
+
                     registeredCapital: thisData.registeredCapital, //注册资金
 
                     firstContacts: thisData.firstContacts,
@@ -584,6 +605,7 @@ const OrgCertify = Form.create()(React.createClass({
 
                         licenceNumber: values.licenceNumber,
                         orgCode: values.orgCode,
+                        field: values.field ? values.field.join(',') : undefined,
 
                         firstContacts: values.firstContacts,
                         firstMobile: values.firstMobile,
@@ -692,6 +714,15 @@ const OrgCertify = Form.create()(React.createClass({
                                 </Select>
                                 )}
                         </FormItem>
+                        <FormItem className="half-item"
+                            {...formItemLayout}
+                            label="领域" >
+                            {getFieldDecorator('field', {
+                                initialValue: this.state.field
+                            })(
+                                <Cascader placeholder="请选择一个领域" options={techFieldList} />
+                                )}
+                        </FormItem>
                         <FormItem
                             {...formItemLayout}
                             label="第一联系人" >

+ 45 - 3
js/component/manageCenter/userManage/userDesc.jsx

@@ -56,7 +56,8 @@ const UserShow = Form.create()(React.createClass({
                     process: thisData.process ? String(thisData.process) : undefined,
                     paymentDateFormattedDate: thisData.paymentDateFormattedDate,
                     paymentDate: thisData.paymentDate,
-
+                    expert: thisData.expert,
+                    celebrity: thisData.celebrity,
                     level: thisData.level,
                     aid: thisData.aid,   //业务员ID
                     mid: thisData.mid  //客户经理ID
@@ -275,7 +276,21 @@ const UserShow = Form.create()(React.createClass({
                     {...formItemLayout}
                     label="用户等级" >
                     {getFieldDecorator('level')(
-                        <span>{"Lv." + this.state.level}</span>
+                        <span>{"Lv." + (this.state.level || 0)}</span>
+                    )}
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="是否专家" >
+                    {getFieldDecorator('expert')(
+                        <span>{this.state.expert ? "否" : "是"}</span>
+                    )}
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="是否专家" >
+                    {getFieldDecorator('celebrity')(
+                        <span>{this.state.celebrity ? "否" : "是"}</span>
                     )}
                 </FormItem>
                 <FormItem
@@ -378,7 +393,8 @@ const UserForm = Form.create()(React.createClass({
                     paymentDateFormattedDate: thisData.paymentDateFormattedDate,
                     paymentDate: thisData.paymentDate,
                     level: thisData.level,
-
+                    expert: thisData.expert,
+                    celebrity: thisData.celebrity,
                     aid: thisData.aid,   //业务员ID
                     mid: thisData.mid  //客户经理ID
                 });
@@ -433,6 +449,8 @@ const UserForm = Form.create()(React.createClass({
                         //auditStatus: values.auditStatus,
                         paymentDateFormattedDate: values.paymentDateFormattedDate ? values.paymentDateFormattedDate.format("YYYY-MM-DD") : undefined,
                         level: values.level,
+                        expert: values.expert,
+                        celebrity: values.celebrity,
                         //aid: values.aid, //指派业务员ID
                         //mid: values.mid, //指派客户经理ID
                         saveSign: this.state.saveSign
@@ -592,6 +610,30 @@ const UserForm = Form.create()(React.createClass({
                 </FormItem>
                 <FormItem
                     {...formItemLayout}
+                    label="专家" >
+                    {getFieldDecorator('expert', {
+                        initialValue: this.state.expert
+                    })(
+                        <RadioGroup>
+                            <Radio value={0}>否</Radio>
+                            <Radio value={1}>是</Radio>
+                        </RadioGroup>
+                        )}
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
+                    label="明星" >
+                    {getFieldDecorator('celebrity', {
+                        initialValue: this.state.celebrity
+                    })(
+                        <RadioGroup>
+                            <Radio value={0}>否</Radio>
+                            <Radio value={1}>是</Radio>
+                        </RadioGroup>
+                        )}
+                </FormItem>
+                <FormItem
+                    {...formItemLayout}
                     label="认证状态" >
                     {getFieldDecorator('auditStatus')(
                         <span>{getAuditState(this.state.auditStatus)}</span>

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

@@ -28,7 +28,7 @@
                 width: 1280px;
                 line-height: 30px;
                 font-size: 24px;
-                margin:0 auto;
+                margin: 0 auto;
                 .alink {
                     float: right;
                     font-size: 14px;
@@ -88,6 +88,47 @@
         }
         .search-title {
             text-align: center;
+            span {
+                line-height: 28px;
+            }
+        }
+        ul {
+            box-sizing: border-box;
+            .user-detail {
+                float: left;
+                height: auto;
+                width: 20%;
+                background: #fff;
+                .logo {
+                    height: 120px;
+                    width: 120px;
+                    position: relative;
+                    padding-top: 120px;
+                    margin: 0 auto;
+                    img {
+                        height: 120px;
+                        width:auto;
+                        position: absolute;
+                        top: 0;
+                        left: 0;
+                    }
+                }
+                >div:not(:first-child)  {
+                    font-size: 16px;
+                    margin-left: 20px;
+                    height: 24px;
+                    line-height: 24px;
+                    vertical-align: middle;
+                }
+                .name {
+                    margin-top: 10px;
+                }
+                .follow {
+                    float: right;
+                    font-size: 13px;
+                    margin-right: 10px;
+                }
+            }
         }
     }
 }

+ 376 - 0
js/component/portal/search/subscriber.jsx

@@ -0,0 +1,376 @@
+import React from 'react';
+import { Icon, message, Row, Col, Select, Radio, Checkbox, Input, InputNumber, Button, Table, Spin, Pagination } from 'antd';
+import '../portal.less';
+import { techFieldList, getTechField } from '../../DicTechFieldList';
+import { provinceList, getProvince } from '../../NewDicProvinceList';
+import { companySearch } from '../../tools';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+
+
+import avatarImg from '../../../../image/avatarImg.png';
+
+const Content = React.createClass({
+    loadData(pageNo) {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            url: globalConfig.context + "/portal/search/subscriberList",
+            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,
+                "province": this.state.province,
+                "city": this.state.city,
+                "area": this.state.area,
+                "name": this.state.searchName,
+                "pageNo": pageNo || 1,
+                "pageSize": this.state.pagination.pageSize
+            },
+            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,
+                            uid: thisdata.uid, //用户ID
+                            identityId: thisdata.identityId,  //认证ID (详情接口传入ID)
+                            username: thisdata.username,// 用户名称
+                            unitName: thisdata.unitName,
+                            personPortraitUrl: thisdata.personPortraitUrl,//用户头像URL
+                            logoUrl: thisdata.logoUrl,
+                            achievementNum: thisdata.achievementNum,	//科技成果数量
+                            demandNum: thisdata.demandNum, //科技需求数量
+                            province: thisdata.province
+                        });
+                    };
+                };
+                this.state.pagination.pageNo = data.data.pageNo;
+                this.state.pagination.total = data.data.totalCount;
+                this.setState({
+                    dataSource: theArr,
+                    pagination: this.state.pagination
+                });
+            }.bind(this),
+        }).done(function (data) {
+            if (data.error && data.error.length) {
+                message.warning(data.error[0].message);
+            };
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            loading: false,
+            type: 0,
+            pagination: {
+                pageNo: 1,
+                pageSize: 15,
+                total: 0
+            },
+            dataSource: []
+        };
+    },
+    componentWillMount() {
+        let theFieldArr = [], theProvinceArr = [];
+        techFieldList.map((item) => {
+            theFieldArr.push(
+                <Select.Option key={item.value}>{item.label}</Select.Option>
+            )
+        });
+        provinceList.map((item) => {
+            theProvinceArr.push(
+                <Select.Option key={item.id}>{item.name}</Select.Option>
+            )
+        });
+        this.state.fieldFirstOption = theFieldArr;
+        this.state.provinceOption = theProvinceArr;
+        this.loadData();
+    },
+    fieldFirstChange(e) {
+        let theArr = [];
+        techFieldList.map((item) => {
+            if (item.value == e) {
+                item.children.map((children) => {
+                    theArr.push(
+                        <Select.Option key={children.value}>{children.label}</Select.Option>
+                    )
+                });
+            }
+        });
+        this.setState({
+            fieldSecondOption: theArr,
+            firstField: e,
+            secondField: undefined,
+            thirdField: undefined
+        })
+    },
+    fieldSecondChange(e) {
+        let theArr = [], _me = this;
+        techFieldList.map((item) => {
+            if (item.value == _me.state.firstField) {
+                item.children.map((children) => {
+                    if (children.value == e) {
+                        children.children.map((third) => {
+                            theArr.push(
+                                <Select.Option key={third.value}>{third.label}</Select.Option>
+                            )
+                        })
+                    }
+                });
+            }
+        });
+        this.setState({
+            fieldThirdOption: theArr,
+            secondField: e,
+            thirdField: undefined
+        })
+    },
+    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,
+            area: undefined
+        })
+    },
+    cityChange(e) {
+        let theArr = [], _me = this;
+        provinceList.map((item) => {
+            if (item.id == _me.state.province) {
+                item.cityList.map((city) => {
+                    if (city.id == e) {
+                        city.areaList.map((area) => {
+                            theArr.push(
+                                <Select.Option key={area.id}>{area.name}</Select.Option>
+                            )
+                        });
+                    };
+                });
+            };
+        });
+        this.setState({
+            areaOption: theArr,
+            city: e,
+            area: undefined
+        })
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+    },
+    interest(e) {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/interest/interestUser",
+            data: {
+                toUid: e
+            }
+        }).done(function (data) {
+            if (data.error && data.error.length) {
+                message.warning(data.error[0].message);
+            };
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    cancelInterest(e) {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            url: globalConfig.context + "/api/user/interest/cancelInterest",
+            data: {
+                interestId: e
+            }
+        }).done(function (data) {
+            if (data.error && data.error.length) {
+                message.warning(data.error[0].message);
+            };
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    render() {
+        const { pageNo, pageSize, total } = this.state.pagination;
+        const _me = this;
+        return (
+            <div className="portal-content clearfix" >
+                <Row className="search-criteria">
+                    <Col className="search-title" span={2}>
+                        <span>行业分类</span>
+                    </Col>
+                    <Col className="search-select" span={22}>
+                        <Select style={{ width: 160, marginRight: '10px', marginBottom: '10px' }}
+                            value={this.state.firstField}
+                            placeholder="请选择行业一级分类"
+                            notFoundContent="未获取到行业分类"
+                            showSearch
+                            filterOption={companySearch}
+                            onChange={this.fieldFirstChange}>
+                            {this.state.fieldFirstOption}
+                        </Select>
+                        <Select style={{ width: 200, marginRight: '10px', marginBottom: '10px' }}
+                            value={this.state.secondField}
+                            placeholder="请选择行业二级分类"
+                            notFoundContent="未获取到行业分类"
+                            showSearch
+                            filterOption={companySearch}
+                            onChange={this.fieldSecondChange}>
+                            {this.state.fieldSecondOption}
+                        </Select>
+                        <Select style={{ width: 240, marginRight: '10px', marginBottom: '10px' }}
+                            value={this.state.thirdField}
+                            placeholder="请选择行业三级分类"
+                            notFoundContent="未获取到行业分类"
+                            showSearch
+                            filterOption={companySearch}
+                            onChange={(e) => { this.setState({ thirdField: e }) }}>
+                            {this.state.fieldThirdOption}
+                        </Select>
+                        <Button type="ghost" style={{ marginLeft: '20px' }}
+                            onClick={() => {
+                                this.setState({
+                                    firstField: undefined,
+                                    secondField: undefined,
+                                    thirdField: undefined
+                                });
+                                this.state.firstField = undefined;
+                                this.state.secondField = undefined;
+                                this.state.thirdField = undefined;
+                                this.loadData();
+                            }}>不限</Button>
+                    </Col>
+                </Row>
+                <Row className="search-criteria">
+                    <Col className="search-title" span={2}>
+                        <span>地区</span>
+                    </Col>
+                    <Col className="search-select" span={22}>
+                        <Select style={{ width: 100, marginRight: '10px', marginBottom: '10px' }}
+                            value={this.state.province}
+                            placeholder="请选择省份"
+                            notFoundContent="未获取到省份列表"
+                            showSearch
+                            filterOption={companySearch}
+                            onChange={this.provinceChange}>
+                            {this.state.provinceOption}
+                        </Select>
+                        <Select style={{ width: 160, marginRight: '10px', marginBottom: '10px' }}
+                            value={this.state.city}
+                            placeholder="请选择行业城市"
+                            notFoundContent="未获取到城市列表"
+                            showSearch
+                            filterOption={companySearch}
+                            onChange={this.cityChange}>
+                            {this.state.cityOption}
+                        </Select>
+                        <Select style={{ width: 160, marginRight: '10px', marginBottom: '10px' }}
+                            value={this.state.area}
+                            placeholder="请选择行政区"
+                            notFoundContent="未获取到行政区列表"
+                            showSearch
+                            filterOption={companySearch}
+                            onChange={(e) => { this.setState({ area: e }) }}>
+                            {this.state.areaOption}
+                        </Select>
+                        <Button type="ghost" style={{ marginLeft: '20px' }}
+                            onClick={() => {
+                                this.setState({
+                                    province: undefined,
+                                    city: undefined,
+                                    area: undefined
+                                });
+                                this.state.province = undefined;
+                                this.state.city = undefined;
+                                this.state.area = undefined;
+                                this.loadData();
+                            }}>不限</Button>
+                    </Col>
+                </Row>
+                <Row className="search-criteria">
+                    <Col className="search-title" span={2}>
+                        <span>用户类型</span>
+                    </Col>
+                    <Col className="search-select" span={6}>
+                        <Radio.Group defaultValue={0} onChange={(e) => {
+                            this.setState({
+                                type: e.target.value
+                            });
+                            this.state.type = e.target.value;
+                            this.loadData();
+                        }}>
+                            <Radio.Button value={0}>个人</Radio.Button>
+                            <Radio.Button value={1}>组织</Radio.Button>
+                        </Radio.Group>
+                    </Col>
+                </Row>
+                <Row className="search-criteria">
+                    <Col className="search-title" span={2}>
+                        <span>用户名</span>
+                    </Col>
+                    <Col className="search-select" span={6}>
+                        <Input style={{ width: 200, marginBottom: '10px' }} value={this.state.searchName} onChange={(e) => { this.setState({ searchName: e.target.value }) }} />
+                        <Button type="primary" style={{ marginLeft: '20px' }}
+                            onClick={() => { this.loadData(); }}>搜索</Button>
+                    </Col>
+                </Row>
+                <Spin spinning={this.state.loading}>
+                    <ul className="clearfix">
+                        {this.state.dataSource.map((item) => {
+                            return <li className="user-detail">
+                                <div className="logo">
+                                    <img src={(item.personPortraitUrl || item.logoUrl) ?
+                                        (globalConfig.avatarHost + "/upload" + (_me.state.type == 0 ? item.personPortraitUrl : item.logoUrl))
+                                        : avatarImg } alt="头像" />
+                                </div>
+                                <div className="name" style={{display:'none'}}>
+                                    {_me.state.type == 0 ? item.username : item.unitName}
+                                    <a onClick={_me.interest.bind(_me, item.uid)} className="follow"><Icon type="heart-o" />感兴趣</a>
+                                </div>
+                                <div className="province">{getProvince(item.province)}</div>
+                                <div className="text">{'需求:' + item.demandNum + '条'}</div>
+                                <div className="text">{'技术成果:' + item.achievementNum + '条'}</div>
+                            </li>
+                        })}
+                    </ul>
+                    <Pagination style={{ float: 'right' }}
+                        onChange={(e) => { this.loadData(e); }}
+                        total={total}
+                        showTotal={() => { return '共' + total + '条数据' }}
+                        current={pageNo}
+                        pageSize={pageSize} />
+                </Spin>
+            </div >
+        )
+    }
+});
+
+export default Content;

+ 0 - 1
js/component/tools.js

@@ -175,7 +175,6 @@ module.exports = {
         fieldList.map(function (item) {
             if (field1 && Number(field1) == item.value) {
                 fieldKey = item.label;
-                debugger
             };
             if (field2 == item.value) {
                 fieldKey = fieldKey + "/" + item.label;

+ 17 - 0
js/portal/search/subscriber.js

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

+ 18 - 2
portal/achievementDetail.html

@@ -33,10 +33,26 @@
 				<button type="button" class="btn btn-info">我要接单</button>
 			</div>
 			<div class="col-md-2">
-				<button type="button" class="btn btn-info"><span class="glyphicon glyphicon-heart" aria-hidden="true"></span> 我感兴趣</button>
+				<button type="button" class="btn btn-default"><span class="glyphicon glyphicon-heart" aria-hidden="true"></span> 我感兴趣</button>
 			</div>
 		</div>
-	</div
+		<div class="row clearfix detail-center">
+			<div class="col-md-4 detail-condition">
+				<div class="detail-icon"><img src="img/discount_ioc_3.png" /></div>
+				<span class="detail-center-title">行业</span>
+				<span class="detail-center-content">机械-铸造/热处理 </span>
+			</div>
+			<div class="col-md-8 detail-condition">
+				<div class="detail-icon"><img src="img/discount_ioc_3.png" /></div>
+				<span class="detail-center-title">标签</span>
+				<ul class="detail-center-tag pull-left clearfix">
+					<li>标签1</li>
+					<li>标签1</li>
+					<li>标签1</li>
+				</ul>
+			</div>
+		</div>
+	</div>
 </body>
 
 </html>

+ 27 - 0
portal/css/achievementDetail.css

@@ -4,4 +4,31 @@
 
 .detail-title .detail-text {
     font-size: 24px;
+}
+
+.detail-center {
+    margin-left: 20px;
+}
+
+.detail-center .detail-icon {
+    float: left;
+    height: 28px;
+    width: 28px;
+    margin-right: 8px;
+}
+
+.detail-center .detail-icon img {
+    height: 100%;
+}
+
+.detail-center .detail-condition .detail-center-title {
+    font-size: 18px;
+    color: #bbb;
+    margin-right:8px;
+}
+.detail-center .detail-condition .detail-center-content {
+    font-size: 14px;
+}
+.detail-center .detail-condition .detail-center-tag  li {
+   float: left; 
 }

+ 6 - 0
webpack.config.js

@@ -184,6 +184,12 @@ module.exports = (function () {
             filename: 'portal/search/achievement.html',
             template: './template/template.html',
             chunks: ['portal/search/achievement', 'vendors']
+        }),
+        new HtmlWebpackPlugin({
+            title: '主页-科技成果搜索',
+            filename: 'portal/search/subscriber.html',
+            template: './template/template.html',
+            chunks: ['portal/search/subscriber', 'vendors']
         })
     ];
     if (!isDev) {

+ 9 - 1
webpack/entry.config.js

@@ -26,7 +26,11 @@ module.exports = {
     'admin/servicesManage/technology': './js/admin/servicesManage/technology.js',
     //admin/demand
     'admin/demand': './js/admin/demand.js',
-    'admin/achievement': './js/admin/achievement.js'
+    'admin/achievement': './js/admin/achievement.js',
+    //portal  门户
+    'portal/search/demand': './js/portal/search/demand.js',
+    'portal/search/achievement': './js/portal/search/achievement.js',
+    'portal/search/subscriber': './js/portal/search/subscriber.js'
   },
   watch: {
     'user/index': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
@@ -129,5 +133,9 @@ module.exports = {
       'webpack/hot/only-dev-server',
       './js/portal/search/achievement.js'
     ],
+    'portal/search/subscriber': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
+      'webpack/hot/only-dev-server',
+      './js/portal/search/subscriber.js'
+    ]
   }
 }

+ 1 - 1
webpack/module.config.js

@@ -38,7 +38,7 @@ module.exports = function (theme) {
         use: [{
           loader: 'url-loader',
           options: {
-            limit: 8192,
+            limit: 10240,
             name: '[path][name].[ext]'
           }
         }]