Skip to content

Commit b1663fe

Browse files
committed
mp:完善微信公众号的消息
1 parent fba1c0f commit b1663fe

File tree

8 files changed

+144
-170
lines changed

8 files changed

+144
-170
lines changed

src/api/mp/draft.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export function getDraftPage(query) {
99
})
1010
}
1111

12-
// 创建草稿
12+
// 创建公众号草稿
1313
export function createDraft(accountId, articles) {
1414
return request({
1515
url: '/mp/draft/create?accountId=' + accountId,
@@ -20,7 +20,7 @@ export function createDraft(accountId, articles) {
2020
})
2121
}
2222

23-
// 更新草稿
23+
// 更新公众号草稿
2424
export function updateDraft(accountId, mediaId, articles) {
2525
return request({
2626
url: '/mp/draft/update?accountId=' + accountId + '&mediaId=' + mediaId,
@@ -29,7 +29,7 @@ export function updateDraft(accountId, mediaId, articles) {
2929
})
3030
}
3131

32-
// 删除草稿
32+
// 删除公众号草稿
3333
export function deleteDraft(accountId, mediaId) {
3434
return request({
3535
url: '/mp/draft/delete?accountId=' + accountId + '&mediaId=' + mediaId,

src/api/mp/message.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import request from '@/utils/request'
22

3-
// 获得粉丝消息分页
3+
// 获得公众号消息分页
44
export function getMessagePage(query) {
55
return request({
66
url: '/mp/message/page',

src/utils/dict.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ export const DICT_TYPE = {
6060

6161
// ========== MP 模块 ==========
6262
MP_AUTO_REPLY_REQUEST_MATCH: 'mp_auto_reply_request_match', // 自动回复请求匹配类型
63+
MP_MESSAGE_TYPE: 'mp_message_type', // 消息类型
6364

6465
// ========== MALL - PRODUCT 模块 ==========
6566
PRODUCT_SPU_STATUS: 'product_spu_status', // 商品 SPU 状态

src/views/mp/autoReply/index.vue

Lines changed: 52 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -50,49 +50,12 @@ SOFTWARE.
5050
</el-col>
5151
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" />
5252
</el-row>
53-
<!-- 列表 -->
53+
<!-- tab 项 -->
5454
<el-tab-pane name="1">
5555
<span slot="label"><i class="el-icon-star-off"></i> 关注时回复</span>
56-
<el-table v-loading="loading" :data="list">
57-
<el-table-column label="回复消息类型" align="center" prop="responseMessageType"/>
58-
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
59-
<template slot-scope="scope">
60-
<span>{{ parseTime(scope.row.createTime) }}</span>
61-
</template>
62-
</el-table-column>
63-
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
64-
<template slot-scope="scope">
65-
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
66-
v-hasPermi="['mp:auto-reply:update']">修改
67-
</el-button>
68-
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
69-
v-hasPermi="['mp:auto-reply:delete']">删除
70-
</el-button>
71-
</template>
72-
</el-table-column>
73-
</el-table>
7456
</el-tab-pane>
7557
<el-tab-pane name="2">
7658
<span slot="label"><i class="el-icon-chat-line-round"></i> 消息回复</span>
77-
<el-table v-loading="loading" :data="list">
78-
<el-table-column label="请求消息类型" align="center" prop="requestMessageType"/>
79-
<el-table-column label="回复消息类型" align="center" prop="responseMessageType"/>
80-
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
81-
<template slot-scope="scope">
82-
<span>{{ parseTime(scope.row.createTime) }}</span>
83-
</template>
84-
</el-table-column>
85-
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
86-
<template slot-scope="scope">
87-
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
88-
v-hasPermi="['mp:auto-reply:update']">修改
89-
</el-button>
90-
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
91-
v-hasPermi="['mp:auto-reply:delete']">删除
92-
</el-button>
93-
</template>
94-
</el-table-column>
95-
</el-table>
9659
</el-tab-pane>
9760
<el-tab-pane name="3">
9861
<span slot="label"><i class="el-icon-news"></i> 关键词回复</span>
@@ -101,13 +64,42 @@ SOFTWARE.
10164

10265
<!-- 列表 -->
10366
<el-table v-loading="loading" :data="list">
104-
<el-table-column label="关键词" align="center" prop="requestKeyword"/>
105-
<el-table-column label="匹配类型" align="center" prop="requestMatch">
67+
<el-table-column label="请求消息类型" align="center" prop="requestMessageType" v-if="type === '2'" />
68+
<el-table-column label="关键词" align="center" prop="requestKeyword" v-if="type === '3'" />
69+
<el-table-column label="匹配类型" align="center" prop="requestMatch" v-if="type === '3'">
10670
<template v-slot="scope">
10771
<dict-tag :type="DICT_TYPE.MP_AUTO_REPLY_REQUEST_MATCH" :value="scope.row.requestMatch"/>
10872
</template>
10973
</el-table-column>
110-
<el-table-column label="回复消息类型" align="center" prop="responseMessageType"/>
74+
<el-table-column label="回复消息类型" align="center">
75+
<template v-slot="scope">
76+
<dict-tag :type="DICT_TYPE.MP_MESSAGE_TYPE" :value="scope.row.responseMessageType"/>
77+
</template>
78+
</el-table-column>
79+
<el-table-column label="回复内容" align="center">
80+
<template slot-scope="scope">
81+
<div v-if="scope.row.responseMessageType === 'text'">{{ scope.row.responseContent }}</div>
82+
<div v-else-if="scope.row.responseMessageType === 'voice'">
83+
<wx-voice-player :url="scope.row.responseMediaUrl" />
84+
</div>
85+
<div v-else-if="scope.row.responseMessageType === 'image'">
86+
<a target="_blank" :href="scope.row.responseMediaUrl">
87+
<img :src="scope.row.responseMediaUrl" style="width: 100px">
88+
</a>
89+
</div>
90+
<div v-else-if="scope.row.responseMessageType === 'video' || scope.row.responseMessageType === 'shortvideo'">
91+
<wx-video-player :url="scope.row.responseMediaUrl" style="margin-top: 10px" />
92+
</div>
93+
<div v-else-if="scope.row.responseMessageType === 'news'">
94+
<wx-news :articles="scope.row.responseArticles" />
95+
</div>
96+
<div v-else-if="scope.row.responseMessageType === 'music'">
97+
<wx-music :title="scope.row.responseTitle" :description="scope.row.responseDescription"
98+
:thumb-media-url="scope.row.responseThumbMediaUrl"
99+
:music-url="scope.row.responseMusicUrl" :hq-music-url="scope.row.responseHqMusicUrl" />
100+
</div>
101+
</template>
102+
</el-table-column>
111103
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
112104
<template slot-scope="scope">
113105
<span>{{ parseTime(scope.row.createTime) }}</span>
@@ -130,9 +122,9 @@ SOFTWARE.
130122
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
131123
<el-form-item label="消息类型" prop="requestMessageType" v-if="type === '2'">
132124
<el-select v-model="form.requestMessageType" placeholder="请选择">
133-
<el-option v-for="item in dictData.get('wx_req_type')" :key="item.value" :label="item.label"
134-
:value="item.value" :disabled="item.disabled" v-if="item.value !== 'event'">
135-
</el-option>
125+
<el-option v-for="dict in this.getDictDatas(DICT_TYPE.MP_MESSAGE_TYPE)"
126+
:key="dict.value" :label="dict.label" :value="dict.value"
127+
v-if="requestMessageTypes.includes(dict.value)"/>
136128
</el-select>
137129
</el-form-item>
138130
<el-form-item label="匹配类型" prop="requestMatch" v-if="type === '3'">
@@ -157,19 +149,33 @@ SOFTWARE.
157149
</template>
158150

159151
<script>
152+
import WxVideoPlayer from '@/views/mp/components/wx-video-play/main.vue';
153+
import WxVoicePlayer from '@/views/mp/components/wx-voice-play/main.vue';
154+
import WxMsg from '@/views/mp/components/wx-msg/main.vue';
155+
import WxLocation from '@/views/mp/components/wx-location/main.vue';
156+
import WxMusic from '@/views/mp/components/wx-music/main.vue';
157+
import WxNews from '@/views/mp/components/wx-news/main.vue';
160158
import WxReplySelect from '@/views/mp/components/wx-reply/main.vue'
161159
import { getSimpleAccounts } from "@/api/mp/account";
162160
import { createAutoReply, deleteAutoReply, getAutoReply, getAutoReplyPage, updateAutoReply } from "@/api/mp/autoReply";
163161
164162
export default {
165163
name: 'mpAutoReply',
166164
components: {
165+
WxVideoPlayer,
166+
WxVoicePlayer,
167+
WxMsg,
168+
WxLocation,
169+
WxMusic,
170+
WxNews,
167171
WxReplySelect
168172
},
169173
data() {
170174
return {
171175
// tab 类型(1、关注时回复;2、消息回复;3、关键词回复)
172176
type: '3',
177+
// 允许选择的请求消息类型
178+
requestMessageTypes: ['text', 'image', 'voice', 'video', 'shortvideo', 'location', 'link'],
173179
// 遮罩层
174180
loading: true,
175181
// 显示搜索条件
@@ -202,8 +208,6 @@ export default {
202208
},
203209
hackResetWxReplySelect: false, // 重置 WxReplySelect 组件,解决无法清除的问题
204210
205-
dictData: new Map(),
206-
207211
// 公众号账号列表
208212
accounts: []
209213
}
@@ -218,33 +222,6 @@ export default {
218222
// 加载数据
219223
this.getList();
220224
})
221-
222-
// TODO 芋艿:字典数据,一起搞
223-
this.dictData.set('wx_req_type',[{
224-
value: 'text',
225-
label: '文本'
226-
},{
227-
value: 'image',
228-
label: '图片'
229-
},{
230-
value: 'voice',
231-
label: '语音'
232-
},{
233-
value: 'video',
234-
label: '视频'
235-
},{
236-
value: 'shortvideo',
237-
label: '小视频'
238-
},{
239-
value: 'location',
240-
label: '地理位置'
241-
},{
242-
value: 'link',
243-
label: '链接消息'
244-
},{
245-
value: 'event',
246-
label: '事件推送'
247-
}])
248225
},
249226
methods: {
250227
/** 查询列表 */
@@ -295,7 +272,8 @@ export default {
295272
this.open = true
296273
this.title = '新增自动回复';
297274
this.objData = {
298-
type : 'text'
275+
type : 'text',
276+
accountId: this.queryParams.accountId,
299277
}
300278
},
301279
/** 修改按钮操作 */

src/views/mp/components/wx-msg/main.vue

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99
<div class="msg-main">
1010
<div class="msg-div" :id="'msg-div' + nowStr">
1111
<!-- 加载更多 -->
12-
<div v-loading="tableLoading"></div>
13-
<div v-if="!tableLoading">
12+
<div v-loading="loading"></div>
13+
<div v-if="!loading">
1414
<div class="el-table__empty-block" v-if="loadMore" @click="loadingMore"><span class="el-table__empty-text">点击加载更多</span></div>
1515
<div class="el-table__empty-block" v-if="!loadMore"><span class="el-table__empty-text">没有更多了</span></div>
1616
</div>
1717
<!-- 消息列表 -->
18-
<div class="execution" v-for="item in tableData" :key='item.id'>
18+
<div class="execution" v-for="item in list" :key='item.id'>
1919
<div class="avue-comment" :class="item.sendFrom === 2 ? 'avue-comment--reverse' : ''">
2020
<div class="avatar-div">
2121
<img :src="item.sendFrom === 1 ? user.avatar : mp.avatar" class="avue-comment__avatar">
@@ -124,20 +124,20 @@ import { getUser } from "@/api/mp/user";
124124
},
125125
props: {
126126
userId: {
127-
type: String,
127+
type: Number,
128128
required: true
129129
},
130130
},
131131
data() {
132132
return {
133133
nowStr: new Date().getTime(), // 当前的时间戳,用于每次消息加载后,回到原位置;具体见 :id="'msg-div' + nowStr" 处
134-
sendLoading: false, // 发送消息是否加载中
135-
tableLoading: false, // 消息列表是否正在加载中
134+
loading: false, // 消息列表是否正在加载中
136135
loadMore: true, // 是否可以加载更多
137-
tableData: [], // 消息列表
138-
page: {
136+
list: [], // 消息列表
137+
queryParams: {
139138
pageNo: 1, // 当前页数
140139
pageSize: 14, // 每页显示多少条
140+
accountId: undefined,
141141
},
142142
user: { // 由于微信不再提供昵称,直接使用“用户”展示
143143
nickname: '用户',
@@ -148,6 +148,9 @@ import { getUser } from "@/api/mp/user";
148148
nickname: '公众号',
149149
avatar: require("@/assets/images/wechat.png"),
150150
},
151+
152+
// ========= 消息发送 =========
153+
sendLoading: false, // 发送消息是否加载中
151154
objData: { // 微信发送消息
152155
type: 'text',
153156
},
@@ -156,14 +159,19 @@ import { getUser } from "@/api/mp/user";
156159
created() {
157160
// 获得用户信息
158161
getUser(this.userId).then(response => {
159-
this.user.nickname = response.data.nickname | this.user.nickname;
160-
this.user.avatar = response.data.avatar | this.user.avatar;
162+
this.user.nickname = response.data.nickname && response.data.nickname.length > 0 ?
163+
response.data.nickname : this.user.nickname;
164+
this.user.avatar = response.data.avatar && this.user.avatar.length > 0 ?
165+
response.data.avatar : this.user.avatar;
166+
this.user.accountId = response.data.accountId;
161167
// 设置公众号账号编号
168+
this.queryParams.accountId = response.data.accountId;
162169
this.objData.accountId = response.data.accountId;
163-
})
164170
165-
// 加载消息
166-
this.refreshChange()
171+
// 加载消息
172+
console.log(this.queryParams)
173+
this.refreshChange()
174+
})
167175
},
168176
methods:{
169177
sendMsg(){
@@ -190,7 +198,7 @@ import { getUser } from "@/api/mp/user";
190198
})).then(response => {
191199
this.sendLoading = false
192200
// 添加到消息列表,并滚动
193-
this.tableData = [...this.tableData , ...[response.data] ]
201+
this.list = [...this.list , ...[response.data] ]
194202
this.scrollToBottom()
195203
// 重置 objData 状态
196204
this.$refs['replySelect'].deleteObj(); // 重置,避免 tab 的数据未清理
@@ -199,15 +207,16 @@ import { getUser } from "@/api/mp/user";
199207
})
200208
},
201209
loadingMore() {
202-
this.page.pageNo++
203-
this.getPage(this.page)
210+
this.queryParams.pageNo++
211+
this.getPage(this.queryParams)
204212
},
205213
getPage(page, params) {
206-
this.tableLoading = true
214+
this.loading = true
207215
getMessagePage(Object.assign({
208216
pageNo: page.pageNo,
209217
pageSize: page.pageSize,
210-
userId: this.userId
218+
userId: this.userId,
219+
accountId: page.accountId,
211220
}, params)).then(response => {
212221
// 计算当前的滚动高度
213222
const msgDiv = document.getElementById('msg-div' + this.nowStr);
@@ -218,16 +227,16 @@ import { getUser } from "@/api/mp/user";
218227
219228
// 处理数据
220229
const data = response.data.list.reverse();
221-
this.tableData = [...data, ...this.tableData]
222-
this.tableLoading = false
223-
if (data.length < this.page.pageSize || data.length === 0){
230+
this.list = [...data, ...this.list]
231+
this.loading = false
232+
if (data.length < this.queryParams.pageSize || data.length === 0){
224233
this.loadMore = false
225234
}
226-
this.page.pageNo = page.pageNo
227-
this.page.pageSize = page.pageSize
235+
this.queryParams.pageNo = page.pageNo
236+
this.queryParams.pageSize = page.pageSize
228237
229238
// 滚动到原来的位置
230-
if(this.page.pageNo === 1) { // 定位到消息底部
239+
if(this.queryParams.pageNo === 1) { // 定位到消息底部
231240
this.scrollToBottom()
232241
} else if (data.length !== 0) { // 定位滚动条
233242
this.$nextTick(() => {
@@ -242,7 +251,7 @@ import { getUser } from "@/api/mp/user";
242251
* 刷新回调
243252
*/
244253
refreshChange() {
245-
this.getPage(this.page)
254+
this.getPage(this.queryParams)
246255
},
247256
/** 定位到消息底部 */
248257
scrollToBottom: function () {
@@ -267,6 +276,8 @@ import { getUser } from "@/api/mp/user";
267276
height: 50vh;
268277
overflow: auto;
269278
background-color: #eaeaea;
279+
margin-left: 10px;
280+
margin-right: 10px;
270281
}
271282
.msg-send {
272283
padding: 10px;

src/views/mp/menu/index.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ SOFTWARE.
6666
<div class="menu_bottom menu_addicon" v-if="this.menuList.length < 3" @click="addMenu"><i class="el-icon-plus"></i></div>
6767
</div>
6868
<div class="save_div">
69-
<el-button class="save_btn" type="success" size="small" @click="handleSave">保存并发布菜单</el-button>
70-
<el-button class="save_btn" type="danger" size="small" @click="handleDelete">清空菜单</el-button>
69+
<el-button class="save_btn" type="success" size="small" @click="handleSave" v-hasPermi="['mp:menu:save']">保存并发布菜单</el-button>
70+
<el-button class="save_btn" type="danger" size="small" @click="handleDelete" v-hasPermi="['mp:menu:delete']">清空菜单</el-button>
7171
</div>
7272
</div>
7373
<!--右边配置-->

0 commit comments

Comments
 (0)