张延森 4 年之前
父節點
當前提交
8520592f09

+ 5
- 0
config/routes.js 查看文件

@@ -214,6 +214,11 @@ export default [
214 214
                 component: './property/lifeConsultant/Score',
215 215
                 hideInMenu: true,
216 216
               },
217
+              {
218
+                path: 'message-event',
219
+                name: '消息推送',
220
+                component: './property/message/event'
221
+              },
217 222
             ]
218 223
           },
219 224
           {

+ 101
- 0
src/pages/property/message/event/Editor.jsx 查看文件

@@ -0,0 +1,101 @@
1
+import React, { useEffect, useState } from 'react'
2
+import { Form, Modal, Button, Input, InputNumber, Select, Radio } from 'antd'
3
+
4
+const formItemLayout = {
5
+  labelCol: {
6
+    xs: { span: 24 },
7
+    sm: { span: 6 },
8
+  },
9
+  wrapperCol: {
10
+    xs: { span: 24 },
11
+    sm: { span: 12 },
12
+  },
13
+}
14
+
15
+const tailFormItemLayout = {
16
+  wrapperCol: {
17
+    xs: {
18
+      span: 24,
19
+      offset: 0,
20
+    },
21
+    sm: {
22
+      span: 16,
23
+      offset: 6,
24
+    },
25
+  },
26
+}
27
+
28
+export default Form.create()(props => {
29
+  const [evtType, setEvtType] = useState()
30
+
31
+  const handleSubmit = e => {
32
+    e.preventDefault()
33
+    props.form.validateFields((err, values) => {
34
+      if (!err) {
35
+        props.onSubmit({
36
+          ...(props.dataSource || {}),
37
+          ...values
38
+        })
39
+      }
40
+    })
41
+  }
42
+
43
+  useEffect(() => {
44
+    if (props.visible) {
45
+      const data = props.dataSource || {}
46
+      props.form.setFieldsValue(data)
47
+      setEvtType(data.evtType)
48
+    }
49
+  }, [props.dataSource, props.visible])
50
+
51
+  return (
52
+    <Modal  footer={null} maskClosable={false} onCancel={props.onCancel} visible={props.visible}>
53
+      <Form onSubmit={handleSubmit} {...formItemLayout}>
54
+        <Form.Item label="类型">
55
+          {
56
+            props.form.getFieldDecorator('evtType', {
57
+              rules: [{required: true, message: '请选择类型'}]
58
+            })(
59
+              <Select onChange={v => setEvtType(v)}>
60
+                <Select.Option value="festival">节日</Select.Option>
61
+                <Select.Option value="birthday">生日</Select.Option>
62
+              </Select>
63
+            )
64
+          }
65
+        </Form.Item>
66
+        <Form.Item label="名称">
67
+          {
68
+            props.form.getFieldDecorator('name', {
69
+              rules: [{required: true, message: '请填写名称'}]
70
+            })(<Input placeholder="请填写名称" />)
71
+          }
72
+        </Form.Item>
73
+        {
74
+          evtType === 'festival' &&
75
+          <Form.Item label="发生日" help="mm-dd格式">
76
+            {
77
+              props.form.getFieldDecorator('evtDate')(<Input placeholder="mm-dd格式" />)
78
+            }
79
+          </Form.Item>
80
+        }
81
+        {
82
+          evtType === 'festival' &&
83
+          <Form.Item label="是否阳历">
84
+            {
85
+              props.form.getFieldDecorator('isSolar')(
86
+                <Radio.Group>
87
+                  <Radio value={true}>阳历</Radio>
88
+                  <Radio value={false}>阴历</Radio>
89
+                </Radio.Group>
90
+              )
91
+            }
92
+          </Form.Item>
93
+        }
94
+        <Form.Item {...tailFormItemLayout}>
95
+          <Button type="primary" htmlType="submit">确定</Button>
96
+          <Button onClick={props.onCancel} style={{ marginLeft: '48px' }}>取消</Button>
97
+        </Form.Item>
98
+      </Form>
99
+    </Modal>
100
+  )
101
+})

+ 175
- 0
src/pages/property/message/event/index.jsx 查看文件

@@ -0,0 +1,175 @@
1
+import React, { useState, useEffect, useRef } from 'react'
2
+import { Select, Spin, Table, Button, Form, Input, Divider, Tag, Modal,Popconfirm } from 'antd'
3
+import NavLink from 'umi/navlink'
4
+import { fetch, apis, fetchList } from '@/utils/request'
5
+import Search from '../../components/Search'
6
+import List from '../../components/List'
7
+import Editor from './Editor'
8
+
9
+const listMessageEvent = fetchList(apis.announcement.messageEvent.list)
10
+const saveMessageEvent = fetch(apis.announcement.messageEvent.save)
11
+const updateMessageEvent = fetch(apis.announcement.messageEvent.update)
12
+const deleteMessageEvent = fetch(apis.announcement.messageEvent.delete)
13
+
14
+const StatusDict = {
15
+  '0': '未发布',
16
+  '1': '已发布',
17
+}
18
+
19
+const EvtTypeDict = {
20
+  'birthday': '生日',
21
+  'festival': '节日',
22
+}
23
+
24
+const Condition = props => {
25
+  return (
26
+    <Search
27
+      onSearch={props.onSearch}
28
+      onReset={props.onReset}
29
+      render={form => {
30
+        const { getFieldDecorator } = form
31
+        
32
+        return (
33
+          <>
34
+            <Form.Item label="名称">
35
+            {
36
+              getFieldDecorator('name')(<Input placeholder="名称" />)
37
+            }
38
+            </Form.Item>
39
+            <Form.Item label="公告类型">
40
+            {
41
+              getFieldDecorator('evtType')(
42
+                <Select style={{minWidth: '120px'}} allowClear>
43
+                  {
44
+                    Object.entries(EvtTypeDict).map(pair => {
45
+                      const [key, val] = pair
46
+                      return <Select.Option key={key} value={key}>{val}</Select.Option>
47
+                    })
48
+                  }
49
+                </Select>
50
+              )
51
+            }
52
+            </Form.Item>
53
+          </>
54
+        )
55
+      }}
56
+    />
57
+  )
58
+}
59
+
60
+export default props => {
61
+  const [loading, setLoading] = useState(false)
62
+  const [listData, setListData] = useState([])
63
+  const [pagination, setPagination] = useState({})
64
+  const [queryParams, setQueryParams] = useState({ pageNum: 1, pageSize: 10 })
65
+  const [showEditor, setShowEditor] = useState(false)
66
+
67
+  const handleSearch = vals => {
68
+    setQueryParams({
69
+      ...queryParams,
70
+      ...vals,
71
+      pageNum: 1,
72
+    })
73
+  }
74
+
75
+  const handleSubmit = data => {
76
+    saveMessageEvent({data}).then(res => {
77
+      Modal.success({
78
+        content: '新增内容成功',
79
+        onOk: () => {
80
+          // 触发数据刷新
81
+          setQueryParams({...queryParams})
82
+          setShowEditor(false)
83
+        }
84
+      })
85
+    })
86
+  }
87
+
88
+  const handleEdit = row => {
89
+    const status = Math.abs(row.status - 1)
90
+    const data = {...row, status}
91
+    updateMessageEvent({data, urlData: {id: row.evtId}}).then(res => {
92
+      Modal.success({
93
+        content: '删除内容成功',
94
+        onOk: () => {
95
+          // 触发数据刷新
96
+          setQueryParams({...queryParams})
97
+        }
98
+      })
99
+    })
100
+  }
101
+
102
+  const handleDeleteRow = row => {
103
+    deleteAnnouncement({urlData: {id: row.evtId}}).then(res => {
104
+      Modal.success({
105
+        content: '删除内容成功',
106
+        onOk: () => {
107
+          // 触发数据刷新
108
+          setQueryParams({...queryParams})
109
+        }
110
+      })
111
+    })
112
+  }
113
+
114
+  const handlePageChange = (pageNum, pageSize) => {
115
+    setQueryParams({
116
+      ...queryParams,      
117
+      pageNum,
118
+      pageSize,
119
+    })
120
+  }
121
+
122
+  useEffect(() => {
123
+    setLoading(true)
124
+    listMessageEvent({ data: queryParams }).then(res => {
125
+      const [list, pageInfo] = res || {}
126
+      setListData(list)
127
+      setPagination(pageInfo)
128
+      setLoading(false)
129
+    }).catch(() => setLoading(false))
130
+  }, [queryParams])
131
+
132
+  return (
133
+    <div>
134
+      <Condition onSearch={handleSearch} onReset={handleSearch} />
135
+      <div style={{ margin: '24px 0' }}>
136
+        <Button type="primary" onClick={() => setShowEditor(true)}>添加</Button>
137
+      </div>
138
+      <List dataSource={listData} loading={loading} pagination={pagination} onPageChange={handlePageChange} rowKey="evtId">
139
+        <Table.Column title="类型" dataIndex="evtType" key="evtType" render={t => EvtTypeDict[t] || ''} />
140
+        <Table.Column title="名称" dataIndex="name" key="name" />
141
+        <Table.Column title="发生日" dataIndex="evtDate" key="evtDate" render={(_, row) => {
142
+          return row.evtDate && (
143
+            <span>
144
+              <Tag color={!row.isSolar ? '#87d068' : '#108ee9'}>{!row.isSolar ? '阴历' : '阳历'}</Tag>
145
+              <span>{row.evtDate}</span>
146
+            </span>
147
+          )
148
+        }} />
149
+        <Table.Column title="状态" dataIndex="status" key="status" render={t => StatusDict[t] || ''} />
150
+        <Table.Column title="创建时间" dataIndex="createDate" key="createDate" />
151
+        <Table.Column
152
+          title="操作"
153
+          key="action"
154
+          render={(_, row) => {
155
+            return (
156
+              <>
157
+                <Popconfirm
158
+                  title="确认进行作废操作?"
159
+                  onConfirm={() => handleDeleteRow(row)}
160
+                  okText="作废"
161
+                  cancelText="取消"
162
+                >
163
+                  <Button type="link">删除</Button>
164
+                </Popconfirm>
165
+                <Divider type="vertical" />
166
+                <Button type="link" onClick={() => handleEdit(row)}>{row.status === 1 ? '取消发布' : '发布'}</Button>
167
+              </>
168
+            )
169
+          }}
170
+        />
171
+      </List>
172
+      <Editor visible={showEditor} onCancel={() => setShowEditor(false)} onSubmit={handleSubmit} />
173
+    </div>
174
+  )
175
+}

+ 28
- 0
src/services/announcement_api.js 查看文件

@@ -62,5 +62,33 @@ export default prefix => {
62 62
       action: 'admin.announcement-tel.delete'
63 63
     },
64 64
 
65
+    messageEvent: {
66
+      list: {
67
+        url: `${prefix}/tpMessageEvent`,
68
+        method: 'get',
69
+        action: 'admin.tpMessageEvent.url'
70
+      },
71
+      save: {
72
+        url: `${prefix}/tpMessageEvent`,
73
+        method: 'post',
74
+        action: 'admin.tpMessageEvent.post'
75
+      },
76
+      update: {
77
+        url: `${prefix}/tpMessageEvent/:id`,
78
+        method: 'put',
79
+        action: 'admin.tpMessageEvent.put'
80
+      },
81
+      delete: {
82
+        url: `${prefix}/tpMessageEvent/:id`,
83
+        method: 'delete',
84
+        action: 'admin.tpMessageEvent.delete'
85
+      },
86
+      get: {
87
+        url: `${prefix}/tpMessageEvent/:id`,
88
+        method: 'get',
89
+        action: 'admin.tpMessageEvent.get'
90
+      },
91
+    }
92
+
65 93
   }
66 94
 }

+ 1
- 1
src/services/prop_news_api.js 查看文件

@@ -33,7 +33,7 @@ export default prefix => {
33 33
 
34 34
     // 删除
35 35
     deleteNews: {
36
-      url: `${prefix}/${moduleName}/id`,
36
+      url: `${prefix}/${moduleName}/:id`,
37 37
       method: 'delete',
38 38
       action: `admin.${moduleName}.delete`
39 39
     },