傅行帆 5 yıl önce
ebeveyn
işleme
bb6cf4c5e5

+ 7
- 1
config/routes.js Dosyayı Görüntüle

@@ -282,7 +282,7 @@ export default [
282 282
               },
283 283
               {
284 284
                 path: '/activity/drainage/DrainageList',
285
-                name: '全网投放引流',
285
+                name: 'H5活动',
286 286
                 component: './activity/drainage/DrainageList',
287 287
               },
288 288
               {
@@ -291,6 +291,12 @@ export default [
291 291
                 hideInMenu: true,
292 292
                 component: './activity/drainage/Detail',
293 293
               },
294
+              {
295
+                path: '/activity/drainage/DetailDrainage',
296
+                name: 'H5详情',
297
+                hideInMenu: true,
298
+                component: './activity/drainage/DetailDrainage',
299
+              },
294 300
               {
295 301
                 path: '/activity/helpActivity/detailActivity',
296 302
                 name: '活动详情',

+ 11
- 5
src/layouts/BasicLayout.jsx Dosyayı Görüntüle

@@ -14,7 +14,7 @@ import RightContent from '@/components/GlobalHeader/RightContent';
14 14
 import RenderAuthorize from '@/components/Authorized';
15 15
 import { isAntDesignPro } from '@/utils/utils';
16 16
 import logo from '../assets/logo.png';
17
-  
17
+
18 18
 const footerRender = () => {
19 19
   return (
20 20
     <div
@@ -24,7 +24,13 @@ const footerRender = () => {
24 24
         fontSize: '30px',
25 25
         fontFamily: 'monospace',
26 26
         fontWeight: '200',
27
+        // height:'200px',
27 28
         color: 'rgba(102, 102, 102, 1)',
29
+        // position: 'fixed',
30
+        // bottom: '0',
31
+        // right: '0',
32
+        // marginTop: '20px',
33
+        // width:'100%'
28 34
       }}
29 35
     >
30 36
       Copy Right @ 知与行
@@ -42,7 +48,7 @@ const menuHeaderRender = (logo, title) => {
42 48
 
43 49
 const BasicLayout = props => {
44 50
   const { dispatch, children, settings } = props;
45
-  
51
+
46 52
   useEffect(() => {
47 53
     if (dispatch && !props.user.currentUser.userId) {
48 54
       dispatch({
@@ -53,7 +59,7 @@ const BasicLayout = props => {
53 59
       });
54 60
     }
55 61
   }, []);
56
-  
62
+
57 63
   const Authorized = RenderAuthorize(props.user.currentUser.roles)
58 64
 
59 65
   const handleMenuCollapse = payload => {
@@ -68,7 +74,7 @@ const BasicLayout = props => {
68 74
   const findAuthority = (path) => {
69 75
     return ((props.user.menuList || []).filter(x => x.code === path)[0] || {}).roles
70 76
   }
71
-  
77
+
72 78
   /**
73 79
    * use Authorized check all menu item
74 80
    */
@@ -92,7 +98,7 @@ const BasicLayout = props => {
92 98
       menuItemRender={(menuItemProps, defaultDom) => {
93 99
         if (menuItemProps.isUrl) {
94 100
           return defaultDom;
95
-        }        
101
+        }
96 102
         return <Link to={menuItemProps.path}>{defaultDom}</Link>;
97 103
       }}
98 104
       breadcrumbRender={(routers = []) => [

+ 1
- 1
src/layouts/BlankLayout.jsx Dosyayı Görüntüle

@@ -2,7 +2,7 @@ import React from 'react';
2 2
 import { PageHeaderWrapper } from '@ant-design/pro-layout';
3 3
 
4 4
 const Layout = ({ children }) => (
5
-  <PageHeaderWrapper style={{height:'49px',background:'rgba(240,240,240,1)',paddingTop:'15px'}}>
5
+  <PageHeaderWrapper style={{height:'auto',background:'rgba(240,240,240,1)',paddingTop:'15px'}}>
6 6
     <div
7 7
       style={{
8 8
         backgroundColor: '#fff',

+ 95
- 28
src/pages/activity/drainage/DrainageList.jsx Dosyayı Görüntüle

@@ -64,6 +64,25 @@ const header = (props) => {
64 64
     });
65 65
   }
66 66
 
67
+  const toDrainageDetail = (drainageId) => () => {
68
+    router.push({
69
+      pathname: '/activity/drainage/DetailDrainage',
70
+      query: {
71
+        drainageId
72
+      },
73
+    });
74
+  }
75
+
76
+  const exchangeDrainage = drainage => () => {
77
+    request({ ...apis.activity.exchangeDrainage, urlData: { id: drainage.drainageId }, data: drainage }).then((data) => {
78
+      message.info('操作成功!')
79
+      gettaDrainage({ pageNum: 1, pageSize: 10 })
80
+    }).catch((err) => {
81
+      console.log(err)
82
+      message.info(err.msg || err.message)
83
+    })
84
+  }
85
+
67 86
   const columns = [
68 87
     {
69 88
       title: 'H5项目编号',
@@ -85,23 +104,23 @@ const header = (props) => {
85 104
       align: 'center',
86 105
       render: (text, datas) => <>
87 106
 
88
-        <div style={{ color: '#66B3FF' }} onClick={() => addshowModal(datas)} >{datas.name}</div>
107
+        <div style={{ color: '#66B3FF', cursor: 'pointer' }} onClick={toDrainageDetail(datas.drainageId)}>{datas.name}</div>
89 108
 
90 109
       </>
91 110
     },
92 111
     {
93
-      title: 'appid',
94
-      dataIndex: 'appid',
95
-      key: 'appid',
112
+      title: '链接地址',
113
+      dataIndex: 'h5Address',
114
+      key: 'h5Address',
96 115
       align: 'center',
97 116
       // render: (text, datas) => <div style={ { color: '#66B3FF' } } onClick= {() => addshowModal(datas)} >{ datas.name }</div>, 
98 117
     },
99 118
     {
100
-      title: 'secret',
101
-      dataIndex: 'appSecret',
102
-      key: 'appSecret',
119
+      title: '上架状态',
120
+      dataIndex: 'status',
121
+      key: 'status',
103 122
       align: 'center',
104
-      // render: (text, datas) => <div style={ { color: '#66B3FF' } } onClick= {() => addshowModal(datas)} >{ datas.name }</div>,
123
+    render: (status) => <span>{status === 1 ? '已上架' : '已下架'}</span>,
105 124
     },
106 125
     {
107 126
       title: '新建时间',
@@ -115,7 +134,7 @@ const header = (props) => {
115 134
       ),
116 135
     },
117 136
     {
118
-      title: '截止时间',
137
+      title: '自动下架时间',
119 138
       dataIndex: 'endDate',
120 139
       key: 'endDate',
121 140
       align: 'center',
@@ -138,27 +157,33 @@ const header = (props) => {
138 157
       align: 'center',
139 158
       render: (text, datas) => (
140 159
         <>
141
-          <AuthButton name="admin.customer.recommend.edit.id.put" noRight={null}>
142
-            <span style={{ right: '20px', top: '20px', fontSize: ' 0.106rem', zIndex: 1, color: '#FF7E48', cursor: 'pointer' }} onClick={toEditList(datas)}>
143
-              查看详情
144
-            </span>
145
-          </AuthButton>
160
+          <span style={{ right: '20px', bottom: ' 10px', fontSize: ' 0.106rem', color: '#FF7E48', cursor: 'pointer'}} onClick={() => addshowModal(datas)}>
161
+            编辑
162
+          </span>
146 163
           <AuthButton name="admin.taDrainage.id.delete" noRight={null}>
147 164
             <span style={{ right: '20px', bottom: ' 10px', fontSize: ' 0.106rem', color: '#FF7E48', cursor: 'pointer', marginLeft: 20 }} onClick={deleteDrainage(datas.drainageId)}>
148 165
               删除
149 166
             </span>
150 167
           </AuthButton >
168
+          <span style={{ right: '20px', bottom: ' 10px', fontSize: ' 0.106rem', color: '#FF7E48', cursor: 'pointer', marginLeft: 20 }} onClick={exchangeDrainage(datas)}>
169
+            {datas.status === 1 ? '下架' : '上架'}
170
+          </span>
171
+          <AuthButton name="admin.customer.recommend.edit.id.put" noRight={null}>
172
+            <span style={{ right: '20px', top: '20px', fontSize: ' 0.106rem', zIndex: 1, color: '#FF7E48', cursor: 'pointer', marginLeft: 20  }} onClick={toEditList(datas)}>
173
+              数据
174
+            </span>
175
+          </AuthButton>
151 176
         </>
152 177
       ),
153 178
     },
154 179
   ];
155 180
   const Forms = props => {
156 181
     const { formsDate } = props
157
-    useEffect(() => {
158
-      if (formsDate) {
159
-        props.form.setFieldsValue({ ...formsDate, endDate: formsdate.endDate ? moment(formsdate.endDate, 'YYYY-MM-DD HH:mm') : null })
160
-      }
161
-    }, [formsDate])
182
+    // useEffect(() => {
183
+    //   if (formsDate) {
184
+    //     props.form.setFieldsValue({ ...formsDate, endDate: formsdate.endDate ? moment(formsdate.endDate, 'YYYY-MM-DD HH:mm') : null })
185
+    //   }
186
+    // }, [formsDate])
162 187
 
163 188
     const [hiddenStatus, setHiddenStatus] = useState(formsdate.isMiniapp)
164 189
     
@@ -238,8 +263,13 @@ const header = (props) => {
238 263
 
239 264
     return <Form {...formItemLayout} onSubmit={handleSubmit}>
240 265
 
241
-      <Form.Item label="是否投放小程序端">
242
-        {getFieldDecorator('isMiniapp')(
266
+      <Form.Item label="是否投放小程序端" help='选择是后,该活动可投放至小程序的轮播位以及开屏广告'>
267
+        {getFieldDecorator('isMiniapp',{
268
+          initialValue : formsDate.isMiniapp ? 1 : 0,
269
+          rules: [
270
+            { required: true, message: '请选择是否投放小程序' },
271
+          ],
272
+        })(
243 273
           <Radio.Group onChange={changeMiniapp}>
244 274
             <Radio value={1}>是</Radio>
245 275
             <Radio value={0}>否</Radio>
@@ -247,14 +277,21 @@ const header = (props) => {
247 277
         )}
248 278
       </Form.Item>
249 279
       <Form.Item label="H5项目名称">
250
-        {getFieldDecorator('name')(
280
+        {getFieldDecorator('name',{initialValue : formsDate.name,
281
+          rules: [
282
+            { required: true, message: '请输入H5项目名称' },
283
+          ],
284
+        })(
251 285
           <Input
252 286
             placeholder="请输入H5项目名称"
253 287
           />,
254 288
         )}
255 289
       </Form.Item>
256
-      <Form.Item label="截止时间">
257
-        {getFieldDecorator('endDate')(
290
+      <Form.Item label="下架时间">
291
+        {getFieldDecorator('endDate',{initialValue : formsdate.endDate ? moment(formsdate.endDate, 'YYYY-MM-DD HH:mm') : null,
292
+          rules: [
293
+            { required: true, message: '请输入下架时间' },
294
+          ]})(
258 295
           <DatePicker
259 296
           // prefix={<Icon type="text" style={{ color: 'rgba(0,0,0,.25)' }} />}
260 297
           // placeholder={formsdate.endDate}
@@ -263,23 +300,38 @@ const header = (props) => {
263 300
         )}
264 301
       </Form.Item>
265 302
       {hiddenStatus && (<Form.Item label="活动链接地址">
266
-        {getFieldDecorator('h5Address')(
303
+        {getFieldDecorator('h5Address',{initialValue : formsDate.h5Address,
304
+          rules: [
305
+            { required: true, message: '请输入H5活动链接地址' },
306
+          ]})(
267 307
           <Input
268 308
             placeholder="请输入H5活动链接地址"
269 309
           />,
270 310
         )}
271 311
       </Form.Item>)}
272 312
       {hiddenStatus && (<Form.Item label="分享设置" help="建议图片尺寸:750*600px,比例5:4,格式:jpg">
273
-          {getFieldDecorator('shareImg')(<ImageUploader />)}
313
+          {getFieldDecorator('shareImg',{initialValue : formsDate.shareImg,
314
+          rules: [
315
+            { required: true, message: '请选择分享图片' },
316
+          ]})(<ImageUploader />)}
274 317
       </Form.Item>)}
275
-      {hiddenStatus && (<Form.Item label="活动分享标题">
276
-        {getFieldDecorator('shareTitle')(
318
+      {hiddenStatus && (<Form.Item label="活动分享语">
319
+        {getFieldDecorator('shareTitle',{initialValue : formsDate.shareTitle,
320
+          rules: [
321
+            { required: true, message: '请输入活动分享语' },
322
+          ]})(
277 323
           <Input
278 324
             placeholder="H5活动分享标题,不超过30字符"
279 325
             maxLength="30"
280 326
           />,
281 327
         )}
282 328
       </Form.Item>)}
329
+      {hiddenStatus && (<Form.Item label="中间页飞机图" help="建议图片尺寸:750*1667px,比例9:20,格式:jpg。图片底部不要放置关键信息。">
330
+          {getFieldDecorator('middleImg',{initialValue : formsDate.middleImg,
331
+          rules: [
332
+            { required: true, message: '请选择中间页飞机图' },
333
+          ]})(<ImageUploader />)}
334
+      </Form.Item>)}
283 335
       <Form.Item {...tailFormItemLayout}>
284 336
         <AuthButton name="admin.taDrainage.id.put" noRight={null}>
285 337
           <Button type="primary" htmlType="submit" className={styles.searchBtn} onClick>
@@ -362,6 +414,12 @@ const header = (props) => {
362 414
     });
363 415
   }
364 416
 
417
+  //打开新页面
418
+  const openIndexImg = () => {
419
+    const newWin=window.open('about:blank');
420
+    newWin.location.href="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3632677651,3179755979&fm=26&gp=0.jpg"
421
+  }
422
+  
365 423
   const { getFieldDecorator } = props.form;
366 424
   const { visible, confirmLoading, ModalText, title } = date;
367 425
   return (
@@ -393,6 +451,14 @@ const header = (props) => {
393 451
               <Option value="0">否</Option>
394 452
             </Select>,
395 453
           )}
454
+        </Form.Item>
455
+        <Form.Item>
456
+          {getFieldDecorator('status')(
457
+            <Select style={{ width: '180px' }} placeholder="上架状态">
458
+              <Option value="1">已上架</Option>
459
+              <Option value="0">已下架</Option>
460
+            </Select>,
461
+          )}
396 462
         </Form.Item>
397 463
           <Form.Item >
398 464
             <Button type="primary" htmlType="submit" className={styles.searchBtn} onClick>
@@ -406,6 +472,7 @@ const header = (props) => {
406 472
         <AuthButton name="admin.taDrainage.add.post" noRight={null}>
407 473
           <Button type="danger" className={styles.addBtn} onClick={showModal}>新增</Button>
408 474
         </AuthButton>
475
+          <span style={{ color: '#66B3FF', cursor: 'pointer', marginLeft: 20 }} onClick={openIndexImg}>什么是H5活动?</span>
409 476
         <Modal
410 477
           title={title}
411 478
 

+ 87
- 0
src/pages/activity/drainage/detailDrainage.jsx Dosyayı Görüntüle

@@ -0,0 +1,87 @@
1
+import React, { useState, useEffect } from 'react';
2
+import { Form, Input, Button, Icon, Select, Tabs, Radio, DatePicker, message, Upload } from 'antd';
3
+import { FormattedMessage } from 'umi-plugin-react/locale';
4
+import apis from '../../../services/apis';
5
+import moment from 'moment';
6
+import router from 'umi/router';
7
+import request from '../../../utils/request'
8
+import AuthButton from '@/components/AuthButton';
9
+
10
+const cancelPage = () => {
11
+  router.go(-1)
12
+}
13
+
14
+const BasicForm = props => {
15
+  const { drainageId } = props.location.query
16
+  const [data, setData] = useState({})
17
+
18
+  useEffect(() => {
19
+    request({...apis.activity.detailDrainage,urlData: { id: drainageId }}).then((data) => {
20
+      setData(data);
21
+    })
22
+  }, [])
23
+
24
+  const Basic = Form.create({ name: 'BasicForm' })(BasicForm);
25
+  const formItemLayout = {
26
+    labelCol: {
27
+      xs: { span: 24 },
28
+      sm: { span: 8 },
29
+    },
30
+    wrapperCol: {
31
+      xs: { span: 24 },
32
+      sm: { span: 16 },
33
+    },
34
+  };
35
+  return (
36
+    <>
37
+      <Form  {...formItemLayout}>
38
+        <Form.Item label="H5活动编号:">
39
+          <span>{data.drainageId}</span>
40
+        </Form.Item>
41
+        <Form.Item label="是否投放小程序:">
42
+        <span>{data.isMiniapp ? "是" : "否"}</span>
43
+        </Form.Item>
44
+        <Form.Item label="H5活动名称:">
45
+        <span>{data.name}</span>
46
+        </Form.Item>
47
+        <Form.Item label="链接地址:">
48
+        <span>{data.h5Address}</span>
49
+        </Form.Item>
50
+        <Form.Item label="上架状态:">
51
+        <span>{data.status === 1 ? "已上架" : "未上架"}</span>
52
+        </Form.Item>
53
+        <Form.Item label="新建时间:">
54
+        <span>{moment(data.createDate).format('YYYY-MM-DD HH:mm:ss')}</span>
55
+        </Form.Item>
56
+        <Form.Item label="自动下架时间:">
57
+        <span>{moment(data.endDate).format('YYYY-MM-DD HH:mm:ss')}</span>
58
+        </Form.Item>
59
+        <Form.Item label="appid:">
60
+        <span>{data.appid}</span>
61
+        </Form.Item>
62
+        <Form.Item label="secret:">
63
+        <span>{data.appSecret}</span>
64
+        </Form.Item>
65
+        <Form.Item label="参与人数:">
66
+        <span>{data.enlistNum}</span>
67
+        </Form.Item>
68
+        {data.isMiniapp && <Form.Item label="分享语:">
69
+        <span>{data.shareTitle}</span>
70
+        </Form.Item>}
71
+        {data.isMiniapp && <Form.Item label="分享图:">
72
+        <img src={data.shareImg} width="75px" height="60px" />
73
+        </Form.Item>}
74
+        {data.isMiniapp && <Form.Item label="中间页飞机图:">
75
+        <img src={data.middleImg} width="75px" height="166.7px" />
76
+        </Form.Item>}
77
+        <Form.Item wrapperCol={{ span: 12, offset: 8 }}>
78
+          <Button onClick={() => cancelPage()}>
79
+            取消
80
+          </Button>
81
+        </Form.Item>
82
+      </Form>
83
+    </>
84
+  );
85
+}
86
+
87
+export default BasicForm

+ 10
- 0
src/services/apis.js Dosyayı Görüntüle

@@ -478,6 +478,11 @@ export default {
478 478
         method: 'GET',
479 479
         action: 'admin.taDrainage.get',
480 480
       },
481
+      detailDrainage: {
482
+        url: `${prefix}/taDrainage/:id`,
483
+        method: 'GET',
484
+        action: 'admin.taDrainage.get',
485
+      },
481 486
       addtaDrainage: {
482 487
         url: `${prefix}/taDrainage/add`,
483 488
         method: 'POST',
@@ -488,6 +493,11 @@ export default {
488 493
         method: 'DELETE',
489 494
         action: 'admin.taDrainage.id.delete',
490 495
       },
496
+      exchangeDrainage: {
497
+        url: `${prefix}/taDrainage/exchange/:id`,
498
+        method: 'PUT',
499
+        action: 'admin.taDrainage.id.put',
500
+      },
491 501
       updatetaDrainage: {
492 502
         url: `${prefix}/taDrainage/:id`,
493 503
         method: 'PUT',