jazz
2022-03-04 5dfa4aae98c53f1f3d5f8b9fa5308f359bfea104
提交 | 用户 | age
5dfa4a 1 <template>
J 2   <div class="app-container">
3     <!-- 返回按钮和标题 -->
4     <!-- <el-page-header class="mb20" content="xx" @back="$router.go(-1)" /> -->
5
6     <!-- 搜索区 ↓↓↓↓↓↓↓↓↓↓ -->
7     <el-form v-show="showSearch" ref="searchForm" :inline="true">
8       <el-form-item label="批次名称">
9         <el-input
10           v-model="batchName"
11           placeholder="搜索批次名称"
12           clearable
13           size="small"
14           style="width: 240px"
15           maxlength="50"
16           @keyup.enter.native="reGetList"
17         />
18       </el-form-item>
19       <el-form-item label="批次编号">
20         <el-input
21           v-model="batchCode"
22           placeholder="搜索批次编号"
23           clearable
24           size="small"
25           style="width: 240px"
26           maxlength="50"
27           @keyup.enter.native="reGetList"
28         />
29       </el-form-item>
30       <el-form-item>
31         <el-button type="cyan" icon="el-icon-search" size="mini" @click="reGetList">搜索</el-button>
32         <el-button icon="el-icon-refresh" size="mini" @click="resetHandle">重置</el-button>
33       </el-form-item>
34     </el-form>
35     <!-- 搜索区 ↑↑↑↑↑↑↑↑↑↑ -->
36
37     <!-- 操作区 ↓↓↓↓↓↓↓↓↓↓ -->
38     <el-row :gutter="10" class="mb8">
39       <el-col :span="1.5">
40         <!-- 权限判断 v-if="getAuthValueFN('xxx_add')" -->
41         <el-button
42           type="primary"
43           icon="el-icon-plus"
44           size="mini"
45           @click="showAddDialog"
46         >临时发送</el-button>
47       </el-col>
48       <right-toolbar :show-search.sync="showSearch" @queryTable="getList" />
49     </el-row>
50     <!-- 操作区 ↑↑↑↑↑↑↑↑↑↑ -->
51
52     <!--
53       table参数设置:
54       stripe 是否为斑马纹
55       border 是否带有纵向边框
56       max-height 最大高度
57     -->
58     <el-table :data="list" stripe>
59       <el-table-column type="index" label="序号" align="center" width="60" />
60       <el-table-column label="创建时间" prop="createTime" align="center" min-width="160" />
61       <el-table-column label="批次名称" prop="batchName" align="center" />
62       <el-table-column label="批次编号" prop="batchCode" align="center" />
63       <el-table-column label="期望发送时间" prop="timingTime" align="center" min-width="160" />
64       <el-table-column label="发送短信时间" prop="executionTime" align="center" min-width="160" />
65       <el-table-column label="发送成功总数" prop="sendSuccess" align="center" />
66       <el-table-column label="发送失败总数" prop="sendFail" align="center" />
67       <el-table-column label="发送总数" prop="sendTotal" align="center" />
68       <el-table-column label="状态" prop="status" align="center">
69         <template slot-scope="scope">
70           <span v-if="scope.row.isUp == 0">待执行</span>
71           <span v-if="scope.row.isUp == 1">执行中</span>
72           <span v-if="scope.row.isUp == 2">完成</span>
73           <span v-if="scope.row.isUp == 3">取消</span>
74           <span v-if="scope.row.isUp == 4">失败</span>
75         </template>
76       </el-table-column>
77       <el-table-column label="短信模内容" prop="smsTemplate" align="center" min-width="160">
78         <template slot-scope="scope">
79           <el-popover
80             placement="top-start"
81             width="400"
82             popper-class="el-popover_tableFilter"
83             trigger="hover"
84             :popper-options="{ removeOnDestroy: true }"
85           >
86             <div style="max-height: 500px;overflow-y: auto;">{{ scope.row.smsTemplate }}</div>
87             <div slot="reference" class="line-clamp-2" style="line-height: 1.2">{{ scope.row.smsTemplate }}</div>
88           </el-popover>
89         </template>
90       </el-table-column>
91       <!-- <el-table-column label="是否上架" prop="isUp" align="center" min-width="100">
92         <template slot-scope="scope">
93           <el-switch
94             v-model="scope.row.isUp"
95             :active-value="1"
96             :inactive-value="0"
97             @change="handleUpChange(scope.row)"
98           />
99         </template>
100       </el-table-column> -->
101       <!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120">
102         <template slot-scope="scope">
103           <el-button
104             size="mini"
105             type="text"
106             icon="el-icon-edit"
107             @click="showEditDialog(scope.row)"
108           >编辑</el-button>
109           <el-button
110             size="mini"
111             type="text warn"
112             icon="el-icon-delete"
113             @click="handleDelete(scope.row)"
114           >删除</el-button>
115         </template>
116       </el-table-column> -->
117     </el-table>
118
119     <!-- 新增&编辑 -->
120     <el-dialog v-el-drag-dialog :title="'临时发送短信'" width="800px" :visible.sync="dialogVisible" append-to-body :before-close="hideDialog" :close-on-click-modal="false">
121       <el-form ref="refDialog" :model="dialogData" label-width="110px" :rules="rules" size="small">
122         <el-form-item label="批次名称" prop="batchName">
123           <el-input v-model="dialogData.batchName" placeholder="请输入批次名称" maxlength="255" />
124         </el-form-item>
125         <el-form-item label="批次编号" prop="batchCode">
126           <el-input v-model="dialogData.batchCode" placeholder="请输入批次编号" maxlength="255" />
127         </el-form-item>
128         <el-form-item label="上传文件" prop="uploadFiles">
129           <div class="upload_single_file">
130             <!-- 上传文件组件(单) -->
131             <el-upload
132               ref="refUploadFile"
133               :auto-upload="false"
134               action="#"
135               :limit="1"
136               :file-list="uploadFiles"
137               :on-change="addUploadFile"
138               :on-remove="delUploadFile"
139               :http-request="uploadFileReq"
140               :before-upload="beforeUploadFile"
141               size="mini"
142             >
143               <el-button style="display: block" :disabled="uploadFiles&&uploadFiles.length>0" class="mb8" type="primary" size="small" icon="el-icon-plus">上传文件</el-button>
144             </el-upload>
145           </div>
146         </el-form-item>
147         <el-form-item label="短信模内容" prop="smsTemplate">
148           <el-input v-model="dialogData.smsTemplate" type="textarea" placeholder="请输入短信模版内容" maxlength="500" rows="5" />
149         </el-form-item>
150         <!-- <el-form-item label="短信模内容" prop="smsTemplate">
151           <WangEnduit :catchdata="catchData" :content="dialogData.smsTemplate" :rangenum="rangenum" />
152         </el-form-item> -->
153       </el-form>
154       <div slot="footer" class="dialog-footer">
155         <el-button @click="hideDialog">取消</el-button>
156         <el-button type="primary" @click="submitHandle">确定</el-button>
157       </div>
158     </el-dialog>
159
160     <pagination
161       v-show="total>0"
162       :total="total"
163       :page.sync="pageNum"
164       :limit.sync="pageSize"
165       @pagination="getList"
166     />
167
168     <back-to-top :visibility-height="300" :back-position="50" transition-name="fade" />
169   </div>
170 </template>
171
172 <script>
173 import BackToTop from '@/components/BackToTop'
174 // import WangEnduit from '@/components/WangEnduit' // 富文本
175 export default {
176   name: 'Index',
177   components: {
178     BackToTop
179     // WangEnduit
180   },
181   data() {
182     return {
183       showSearch: true, // 是否显示搜索区
184       // keyWord: '', // 搜索区字段,可自行扩展其余字段
185       batchName: '',
186       batchCode: '',
187
188       objectName: '短信', // 对象名称,用于删除提示、启用提示、弹窗标题等
189
190       // 数据列表
191       list: [],
192       userList: [], // 用户列表
193
194       uploadFiles: [], // 上传文件
195
196       // 弹窗数据
197       dialogVisible: false,
198       dialogData: {},
199
200       // 富文本编辑器
201       // rangenum: null,
202
203       // 分页 ↓↓↓↓↓↓↓↓↓↓
204       total: 0,
205       pageNum: 1,
206       pageSize: 20,
207       // 分页 ↑↑↑↑↑↑↑↑↑↑
208
209       // 表单校验
210       rules: {
211         batchName: [
212           { required: true, message: '批次名称不能为空', trigger: 'change' }
213         ],
214         batchCode: [
215           { required: true, message: '批次编号不能为空', trigger: 'change' }
216         ],
217         smsTemplate: [
218           { required: true, message: '短信模内容不能为空', trigger: 'change' }
219         ]
220         // isUp: [
221         //   { required: true, message: '是否上架不能为空', trigger: 'change' }
222         // ]
223       }
224     }
225   },
226   mounted() {
227     this.init()
228   },
229   methods: {
230     // 初始化
231     init() {
232       this.getList()
233     },
234
235     // ========== 富文本相关
236     // 富文本编辑器的内容赋值
237     // catchData(content) {
238     //   if (content === '<p><br></p>') content = ''
239     //   try {
240     //     const currentRange = window.getSelection().getRangeAt(0)
241     //     this.rangenum = currentRange
242     //   } catch (e) {
243     //     console.log(e)
244     //   }
245     //   this.$set(this.dialogData, 'smsTemplate', content)
246     //   this.$refs['refDialog'].validateField('smsTemplate')
247     // },
248     // ========== 富文本相关
249
250     // 获取列表
251     getList() {
252       var { pageNum, pageSize, batchName, batchCode } = this
253       this.postFN({
254         url: 'send-general/list',
255         header: { 'Content-Type': 'application/json;charset=UTF-8' },
256         params: {
257           pageNum: pageNum,
258           pageSize: pageSize,
259
260           batchName: batchName,
261           batchCode: batchCode
262         },
263         mockData: {
264           code: 100,
265           msg: '',
266           data: {
267             list: [{
268               id: 'xxx',
269               index: 1,
270               name: '超级管理员',
271               createTime: '2020-08-09 10:10:10'
272             }],
273             total: 100
274           }
275         }
276       }, (inf) => {
277         this.list = inf.list || []
278         this.userList = inf.userList || []
279         this.total = inf.total
280       })
281     },
282     // 重新获取列表
283     reGetList() {
284       this.pageNum = 1
285       this.getList()
286     },
287     // 重置
288     resetHandle() {
289       this.batchCode = ''
290       this.batchName = ''
291       this.reGetList()
292     },
293     // 删除
294     handleDelete(item) {
295       // 打开二次确认弹窗
296       this.$confirm('是否确认删除该' + this.objectName + '?', '提示', {
297         confirmButtonText: '确定',
298         cancelButtonText: '取消',
299         type: 'warning'
300       }).then(() => {
301         // 确定回调
302         // TODO url
303         this.postFN({
304           url: 'xxx',
305           params: {
306             id: item.id
307           },
308           mockData: {
309             code: 100,
310             msg: '',
311             data: {}
312           }
313         }, () => {
314           this.getList()
315           this.$messageSuc('删除成功')
316         })
317       }).catch(() => {})
318     },
319     // 修改是否上架
320     handleUpChange(item) {
321       const text = item.isUp === 1 ? '上架' : '下架'
322       this.$confirm('确认要' + text + '该' + this.objectName + '吗?', '提示', {
323         confirmButtonText: '确定',
324         cancelButtonText: '取消',
325         type: 'warning'
326       }).then(() => {
327         // TODO url
328         this.postFN({
329           url: 'xxx',
330           params: {
331             id: item.id,
332             isUp: item.isUp
333           },
334           mockData: {
335             code: 100,
336             msg: '',
337             data: {}
338           }
339         }, () => {
340           this.$messageSuc(text + '成功')
341         }, (res) => {
342           item.isUp = item.isUp === 1 ? 0 : 1
343           this.$messageError(res.msg)
344         })
345       }).catch(() => {
346         item.isUp = item.isUp === 1 ? 0 : 1
347       })
348     },
349
350     // 打开新增弹窗
351     showAddDialog() {
352       var dialogData = {
353         batchCode: '',
354         batchName: '',
355         smsTemplate: ''
356       }
357       this.uploadFiles = []
358       this.dialogVisible = true
359       this.$nextTick(() => {
360         this.dialogData = dialogData
361         this.$refs['refDialog'].resetFields()
362       })
363     },
364     // 打开编辑弹框
365     showEditDialog(item) {
366       var dialogData = {
367         type: 'edit',
368         ...item
369       }
370       console.log('dialogData', dialogData)
371       this.dialogVisible = true
372       this.$nextTick(() => {
373         this.dialogData = dialogData
374         this.$refs['refDialog'].resetFields()
375       })
376     },
377     // 关闭编辑弹窗
378     hideDialog() {
379       this.dialogData = {
380
381       }
382       this.dialogVisible = false
383       // 清空富文本
384       // this.rangenum = null
385     },
386     // 提交新增&编辑
387     submitHandle() {
388       this.$refs['refDialog'].validate(valid => {
389         if (valid) {
390           this.uploadFileReq()
391           // this.submitReq()
392         }
393       })
394     },
395     // 提交接口
396     submitReq() {
397       var { dialogData } = this
398       var params = {
399         name: dialogData.name,
400         isUp: dialogData.isUp
401         // TODO 参数
402       }
403
404       if (dialogData.password) params.password = dialogData.password
405
406       var isAdd = dialogData.type === 'add'
407       // TODO url
408       var url = isAdd ? 'xxx/add' : 'xxx/edit'
409
410       !isAdd && (params.id = dialogData.id)
411
412       this.postFN({
413         url: url,
414         params: params,
415         mockData: {
416           code: 100,
417           msg: '',
418           data: {}
419         }
420       }, () => {
421         this.$messageSuc('保存成功')
422         this.hideDialog()
423         isAdd ? this.reGetList() : this.getList()
424       })
425     },
426     // 上传文件 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
427     // 上传前确认格式
428     beforeUploadFile(file) {
429       const isTooLarge = file.size / 1024 / 1024 > 50
430       let flag = true
431       if (isTooLarge) {
432         this.$message.error('请勿上传大于50MB的文件')
433         flag = false
434       }
435       return flag
436     },
437     // 增加文件
438     addUploadFile(file, fileList) {
439       this.uploadFiles = fileList
440     },
441     // 删除文件
442     delUploadFile(file, fileList) {
443       this.uploadFiles = fileList
444     },
445     // 执行上传商品图
446     runUploadFile(suc_cb) {
447       if (this.checkNeedUpload(this.uploadFiles)) {
448         this.callback = suc_cb
449         this.$refs.refUploadFile.submit()
450       } else {
451         suc_cb && suc_cb()
452       }
453     },
454     // 上传文件
455     uploadFileReq() {
456       var { dialogData, uploadFiles } = this
457       var file
458       uploadFiles[0] && (file = uploadFiles[0].raw)
459       const formData = new FormData()
460       for (const key in dialogData) {
461         formData.append(key, dialogData[key])
462       }
463       formData.append('file', file)
464       if (!file) {
465         this.$message.error('请上传文件')
466         return
467       }
468       console.log('/*******************提交数据formData/', dialogData, file)
469       this.postFN({
470         url: 'send-general/temporary-send',
471         header: { 'Content-Type': 'multipart/form-data' },
472         params: formData,
473         mockData: {
474           code: 100,
475           msg: '',
476           data: {
477             imgUrl: '上传文件成功'
478           }
479         }
480       }, (inf) => {
481         console.log('上传文件成功且结束', inf)
482
483         this.reGetList()
484
485         this.hideDialog()
486
487         // 提交
488         // this.$set(this.dialogData, 'imgUrl', inf.imgUrl)
489         // this.callback && this.callback(inf.imgUrl)
490       })
491     },
492     // 获取文件后缀名
493     extname(filename) {
494       if (!filename || typeof filename !== 'string') {
495         return ''
496       }
497       const a = filename.split('').reverse().join('')
498       const b = a.substring(0, a.search(/\./)).split('').reverse().join('')
499       return b
500     }
501     // 上传文件 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
502   }
503 }
504 </script>
505
506 <style lang="scss" scoped>
507 .upload_single_file .el-upload-list__item-name{
508   padding: 5px!important;
509 }
510 </style>