Commit 541ee81300b745dbe3d345519017955e75d7eadd

Authored by YunaiV
1 parent 6325dd28

mp:前端接入发送消息

yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/MpMessageController.java
@@ -37,10 +37,11 @@ public class MpMessageController { @@ -37,10 +37,11 @@ public class MpMessageController {
37 } 37 }
38 38
39 @PostMapping("/send") 39 @PostMapping("/send")
40 -// @ApiOperation("获得粉丝消息表分页")  
41 -// @PreAuthorize("@ss.hasPermission('mp:message:query')")  
42 - public CommonResult<Long> sendMessage(@Valid @RequestBody MpMessageSendReqVO reqVO) {  
43 - return success(mpMessageService.sendKefuMessage(reqVO)); 40 + @ApiOperation("给粉丝发送消息")
  41 + @PreAuthorize("@ss.hasPermission('mp:message:send')")
  42 + public CommonResult<MpMessageRespVO> sendMessage(@Valid @RequestBody MpMessageSendReqVO reqVO) {
  43 + MpMessageDO message = mpMessageService.sendKefuMessage(reqVO);
  44 + return success(MpMessageConvert.INSTANCE.convert(message));
44 } 45 }
45 46
46 } 47 }
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/message/MpMessageService.java
@@ -52,8 +52,8 @@ public interface MpMessageService { @@ -52,8 +52,8 @@ public interface MpMessageService {
52 * 注意,该方法会真实发送消息 52 * 注意,该方法会真实发送消息
53 * 53 *
54 * @param sendReqVO 消息内容 54 * @param sendReqVO 消息内容
55 - * @return 消息编号 55 + * @return 消息
56 */ 56 */
57 - Long sendKefuMessage(MpMessageSendReqVO sendReqVO); 57 + MpMessageDO sendKefuMessage(MpMessageSendReqVO sendReqVO);
58 58
59 } 59 }
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/message/MpMessageServiceImpl.java
@@ -104,7 +104,7 @@ public class MpMessageServiceImpl implements MpMessageService { @@ -104,7 +104,7 @@ public class MpMessageServiceImpl implements MpMessageService {
104 } 104 }
105 105
106 @Override 106 @Override
107 - public Long sendKefuMessage(MpMessageSendReqVO sendReqVO) { 107 + public MpMessageDO sendKefuMessage(MpMessageSendReqVO sendReqVO) {
108 // 校验消息格式 108 // 校验消息格式
109 MpUtils.validateMessage(validator, sendReqVO.getType(), sendReqVO); 109 MpUtils.validateMessage(validator, sendReqVO.getType(), sendReqVO);
110 110
@@ -116,18 +116,17 @@ public class MpMessageServiceImpl implements MpMessageService { @@ -116,18 +116,17 @@ public class MpMessageServiceImpl implements MpMessageService {
116 WxMpKefuMessage wxMessage = MpMessageConvert.INSTANCE.convert(sendReqVO, user); 116 WxMpKefuMessage wxMessage = MpMessageConvert.INSTANCE.convert(sendReqVO, user);
117 WxMpService mpService = mpServiceFactory.getRequiredMpService(user.getAppId()); 117 WxMpService mpService = mpServiceFactory.getRequiredMpService(user.getAppId());
118 try { 118 try {
119 - boolean result = mpService.getKefuService().sendKefuMessage(wxMessage);  
120 - System.out.println(result); 119 + mpService.getKefuService().sendKefuMessageWithResponse(wxMessage);
121 } catch (WxErrorException e) { 120 } catch (WxErrorException e) {
122 throw new RuntimeException(e); 121 throw new RuntimeException(e);
123 } 122 }
124 123
125 // 记录消息 124 // 记录消息
126 MpMessageDO message = MpMessageConvert.INSTANCE.convert(wxMessage, account, user); 125 MpMessageDO message = MpMessageConvert.INSTANCE.convert(wxMessage, account, user);
127 - message.setSendFrom(MpMessageSendFromEnum.USER_TO_MP.getFrom()); 126 + message.setSendFrom(MpMessageSendFromEnum.MP_TO_USER.getFrom());
128 downloadMessageMedia(mpService, message); 127 downloadMessageMedia(mpService, message);
129 mpMessageMapper.insert(message); 128 mpMessageMapper.insert(message);
130 - return message.getId(); 129 + return message;
131 } 130 }
132 131
133 /** 132 /**
yudao-ui-admin/src/api/mp/message.js
1 import request from '@/utils/request' 1 import request from '@/utils/request'
2 2
3 -// 创建粉丝消息表  
4 -export function createMessage(data) {  
5 - return request({  
6 - url: '/mp/message/create',  
7 - method: 'post',  
8 - data: data  
9 - })  
10 -}  
11 -  
12 -// 获得粉丝消息表  
13 -export function getMessage(id) {  
14 - return request({  
15 - url: '/mp/message/get?id=' + id,  
16 - method: 'get'  
17 - })  
18 -}  
19 -  
20 -// 获得粉丝消息表 分页 3 +// 获得粉丝消息表分页
21 export function getMessagePage(query) { 4 export function getMessagePage(query) {
22 return request({ 5 return request({
23 url: '/mp/message/page', 6 url: '/mp/message/page',
@@ -25,3 +8,12 @@ export function getMessagePage(query) { @@ -25,3 +8,12 @@ export function getMessagePage(query) {
25 params: query 8 params: query
26 }) 9 })
27 } 10 }
  11 +
  12 +// 给粉丝发送消息
  13 +export function sendMessage(data) {
  14 + return request({
  15 + url: '/mp/message/send',
  16 + method: 'post',
  17 + data: data
  18 + })
  19 +}
yudao-ui-admin/src/views/mp/components/wx-msg/main.vue
@@ -88,7 +88,7 @@ @@ -88,7 +88,7 @@
88 </template> 88 </template>
89 89
90 <script> 90 <script>
91 - import { getMessagePage } from '@/api/mp/message' 91 +import {getMessagePage, sendMessage} from '@/api/mp/message'
92 import WxReplySelect from '@/views/mp/components/wx-reply/main.vue' 92 import WxReplySelect from '@/views/mp/components/wx-reply/main.vue'
93 import WxVideoPlayer from '@/views/mp/components/wx-video-play/main.vue'; 93 import WxVideoPlayer from '@/views/mp/components/wx-video-play/main.vue';
94 import WxVoicePlayer from '@/views/mp/components/wx-voice-play/main.vue'; 94 import WxVoicePlayer from '@/views/mp/components/wx-voice-play/main.vue';
@@ -107,16 +107,14 @@ @@ -107,16 +107,14 @@
107 WxMusic 107 WxMusic
108 }, 108 },
109 props: { 109 props: {
110 - wxUserId: {  
111 - type: String 110 + userId: {
  111 + type: String,
  112 + required: true
112 } 113 }
113 }, 114 },
114 data() { 115 data() {
115 return { 116 return {
116 nowStr: new Date().getTime(), // 当前的时间戳,用于每次消息加载后,回到原位置;具体见 :id="'msg-div' + nowStr" 处 117 nowStr: new Date().getTime(), // 当前的时间戳,用于每次消息加载后,回到原位置;具体见 :id="'msg-div' + nowStr" 处
117 - objData:{  
118 - repType: 'text'  
119 - },  
120 sendLoading: false, // 发送消息是否加载中 118 sendLoading: false, // 发送消息是否加载中
121 tableLoading: false, // 消息列表是否正在加载中 119 tableLoading: false, // 消息列表是否正在加载中
122 loadMore: true, // 是否可以加载更多 120 loadMore: true, // 是否可以加载更多
@@ -133,6 +131,9 @@ @@ -133,6 +131,9 @@
133 nickname: '公众号', 131 nickname: '公众号',
134 avatar: require("@/assets/images/wechat.png"), 132 avatar: require("@/assets/images/wechat.png"),
135 }, 133 },
  134 + objData:{ // 微信发送消息
  135 + repType: 'text'
  136 + },
136 } 137 }
137 }, 138 },
138 created() { 139 created() {
@@ -140,30 +141,37 @@ @@ -140,30 +141,37 @@
140 }, 141 },
141 methods:{ 142 methods:{
142 sendMsg(){ 143 sendMsg(){
143 - if (this.objData) {  
144 - if(this.objData.repType === 'news'){  
145 - this.objData.content.articles = [this.objData.content.articles[0]]  
146 - this.$message({  
147 - showClose: true,  
148 - message: '图文消息条数限制在1条以内,已默认发送第一条',  
149 - type: 'success'  
150 - })  
151 - }  
152 - this.sendLoading = true  
153 - addObj(Object.assign({  
154 - wxUserId: this.wxUserId  
155 - },this.objData)).then(data => {  
156 - this.sendLoading = false  
157 - data = data.data  
158 - this.tableData = [...this.tableData , ...[data] ]  
159 - this.scrollToBottom()  
160 - this.objData = {  
161 - repType: 'text'  
162 - }  
163 - }).catch(() => {  
164 - this.sendLoading = false 144 + if (!this.objData) {
  145 + return;
  146 + }
  147 + if (this.objData.repType === 'news') {
  148 + this.objData.content.articles = [this.objData.content.articles[0]]
  149 + this.$message({
  150 + showClose: true,
  151 + message: '图文消息条数限制在1条以内,已默认发送第一条',
  152 + type: 'success'
165 }) 153 })
166 } 154 }
  155 + this.sendLoading = true
  156 + sendMessage(Object.assign({
  157 + userId: this.userId
  158 + }, {
  159 + ...this.objData,
  160 + type: this.objData.repType,
  161 + content: this.objData.repContent,
  162 + // TODO 芋艿:临时适配,保证可用
  163 + })).then(response => {
  164 + this.sendLoading = false
  165 + // 添加到消息列表,并滚动
  166 + this.tableData = [...this.tableData , ...[response.data] ]
  167 + this.scrollToBottom()
  168 + // 重置 objData 状态
  169 + this.objData = {
  170 + repType: 'text'
  171 + }
  172 + }).catch(() => {
  173 + this.sendLoading = false
  174 + })
167 }, 175 },
168 loadingMore() { 176 loadingMore() {
169 this.page.pageNo++ 177 this.page.pageNo++
@@ -174,7 +182,7 @@ @@ -174,7 +182,7 @@
174 getMessagePage(Object.assign({ 182 getMessagePage(Object.assign({
175 pageNo: page.pageNo, 183 pageNo: page.pageNo,
176 pageSize: page.pageSize, 184 pageSize: page.pageSize,
177 - wxUserId: this.wxUserId 185 + userId: this.userId
178 }, params)).then(response => { 186 }, params)).then(response => {
179 // 计算当前的滚动高度 187 // 计算当前的滚动高度
180 const msgDiv = document.getElementById('msg-div' + this.nowStr); 188 const msgDiv = document.getElementById('msg-div' + this.nowStr);
yudao-ui-admin/src/views/mp/message/index.vue
@@ -111,7 +111,7 @@ @@ -111,7 +111,7 @@
111 @pagination="getList"/> 111 @pagination="getList"/>
112 112
113 <el-dialog title="用户消息" :visible.sync="open" width="40%"> 113 <el-dialog title="用户消息" :visible.sync="open" width="40%">
114 - <wx-msg wxUserId="1" v-if="true" /> 114 + <wx-msg user-id="3" v-if="true" />
115 </el-dialog> 115 </el-dialog>
116 116
117 </div> 117 </div>