detail.jsx 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. import React, { useState, useEffect } from 'react';
  2. import { Form, Input, Button, Icon, Select, Card, Radio, DatePicker, message, Upload } from 'antd';
  3. import apis from '@/services/apis';
  4. import moment from 'moment';
  5. import router from 'umi/router';
  6. import BuildSelect from '@/components/SelectButton/BuildSelect'
  7. import request from '@/utils/request'
  8. import yinhao from '@/assets/yinhao.png'
  9. import logo from '@/assets/logo.png';
  10. import touxiang from '@/assets/touxiang.jpg';
  11. import poster1 from '@/assets/poster1.png';
  12. import poster2 from '@/assets/poster2.png';
  13. import xiaochengxu from '@/assets/xiaochengxu.png';
  14. import AuthButton from '@/components/AuthButton';
  15. import Prompt from 'umi/prompt';
  16. const { MonthPicker, RangePicker, WeekPicker } = DatePicker;
  17. const { TextArea } = Input;
  18. const formItemLayout = {
  19. labelCol: { span: 6 },
  20. wrapperCol: { span: 14 },
  21. };
  22. const cancelPage = () => {
  23. router.go('-1')
  24. }
  25. const getSignList = dynamicId => {
  26. router.push({
  27. pathname: '/activity/SignList',
  28. query: {
  29. dynamicId,
  30. },
  31. });
  32. }
  33. const newQrcode = row => {
  34. const x = new XMLHttpRequest();
  35. const resourceUrl = row.qrCode
  36. x.open('GET', resourceUrl, true);
  37. x.responseType = 'blob';
  38. x.onload = function (e) {
  39. const url = window.URL.createObjectURL(x.response)
  40. const a = document.createElement('a');
  41. a.href = url;
  42. a.style.display = 'none'
  43. a.download = '活动二维码.png';
  44. a.click();
  45. }
  46. x.send();
  47. }
  48. const BasicForm = props => {
  49. const detailData = props.detailData || {}
  50. const radioOnChange = e => {
  51. // setIsEnlist(e.target.value)
  52. }
  53. const { dynamicId } = props
  54. const handleSubmit = e => {
  55. e.preventDefault();
  56. props.form.validateFields((err, values) => {
  57. if (!err) {
  58. console.log('Received values of form: ', values);
  59. const { activityTime, signupTime } = values
  60. const [startDate, endDate] = activityTime
  61. values.startDate = moment(startDate).format('YYYY-MM-DD HH:mm');
  62. values.endDate = moment(endDate).format('YYYY-MM-DD HH:mm');
  63. if (signupTime) {
  64. const [enlistStart, enlistEnd] = signupTime
  65. values.enlistStart = moment(enlistStart).format('YYYY-MM-DD HH:mm');
  66. values.enlistEnd = moment(enlistEnd).format('YYYY-MM-DD HH:mm');
  67. }
  68. console.log('submit data --->', values)
  69. if (dynamicId) {
  70. values.dynamicId = dynamicId
  71. request({ ...apis.activity.update, data: values }).then(data => {
  72. message.info('保存成功')
  73. // router.go(-1)
  74. }).catch((err) => {
  75. message.info(err.msg || err.message)
  76. })
  77. } else {
  78. request({ ...apis.activity.add, data: { ...values } }).then((data) => {
  79. message.info('保存成功')
  80. router.push({
  81. pathname: '/activity/editActivity',
  82. query: {
  83. dynamicId: data.dynamicId,
  84. },
  85. });
  86. // router.go(-1)
  87. }).catch((err) => {
  88. message.info(err.msg || err.message)
  89. })
  90. }
  91. }
  92. });
  93. }
  94. const { getFieldDecorator } = props.form;
  95. return (
  96. <>
  97. <Form {...formItemLayout} onSubmit={handleSubmit}>
  98. <Form.Item label="所属项目">
  99. {getFieldDecorator('buildingId', {
  100. initialValue: detailData.buildingId,
  101. rules: [
  102. {
  103. required: true,
  104. message: '请选择所属项目',
  105. },
  106. ],
  107. })(<BuildSelect disabled />)}
  108. </Form.Item>
  109. <Form.Item label="活动封面图1">
  110. <img src={detailData.listImgUrl} height="210px" width="375px" />
  111. </Form.Item>
  112. <Form.Item label="活动封面图2">
  113. <img src={detailData.bannerListImg} height="125px" width="375px" />
  114. </Form.Item>
  115. <Form.Item label="活动详情主图">
  116. <img src={detailData.imgUrl} height="300px" width="375px" />
  117. </Form.Item>
  118. <Form.Item label="活动标题">
  119. <span>{detailData.title}</span>
  120. </Form.Item>
  121. <Form.Item label="活动时间">
  122. <span>{`${moment(detailData.startDate).format('YYYY-MM-DD HH:mm')} —— ${moment(detailData.endDate).format('YYYY-MM-DD HH:mm')}`}</span>
  123. </Form.Item>
  124. <Form.Item label="活动地点">
  125. <span>{detailData.address}</span>
  126. </Form.Item>
  127. <Form.Item label="活动人数">
  128. <span>{detailData.personNum}</span>
  129. </Form.Item>
  130. <Form.Item label="阅读量">
  131. <span>{detailData.pvNum}</span>
  132. </Form.Item>
  133. <Form.Item label="转发量">
  134. <span>{detailData.shareNum}</span>
  135. </Form.Item>
  136. <Form.Item label="收藏数">
  137. <span>{detailData.saveNum}</span>
  138. </Form.Item>
  139. <Form.Item label="最大报名人数">
  140. <span>{detailData.maxEnlistByPerson}</span>
  141. </Form.Item>
  142. <Form.Item label="活动详情">
  143. <div style={{ maxHeight: '500px', overflowY: 'auto' }} dangerouslySetInnerHTML={{ __html: detailData.desc }}></div>
  144. </Form.Item>
  145. <Form.Item label="报名时间">
  146. <span>{`${moment(detailData.enlistStart).format('YYYY-MM-DD HH:mm')} —— ${moment(detailData.enlistEnd).format('YYYY-MM-DD HH:mm')}`}</span>
  147. </Form.Item>
  148. <Form.Item label="权重">
  149. <span>{detailData.heavy}</span>
  150. </Form.Item>
  151. </Form>
  152. </>
  153. )
  154. }
  155. const Basic = Form.create({ name: 'BasicForm' })(BasicForm);
  156. const Poster = (props) => {
  157. const { dynamicId } = props
  158. const [inputValue, changeInput] = useState('')
  159. const [textAreaValue, changeTextArea] = useState('')
  160. const [imgValue, changeImg] = useState('')
  161. const [posterId, setPosterId] = useState('')
  162. if (dynamicId) {
  163. console.log(dynamicId, 'dynamicId')
  164. useEffect(() => {
  165. request({ ...apis.activity.poster, params: { targetId: dynamicId, targetType: 'activity' } }).then((data) => {
  166. console.log(data, "2222")
  167. if (data.length > 0) {
  168. setPosterId(data[0].posterId)
  169. changeImg(data[0].posterImg)
  170. changeTextArea(data[0].posterDescription)
  171. changeInput(data[0].posterTitle)
  172. }
  173. }).catch((err) => {
  174. message.info(err.msg || err.message)
  175. })
  176. getMiniappName()
  177. }, [])
  178. } else {
  179. getMiniappName()
  180. }
  181. // 获取小程序名称
  182. const [miniappName, setMiniappName] = useState('')
  183. function getMiniappName() {
  184. request({ ...apis.building.getMiniappName }).then(res => {
  185. console.log(res, "0000000000000")
  186. setMiniappName(res)
  187. })
  188. }
  189. const submitPoster = () => {
  190. if (dynamicId) {
  191. if (posterId) {
  192. request({ ...apis.activity.updatePoster, urlData: { id: posterId }, data: { targetId: dynamicId, targetType: 'activity', posterImg: imgValue, posterTitle: inputValue, posterDescription: textAreaValue }, }).then((data) => {
  193. message.info("保存成功")
  194. }).catch((err) => {
  195. message.info(err.msg || err.message)
  196. })
  197. } else {
  198. request({ ...apis.activity.addPoster, data: { targetId: dynamicId, targetType: 'activity', posterImg: imgValue, posterTitle: inputValue, posterDescription: textAreaValue }, }).then((data) => {
  199. setPosterId(data.posterId)
  200. message.info("保存成功")
  201. }).catch((err) => {
  202. message.info(err.msg || err.message)
  203. })
  204. }
  205. } else {
  206. message.warn("请先保存基本信息数据")
  207. }
  208. }
  209. return <div>
  210. <div style={{ display: 'flex' }}>
  211. <div style={{ width: '420px', height: '900px', display: 'inline-block', marginTop: '30px' }}>
  212. <div style={{ width: '375px', height: '700px', backgroundColor: '#fff', boxShadow: '0px 0px 16px 6px rgba(0,0,0,0.15)', position: 'relative', margin: '0 auto' }}>
  213. <img style={{ width: '100%', height: '300px' }} src={imgValue ? imgValue : poster1} alt="" />
  214. <div style={{ display: 'flex', alignItems: 'center', marginTop: '-24px' }}>
  215. <img style={{ width: '70px', height: '70px', border: '4px solid #fff', borderRadius: '35px', marginLeft: '16px' }} src={touxiang} alt="" />
  216. <span style={{ color: '#222', fontWeight: '600', margin: '24px 10px 0 14px', fontSize: '17px' }}>喵喵</span>
  217. <span style={{ color: '#999', marginTop: '25px', fontSize: '17px' }}>邀您参与</span>
  218. <span style={{ color: '#999', margin: '25px 0 0 60px', fontSize: '17px' }}>2019.09.21</span>
  219. </div>
  220. <p style={{
  221. margin: '10px 20px',
  222. fontSize: '20px',
  223. color: '#222',
  224. fontWeight: '600',
  225. display: '-webkit-box',
  226. lineClamp: '3',
  227. height: '60px',
  228. WebkitLineClamp: '2',
  229. WebkitBoxOrient: 'vertical',
  230. overflow: 'hidden',
  231. textOverflow: 'ellipsis'
  232. }}>{inputValue ? inputValue : '海报标题'}</p>
  233. <img src={yinhao} style={{ width: '30px', marginLeft: '20px' }} alt="" />
  234. <p style={{
  235. margin: '16px 20px 28px 20px',
  236. fontSize: '17px',
  237. color: '#999',
  238. display: '-webkit-box',
  239. lineClamp: '3',
  240. height: '72px',
  241. WebkitLineClamp: '3',
  242. WebkitBoxOrient: 'vertical',
  243. overflow: 'hidden',
  244. textOverflow: 'ellipsis'
  245. }}>{textAreaValue ? textAreaValue : '海报描述'}</p>
  246. <div style={{ backgroundColor: '#f1f1f1', padding: '22px 30px', boxShadow: '0px 6px 12px -4px #dcdcdc', position: 'relative' }}>
  247. <p style={{ margin: '0', fontSize: '18px', color: '#888' }}>长按识别小程序码</p>
  248. <p style={{ margin: '0', fontSize: '18px', color: '#888' }}>进入<span style={{ margin: '0 5px', fontSize: '18px', color: '#333', fontWeight: '600' }}>{miniappName || '置业V顾问'}</span>报名活动</p>
  249. <img style={{ width: '80px', position: 'absolute', right: '30px', top: '10px' }} src={xiaochengxu} alt="" />
  250. </div>
  251. </div>
  252. <p style={{ textAlign: 'center', fontSize: '19px', color: '#666', marginTop: '30px' }}>海报模板</p>
  253. </div>
  254. {/* <div >
  255. <div style={{ display: 'flex', width: '100%', margin: '60px 0' }}>
  256. <p style={{ minWidth: '200px', color: '#222', textAlign: 'right', margin: '0 30px 0 0' }}>活动海报图</p>
  257. <ImageUploader value={imgValue} onChange={e => changeImg(e)} />
  258. </div>
  259. <p style={{ fontSize: '0.5vw', color: '#A9A9A9', marginLeft: '230px', marginBottom: '30px'}}>建议图片尺寸:640*670px,比例64:67,格式:jpg,用于普通活动海报</p>
  260. <div style={{ display: 'flex', alignItems: 'center', width: '100%', marginBottom: '60px' }}>
  261. <p style={{ minWidth: '200px', color: '#222', textAlign: 'right', margin: '0 30px 0 0' }}>海报标题</p>
  262. <Input style={{ width: '20vw' }} value={inputValue} placeholder="请输入海报标题" onChange={e => changeInput(e.target.value)} />
  263. </div>
  264. <div style={{ display: 'flex', margin: '10px 0 40px 0', width: '100%' }}>
  265. <p style={{ minWidth: '200px', color: '#222', textAlign: 'right', margin: '0 30px 0 0' }}>海报描述</p>
  266. <TextArea rows={5} value={textAreaValue} onChange={e => changeTextArea(e.target.value)} />
  267. </div>
  268. </div> */}
  269. </div>
  270. {/* <Button type="primary" onClick={submitPoster} style={{ margin: '40px 40px 40px 30vw' }}> 确定</Button>
  271. <Button onClick={() => cancelPage()}>
  272. 取消
  273. </Button> */}
  274. </div>
  275. }
  276. const Share = (props) => {
  277. const { dynamicId } = props
  278. const [inputValue, changeInput] = useState('')
  279. const [imgValue, changeImg] = useState('')
  280. const [shareContentId, setShareContentId] = useState('')
  281. useEffect(() => {
  282. if (dynamicId) {
  283. request({ ...apis.activity.shareContent, params: { targetId: dynamicId, targetType: 'activity' }, }).then((data) => {
  284. if (data.length > 0) {
  285. setShareContentId(data[0].shareContentId)
  286. changeImg(data[0].shareContentImg)
  287. changeInput(data[0].shareContentTitle)
  288. }
  289. }).catch((err) => {
  290. message.info(err.msg || err.message)
  291. })
  292. }
  293. }, [])
  294. const submitShare = () => {
  295. if (dynamicId) {
  296. if (shareContentId) {
  297. request({ ...apis.activity.updateShareContent, urlData: { id: shareContentId }, data: { targetId: dynamicId, shareContentType: 'activity', shareContentImg: imgValue, shareContentTitle: inputValue }, }).then((data) => {
  298. message.info("保存成功")
  299. }).catch((err) => {
  300. message.info(err.msg || err.message)
  301. })
  302. } else {
  303. request({ ...apis.activity.addShareContent, data: { targetId: dynamicId, shareContentType: 'activity', shareContentImg: imgValue, shareContentTitle: inputValue }, }).then((data) => {
  304. setShareContentId(data.shareContentId)
  305. message.info("保存成功")
  306. }).catch(err => {
  307. message.info(err.msg || err.message)
  308. })
  309. }
  310. } else {
  311. message.warn("请先保存基本信息数据")
  312. }
  313. }
  314. return <div style={{ padding: '20px' }}>
  315. <div style={{ display: 'flex', margin: '10px 0 40px 0', width: '100%' }}>
  316. <p style={{ minWidth: '200px', color: '#222', textAlign: 'right', margin: '0 30px 0 0' }}>分享模板</p>
  317. <div>
  318. <p style={{ display: 'flex', alignItems: 'center', fontSize: '14px', color: '#999', margin: '0', lineHeight: '0' }}><img src={logo} style={{ width: '22px', marginRight: '10px' }} />橙蕉互动</p>
  319. <p style={{ fontSize: '16px', color: '#222', fontWeight: '600', margin: '0' }}>{inputValue ? inputValue : '置业V客厅 精准获客平台'}</p>
  320. <img style={{ width: '200px', height: '160px' }} src={imgValue ? imgValue : poster2} alt="" />
  321. </div>
  322. </div>
  323. <div style={{ display: 'flex', alignItems: 'center', width: '100%' }}>
  324. <p style={{ minWidth: '200px', color: '#222', textAlign: 'right', margin: '0 30px 0 0' }}>分享标题</p>
  325. {inputValue === '' ? '无' : <span>{inputValue}</span>}
  326. </div>
  327. <div style={{ display: 'flex', width: '100%', marginTop: '40px' }}>
  328. <p style={{ minWidth: '200px', color: '#222', textAlign: 'right', margin: '0 30px 0 0' }}>活动分享图</p>
  329. {imgValue === '' ? '无' : <img src={imgValue} height="120px" height="150px" />}
  330. </div>
  331. {/* <Button type="primary" htmlType="submit" onClick={submitShare} style={{ margin: '40px 40px 40px 220px' }}> 确定</Button>
  332. <Button onClick={() => cancelPage()}>
  333. 取消
  334. </Button> */}
  335. </div>
  336. }
  337. /**
  338. *
  339. *
  340. * @param {*} props
  341. * @returns
  342. */
  343. const Edit = props => {
  344. const [tab, changeTab] = useState('basic')
  345. const { dynamicId } = props.location.query
  346. const [detailData, setDetailData] = useState(false)
  347. const getDynamicData = dynamicId => {
  348. request({ ...apis.activity.details, params: { dynamicId } }).then((data) => {
  349. console.log(data)
  350. data.activityTime = [moment(data.startDate), moment(data.endDate)]
  351. data.signupTime = [moment(data.enlistStart), moment(data.enlistEnd)]
  352. setDetailData(data)
  353. })
  354. }
  355. useEffect(() => {
  356. if (dynamicId) {
  357. getDynamicData(dynamicId);
  358. }
  359. }, [])
  360. return (
  361. <Card>
  362. <div>
  363. <Radio.Group value={tab} buttonStyle="solid" onChange={e => changeTab(e.target.value)}>
  364. <Radio.Button value="basic">基本信息</Radio.Button>
  365. <Radio.Button value="poster">海报图片</Radio.Button>
  366. <Radio.Button value="share">分享设置</Radio.Button>
  367. </Radio.Group>
  368. </div>
  369. <div>
  370. {tab === 'basic' && <Basic dynamicId={dynamicId} detailData={detailData} />}
  371. {tab === 'poster' && <Poster dynamicId={dynamicId} />}
  372. {tab === 'share' && <Share dynamicId={dynamicId} />}
  373. </div>
  374. <div style={{ textAlign: 'center' }}>
  375. <AuthButton name="admin.SignList.get" noRight={null}>
  376. {(detailData.activityStatus === 0 || detailData.activityStatus === 2) && <span style={{ color: '#1990FF', marginRight: '20px', cursor: 'pointer' }} onClick={getSignList.bind(this, detailData.dynamicId)}><Button>报名记录</Button></span>}
  377. </AuthButton>
  378. <AuthButton name="admin.dymic.qrcode" noRight={null}>
  379. {(detailData.activityStatus === 0 || detailData.activityStatus === 2) && <span style={{ color: '#1990FF', marginRight: '20px', cursor: 'pointer' }} onClick={newQrcode.bind(this, detailData)}>{<Button>下载二维码</Button>}</span>}
  380. </AuthButton>
  381. <Button onClick={() => cancelPage()}>
  382. 取消
  383. </Button>
  384. </div>
  385. </Card>
  386. );
  387. }
  388. export default Edit