content.jsx 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. import React from 'react';
  2. import { Spin, Button, Tabs, Table, message, Modal, Tooltip } from 'antd';
  3. import ajax from 'jquery/src/ajax/xhr.js'
  4. import $ from 'jquery/src/ajax';
  5. import '../content.less';
  6. import './content.less';
  7. import LeftTab from './leftTab.jsx';
  8. import FollowDetail from "../customer/NEW/intentionCustomer/followDetail";
  9. const TabPane = Tabs.TabPane;
  10. const MessageModal = React.createClass({
  11. getInitialState() {
  12. return {
  13. unreadData: [],
  14. unreadDataType: '0',
  15. dataSourceType: '1',
  16. unreadDataIndex: 0,
  17. newVisible: false,
  18. loading: false,
  19. categoryArr: [],
  20. pagination: {
  21. defaultCurrent: 1,
  22. defaultPageSize: 10,
  23. showQuickJumper: true,
  24. pageSize: 10,
  25. onChange: function (page) {
  26. this.loadReaded(page);
  27. }.bind(this),
  28. showTotal: function (total) {
  29. return '共' + total + '条数据';
  30. }
  31. },
  32. UnreadPagination: {
  33. defaultCurrent: 1,
  34. defaultPageSize: 10,
  35. showQuickJumper: true,
  36. pageSize: 9999999,
  37. onChange: function (page) {
  38. this.loadUnread(page);
  39. }.bind(this),
  40. showTotal: function (total) {
  41. return '共' + total + '条数据';
  42. }
  43. },
  44. columns: [
  45. {
  46. title: '类型',
  47. dataIndex: 'noticeTypeName',
  48. key: 'noticeTypeName',
  49. width: 120,
  50. render: (text, record) => {
  51. return <span style={{ color: record.noticeType == 59 && "red" }}>{text}</span>;
  52. },
  53. }, {
  54. title: '时间',
  55. dataIndex: 'createTimeFormattedDate',
  56. key: 'createTimeFormattedDate',
  57. width: 120
  58. }, {
  59. title: '内容',
  60. dataIndex: 'content',
  61. key: 'content',
  62. width: 1189,
  63. render: (text, record) => {
  64. return (
  65. <Tooltip placement="topLeft" title={text}>
  66. <div style={{
  67. color: record.noticeType == 59 && "red",
  68. width: 1189,
  69. textOverflow: "ellipsis",
  70. whiteSpace: "nowrap",
  71. overflow: 'hidden',
  72. }}>
  73. {text}
  74. </div>
  75. </Tooltip>
  76. )
  77. }
  78. },
  79. {
  80. title: "操作",
  81. dataIndex: "abc",
  82. key: "abc",
  83. width: 150,
  84. render: (text, record) => {
  85. let contractNo = '';
  86. if ((record.noticeType === 14 || record.noticeType === 40) && record.content.indexOf('合同编号-') !== -1) {
  87. let arr = record.content.split('合同编号-');
  88. contractNo = arr[1].match(/(\S*), 订单编号/)[1];
  89. }
  90. return (
  91. record.noticeType === 48 || record.noticeType === 49 ?
  92. <Button type="primary" onClick={() => {
  93. this.category();
  94. record.id = record.uid;
  95. this.setState({
  96. followData: record,
  97. visitModul: true,
  98. });
  99. }}>立即跟进</Button> :
  100. record.noticeType === 14 || record.noticeType === 40 ?
  101. <Button disabled={!contractNo} type="primary" onClick={(e) => {
  102. e.stopPropagation();
  103. let input = document.getElementById("copyText1");
  104. input.value = contractNo;
  105. input.select();
  106. document.execCommand("copy");
  107. message.success('复制成功')
  108. }}>
  109. 复制合同号
  110. </Button> : null
  111. )
  112. }
  113. }
  114. // {
  115. // title: '公司',
  116. // dataIndex: 'unitName',
  117. // key: 'unitName',
  118. // }, {
  119. // title: '业务员',
  120. // dataIndex: 'principle',
  121. // key: 'principle',
  122. // }
  123. ],
  124. columns1: [
  125. {
  126. title: '类型',
  127. dataIndex: 'noticeTypeName',
  128. key: 'noticeTypeName',
  129. width: 120,
  130. render: (text, record) => {
  131. return (
  132. <div style={{ color: record.noticeType == 59 && "red" }}>{text}</div>
  133. )
  134. }
  135. }, {
  136. title: '时间',
  137. dataIndex: 'createTimeFormattedDate',
  138. key: 'createTimeFormattedDate',
  139. width: 120
  140. }, {
  141. title: '内容',
  142. dataIndex: 'content',
  143. key: 'content',
  144. width: 610,
  145. render: (text, record) => {
  146. return (
  147. <Tooltip placement="topLeft" title={text}>
  148. <div
  149. style={{
  150. color: record.noticeType == 59 && "red",
  151. width: 610,
  152. textOverflow: "ellipsis",
  153. whiteSpace: "nowrap",
  154. overflow: 'hidden',
  155. }}>
  156. {text}
  157. </div>
  158. </Tooltip>
  159. )
  160. }
  161. },
  162. {
  163. title: "操作",
  164. dataIndex: "abc",
  165. key: "abc",
  166. width: 150,
  167. render: (text, record) => {
  168. let contractNo = '';
  169. if ((record.noticeType === 14 || record.noticeType === 40) && record.content.indexOf('合同编号-') !== -1) {
  170. let arr = record.content.split('合同编号-');
  171. contractNo = arr[1].match(/(\S*), 订单编号/)[1];
  172. }
  173. return (
  174. record.noticeType === 48 || record.noticeType === 49 ?
  175. <Button type="primary" onClick={() => {
  176. this.category();
  177. record.id = record.uid;
  178. this.setState({
  179. followData: record,
  180. visitModul: true,
  181. });
  182. }}>立即跟进</Button> :
  183. record.noticeType === 14 || record.noticeType === 40 ?
  184. <Button disabled={!contractNo} type="primary" onClick={(e) => {
  185. e.stopPropagation();
  186. let input = document.getElementById("copyText1");
  187. input.value = contractNo;
  188. input.select();
  189. document.execCommand("copy");
  190. message.success('复制成功')
  191. }}>
  192. 复制合同号
  193. </Button> : null
  194. )
  195. }
  196. }
  197. // {
  198. // title: '公司',
  199. // dataIndex: 'unitName',
  200. // key: 'unitName',
  201. // }, {
  202. // title: '业务员',
  203. // dataIndex: 'principle',
  204. // key: 'principle',
  205. // }
  206. ],
  207. data: []
  208. };
  209. },
  210. closeDesc() {
  211. this.setState({
  212. categoryArr: [],
  213. followData: '',
  214. visitModul: false
  215. }, () => {
  216. this.loadReaded(this.state.pagination.current);
  217. })
  218. },
  219. category() {
  220. $.ajax({
  221. method: "get",
  222. dataType: "json",
  223. crossDomain: false,
  224. url: globalConfig.context + "/api/admin/Varieties/getSuperList",
  225. data: {},
  226. success: function (data) {
  227. let thedata = data.data;
  228. let theArr = [];
  229. if (!thedata) {
  230. if (data.error && data.error.length) {
  231. message.warning(data.error[0].message);
  232. }
  233. thedata = {};
  234. } else {
  235. thedata.map(function (item, index) {
  236. theArr.push({
  237. value: item.id,
  238. key: item.cname,
  239. });
  240. });
  241. }
  242. this.setState({
  243. categoryArr: theArr,
  244. });
  245. }.bind(this),
  246. });
  247. },
  248. //主菜单请求
  249. mainMenu() {
  250. this.setState({
  251. loading: true
  252. });
  253. $.ajax({
  254. method: "get",
  255. dataType: "json",
  256. crossDomain: false,
  257. url: globalConfig.context + "/api/admin/selectNavList",
  258. data: {
  259. },
  260. success: function (data) {
  261. if (!data.data) {
  262. if (data.error && data.error.length) {
  263. message.warning(data.error[0].message);
  264. return;
  265. };
  266. };
  267. this.setState({
  268. menu: data.data
  269. });
  270. }.bind(this),
  271. }).always(function (data) {
  272. this.setState({
  273. loading: false
  274. })
  275. }.bind(this))
  276. },
  277. finId(text) {
  278. var data = this.state.menu || [];
  279. var rid = '';
  280. switch (text) {
  281. case 1:
  282. data.map(function (nub, index) {
  283. if (nub.url.indexOf('demand') != -1) {
  284. rid = nub.id;
  285. }
  286. });
  287. break;
  288. case 2:
  289. data.map(function (nub, index) {
  290. if (nub.url.indexOf('demand') != -1) {
  291. rid = nub.id;
  292. }
  293. });
  294. break;
  295. case 3:
  296. data.map(function (nub, index) {
  297. if (nub.url.indexOf('achievement') != -1) {
  298. rid = nub.id;
  299. }
  300. });
  301. break;
  302. case 4:
  303. data.map(function (nub, index) {
  304. if (nub.url.indexOf('achievement') != -1) {
  305. rid = nub.id;
  306. }
  307. });
  308. break;
  309. case 5:
  310. data.map(function (nub, index) {
  311. if (nub.url.indexOf('order') != -1) {
  312. rid = nub.id;
  313. }
  314. });
  315. break;
  316. case 6:
  317. data.map(function (nub, index) {
  318. if (nub.url.indexOf('order') != -1) {
  319. rid = nub.id;
  320. }
  321. });
  322. break;
  323. case 7:
  324. data.map(function (nub, index) {
  325. if (nub.url.indexOf('servicesManage') != -1) {
  326. rid = nub.id;
  327. }
  328. });
  329. break;
  330. default:
  331. rid = '';
  332. }
  333. return rid;
  334. },
  335. //跳转详情
  336. setStore(record) {
  337. localStorage.setItem('newData', {});
  338. let ids = record.noticeType;
  339. let rid = this.finId(ids) || "";
  340. var urls = '',
  341. dataJson = {};
  342. switch (ids) {
  343. case 1:
  344. urls = "/admin/demand.html?rid=" + rid + "#techDemandAudit";
  345. dataJson = {
  346. "id": record.uid,
  347. //"id":"3f93588b-332e-4353-bbfd-f1451b4b390c",
  348. "dataCategory": "0"
  349. };
  350. break;
  351. case 2:
  352. urls = "/admin/demand.html?rid=" + rid + "#techDemandPublish";
  353. dataJson = {
  354. "id": record.uid,
  355. //"id":"40f77e32-29fa-4a85-a6f0-7c4986bdc5e3",
  356. "dataCategory": '1'
  357. };
  358. break;
  359. case 3:
  360. urls = "/admin/achievement.html?rid=" + rid + "#techAchievementAudit";
  361. dataJson = {
  362. "id": record.uid,
  363. //"id":"f09d5c08-4a8b-48a6-9753-86006f1a53cb",
  364. "ownerType": '1'
  365. };
  366. break;
  367. case 4:
  368. urls = "/admin/achievement.html?rid=" + rid + "#techAchievementPublish";
  369. dataJson = {
  370. "id": record.uid,
  371. //"id":"953c9ef7-6cf6-4ab7-af89-c01521998fed",
  372. "ownerType": '1'
  373. };
  374. break;
  375. case 5:
  376. urls = "/admin/order.html?rid=" + rid + "#myService";
  377. dataJson = {
  378. "orderNo": record.orderNo
  379. //"orderNo":"175557414077480960"
  380. };
  381. break;
  382. case 6:
  383. urls = "/admin/order.html?rid=" + rid + "#mySettlement";
  384. dataJson = {
  385. "orderNo": record.orderNo
  386. //"orderNo":"180714111314051072"
  387. };
  388. break;
  389. case 7:
  390. urls = "/admin/servicesManage/projectOrder.html?rid=" + rid + "#projectManage";
  391. dataJson = {
  392. //"id":record.id,
  393. "id": "69e2d8ca984240a4b9c90daac69fe5e3",
  394. "buyerType": "1"
  395. };
  396. break;
  397. default:
  398. urls: '#';
  399. dataJson = {};
  400. };
  401. console.log(rid);
  402. if (rid) {
  403. var data = dataJson;
  404. var newData = JSON.stringify(data);
  405. localStorage.setItem('newData', newData);
  406. window.location.href = globalConfig.context + urls;
  407. }
  408. },
  409. loadReaded(pageNo) {
  410. this.state.data = [];
  411. this.setState({
  412. loading: true
  413. });
  414. $.ajax({
  415. method: "get",
  416. dataType: "json",
  417. crossDomain: false,
  418. url: globalConfig.context + "/api/admin/notice/readed",
  419. data: {
  420. pageNo: pageNo || 1,
  421. pageSize: this.state.pagination.pageSize,
  422. type: this.state.unreadDataType,
  423. }
  424. }).done((data) => {
  425. if (!data.data) {
  426. if (data.error && data.error.length) {
  427. message.warning(data.error[0].message);
  428. return;
  429. };
  430. };
  431. this.state.data = [];
  432. for (let i = 0; i < data.data.list.length; i++) {
  433. let thisdata = data.data.list[i];
  434. this.state.data.push({
  435. key: i + 1,
  436. id: thisdata.id,
  437. rid: thisdata.rid,
  438. uid: thisdata.uid,
  439. aid: thisdata.aid,
  440. noticeType: thisdata.noticeType,
  441. year: thisdata.year,
  442. noticeTypeName: thisdata.noticeTypeName,
  443. content: thisdata.content,
  444. createTime: thisdata.createTime,
  445. createTimeFormattedDate: thisdata.createTimeFormattedDate,
  446. principle: thisdata.principle,
  447. unitName: thisdata.unitName
  448. });
  449. };
  450. this.state.pagination.current = data.data.pageNo;
  451. this.state.pagination.total = data.data.totalCount;
  452. this.setState({
  453. dataSource: this.state.data,
  454. pagination: this.state.pagination,
  455. });
  456. }).always(function () {
  457. this.setState({
  458. loading: false
  459. });
  460. }.bind(this));
  461. },
  462. loadUnread(pageNo) {
  463. this.state.data = [];
  464. this.setState({
  465. loading: true
  466. });
  467. $.ajax({
  468. method: "get",
  469. dataType: "json",
  470. crossDomain: false,
  471. url: globalConfig.context + "/api/admin/notice/unread",
  472. data: {
  473. }
  474. }).done((data) => {
  475. if (data.error && data.error.length) {
  476. message.warning(data.error[0].message);
  477. return;
  478. } else {
  479. let arr = data.data.filter(v => v.list.length > 0)
  480. if (arr.length) {
  481. this.setState({
  482. newVisible: true
  483. });
  484. }
  485. let index = data.data.findIndex(v => v.list.length > 0);
  486. if (index >= 0) {
  487. data.data[index].isRead = true;
  488. this.setState({
  489. unreadDataType: data.data[index]['id'] + '',
  490. unreadDataIndex: index,
  491. });
  492. } else {
  493. this.setState({
  494. unreadDataType: data.data[0]['id'] + '',
  495. unreadDataIndex: '0',
  496. });
  497. }
  498. this.setState({
  499. unreadData: data.data,
  500. });
  501. }
  502. }).always(function () {
  503. this.setState({
  504. loading: false,
  505. });
  506. }.bind(this));
  507. },
  508. componentWillMount() {
  509. // this.loadReaded();
  510. this.loadUnread();
  511. this.mainMenu();
  512. },
  513. handleOk() {
  514. let arr = this.state.unreadData.filter(v => v.list.length > 0 && !v.isRead);
  515. if (arr.length > 0) {
  516. message.warning('还存在未读消息,请查看后再关闭当前页面!');
  517. return;
  518. } else {
  519. this.loadUnread();
  520. this.setState({
  521. newVisible: false
  522. });
  523. }
  524. },
  525. render() {
  526. return (
  527. <div className="set-content">
  528. <div className="set-title" style={{ marginBottom: 10 }}>
  529. <span style={{ fontWeight: 900, fontSize: 16 }}>信息中心</span>
  530. </div>
  531. <Spin spinning={this.state.loading} className="spin-box">
  532. <Tabs defaultActiveKey={this.state.unreadDataType} activeKey={this.state.unreadDataType} onChange={v => {
  533. let index = this.state.unreadData.findIndex(d => d.id == v);
  534. this.state.unreadData[index].isRead = true;
  535. this.setState({
  536. unreadDataIndex: index,
  537. unreadData: this.state.unreadData,
  538. unreadDataType: v
  539. }, () => {
  540. if (this.state.dataSourceType === '2') {
  541. this.loadReaded()
  542. }
  543. })
  544. }}>
  545. {
  546. this.state.unreadData.map((v) => (
  547. <Tabs.TabPane
  548. key={v.id + ''}
  549. tab={<div>
  550. {v.list.length === 0 || v.isRead ? null :
  551. <div
  552. style={{
  553. width: '8px',
  554. height: "8px",
  555. borderRadius: '8px',
  556. background: '#f00',
  557. position: 'absolute',
  558. right: '5px',
  559. top: '2px'
  560. }} />}
  561. {v.name}
  562. </div>
  563. } />
  564. ))
  565. }
  566. </Tabs>
  567. <Tabs defaultActiveKey="1" type="card" tabPosition='left' value={this.state.dataSourceType} onChange={(v) => {
  568. this.setState({
  569. dataSourceType: v
  570. })
  571. if (v === '2') {
  572. this.loadReaded()
  573. }
  574. }}>
  575. <Tabs.TabPane tab={'未读'} key="1">
  576. <Table
  577. bordered
  578. columns={this.state.columns}
  579. dataSource={this.state.unreadData[this.state.unreadDataIndex] ? this.state.unreadData[this.state.unreadDataIndex].list : []}
  580. pagination={false}
  581. />
  582. </Tabs.TabPane>
  583. <Tabs.TabPane tab="已读" key="2">
  584. <Table
  585. bordered
  586. columns={this.state.columns}
  587. dataSource={this.state.dataSource}
  588. pagination={this.state.pagination}
  589. />
  590. </Tabs.TabPane>
  591. </Tabs>
  592. </Spin>
  593. <Modal
  594. maskClosable={false}
  595. style={{ position: "relative" }}
  596. title="消息提醒"
  597. visible={this.state.newVisible}
  598. width={1400}
  599. closable={false}
  600. footer={null}
  601. >
  602. <Spin spinning={this.state.loading} className="spin-box">
  603. <Tabs
  604. defaultActiveKey={this.state.unreadDataType}
  605. activeKey={this.state.unreadDataType}
  606. onChange={v => {
  607. let index = this.state.unreadData.findIndex(d => d.id == v);
  608. this.state.unreadData[index].isRead = true;
  609. this.setState({
  610. unreadDataIndex: index,
  611. unreadData: this.state.unreadData,
  612. unreadDataType: v
  613. })
  614. }}>
  615. {
  616. this.state.unreadData.map((v) => (
  617. <Tabs.TabPane
  618. key={v.id + ''}
  619. tab={<div>
  620. {v.list.length === 0 || v.isRead ? null : <div style={{ width: '8px', height: "8px", borderRadius: '8px', background: '#f00', position: 'absolute', right: '5px', top: '2px' }} />}
  621. {v.name}
  622. </div>
  623. } />
  624. ))
  625. }
  626. </Tabs>
  627. <Table
  628. columns={this.state.columns1}
  629. dataSource={this.state.unreadData[this.state.unreadDataIndex] ? this.state.unreadData[this.state.unreadDataIndex].list : []}
  630. pagination={false}
  631. scroll={{ y: 600, x: 1000 }}
  632. />
  633. </Spin>
  634. <Button
  635. onClick={this.handleOk}
  636. type={"primary"}
  637. style={{
  638. position: "relative",
  639. left: "50%",
  640. transform: "translateX(-50%)",
  641. bottom: -10
  642. }}
  643. >
  644. 我已阅读以上信息
  645. </Button>
  646. </Modal>
  647. <FollowDetail
  648. categoryArr={this.state.categoryArr}
  649. followData={this.state.followData}
  650. visitModul={this.state.visitModul}
  651. closeDesc={this.closeDesc}
  652. />
  653. <textarea id='copyText1' style={{ opacity: 0 }} />
  654. </div>
  655. );
  656. }
  657. });
  658. const Content = React.createClass({
  659. getInitialState() {
  660. return {
  661. loading: false,
  662. component: '<div></div>'
  663. };
  664. },
  665. getKey(key) {
  666. switch (key) {
  667. case 'normal':
  668. require.ensure([], () => {
  669. this.setState({
  670. component: <MessageModal />,
  671. });
  672. });
  673. break;
  674. case "contacts":
  675. let Module = require('./contacts/index').default;
  676. require.ensure([], () => {
  677. this.setState({
  678. component: <Module />,
  679. });
  680. });
  681. break;
  682. default:
  683. require.ensure([], () => {
  684. let Module = require('../module').default;
  685. this.setState({
  686. component: <Module />
  687. });
  688. });
  689. }
  690. window.location.hash = key;
  691. },
  692. componentWillMount() {
  693. if (window.location.hash) {
  694. this.getKey((window.location.hash).slice(1));
  695. } else {
  696. this.getKey('normal');
  697. };
  698. },
  699. render() {
  700. return (
  701. <div className="manage-content">
  702. <LeftTab handlekey={this.getKey} />
  703. <div className="content-right">
  704. <Spin spinning={this.state.loading} className='spin-box'>
  705. <div className="index-content">
  706. {this.state.component}
  707. </div>
  708. </Spin>
  709. </div>
  710. </div>
  711. )
  712. }
  713. });
  714. export default Content;
  715. // <div className="index-content">
  716. // <div className="index-userdata clearfix">
  717. // <p className="acc-title">{this.state.number}</p>
  718. // <div className="userdata-img">
  719. // <img src={globalConfig.staticHost + "/upload" + this.state.personPortraitUrl} alt="" />
  720. // </div>
  721. // <div className="userdata-content">
  722. // {(() => {
  723. // switch (userData.lvl || this.state.userlvl) {
  724. // case '0':
  725. // return <p className="userdata-lvl">等级:<span>LV1</span> 普通用户</p>;
  726. // case '1':
  727. // return <p className="userdata-lvl">等级:<span>LV2</span> 已认证用户</p>;
  728. // };
  729. // })()}
  730. // <p>完善资料 {this.state.per}% ,<a href="./set.html">继续完善</a>,有助于提高您的资信</p>
  731. // <p className="userdata-relate" style={{ 'display': 'none' }}>
  732. // <Button className="relateqq"><img src={qq} alt="" /> QQ账号登录</Button>
  733. // <Button className="relateweibo"><img src={weibo} alt="" />微博账号登录</Button>
  734. // <Button className="relateweixin"><img src={weixin} alt="" />微信账号登录</Button>
  735. // </p>
  736. // <div className="userdata-follow">已有<a href="">{this.state.follow}</a>人关注你</div>
  737. // </div>
  738. // </div>
  739. // <div className="index-record">
  740. // <p className="acc-title">我的轨迹</p>
  741. // <ul className="record-list clearfix">
  742. // <li>技术成果:<a href="">{this.state.chengguo}</a>项</li>
  743. // <li>技术开发:<a href="">{this.state.kaifa}</a>项</li>
  744. // <li>科技服务:<a href="">{this.state.fuwu}</a>项</li>
  745. // <li>发布需求:<a href="">{this.state.xuqiu}</a>项</li>
  746. // </ul>
  747. // </div>
  748. // <div className="index-activity">
  749. // <Tabs defaultActiveKey="1" onChange={this.tabChange}>
  750. // <TabPane tab="活动" key="1">
  751. // <p className="acc-title">即将举办的活动</p>
  752. // <ul className="activity-list">
  753. // {
  754. // this.state.activityArr.map(function (item, i) {
  755. // return <li key={i}>
  756. // <span className="list-type">[{item.type}]</span>
  757. // <span className="list-title">{item.title}</span>
  758. // <a href={item.link}>报名</a>
  759. // <span className="list-time">{item.time}</span>
  760. // </li>;
  761. // })
  762. // }
  763. // </ul>
  764. // </TabPane>
  765. // <TabPane tab="其他" key="2">Content of Tab Pane 2</TabPane>
  766. // </Tabs>
  767. // </div>
  768. // </div>