From 02ccf52d6c5476e549cc164e980531d45a957d6d Mon Sep 17 00:00:00 2001 From: YunaiV <zhijiantianya@gmail.com> Date: Thu, 12 Jan 2023 23:57:17 +0800 Subject: [PATCH] =?UTF-8?q?mp=EF=BC=9A=E5=A2=9E=E5=8A=A0=E5=8F=91=E9=80=81?= =?UTF-8?q?=E3=80=90=E5=9B=BE=E6=96=87=E3=80=91=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/news/MpDraftController.http | 8 ++ .../admin/news/MpFreePublishController.http | 2 +- .../admin/news/MpFreePublishController.java | 1 + yudao-ui-admin/src/api/mp/freePublish.js | 10 ++ .../mp/components/wx-material-select/main.vue | 121 +++++++----------- .../src/views/mp/components/wx-msg/main.vue | 14 +- .../src/views/mp/components/wx-news/main.vue | 5 +- .../src/views/mp/components/wx-reply/main.vue | 17 ++- 8 files changed, 91 insertions(+), 87 deletions(-) create mode 100644 yudao-ui-admin/src/api/mp/freePublish.js diff --git a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpDraftController.http b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpDraftController.http index 8e95a3ef5..b60ce3519 100644 --- a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpDraftController.http +++ b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpDraftController.http @@ -19,6 +19,14 @@ tenant-id: {{adminTenentId}} "content": "我是内容", "contentSourceUrl": "https://www.iocoder.cn", "thumbMediaId": "r6ryvl6LrxBU0miaST4Y-pIcmK-zAAId-9TGgy-DrSLhjVuWbuT3ZBjk9K1yQ0Dn" + }, + { + "title": "我是标题 2", + "author": "我是作者 2", + "digest": "我是摘要 2", + "content": "我是内容 2", + "contentSourceUrl": "https://www.iocoder.cn", + "thumbMediaId": "r6ryvl6LrxBU0miaST4Y-pIcmK-zAAId-9TGgy-DrSLhjVuWbuT3ZBjk9K1yQ0Dn" } ] } diff --git a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpFreePublishController.http b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpFreePublishController.http index 5e38dc4b5..122413200 100644 --- a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpFreePublishController.http +++ b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpFreePublishController.http @@ -5,7 +5,7 @@ Authorization: Bearer {{token}} tenant-id: {{adminTenentId}} ### 请求 /mp/free-publish/submit 接口 => 成功 -POST {{baseUrl}}/mp/free-publish/submit?accountId=1&mediaId=r6ryvl6LrxBU0miaST4Y-pEm50d1qKxNPkZVzrRZthSJHKCgiylCf4tARZfybZ_O +POST {{baseUrl}}/mp/free-publish/submit?accountId=1&mediaId=r6ryvl6LrxBU0miaST4Y-vilmd7iS51D8IPddxflWrau0hIQ2ovY8YanO5jlgUcM Content-Type: application/json Authorization: Bearer {{token}} tenant-id: {{adminTenentId}} diff --git a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpFreePublishController.java b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpFreePublishController.java index 1354ff354..10b7ad3c9 100644 --- a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpFreePublishController.java +++ b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpFreePublishController.java @@ -44,6 +44,7 @@ public class MpFreePublishController { } catch (WxErrorException e) { throw exception(FREE_PUBLISH_LIST_FAIL, e.getError().getErrorMsg()); } + // todo 芋艿:需要查询对应的缩略图,不然前端无法展示 // 返回分页 return success(new PageResult<>(publicationRecords.getItems(), publicationRecords.getTotalCount().longValue())); diff --git a/yudao-ui-admin/src/api/mp/freePublish.js b/yudao-ui-admin/src/api/mp/freePublish.js new file mode 100644 index 000000000..ba24213df --- /dev/null +++ b/yudao-ui-admin/src/api/mp/freePublish.js @@ -0,0 +1,10 @@ +import request from '@/utils/request' + +// 获得公众号素材分页 +export function getFreePublishPage(query) { + return request({ + url: '/mp/free-publish/page', + method: 'get', + params: query + }) +} diff --git a/yudao-ui-admin/src/views/mp/components/wx-material-select/main.vue b/yudao-ui-admin/src/views/mp/components/wx-material-select/main.vue index 0ba1604e5..2b92ff487 100644 --- a/yudao-ui-admin/src/views/mp/components/wx-material-select/main.vue +++ b/yudao-ui-admin/src/views/mp/components/wx-material-select/main.vue @@ -48,7 +48,7 @@ </el-table> <!-- 分页组件 --> <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" - @pagination="getMaterialPage"/> + @pagination="getPage"/> </div> <div v-else-if="objData.type === 'video'"> <!-- 列表 --> @@ -78,41 +78,32 @@ <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" @pagination="getMaterialPage"/> </div> - <div v-else-if="objData.type == 'news'"> + <div v-else-if="objData.type === 'news'"> <div class="waterfall" v-loading="loading"> - <div class="waterfall-item" v-for="item in list" :key="item.mediaId" v-if="item.content && item.content.articles"> - <WxNews :objData="item.content.articles"></WxNews> + <div class="waterfall-item" v-for="item in list" :key="item.mediaId" v-if="item.content && item.content.newsItem"> + <wx-news :articles="item.content.newsItem" /> <el-row class="ope-row"> - <el-button size="mini" type="success" @click="selectMaterial(item)">选择<i class="el-icon-circle-check el-icon--right"></i></el-button> + <el-button size="mini" type="success" @click="selectMaterial(item)"> + 选择<i class="el-icon-circle-check el-icon--right"></i> + </el-button> </el-row> </div> </div> - <div v-if="list.length <=0 && !loading" class="el-table__empty-block"> + <!-- 分页组件 --> + <div v-if="list.length <= 0 && !loading" class="el-table__empty-block"> <span class="el-table__empty-text">暂无数据</span> </div> - <span slot="footer" class="dialog-footer"> - <el-pagination - @size-change="sizeChange" - :current-page.sync="page.currentPage" - :page-sizes="[10, 20]" - :page-size="page.pageSize" - layout="total, sizes, prev, pager, next, jumper" - :total="page.total" - class="pagination" - > - </el-pagination> - </span> + <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" + @pagination="getMaterialPage"/> </div> </template> <script> - - // import { tableOptionVoice } from '@/const/crud/wxmp/wxmaterial_voice' - // import { tableOptionVideo } from '@/const/crud/wxmp/wxmaterial_video' import WxNews from '@/views/mp/components/wx-news/main.vue'; import WxVoicePlayer from '@/views/mp/components/wx-voice-play/main.vue'; import WxVideoPlayer from '@/views/mp/components/wx-video-play/main.vue'; import { getMaterialPage } from "@/api/mp/material"; + import {getFreePublishPage} from "@/api/mp/freePublish"; export default { name: "wxMaterialSelect", @@ -143,56 +134,40 @@ queryParams: { pageNo: 1, pageSize: 10, + accountId: this.objData.accountId, }, // tableOptionVoice: tableOptionVoice, // tableOptionVideo: tableOptionVideo, } }, created() { - this.getPage(this.page) + this.getPage() }, methods:{ - selectMaterial(item){ + selectMaterial(item) { this.$emit('selectMaterial', item) }, - getPage(page, params) { + getPage() { this.loading = true - if(this.objData.type == 'news'){ // 【图文】 - if(this.newsType == '1'){ - getPageNews(Object.assign({ - current: page.currentPage, - size: page.pageSize, - appId:this.appId, - }, params)).then(response => { - let tableData = response.data.items - tableData.forEach(item => { - item.mediaId = item.articleId - item.content.articles = item.content.newsItem - }) - this.list = tableData - this.page.total = response.data.totalCount - this.page.currentPage = page.currentPage - this.page.pageSize = page.pageSize - this.loading = false + if (this.objData.type === 'news' && this.newsType === '1') { // 【图文】+ 【已发布】 + this.getFreePublishPage(); + } else if (this.objData.type === 'news' && this.newsType === '2') { // 【图文】+ 【草稿】 + getPageNewsDraft(Object.assign({ + current: page.currentPage, + size: page.pageSize, + appId:this.appId, + }, params)).then(response => { + let tableData = response.data.items + tableData.forEach(item => { + item.mediaId = item.mediaId + item.content.articles = item.content.newsItem }) - }else if(this.newsType == '2'){ - getPageNewsDraft(Object.assign({ - current: page.currentPage, - size: page.pageSize, - appId:this.appId, - }, params)).then(response => { - let tableData = response.data.items - tableData.forEach(item => { - item.mediaId = item.mediaId - item.content.articles = item.content.newsItem - }) - this.list = tableData - this.page.total = response.data.totalCount - this.page.currentPage = page.currentPage - this.page.pageSize = page.pageSize - this.loading = false - }) - } + this.list = tableData + this.page.total = response.data.totalCount + this.page.currentPage = page.currentPage + this.page.pageSize = page.pageSize + this.loading = false + }) } else { // 【素材】 this.getMaterialPage(); } @@ -208,20 +183,20 @@ this.loading = false }) }, - sizeChange(val) { - this.page.currentPage = 1 - this.page.pageSize = val - this.getPage(this.page) - }, - currentChange(val) { - this.page.currentPage = val - this.getPage(this.page) - }, - /** - * 刷新回调 - */ - refreshChange(page) { - this.getPage(this.page) + getFreePublishPage() { + getFreePublishPage(this.queryParams).then(response => { + // 将 thumbUrl 转成 picUrl,保证 wx-news 组件可以预览封面 + response.data.list.forEach(item => { + const newsItem = item.content.newsItem; + newsItem.forEach(article => { + article.picUrl = article.thumbUrl; + }) + }) + this.list = response.data.list + this.total = response.data.total + }).finally(() => { + this.loading = false + }) } } }; diff --git a/yudao-ui-admin/src/views/mp/components/wx-msg/main.vue b/yudao-ui-admin/src/views/mp/components/wx-msg/main.vue index 383731d40..b458a4a30 100644 --- a/yudao-ui-admin/src/views/mp/components/wx-msg/main.vue +++ b/yudao-ui-admin/src/views/mp/components/wx-msg/main.vue @@ -155,21 +155,23 @@ import { getUser } from "@/api/mp/user"; if (!this.objData) { return; } - if (this.objData.type === 'news') { - this.objData.content.articles = [this.objData.content.articles[0]] + // 公众号限制:客服消息,公众号只允许发送一条 + if (this.objData.type === 'news' + && this.objData.articles.length > 1) { + this.objData.articles = [this.objData.articles[0]] this.$message({ showClose: true, - message: '图文消息条数限制在1条以内,已默认发送第一条', + message: '图文消息条数限制在 1 条以内,已默认发送第一条', type: 'success' }) } + + // 执行发送 this.sendLoading = true sendMessage(Object.assign({ userId: this.userId }, { - ...this.objData, - // content: this.objData.repContent, - // TODO 芋艿:临时适配,保证可用 + ...this.objData })).then(response => { this.sendLoading = false // 添加到消息列表,并滚动 diff --git a/yudao-ui-admin/src/views/mp/components/wx-news/main.vue b/yudao-ui-admin/src/views/mp/components/wx-news/main.vue index 6d6259541..bccffc2b4 100644 --- a/yudao-ui-admin/src/views/mp/components/wx-news/main.vue +++ b/yudao-ui-admin/src/views/mp/components/wx-news/main.vue @@ -41,7 +41,10 @@ articles: { type: Array // title - 标题;description - 描述;picUrl - 图片连接;url - 跳转链接 } - } + }, + created() { + console.log(this.articles) + }, }; </script> diff --git a/yudao-ui-admin/src/views/mp/components/wx-reply/main.vue b/yudao-ui-admin/src/views/mp/components/wx-reply/main.vue index cb1a0054b..a6ccdb5ec 100644 --- a/yudao-ui-admin/src/views/mp/components/wx-reply/main.vue +++ b/yudao-ui-admin/src/views/mp/components/wx-reply/main.vue @@ -118,18 +118,20 @@ </el-row> </el-row> </el-tab-pane> + <!-- 类型 5:图文 --> <el-tab-pane name="news"> <span slot="label"><i class="el-icon-news"></i> 图文</span> <el-row> - <div class="select-item" v-if="objData.content"> - <WxNews :objData="objData.content.articles"></WxNews> + <div class="select-item" v-if="objData.articles"> + <wx-news :articles="objData.articles" /> <el-row class="ope-row"> - <el-button type="danger" icon="el-icon-delete" circle @click="deleteObj"></el-button> + <el-button type="danger" icon="el-icon-delete" circle @click="deleteObj" /> </el-row> </div> + <!-- 选择素材 --> <div v-if="!objData.content"> <el-row style="text-align: center"> - <el-col :span="24" class="col-select2"> + <el-col :span="24"> <el-button type="success" @click="openMaterial">{{newsType === '1' ? '选择已发布图文' : '选择草稿箱图文'}}<i class="el-icon-circle-check el-icon--right"></i></el-button> </el-col> </el-row> @@ -369,7 +371,10 @@ // 创建 tempObjItem 对象,并设置对应的值 let tempObjItem = {} tempObjItem.type = this.objData.type; - if (this.objData.type === 'music') { // 音乐需要特殊处理,因为选择的是图片的缩略图 + if (this.objData.type === 'news') { + tempObjItem.articles = item.content.newsItem + this.objData.articles = item.content.newsItem + } else if (this.objData.type === 'music') { // 音乐需要特殊处理,因为选择的是图片的缩略图 tempObjItem.thumbMediaId = item.mediaId this.objData.thumbMediaId = item.mediaId tempObjItem.thumbMediaUrl = item.url @@ -431,7 +436,7 @@ }, deleteObj() { if (this.objData.type === 'news') { - this.objData.articles = [] + this.$delete(this.objData, 'articles'); } else if(this.objData.type === 'image') { this.objData.mediaId = null this.objData.url = null