知与行后台管理端

userSource.jsx 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import React, { Component, useState, useEffect } from 'react';
  2. import { Form, Icon, Input, Button, DatePicker, Select, Card, Row, Col, Pagination, Alert, Table, Avatar, Radio, Modal, Descriptions } from 'antd';
  3. import UserSource from './components/UserSource.jsx';
  4. import UserSourcepie from './components/UserSourcepie.jsx';
  5. // import XForm, { FieldTypes } from '../../components/XForm';
  6. import moment from 'moment';
  7. import EChart from '../../components/EchartsTest/EChart';
  8. import request from '../../utils/request';
  9. import apis from '../../services/apis';
  10. // const formatDate = (start, end) => {
  11. // const startDate = moment(start).format('YYYY-MM-DDT00:00:00.000') + 'Z'
  12. // const endDate = moment(end).format('YYYY-MM-DDT23:59:59.999') + 'Z'
  13. // return { startDate, endDate }
  14. // }
  15. const header = props => {
  16. const [tableData, setTableData] = useState([])
  17. const [userType, setuserType] = useState([])
  18. const [endDate, setEndDate] = useState({})
  19. const [startDate, setStartDate] = useState({})
  20. let daterange = []
  21. useEffect(() => {
  22. setEndDate(new Date())
  23. setStartDate(moment().subtract(7, 'day').toDate())
  24. setuserType('all')
  25. }, [])
  26. const { RangePicker } = DatePicker;
  27. function onChangetime (dates, dateStrings) {
  28. daterange[1] = dateStrings[1]
  29. daterange[0] = dateStrings[0]
  30. }
  31. const handleSubmit = (e, props) => {
  32. e.preventDefault();
  33. }
  34. const getDataOf = (days) => () => {
  35. setEndDate(new Date())
  36. setStartDate(moment().subtract(days, 'day').toDate())
  37. }
  38. function onChange (e) {
  39. // console.log(`radio checked:${e.target.value}`);
  40. }
  41. function datalist () {
  42. setEndDate(daterange[1])
  43. setStartDate(daterange[0])
  44. }
  45. // const userType = 'all'
  46. let tableTitle = ['日期']
  47. // const dataset = data || {}
  48. // function tableData () {
  49. // const data = (dataset.data || []).reduce((acc, item, index) => {
  50. // const { date, fromName, count, registered } = item
  51. // const num = userType === 'registered' ? registered : count
  52. // tableTitle = tableTitle.indexOf(fromName) > -1 ? tableTitle : tableTitle.concat(fromName) // eslint-disable-line
  53. // acc[date] = { ...acc[date], [`${fromName}`]: !num ? 0 : num }
  54. // return acc
  55. // }, {})
  56. // return Object.keys(data).map(x => ({ label: x, ...data[x] }))
  57. // }
  58. function onTabledatas (e) {
  59. const data = (e.data || []).reduce((acc, item, index) => {
  60. const { date, fromName, count, registered } = item
  61. const num = userType === 'registered' ? registered : count
  62. tableTitle = tableTitle.indexOf(fromName) > -1 ? tableTitle : tableTitle.concat(fromName) // eslint-disable-line
  63. acc[date] = { ...acc[date], [`${fromName}`]: !num ? 0 : num }
  64. return acc
  65. }, {})
  66. setTableData(Object.keys(data).map(x => ({ label: x, ...data[x] })))
  67. }
  68. const columns = [
  69. {
  70. title: '日期',
  71. dataIndex: 'label',
  72. key: 'label',
  73. width: '20%',
  74. },
  75. // {
  76. // title: '名片分享',
  77. // dataIndex: '名片分享',
  78. // key: '名片分享',
  79. // width: '16%'
  80. // },
  81. // {
  82. // title: '好友分享',
  83. // dataIndex: '好友分享',
  84. // key: '好友分享',
  85. // width: '16%'
  86. // },
  87. // {
  88. // title: '小程序搜索',
  89. // dataIndex: '小程序搜索',
  90. // key: '小程序搜索',
  91. // width: '16%'
  92. // },
  93. // {
  94. // title: '线下扫码',
  95. // dataIndex: '线下扫码',
  96. // key: '线下扫码',
  97. // width: '16%'
  98. // },
  99. // {
  100. // title: '群分享',
  101. // dataIndex: '群分享',
  102. // key: '群分享',
  103. // width: '16%'
  104. // },
  105. ]
  106. function handleSelectChange (e) {
  107. console.log(e)
  108. setuserType(e)
  109. }
  110. return (<>
  111. <div style={{
  112. backgroundColor: '#fff',
  113. padding: '32PX 28px',
  114. boxShadow: '0px 0px 16px 2px rgba(0,0,0,0.12)',
  115. borderRadius: '12px',
  116. minHeight: '60vh'
  117. }}>
  118. <Radio.Group buttonStyle="solid" defaultValue="a">
  119. <Radio.Button value="a" onClick={getDataOf(7)}>最近7天</Radio.Button>
  120. <Radio.Button value="b" onClick={getDataOf(30)}>最近1月</Radio.Button>
  121. </Radio.Group>
  122. <RangePicker
  123. style={{ paddingLeft: '30px' }}
  124. ranges={{
  125. Today: [moment(), moment()],
  126. 'This Month': [moment().startOf('month'), moment().endOf('month')],
  127. }}
  128. showTime
  129. // format="YYYY/MM/DD HH:mm:ss"
  130. onChange={onChangetime}
  131. />
  132. <Button type="primary" htmlType="submit" style={{ marginLeft: '30px' }} onClick={datalist}>
  133. 查询
  134. </Button>
  135. <div>
  136. <div style={{ display: 'flex' }}>
  137. <div style={{
  138. width: '1060px',
  139. height: '560px',
  140. paddingTop: '40px',
  141. marginRight: ' 40px',
  142. }}>
  143. <UserSource endDate={endDate} startDate={startDate} onSuccess={(e) => onTabledatas(e)}></UserSource>
  144. </div>
  145. <div style={{
  146. width: '509px',
  147. height: '600px',
  148. paddingTop: '40px',
  149. }}>
  150. <UserSourcepie endDate={endDate} startDate={startDate}></UserSourcepie>
  151. </div>
  152. </div>
  153. <Select style={{ width: '180px' }} placeholder="所有用户" onChange={handleSelectChange}>
  154. <Option value='all'>所有用户</Option>
  155. <Option value='registered'>注册用户</Option>
  156. </Select>
  157. <Table dataSource={tableData} columns={columns} pagination={false} scroll={{ y: 500 }}></Table>
  158. </div>
  159. </div>
  160. </>
  161. )
  162. }
  163. export default header