Commit 331af28fe73e279f09c810bf91bffffea654ebc5
1 parent
188d8802
mp:增加【语音】【视频】的素材选择
Showing
3 changed files
with
78 additions
and
54 deletions
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/material/vo/MpMaterialRespVO.java
| @@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel; | @@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel; | ||
| 4 | import io.swagger.annotations.ApiModelProperty; | 4 | import io.swagger.annotations.ApiModelProperty; |
| 5 | import lombok.Data; | 5 | import lombok.Data; |
| 6 | 6 | ||
| 7 | +import java.util.Date; | ||
| 8 | + | ||
| 7 | @ApiModel("管理后台 - 公众号素材 Response VO") | 9 | @ApiModel("管理后台 - 公众号素材 Response VO") |
| 8 | @Data | 10 | @Data |
| 9 | public class MpMaterialRespVO { | 11 | public class MpMaterialRespVO { |
| @@ -39,4 +41,8 @@ public class MpMaterialRespVO { | @@ -39,4 +41,8 @@ public class MpMaterialRespVO { | ||
| 39 | private String title; | 41 | private String title; |
| 40 | @ApiModelProperty(value = "视频素材的描述", example = "我是介绍", notes = "只有【永久素材】使用") | 42 | @ApiModelProperty(value = "视频素材的描述", example = "我是介绍", notes = "只有【永久素材】使用") |
| 41 | private String introduction; | 43 | private String introduction; |
| 44 | + | ||
| 45 | + @ApiModelProperty(value = "创建时间", required = true) | ||
| 46 | + private Date createTime; | ||
| 47 | + | ||
| 42 | } | 48 | } |
yudao-ui-admin/src/views/mp/components/wx-material-select/main.vue
| @@ -23,45 +23,59 @@ | @@ -23,45 +23,59 @@ | ||
| 23 | <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" | 23 | <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" |
| 24 | @pagination="getMaterialPage"/> | 24 | @pagination="getMaterialPage"/> |
| 25 | </div> | 25 | </div> |
| 26 | - <div v-else-if="objData.type == 'voice'"> | ||
| 27 | - <!-- TODO 芋艿:需要翻译 --> | ||
| 28 | -<!-- <avue-crud ref="crud"--> | ||
| 29 | -<!-- :page="page"--> | ||
| 30 | -<!-- :data="tableData"--> | ||
| 31 | -<!-- :table-loading="tableLoading"--> | ||
| 32 | -<!-- :option="tableOptionVoice"--> | ||
| 33 | -<!-- @on-load="getPage"--> | ||
| 34 | -<!-- @size-change="sizeChange"--> | ||
| 35 | -<!-- @refresh-change="refreshChange">--> | ||
| 36 | -<!-- <template slot-scope="scope"--> | ||
| 37 | -<!-- slot="menu">--> | ||
| 38 | -<!-- <el-button type="text"--> | ||
| 39 | -<!-- icon="el-icon-circle-plus"--> | ||
| 40 | -<!-- size="small"--> | ||
| 41 | -<!-- plain--> | ||
| 42 | -<!-- @click="selectMaterial(scope.row)">选择</el-button>--> | ||
| 43 | -<!-- </template>--> | ||
| 44 | -<!-- </avue-crud>--> | 26 | + <!-- 类型:语音 --> |
| 27 | + <div v-else-if="objData.type === 'voice'"> | ||
| 28 | + <!-- 列表 --> | ||
| 29 | + <el-table v-loading="loading" :data="list"> | ||
| 30 | + <el-table-column label="编号" align="center" prop="mediaId" /> | ||
| 31 | + <el-table-column label="名字" align="center" prop="name" /> | ||
| 32 | + <el-table-column label="语音" align="center"> | ||
| 33 | + <template v-slot="scope"> | ||
| 34 | + <wx-voice-player :url="scope.row.url" /> | ||
| 35 | + </template> | ||
| 36 | + </el-table-column> | ||
| 37 | + <el-table-column label="上传时间" align="center" prop="createTime" width="180"> | ||
| 38 | + <template v-slot="scope"> | ||
| 39 | + <span>{{ parseTime(scope.row.createTime) }}</span> | ||
| 40 | + </template> | ||
| 41 | + </el-table-column> | ||
| 42 | + <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width"> | ||
| 43 | + <template v-slot="scope"> | ||
| 44 | + <el-button size="mini" type="text" icon="el-icon-circle-plus" | ||
| 45 | + @click="selectMaterial(scope.row)">选择</el-button> | ||
| 46 | + </template> | ||
| 47 | + </el-table-column> | ||
| 48 | + </el-table> | ||
| 49 | + <!-- 分页组件 --> | ||
| 50 | + <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" | ||
| 51 | + @pagination="getMaterialPage"/> | ||
| 45 | </div> | 52 | </div> |
| 46 | - <div v-else-if="objData.type == 'video'"> | ||
| 47 | - <!-- TODO 芋艿:需要翻译 --> | ||
| 48 | - <!-- <avue-crud ref="crud"--> | ||
| 49 | -<!-- :page="page"--> | ||
| 50 | -<!-- :data="tableData"--> | ||
| 51 | -<!-- :table-loading="tableLoading"--> | ||
| 52 | -<!-- :option="tableOptionVideo"--> | ||
| 53 | -<!-- @on-load="getPage"--> | ||
| 54 | -<!-- @size-change="sizeChange"--> | ||
| 55 | -<!-- @refresh-change="refreshChange">--> | ||
| 56 | -<!-- <template slot-scope="scope"--> | ||
| 57 | -<!-- slot="menu">--> | ||
| 58 | -<!-- <el-button type="text"--> | ||
| 59 | -<!-- icon="el-icon-circle-plus"--> | ||
| 60 | -<!-- size="small"--> | ||
| 61 | -<!-- plain--> | ||
| 62 | -<!-- @click="selectMaterial(scope.row)">选择</el-button>--> | ||
| 63 | -<!-- </template>--> | ||
| 64 | -<!-- </avue-crud>--> | 53 | + <div v-else-if="objData.type === 'video'"> |
| 54 | + <!-- 列表 --> | ||
| 55 | + <el-table v-loading="loading" :data="list"> | ||
| 56 | + <el-table-column label="编号" align="center" prop="mediaId" /> | ||
| 57 | + <el-table-column label="标题" align="center" prop="title" /> | ||
| 58 | + <el-table-column label="介绍" align="center" prop="introduction" /> | ||
| 59 | + <el-table-column label="视频" align="center"> | ||
| 60 | + <template v-slot="scope"> | ||
| 61 | + <wx-video-player :url="scope.row.url" /> | ||
| 62 | + </template> | ||
| 63 | + </el-table-column> | ||
| 64 | + <el-table-column label="上传时间" align="center" prop="createTime" width="180"> | ||
| 65 | + <template v-slot="scope"> | ||
| 66 | + <span>{{ parseTime(scope.row.createTime) }}</span> | ||
| 67 | + </template> | ||
| 68 | + </el-table-column> | ||
| 69 | + <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width"> | ||
| 70 | + <template v-slot="scope"> | ||
| 71 | + <el-button size="mini" type="text" icon="el-icon-circle-plus" | ||
| 72 | + @click="selectMaterial(scope.row)">选择</el-button> | ||
| 73 | + </template> | ||
| 74 | + </el-table-column> | ||
| 75 | + </el-table> | ||
| 76 | + <!-- 分页组件 --> | ||
| 77 | + <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" | ||
| 78 | + @pagination="getMaterialPage"/> | ||
| 65 | </div> | 79 | </div> |
| 66 | <div v-else-if="objData.type == 'news'"> | 80 | <div v-else-if="objData.type == 'news'"> |
| 67 | <div class="waterfall" v-loading="loading"> | 81 | <div class="waterfall" v-loading="loading"> |
| @@ -95,6 +109,8 @@ | @@ -95,6 +109,8 @@ | ||
| 95 | // import { tableOptionVoice } from '@/const/crud/wxmp/wxmaterial_voice' | 109 | // import { tableOptionVoice } from '@/const/crud/wxmp/wxmaterial_voice' |
| 96 | // import { tableOptionVideo } from '@/const/crud/wxmp/wxmaterial_video' | 110 | // import { tableOptionVideo } from '@/const/crud/wxmp/wxmaterial_video' |
| 97 | import WxNews from '@/views/mp/components/wx-news/main.vue'; | 111 | import WxNews from '@/views/mp/components/wx-news/main.vue'; |
| 112 | + import WxVoicePlayer from '@/views/mp/components/wx-voice-play/main.vue'; | ||
| 113 | + import WxVideoPlayer from '@/views/mp/components/wx-video-play/main.vue'; | ||
| 98 | import { getMaterialPage } from "@/api/mp/material"; | 114 | import { getMaterialPage } from "@/api/mp/material"; |
| 99 | // import {getPage as getPageNews} from '@/api/wxmp/wxfreepublish' | 115 | // import {getPage as getPageNews} from '@/api/wxmp/wxfreepublish' |
| 100 | // import {getPage as getPageNewsDraft} from '@/api/wxmp/wxdraft' | 116 | // import {getPage as getPageNewsDraft} from '@/api/wxmp/wxdraft' |
| @@ -102,7 +118,9 @@ | @@ -102,7 +118,9 @@ | ||
| 102 | export default { | 118 | export default { |
| 103 | name: "wxMaterialSelect", | 119 | name: "wxMaterialSelect", |
| 104 | components: { | 120 | components: { |
| 105 | - WxNews | 121 | + WxNews, |
| 122 | + WxVoicePlayer, | ||
| 123 | + WxVideoPlayer | ||
| 106 | }, | 124 | }, |
| 107 | props: { | 125 | props: { |
| 108 | objData: { | 126 | objData: { |
yudao-ui-admin/src/views/mp/components/wx-reply/main.vue
| @@ -19,7 +19,7 @@ | @@ -19,7 +19,7 @@ | ||
| 19 | <!-- 情况一:已经选择好素材、或者上传好图片 --> | 19 | <!-- 情况一:已经选择好素材、或者上传好图片 --> |
| 20 | <div class="select-item" v-if="objData.url"> | 20 | <div class="select-item" v-if="objData.url"> |
| 21 | <img class="material-img" :src="objData.url"> | 21 | <img class="material-img" :src="objData.url"> |
| 22 | - <p class="item-name" v-if="objData.repName">{{objData.repName}}</p> <!-- TODO 芋艿:永久素材,name 字段 --> | 22 | + <p class="item-name" v-if="objData.name">{{objData.name}}</p> |
| 23 | <el-row class="ope-row"> | 23 | <el-row class="ope-row"> |
| 24 | <el-button type="danger" icon="el-icon-delete" circle @click="deleteObj"></el-button> | 24 | <el-button type="danger" icon="el-icon-delete" circle @click="deleteObj"></el-button> |
| 25 | </el-row> | 25 | </el-row> |
| @@ -54,7 +54,7 @@ | @@ -54,7 +54,7 @@ | ||
| 54 | <span slot="label"><i class="el-icon-phone"></i> 语音</span> | 54 | <span slot="label"><i class="el-icon-phone"></i> 语音</span> |
| 55 | <el-row> | 55 | <el-row> |
| 56 | <div class="select-item2" v-if="objData.url"> | 56 | <div class="select-item2" v-if="objData.url"> |
| 57 | - <p class="item-name">{{objData.repName}}</p> <!-- TODO 芋艿:永久素材,name 字段 --> | 57 | + <p class="item-name">{{objData.name}}</p> |
| 58 | <div class="item-infos"> | 58 | <div class="item-infos"> |
| 59 | <wx-voice-player :url="objData.url" /> | 59 | <wx-voice-player :url="objData.url" /> |
| 60 | </div> | 60 | </div> |
| @@ -315,22 +315,17 @@ | @@ -315,22 +315,17 @@ | ||
| 315 | this.objData.content = tempObjItem.content ? tempObjItem.content : null | 315 | this.objData.content = tempObjItem.content ? tempObjItem.content : null |
| 316 | this.objData.mediaId = tempObjItem.mediaId ? tempObjItem.mediaId : null | 316 | this.objData.mediaId = tempObjItem.mediaId ? tempObjItem.mediaId : null |
| 317 | this.objData.url = tempObjItem.url ? tempObjItem.url : null | 317 | this.objData.url = tempObjItem.url ? tempObjItem.url : null |
| 318 | + this.objData.name = tempObjItem.url ? tempObjItem.name : null | ||
| 318 | 319 | ||
| 319 | // TODO 芋艿:临时注释掉,看看有没用 | 320 | // TODO 芋艿:临时注释掉,看看有没用 |
| 320 | - // this.objData.repName = tempObjItem.repName ? tempObjItem.repName : null | ||
| 321 | - // this.objData.repMediaId = tempObjItem.repMediaId ? tempObjItem.repMediaId : null | ||
| 322 | // this.objData.repDesc = tempObjItem.repDesc ? tempObjItem.repDesc : null | 321 | // this.objData.repDesc = tempObjItem.repDesc ? tempObjItem.repDesc : null |
| 323 | return; | 322 | return; |
| 324 | } | 323 | } |
| 325 | // 如果获取不到,需要把 objData 复原 | 324 | // 如果获取不到,需要把 objData 复原 |
| 325 | + this.objData.content = undefined; | ||
| 326 | this.objData.mediaId = undefined; | 326 | this.objData.mediaId = undefined; |
| 327 | this.objData.url = undefined; | 327 | this.objData.url = undefined; |
| 328 | - this.objData.content = undefined; | ||
| 329 | - // this.$delete(this.objData,'repName') | ||
| 330 | - // this.$delete(this.objData,'repMediaId') | ||
| 331 | - // this.$delete(this.objData,'mediaId') | ||
| 332 | - // this.$delete(this.objData,'url') | ||
| 333 | - // this.$delete(this.objData,'content') // TODO 芋艿:貌似删除了,文本无法输入 | 328 | + this.objData.name = undefined; |
| 334 | // this.$delete(this.objData,'repDesc') | 329 | // this.$delete(this.objData,'repDesc') |
| 335 | }, | 330 | }, |
| 336 | /** | 331 | /** |
| @@ -357,12 +352,16 @@ | @@ -357,12 +352,16 @@ | ||
| 357 | tempObjItem.hqMusicUrl = this.objData.hqMusicUrl | 352 | tempObjItem.hqMusicUrl = this.objData.hqMusicUrl |
| 358 | } else if (this.objData.type === 'image' | 353 | } else if (this.objData.type === 'image' |
| 359 | || this.objData.type === 'voice') { | 354 | || this.objData.type === 'voice') { |
| 360 | - tempObjItem.mediaId = item.mediaId; | 355 | + tempObjItem.mediaId = item.mediaId |
| 361 | this.objData.mediaId = item.mediaId | 356 | this.objData.mediaId = item.mediaId |
| 362 | - tempObjItem.url = item.url; | ||
| 363 | - this.objData.url = item.url | ||
| 364 | - // tempObjItem.repName = item.name | ||
| 365 | - // this.objData.repName = item.name | 357 | + if (item.url) { |
| 358 | + tempObjItem.url = item.url; | ||
| 359 | + this.objData.url = item.url; | ||
| 360 | + } else { // 必须使用 $delete 删除,否则 vue 监听不到数据 | ||
| 361 | + this.$delete(this.objData, 'url'); | ||
| 362 | + } | ||
| 363 | + tempObjItem.name = item.name | ||
| 364 | + this.objData.name = item.name | ||
| 366 | } else if (this.objData.type === 'video') { | 365 | } else if (this.objData.type === 'video') { |
| 367 | // getMaterialVideo({ | 366 | // getMaterialVideo({ |
| 368 | // mediaId:item.mediaId | 367 | // mediaId:item.mediaId |
| @@ -401,6 +400,7 @@ | @@ -401,6 +400,7 @@ | ||
| 401 | this.dialogThumbVisible = false | 400 | this.dialogThumbVisible = false |
| 402 | }, | 401 | }, |
| 403 | deleteObj() { | 402 | deleteObj() { |
| 403 | + console.log('删除!'); | ||
| 404 | if (this.objData.type === 'news') { | 404 | if (this.objData.type === 'news') { |
| 405 | // TODO 芋艿,待实现 | 405 | // TODO 芋艿,待实现 |
| 406 | } else if(this.objData.type === 'image' | 406 | } else if(this.objData.type === 'image' |