Commit 858b4e81a5298a00d10c648891b81f1149b65818
1 parent
7ba6a2e3
mp:优化前端消息发送的缓存逻辑
Showing
4 changed files
with
59 additions
and
36 deletions
yudao-module-mp/yudao-module-mp-api/src/main/java/cn/iocoder/yudao/module/mp/enums/ErrorCodeConstants.java
| @@ -34,6 +34,9 @@ public interface ErrorCodeConstants { | @@ -34,6 +34,9 @@ public interface ErrorCodeConstants { | ||
| 34 | // ========== 公众号素材 1006004000============ | 34 | // ========== 公众号素材 1006004000============ |
| 35 | ErrorCode MATERIAL_UPLOAD_FAIL = new ErrorCode(1006004000, "上传素材失败,原因:{}"); | 35 | ErrorCode MATERIAL_UPLOAD_FAIL = new ErrorCode(1006004000, "上传素材失败,原因:{}"); |
| 36 | 36 | ||
| 37 | + // ========== 公众号素材 1006005000============ | ||
| 38 | + ErrorCode MESSAGE_SEND_FAIL = new ErrorCode(1006005000, "发送消息失败,原因:{}"); | ||
| 39 | + | ||
| 37 | // TODO 要处理下 | 40 | // TODO 要处理下 |
| 38 | ErrorCode MENU_NOT_EXISTS = new ErrorCode(1006001002, "菜单不存在"); | 41 | ErrorCode MENU_NOT_EXISTS = new ErrorCode(1006001002, "菜单不存在"); |
| 39 | 42 |
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/message/MpMessageServiceImpl.java
| @@ -31,6 +31,9 @@ import org.springframework.validation.annotation.Validated; | @@ -31,6 +31,9 @@ import org.springframework.validation.annotation.Validated; | ||
| 31 | import javax.annotation.Resource; | 31 | import javax.annotation.Resource; |
| 32 | import javax.validation.Validator; | 32 | import javax.validation.Validator; |
| 33 | 33 | ||
| 34 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 35 | +import static cn.iocoder.yudao.module.mp.enums.ErrorCodeConstants.MESSAGE_SEND_FAIL; | ||
| 36 | + | ||
| 34 | /** | 37 | /** |
| 35 | * 粉丝消息表 Service 实现类 | 38 | * 粉丝消息表 Service 实现类 |
| 36 | * | 39 | * |
| @@ -115,7 +118,7 @@ public class MpMessageServiceImpl implements MpMessageService { | @@ -115,7 +118,7 @@ public class MpMessageServiceImpl implements MpMessageService { | ||
| 115 | try { | 118 | try { |
| 116 | mpService.getKefuService().sendKefuMessageWithResponse(wxMessage); | 119 | mpService.getKefuService().sendKefuMessageWithResponse(wxMessage); |
| 117 | } catch (WxErrorException e) { | 120 | } catch (WxErrorException e) { |
| 118 | - throw new RuntimeException(e); | 121 | + throw exception(MESSAGE_SEND_FAIL, e.getError().getErrorMsg()); |
| 119 | } | 122 | } |
| 120 | 123 | ||
| 121 | // 记录消息 | 124 | // 记录消息 |
yudao-ui-admin/src/views/mp/components/wx-msg/main.vue
| @@ -177,10 +177,6 @@ import { getUser } from "@/api/mp/user"; | @@ -177,10 +177,6 @@ import { getUser } from "@/api/mp/user"; | ||
| 177 | this.scrollToBottom() | 177 | this.scrollToBottom() |
| 178 | // 重置 objData 状态 | 178 | // 重置 objData 状态 |
| 179 | this.$refs['replySelect'].deleteObj(); // 重置,避免 tab 的数据未清理 | 179 | this.$refs['replySelect'].deleteObj(); // 重置,避免 tab 的数据未清理 |
| 180 | - this.objData = { | ||
| 181 | - type: 'text', | ||
| 182 | - content: '', | ||
| 183 | - } | ||
| 184 | }).catch(() => { | 180 | }).catch(() => { |
| 185 | this.sendLoading = false | 181 | this.sendLoading = false |
| 186 | }) | 182 | }) |
yudao-ui-admin/src/views/mp/components/wx-reply/main.vue
| @@ -85,9 +85,9 @@ | @@ -85,9 +85,9 @@ | ||
| 85 | <el-tab-pane name="video"> | 85 | <el-tab-pane name="video"> |
| 86 | <span slot="label"><i class="el-icon-share"></i> 视频</span> | 86 | <span slot="label"><i class="el-icon-share"></i> 视频</span> |
| 87 | <el-row> | 87 | <el-row> |
| 88 | - <el-input v-model="objData.title" placeholder="请输入标题"></el-input> | 88 | + <el-input v-model="objData.title" placeholder="请输入标题" @input="inputContent" /> |
| 89 | <div style="margin: 20px 0;"></div> | 89 | <div style="margin: 20px 0;"></div> |
| 90 | - <el-input v-model="objData.description" placeholder="请输入描述"></el-input> | 90 | + <el-input v-model="objData.description" placeholder="请输入描述" @input="inputContent" /> |
| 91 | <div style="margin: 20px 0;"></div> | 91 | <div style="margin: 20px 0;"></div> |
| 92 | <div style="text-align: center;"> | 92 | <div style="text-align: center;"> |
| 93 | <wx-video-player v-if="objData.url" :url="objData.url" /> | 93 | <wx-video-player v-if="objData.url" :url="objData.url" /> |
| @@ -149,9 +149,9 @@ | @@ -149,9 +149,9 @@ | ||
| 149 | </el-col> | 149 | </el-col> |
| 150 | </el-row> | 150 | </el-row> |
| 151 | <div style="margin: 20px 0;"></div> | 151 | <div style="margin: 20px 0;"></div> |
| 152 | - <el-input v-model="objData.musicUrl" placeholder="请输入音乐链接"></el-input> | 152 | + <el-input v-model="objData.musicUrl" placeholder="请输入音乐链接" @input="inputContent" /> |
| 153 | <div style="margin: 20px 0;"></div> | 153 | <div style="margin: 20px 0;"></div> |
| 154 | - <el-input v-model="objData.hqMusicUrl" placeholder="请输入高质量音乐链接"></el-input> | 154 | + <el-input v-model="objData.hqMusicUrl" placeholder="请输入高质量音乐链接" @input="inputContent" /> |
| 155 | </el-tab-pane> | 155 | </el-tab-pane> |
| 156 | </el-tabs> | 156 | </el-tabs> |
| 157 | </template> | 157 | </template> |
| @@ -309,27 +309,20 @@ | @@ -309,27 +309,20 @@ | ||
| 309 | 309 | ||
| 310 | // 从 tempObj 临时缓存中,获取对应的数据,并设置回 objData | 310 | // 从 tempObj 临时缓存中,获取对应的数据,并设置回 objData |
| 311 | let tempObjItem = this.tempObj.get(this.objData.type) | 311 | let tempObjItem = this.tempObj.get(this.objData.type) |
| 312 | - // console.log(this.objData.type) | ||
| 313 | - // console.log(tempObjItem) | ||
| 314 | - // console.log(this.objData) | ||
| 315 | - // console.log(this.tempObj) | ||
| 316 | if (tempObjItem) { | 312 | if (tempObjItem) { |
| 317 | - console.log(this.tempObj) | ||
| 318 | this.objData.content = tempObjItem.content ? tempObjItem.content : null | 313 | this.objData.content = tempObjItem.content ? tempObjItem.content : null |
| 319 | this.objData.mediaId = tempObjItem.mediaId ? tempObjItem.mediaId : null | 314 | this.objData.mediaId = tempObjItem.mediaId ? tempObjItem.mediaId : null |
| 320 | this.objData.url = tempObjItem.url ? tempObjItem.url : null | 315 | this.objData.url = tempObjItem.url ? tempObjItem.url : null |
| 321 | this.objData.name = tempObjItem.url ? tempObjItem.name : null | 316 | this.objData.name = tempObjItem.url ? tempObjItem.name : null |
| 322 | - | ||
| 323 | - // TODO 芋艿:临时注释掉,看看有没用 | ||
| 324 | - // this.objData.repDesc = tempObjItem.repDesc ? tempObjItem.repDesc : null | 317 | + this.objData.title = tempObjItem.title ? tempObjItem.title : null |
| 318 | + this.objData.description = tempObjItem.description ? tempObjItem.description : null | ||
| 325 | return; | 319 | return; |
| 326 | } | 320 | } |
| 327 | // 如果获取不到,需要把 objData 复原 | 321 | // 如果获取不到,需要把 objData 复原 |
| 328 | - this.objData.content = undefined; | ||
| 329 | - this.objData.mediaId = undefined; | ||
| 330 | - this.objData.url = undefined; | ||
| 331 | - this.objData.name = undefined; | ||
| 332 | - // this.$delete(this.objData,'repDesc') | 322 | + // 必须使用 $set 赋值,不然 input 无法输入内容 |
| 323 | + this.$set(this.objData, 'content', ''); | ||
| 324 | + this.$set(this.objData, 'title', ''); | ||
| 325 | + this.$set(this.objData, 'description', ''); | ||
| 333 | }, | 326 | }, |
| 334 | /** | 327 | /** |
| 335 | * 选择素材,将设置设置到 objData 变量 | 328 | * 选择素材,将设置设置到 objData 变量 |
| @@ -348,11 +341,11 @@ | @@ -348,11 +341,11 @@ | ||
| 348 | this.objData.thumbMediaId = item.mediaId | 341 | this.objData.thumbMediaId = item.mediaId |
| 349 | tempObjItem.thumbMediaUrl = item.url | 342 | tempObjItem.thumbMediaUrl = item.url |
| 350 | this.objData.thumbMediaUrl = item.url | 343 | this.objData.thumbMediaUrl = item.url |
| 351 | - // title、introduction、musicUrl、hqMusicUrl | ||
| 352 | - tempObjItem.title = this.objData.title | ||
| 353 | - tempObjItem.introduction = this.objData.introduction | ||
| 354 | - tempObjItem.musicUrl = this.objData.musicUrl | ||
| 355 | - tempObjItem.hqMusicUrl = this.objData.hqMusicUrl | 344 | + // title、introduction、musicUrl、hqMusicUrl:从 objData 到 tempObjItem,避免上传素材后,被覆盖掉 |
| 345 | + tempObjItem.title = this.objData.title || '' | ||
| 346 | + tempObjItem.introduction = this.objData.introduction || '' | ||
| 347 | + tempObjItem.musicUrl = this.objData.musicUrl || '' | ||
| 348 | + tempObjItem.hqMusicUrl = this.objData.hqMusicUrl || '' | ||
| 356 | } else if (this.objData.type === 'image' | 349 | } else if (this.objData.type === 'image' |
| 357 | || this.objData.type === 'voice') { | 350 | || this.objData.type === 'voice') { |
| 358 | tempObjItem.mediaId = item.mediaId | 351 | tempObjItem.mediaId = item.mediaId |
| @@ -368,11 +361,13 @@ | @@ -368,11 +361,13 @@ | ||
| 368 | this.objData.url = item.url; | 361 | this.objData.url = item.url; |
| 369 | tempObjItem.name = item.name | 362 | tempObjItem.name = item.name |
| 370 | this.objData.name = item.name | 363 | this.objData.name = item.name |
| 371 | - // title、introduction | ||
| 372 | - this.objData.title = item.title | ||
| 373 | - tempObjItem.title = this.objData.title | ||
| 374 | - this.objData.description = item.introduction // 消息使用的是 description,素材使用的是 introduction,所以转换下 | ||
| 375 | - tempObjItem.description = this.objData.introduction | 364 | + // title、introduction:从 item 到 tempObjItem,因为素材里有 title、introduction |
| 365 | + this.objData.title = item.title || '' | ||
| 366 | + tempObjItem.title = item.title || '' | ||
| 367 | + this.objData.description = item.introduction || '' // 消息使用的是 description,素材使用的是 introduction,所以转换下 | ||
| 368 | + tempObjItem.description = item.introduction || '' | ||
| 369 | + } else if (this.objData.type === 'text') { | ||
| 370 | + this.objData.content = item.content || '' | ||
| 376 | } | 371 | } |
| 377 | // 最终设置到临时缓存 | 372 | // 最终设置到临时缓存 |
| 378 | this.tempObj.set(this.objData.type, tempObjItem) | 373 | this.tempObj.set(this.objData.type, tempObjItem) |
| @@ -398,8 +393,34 @@ | @@ -398,8 +393,34 @@ | ||
| 398 | this.dialogThumbVisible = false | 393 | this.dialogThumbVisible = false |
| 399 | }, | 394 | }, |
| 400 | deleteObj() { | 395 | deleteObj() { |
| 401 | - // this.$delete(this.objData, 'url'); TODO 芋艿:重新实现清空;还有 reset | ||
| 402 | - this.selectMaterial({}) // 选择一个空的素材 | 396 | + if (this.objData.type === 'news') { |
| 397 | + this.objData.articles = [] | ||
| 398 | + } else if(this.objData.type === 'image') { | ||
| 399 | + this.objData.mediaId = null | ||
| 400 | + this.objData.url = null | ||
| 401 | + this.objData.name = null | ||
| 402 | + } else if(this.objData.type === 'voice') { | ||
| 403 | + this.objData.mediaId = null | ||
| 404 | + this.objData.url = null | ||
| 405 | + this.objData.name = null | ||
| 406 | + } else if(this.objData.type === 'video') { | ||
| 407 | + this.objData.mediaId = null | ||
| 408 | + this.objData.url = null | ||
| 409 | + this.objData.name = null | ||
| 410 | + this.objData.title = null | ||
| 411 | + this.objData.description = null | ||
| 412 | + } else if(this.objData.type === 'music') { | ||
| 413 | + this.objData.thumbMediaId = null | ||
| 414 | + this.objData.thumbMediaUrl = null | ||
| 415 | + this.objData.title = null | ||
| 416 | + this.objData.description = null | ||
| 417 | + this.objData.musicUrl = null | ||
| 418 | + this.objData.hqMusicUrl = null | ||
| 419 | + } else if(this.objData.type === 'text') { | ||
| 420 | + this.objData.content = null | ||
| 421 | + } | ||
| 422 | + // 覆盖缓存 | ||
| 423 | + this.tempObj.set(this.objData.type, Object.assign({}, this.objData)); | ||
| 403 | }, | 424 | }, |
| 404 | getPage(page, params) { | 425 | getPage(page, params) { |
| 405 | this.tableLoading = true | 426 | this.tableLoading = true |
| @@ -426,8 +447,8 @@ | @@ -426,8 +447,8 @@ | ||
| 426 | * why?不确定为什么 v-model="objData.content" 不能自动缓存,所以通过这样的方式 | 447 | * why?不确定为什么 v-model="objData.content" 不能自动缓存,所以通过这样的方式 |
| 427 | */ | 448 | */ |
| 428 | inputContent(str) { | 449 | inputContent(str) { |
| 429 | - let tempObjItem = {...this.objData}; | ||
| 430 | - this.tempObj.set(this.objData.type, tempObjItem); | 450 | + // 覆盖缓存 |
| 451 | + this.tempObj.set(this.objData.type, Object.assign({}, this.objData)); | ||
| 431 | } | 452 | } |
| 432 | } | 453 | } |
| 433 | }; | 454 | }; |