知与行后台管理端

ActivityList.jsx 9.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. import React, { useState, useEffect } from 'react';
  2. import { Form, Input, Button, Icon, Select, message, Table, Divider, Tag, Pagination, Modal, DatePicker } from 'antd';
  3. import { FormattedMessage } from 'umi-plugin-react/locale';
  4. import router from 'umi/router';
  5. import moment from 'moment';
  6. import QRCode from 'qrcodejs2'
  7. import styles from '../style/GoodsList.less';
  8. import SelectCity from '../../components/SelectButton/CitySelect'
  9. import BuildSelect from '../../components/SelectButton/BuildSelect'
  10. import apis from '../../services/apis';
  11. import request from '../../utils/request';
  12. import AuthButton from '@/components/AuthButton';
  13. const { Option } = Select;
  14. const { MonthPicker, RangePicker, WeekPicker } = DatePicker;
  15. const header = props => {
  16. // eslint-disable-next-line react-hooks/rules-of-hooks
  17. const [data, setData] = useState({ list: [], total: 0 })
  18. // const [page, changePage] = useState({})
  19. // 查询列表
  20. const getList = params => {
  21. request({ ...apis.activity.list, params: { ...params } }).then(data => {
  22. console.log(data)
  23. setData(data)
  24. })
  25. }
  26. // eslint-disable-next-line react-hooks/rules-of-hooks
  27. useEffect(() => {
  28. getList({ pageNum: 1, pageSize: 10 });
  29. }, [])
  30. // 跳转到编辑商品
  31. const toEditGoods = dynamicId => () => {
  32. router.push({
  33. pathname: '/activity/editActivity',
  34. query: {
  35. dynamicId,
  36. },
  37. });
  38. }
  39. const newQrcode = row => {
  40. const x = new XMLHttpRequest();
  41. const resourceUrl = row.qrCode
  42. x.open('GET', resourceUrl, true);
  43. x.responseType = 'blob';
  44. x.onload = function (e) {
  45. const url = window.URL.createObjectURL(x.response)
  46. const a = document.createElement('a');
  47. a.href = url;
  48. a.style.display = 'none'
  49. a.download = '活动二维码.png';
  50. a.click();
  51. }
  52. x.send();
  53. }
  54. function download (data) {
  55. if (!data) {
  56. return
  57. }
  58. const url = URL.createObjectURL(data)
  59. const link = document.createElement('a')
  60. link.style.display = 'none'
  61. link.href = url
  62. link.setAttribute('download', '活动二维码.png')
  63. document.body.append(link)
  64. link.click()
  65. }
  66. /**
  67. *
  68. *
  69. * @param {*} props
  70. * @returns
  71. */
  72. const columns = [
  73. {
  74. title: '活动标题',
  75. dataIndex: 'title',
  76. key: 'title',
  77. align: 'center',
  78. },
  79. {
  80. title: '活动时间',
  81. dataIndex: 'startDate',
  82. key: 'startDate',
  83. align: 'center',
  84. render: (x, row) => <><span>{`${moment(row.startDate).format('YYYY-MM-DD')} —— ${moment(row.endDate).format('YYYY-MM-DD')}`}</span></>,
  85. },
  86. {
  87. title: '已参加人数',
  88. dataIndex: 'count',
  89. key: 'count',
  90. align: 'center',
  91. },
  92. {
  93. title: '阅读量',
  94. dataIndex: 'pvNum',
  95. key: 'pvNum',
  96. align: 'center',
  97. },
  98. {
  99. title: '转发量',
  100. dataIndex: 'shareNum',
  101. key: 'shareNum',
  102. align: 'center',
  103. },
  104. {
  105. title: '收藏数',
  106. dataIndex: 'saveNum',
  107. key: 'saveNum',
  108. align: 'center',
  109. },
  110. {
  111. title: '状态',
  112. dataIndex: 'activityStatus',
  113. key: 'activityStatus',
  114. align: 'center',
  115. render: activityStatus => <><span>{activityStatus == 0 ? '进行中' : activityStatus == 1 ? '未开始' : '已结束'}</span></>,
  116. },
  117. {
  118. title: '操作',
  119. dataIndex: 'handle',
  120. key: 'handle',
  121. align: 'center',
  122. render: (x, row) => (
  123. <>
  124. <AuthButton name="admin.SignList.get" noRight={null}>
  125. <span style={{ color: '#1990FF', cursor: 'pointer' }} onClick={getSignList.bind(this, row.dynamicId)}>{row.isEnlist == '1' || row.isEnlist == '2' ? '报名记录' : ''}{ (row.isEnlist==1||row.isEnlist==2) && <Icon type="snippets" className={styles.shoppingCart} />}</span>
  126. </AuthButton>
  127. <AuthButton name="admin.buildingDynamic.send.dynamicId.put" noRight={null}>
  128. {row.activityStatus != 0 && <span style={{ color: '#1990FF', cursor: 'pointer' }} onClick={sendOrPublicDynamic.bind(this, row)}>{row.status === 1 ? '取消发布' : '发布'}<Icon type="close-circle" className={styles.edit} /></span>}
  129. </AuthButton>
  130. <AuthButton name="admin.buildingDynamic.finish.put" noRight={null}>
  131. {row.isEnlist == 1 && <span style={{ color: '#1990FF', cursor: 'pointer' }} onClick={finishDynamic.bind(this, row)}>结束活动<Icon type="poweroff" className={styles.edit} /></span>}
  132. </AuthButton>
  133. <AuthButton name="admin.buildingDynamic.update.put" noRight={null}>
  134. <span style={{ color: '#1990FF', marginRight: '20px', cursor: 'pointer' }} onClick={topDynamic(row)}>{row.weight === 1 ? '取消置顶' : '置顶'}<Icon type="vertical-align-top" className={styles.edit} /></span>
  135. {row.isEnlist != 2 && <span style={{ color: '#FF925C', cursor: 'pointer' }} onClick={toEditGoods(row.dynamicId)}>编辑<Icon type="form" className={styles.edit} /></span>}
  136. </AuthButton>
  137. <span style={{ color: '#1990FF', cursor: 'pointer' }} onClick={newQrcode.bind(this, row)}>下载二维码<Icon type="qrcode" className={styles.shoppingCart} /></span>
  138. </>
  139. ),
  140. },
  141. ];
  142. const getSignList = dynamicId => {
  143. router.push({
  144. pathname: '/activity/SignList',
  145. query: {
  146. dynamicId,
  147. },
  148. });
  149. }
  150. const finishDynamic = row => {
  151. Modal.confirm({
  152. title: '结束以后将无法编辑, 是否继续?',
  153. okText: '确定',
  154. cancelText: '取消',
  155. onOk () {
  156. request({ ...apis.activity.finish, data: { dynamicId: row.dynamicId, top: '' } }).then(data => {
  157. console.log(data)
  158. message.info('操作成功!')
  159. getList({ pageNum: 1, pageSize: 10 })
  160. }).catch(err => {
  161. console.log(err)
  162. message.info(err.msg || err.message)
  163. })
  164. },
  165. });
  166. }
  167. // 置顶
  168. const topDynamic = row => () => {
  169. const weight = Math.abs(row.weight - 1)
  170. request({ ...apis.activity.weight, params: { dynamicId: row.dynamicId, weight } }).then(data => {
  171. console.log(data)
  172. message.info('操作成功!')
  173. getList({ pageNum: 1, pageSize: 10 })
  174. }).catch(err => {
  175. console.log(err)
  176. message.info(err.msg || err.message)
  177. })
  178. }
  179. const sendOrPublicDynamic = row => {
  180. if (row.status === 1) {
  181. cancelDynamic(row)
  182. } else {
  183. sendDynamic(row)
  184. }
  185. }
  186. // 取消活动
  187. const cancelDynamic = row => {
  188. request({ ...apis.activity.cancel, urlData: { id: row.dynamicId } }).then(data => {
  189. message.info('操作成功!')
  190. getList({ pageNum: 1, pageSize: 10 })
  191. }).catch(err => {
  192. console.log(err)
  193. message.info(err.msg || err.message)
  194. })
  195. }
  196. // 发布活动
  197. const sendDynamic = row => {
  198. request({ ...apis.activity.send, urlData: { id: row.dynamicId } }).then(data => {
  199. message.info('操作成功!')
  200. getList({ pageNum: 1, pageSize: 10 });
  201. }).catch(err => {
  202. console.log(err)
  203. message.info(err.msg || err.message)
  204. })
  205. }
  206. const changePageNum = pageNumber => {
  207. getList({ pageNum: pageNumber, pageSize: 10 })
  208. }
  209. // 提交事件
  210. const handleSubmit = (e, props) => {
  211. e.preventDefault();
  212. props.form.validateFields((err, values) => {
  213. if (!err) {
  214. console.log('提交数据: ', values)
  215. getList({ pageNum: 1, pageSize: 10, ...values })
  216. }
  217. });
  218. }
  219. // 重置搜索
  220. function handleReset () {
  221. props.form.resetFields();
  222. }
  223. const { getFieldDecorator } = props.form
  224. return (
  225. <>
  226. {/* style={{ display: 'none' }} */}
  227. <div id="qrcode"></div>
  228. <Form layout="inline" onSubmit={e => handleSubmit(e, props)}>
  229. <Form.Item>
  230. {getFieldDecorator('cityId')(
  231. <SelectCity />,
  232. )}
  233. </Form.Item>
  234. <Form.Item>
  235. {getFieldDecorator('buildingId')(
  236. <BuildSelect />,
  237. )}
  238. </Form.Item>
  239. <Form.Item>
  240. {getFieldDecorator('title')(
  241. <Input
  242. prefix={<Icon type="text" style={{ color: 'rgba(0,0,0,.25)' }} />}
  243. placeholder="请输入标题"
  244. />,
  245. )}
  246. </Form.Item>
  247. <Form.Item>
  248. {getFieldDecorator('time')(
  249. <DatePicker />,
  250. )}
  251. </Form.Item>
  252. <Form.Item>
  253. {getFieldDecorator('isEnlist')(
  254. <Select style={{ width: '180px' }} placeholder="是否报名">
  255. <Option value="1">已报名</Option>
  256. <Option value="0">未报名</Option>
  257. </Select>,
  258. )}
  259. </Form.Item>
  260. <Form.Item>
  261. <Button type="primary" htmlType="submit" className={styles.searchBtn}>
  262. 搜索
  263. </Button>
  264. <Button style={{ marginLeft: 8 }} onClick={handleReset}>
  265. 重置
  266. </Button>
  267. </Form.Item>
  268. </Form>
  269. <AuthButton name="admin.buildingDynamic.add.post" noRight={null}>
  270. <Button type="danger" className={styles.addBtn} onClick={toEditGoods()}>新增</Button>
  271. </AuthButton>
  272. <Table dataSource={data.list} columns={columns} pagination={false} rowKey="activityList" />
  273. <div style={{ display: 'flex', justifyContent: 'flex-end', marginTop: '30px' }}>
  274. <Pagination showQuickJumper defaultCurrent={1} total={data.total} onChange={e => changePageNum(e)} current={data.current}/>
  275. </div>
  276. </>
  277. )
  278. }
  279. const WrappedHeader = Form.create({ name: 'header' })(header);
  280. export default WrappedHeader