Commit 431569fd0934e90e6f1134f25cdcaabaa5f04e9a
1 parent
32f152cc
mp:后端增加上传永久素材的接口
Showing
8 changed files
with
398 additions
and
5 deletions
yudao-module-mp/yudao-module-mp-api/src/main/java/cn/iocoder/yudao/module/mp/enums/ErrorCodeConstants.java
| ... | ... | @@ -27,11 +27,14 @@ public interface ErrorCodeConstants { |
| 27 | 27 | ErrorCode TAG_DELETE_FAIL = new ErrorCode(1006002001, "删除标签失败,原因:{}"); |
| 28 | 28 | ErrorCode TAG_GET_FAIL = new ErrorCode(1006002001, "获得标签失败,原因:{}"); |
| 29 | 29 | |
| 30 | - // ========== 公众号标签 1006003000============ | |
| 30 | + // ========== 公众号粉丝 1006003000============ | |
| 31 | 31 | ErrorCode USER_NOT_EXISTS = new ErrorCode(1006003000, "用户不存在"); |
| 32 | 32 | ErrorCode USER_UPDATE_TAG_FAIL = new ErrorCode(1006003001, "更新用户标签失败,原因:{}"); |
| 33 | 33 | |
| 34 | + // ========== 公众号素材 1006004000============ | |
| 35 | + ErrorCode MATERIAL_UPLOAD_FAIL = new ErrorCode(1006004000, "上传素材失败,原因:{}"); | |
| 36 | + | |
| 34 | 37 | // TODO 要处理下 |
| 35 | - ErrorCode COMMON_NOT_EXISTS = new ErrorCode(1006001002, "用户不存在"); | |
| 38 | + ErrorCode MENU_NOT_EXISTS = new ErrorCode(1006001002, "菜单不存在"); | |
| 36 | 39 | |
| 37 | 40 | } | ... | ... |
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/material/MpMaterialController.java
| 1 | 1 | package cn.iocoder.yudao.module.mp.controller.admin.material; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | +import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadPermanentReqVO; | |
| 4 | 5 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadRespVO; |
| 5 | 6 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadTemporaryReqVO; |
| 6 | 7 | import cn.iocoder.yudao.module.mp.convert.material.MpMaterialConvert; |
| ... | ... | @@ -36,4 +37,12 @@ public class MpMaterialController { |
| 36 | 37 | return success(MpMaterialConvert.INSTANCE.convert(material)); |
| 37 | 38 | } |
| 38 | 39 | |
| 40 | + @ApiOperation("上传永久素材") | |
| 41 | + @PostMapping("/upload-permanent") | |
| 42 | + public CommonResult<MpMaterialUploadRespVO> uploadPermanentMaterial( | |
| 43 | + @Valid MpMaterialUploadPermanentReqVO reqVO) throws IOException { | |
| 44 | + MpMaterialDO material = mpMaterialService.uploadPermanentMaterial(reqVO); | |
| 45 | + return success(MpMaterialConvert.INSTANCE.convert(material)); | |
| 46 | + } | |
| 47 | + | |
| 39 | 48 | } | ... | ... |
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/material/vo/MpMaterialUploadPermanentReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.mp.controller.admin.material.vo; | |
| 2 | + | |
| 3 | +import cn.hutool.core.util.ObjectUtil; | |
| 4 | +import com.fasterxml.jackson.annotation.JsonIgnore; | |
| 5 | +import io.swagger.annotations.ApiModel; | |
| 6 | +import io.swagger.annotations.ApiModelProperty; | |
| 7 | +import lombok.Data; | |
| 8 | +import me.chanjar.weixin.common.api.WxConsts; | |
| 9 | +import org.springframework.web.multipart.MultipartFile; | |
| 10 | + | |
| 11 | +import javax.validation.constraints.AssertTrue; | |
| 12 | +import javax.validation.constraints.NotEmpty; | |
| 13 | +import javax.validation.constraints.NotNull; | |
| 14 | + | |
| 15 | +@ApiModel("管理后台 - 公众号素材上传永久 Request VO") | |
| 16 | +@Data | |
| 17 | +public class MpMaterialUploadPermanentReqVO { | |
| 18 | + | |
| 19 | + @ApiModelProperty(value = "公众号账号的编号", required = true, example = "2048") | |
| 20 | + @NotNull(message = "公众号账号的编号不能为空") | |
| 21 | + private Long accountId; | |
| 22 | + | |
| 23 | + @ApiModelProperty(value = "文件类型", required = true, example = "image", notes = "参见 WxConsts.MediaFileType 枚举") | |
| 24 | + @NotEmpty(message = "文件类型不能为空") | |
| 25 | + private String type; | |
| 26 | + | |
| 27 | + @ApiModelProperty(value = "文件附件", required = true) | |
| 28 | + @NotNull(message = "文件不能为空") | |
| 29 | + @JsonIgnore // 避免被操作日志,进行序列化,导致报错 | |
| 30 | + private MultipartFile file; | |
| 31 | + | |
| 32 | + @ApiModelProperty(value = "名字", example = "wechat.mp", notes = "如果 name 为空,则使用 file 文件名") | |
| 33 | + private String name; | |
| 34 | + | |
| 35 | + @ApiModelProperty(value = "视频素材的标题", example = "视频素材的标题", notes = "文件类型为 video 时,必填") | |
| 36 | + private String title; | |
| 37 | + @ApiModelProperty(value = "视频素材的描述", example = "视频素材的描述", notes = "文件类型为 video 时,必填") | |
| 38 | + private String introduction; | |
| 39 | + | |
| 40 | + @AssertTrue(message = "标题不能为空") | |
| 41 | + public boolean isTitleValid() { | |
| 42 | + // 生成场景为管理后台时,必须设置上级菜单,不然生成的菜单 SQL 是无父级菜单的 | |
| 43 | + return ObjectUtil.notEqual(type, WxConsts.MediaFileType.VIDEO) | |
| 44 | + || title != null; | |
| 45 | + } | |
| 46 | + | |
| 47 | + @AssertTrue(message = "描述不能为空") | |
| 48 | + public boolean isIntroductionValid() { | |
| 49 | + // 生成场景为管理后台时,必须设置上级菜单,不然生成的菜单 SQL 是无父级菜单的 | |
| 50 | + return ObjectUtil.notEqual(type, WxConsts.MediaFileType.VIDEO) | |
| 51 | + || introduction != null; | |
| 52 | + } | |
| 53 | + | |
| 54 | +} | ... | ... |
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/convert/material/MpMaterialConvert.java
| ... | ... | @@ -3,11 +3,14 @@ package cn.iocoder.yudao.module.mp.convert.material; |
| 3 | 3 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadRespVO; |
| 4 | 4 | import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO; |
| 5 | 5 | import cn.iocoder.yudao.module.mp.dal.dataobject.material.MpMaterialDO; |
| 6 | +import me.chanjar.weixin.mp.bean.material.WxMpMaterial; | |
| 6 | 7 | import org.mapstruct.Mapper; |
| 7 | 8 | import org.mapstruct.Mapping; |
| 8 | 9 | import org.mapstruct.Mappings; |
| 9 | 10 | import org.mapstruct.factory.Mappers; |
| 10 | 11 | |
| 12 | +import java.io.File; | |
| 13 | + | |
| 11 | 14 | @Mapper |
| 12 | 15 | public interface MpMaterialConvert { |
| 13 | 16 | |
| ... | ... | @@ -20,6 +23,19 @@ public interface MpMaterialConvert { |
| 20 | 23 | }) |
| 21 | 24 | MpMaterialDO convert(String mediaId, String type, String url, MpAccountDO account); |
| 22 | 25 | |
| 26 | + @Mappings({ | |
| 27 | + @Mapping(target = "id", ignore = true), | |
| 28 | + @Mapping(source = "account.id", target = "accountId"), | |
| 29 | + @Mapping(source = "account.appId", target = "appId"), | |
| 30 | + @Mapping(source = "name", target = "name") | |
| 31 | + }) | |
| 32 | + MpMaterialDO convert(String mediaId, String type, String url, MpAccountDO account, | |
| 33 | + String name, String title, String introduction, String mpUrl); | |
| 34 | + | |
| 23 | 35 | MpMaterialUploadRespVO convert(MpMaterialDO bean); |
| 24 | 36 | |
| 37 | + default WxMpMaterial convert(String name, File file, String title, String introduction) { | |
| 38 | + return new WxMpMaterial(name, file, title, introduction); | |
| 39 | + } | |
| 40 | + | |
| 25 | 41 | } | ... | ... |
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/material/MpMaterialService.java
| 1 | 1 | package cn.iocoder.yudao.module.mp.service.material; |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadPermanentReqVO; | |
| 3 | 4 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadTemporaryReqVO; |
| 4 | 5 | import cn.iocoder.yudao.module.mp.dal.dataobject.material.MpMaterialDO; |
| 5 | 6 | import me.chanjar.weixin.common.api.WxConsts; |
| ... | ... | @@ -26,5 +27,22 @@ public interface MpMaterialService { |
| 26 | 27 | */ |
| 27 | 28 | String downloadMaterialUrl(Long accountId, String mediaId, String type); |
| 28 | 29 | |
| 30 | + /** | |
| 31 | + * 上传临时素材 | |
| 32 | + * | |
| 33 | + * @param reqVO 请求 | |
| 34 | + * @return 素材 | |
| 35 | + * @throws IOException 文件操作发生异常 | |
| 36 | + */ | |
| 29 | 37 | MpMaterialDO uploadTemporaryMaterial(@Valid MpMaterialUploadTemporaryReqVO reqVO) throws IOException; |
| 38 | + | |
| 39 | + /** | |
| 40 | + * 上传永久素材 | |
| 41 | + * | |
| 42 | + * @param reqVO 请求 | |
| 43 | + * @return 素材 | |
| 44 | + * @throws IOException 文件操作发生异常 | |
| 45 | + */ | |
| 46 | + MpMaterialDO uploadPermanentMaterial(@Valid MpMaterialUploadPermanentReqVO reqVO) throws IOException; | |
| 47 | + | |
| 30 | 48 | } | ... | ... |
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/material/MpMaterialServiceImpl.java
| ... | ... | @@ -3,7 +3,9 @@ package cn.iocoder.yudao.module.mp.service.material; |
| 3 | 3 | import cn.hutool.core.io.FileTypeUtil; |
| 4 | 4 | import cn.hutool.core.io.FileUtil; |
| 5 | 5 | import cn.hutool.core.util.ObjUtil; |
| 6 | +import cn.hutool.core.util.StrUtil; | |
| 6 | 7 | import cn.iocoder.yudao.module.infra.api.file.FileApi; |
| 8 | +import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadPermanentReqVO; | |
| 7 | 9 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadTemporaryReqVO; |
| 8 | 10 | import cn.iocoder.yudao.module.mp.convert.material.MpMaterialConvert; |
| 9 | 11 | import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO; |
| ... | ... | @@ -15,6 +17,7 @@ import lombok.extern.slf4j.Slf4j; |
| 15 | 17 | import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; |
| 16 | 18 | import me.chanjar.weixin.common.error.WxErrorException; |
| 17 | 19 | import me.chanjar.weixin.mp.api.WxMpService; |
| 20 | +import me.chanjar.weixin.mp.bean.material.WxMpMaterialUploadResult; | |
| 18 | 21 | import org.springframework.context.annotation.Lazy; |
| 19 | 22 | import org.springframework.stereotype.Service; |
| 20 | 23 | import org.springframework.validation.annotation.Validated; |
| ... | ... | @@ -23,6 +26,9 @@ import javax.annotation.Resource; |
| 23 | 26 | import java.io.File; |
| 24 | 27 | import java.io.IOException; |
| 25 | 28 | |
| 29 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | |
| 30 | +import static cn.iocoder.yudao.module.mp.enums.ErrorCodeConstants.MATERIAL_UPLOAD_FAIL; | |
| 31 | + | |
| 26 | 32 | /** |
| 27 | 33 | * 公众号素材 Service 接口 |
| 28 | 34 | * |
| ... | ... | @@ -87,8 +93,7 @@ public class MpMaterialServiceImpl implements MpMaterialService { |
| 87 | 93 | mediaId = ObjUtil.defaultIfNull(result.getMediaId(), result.getThumbMediaId()); |
| 88 | 94 | url = uploadFile(mediaId, file); |
| 89 | 95 | } catch (WxErrorException e) { |
| 90 | - // TODO yunai:待完善 | |
| 91 | - throw new RuntimeException(e); | |
| 96 | + throw exception(MATERIAL_UPLOAD_FAIL, e.getError().getErrorMsg()); | |
| 92 | 97 | } finally { |
| 93 | 98 | FileUtil.del(file); |
| 94 | 99 | } |
| ... | ... | @@ -101,6 +106,39 @@ public class MpMaterialServiceImpl implements MpMaterialService { |
| 101 | 106 | return material; |
| 102 | 107 | } |
| 103 | 108 | |
| 109 | + @Override | |
| 110 | + public MpMaterialDO uploadPermanentMaterial(MpMaterialUploadPermanentReqVO reqVO) throws IOException { | |
| 111 | + WxMpService mpService = mpServiceFactory.getRequiredMpService(reqVO.getAccountId()); | |
| 112 | + // 第一步,上传到公众号 | |
| 113 | + String name = StrUtil.blankToDefault(reqVO.getName(), reqVO.getFile().getName()); | |
| 114 | + File file = null; | |
| 115 | + WxMpMaterialUploadResult result; | |
| 116 | + String mediaId; | |
| 117 | + String url; | |
| 118 | + try { | |
| 119 | + // 写入到临时文件 | |
| 120 | + file = FileUtil.newFile(FileUtil.getTmpDirPath() + reqVO.getFile().getOriginalFilename()); | |
| 121 | + reqVO.getFile().transferTo(file); | |
| 122 | + // 上传到公众号 | |
| 123 | + result = mpService.getMaterialService().materialFileUpload(reqVO.getType(), | |
| 124 | + MpMaterialConvert.INSTANCE.convert(name, file, reqVO.getTitle(), reqVO.getIntroduction())); | |
| 125 | + // 上传到文件服务 | |
| 126 | + mediaId = ObjUtil.defaultIfNull(result.getMediaId(), result.getMediaId()); | |
| 127 | + url = uploadFile(mediaId, file); | |
| 128 | + } catch (WxErrorException e) { | |
| 129 | + throw exception(MATERIAL_UPLOAD_FAIL, e.getError().getErrorMsg()); | |
| 130 | + } finally { | |
| 131 | + FileUtil.del(file); | |
| 132 | + } | |
| 133 | + | |
| 134 | + // 第二步,存储到数据库 | |
| 135 | + MpAccountDO account = mpAccountService.getRequiredAccount(reqVO.getAccountId()); | |
| 136 | + MpMaterialDO material = MpMaterialConvert.INSTANCE.convert(mediaId, reqVO.getType(), url, account, | |
| 137 | + name, reqVO.getTitle(), reqVO.getIntroduction(), result.getUrl()).setPermanent(true); | |
| 138 | + mpMaterialMapper.insert(material); | |
| 139 | + return material; | |
| 140 | + } | |
| 141 | + | |
| 104 | 142 | /** |
| 105 | 143 | * 下载微信媒体文件的内容,并上传到文件服务 |
| 106 | 144 | * | ... | ... |
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/menu/MpMenuServiceImpl.java
| ... | ... | @@ -77,7 +77,7 @@ public class MpMenuServiceImpl implements MpMenuService { |
| 77 | 77 | private void validateMenuExists(Long id) { |
| 78 | 78 | if (mpMenuMapper.selectById(id) == null) { |
| 79 | 79 | // TODO 芋艿:错误码不太对 |
| 80 | - throw exception(COMMON_NOT_EXISTS); | |
| 80 | + throw exception(MENU_NOT_EXISTS); | |
| 81 | 81 | } |
| 82 | 82 | } |
| 83 | 83 | ... | ... |
yudao-ui-admin/src/views/mp/components/wx-material-select/main.vue
0 → 100644
| 1 | +<!-- | |
| 2 | + - Copyright (C) 2018-2019 | |
| 3 | + - All rights reserved, Designed By www.joolun.com | |
| 4 | +--> | |
| 5 | +<template> | |
| 6 | + <!-- 类型:图片 --> | |
| 7 | + <div v-if="objData.type === 'image'"> | |
| 8 | + <div class="waterfall" v-loading="tableLoading"> | |
| 9 | + <div class="waterfall-item" v-for="item in tableData" :key="item.mediaId"> | |
| 10 | + <img class="material-img" :src="item.url"> | |
| 11 | + <p class="item-name">{{item.name}}</p> | |
| 12 | + <el-row class="ope-row"> | |
| 13 | + <el-button size="mini" type="success" @click="selectMaterial(item)">选择 | |
| 14 | + <i class="el-icon-circle-check el-icon--right"></i> | |
| 15 | + </el-button> | |
| 16 | + </el-row> | |
| 17 | + </div> | |
| 18 | + </div> | |
| 19 | + <div v-if="tableData.length <= 0 && !tableLoading" class="el-table__empty-block"> | |
| 20 | + <span class="el-table__empty-text">暂无数据</span> | |
| 21 | + </div> | |
| 22 | + <span slot="footer" class="dialog-footer"> | |
| 23 | + <el-pagination @size-change="sizeChange" @current-change="currentChange" :current-page.sync="page.currentPage" | |
| 24 | + :page-sizes="[10, 20]" :page-size="page.pageSize" layout="total, sizes, prev, pager, next, jumper" | |
| 25 | + :total="page.total" class="pagination" /> | |
| 26 | + </span> | |
| 27 | + </div> | |
| 28 | + <div v-else-if="objData.repType == 'voice'"> | |
| 29 | + <!-- TODO 芋艿:需要翻译 --> | |
| 30 | +<!-- <avue-crud ref="crud"--> | |
| 31 | +<!-- :page="page"--> | |
| 32 | +<!-- :data="tableData"--> | |
| 33 | +<!-- :table-loading="tableLoading"--> | |
| 34 | +<!-- :option="tableOptionVoice"--> | |
| 35 | +<!-- @on-load="getPage"--> | |
| 36 | +<!-- @size-change="sizeChange"--> | |
| 37 | +<!-- @refresh-change="refreshChange">--> | |
| 38 | +<!-- <template slot-scope="scope"--> | |
| 39 | +<!-- slot="menu">--> | |
| 40 | +<!-- <el-button type="text"--> | |
| 41 | +<!-- icon="el-icon-circle-plus"--> | |
| 42 | +<!-- size="small"--> | |
| 43 | +<!-- plain--> | |
| 44 | +<!-- @click="selectMaterial(scope.row)">选择</el-button>--> | |
| 45 | +<!-- </template>--> | |
| 46 | +<!-- </avue-crud>--> | |
| 47 | + </div> | |
| 48 | + <div v-else-if="objData.repType == 'video'"> | |
| 49 | + <!-- TODO 芋艿:需要翻译 --> | |
| 50 | + <!-- <avue-crud ref="crud"--> | |
| 51 | +<!-- :page="page"--> | |
| 52 | +<!-- :data="tableData"--> | |
| 53 | +<!-- :table-loading="tableLoading"--> | |
| 54 | +<!-- :option="tableOptionVideo"--> | |
| 55 | +<!-- @on-load="getPage"--> | |
| 56 | +<!-- @size-change="sizeChange"--> | |
| 57 | +<!-- @refresh-change="refreshChange">--> | |
| 58 | +<!-- <template slot-scope="scope"--> | |
| 59 | +<!-- slot="menu">--> | |
| 60 | +<!-- <el-button type="text"--> | |
| 61 | +<!-- icon="el-icon-circle-plus"--> | |
| 62 | +<!-- size="small"--> | |
| 63 | +<!-- plain--> | |
| 64 | +<!-- @click="selectMaterial(scope.row)">选择</el-button>--> | |
| 65 | +<!-- </template>--> | |
| 66 | +<!-- </avue-crud>--> | |
| 67 | + </div> | |
| 68 | + <div v-else-if="objData.repType == 'news'"> | |
| 69 | + <div class="waterfall" v-loading="tableLoading"> | |
| 70 | + <div class="waterfall-item" v-for="item in tableData" :key="item.mediaId" v-if="item.content && item.content.articles"> | |
| 71 | + <WxNews :objData="item.content.articles"></WxNews> | |
| 72 | + <el-row class="ope-row"> | |
| 73 | + <el-button size="mini" type="success" @click="selectMaterial(item)">选择<i class="el-icon-circle-check el-icon--right"></i></el-button> | |
| 74 | + </el-row> | |
| 75 | + </div> | |
| 76 | + </div> | |
| 77 | + <div v-if="tableData.length <=0 && !tableLoading" class="el-table__empty-block"> | |
| 78 | + <span class="el-table__empty-text">暂无数据</span> | |
| 79 | + </div> | |
| 80 | + <span slot="footer" class="dialog-footer"> | |
| 81 | + <el-pagination | |
| 82 | + @size-change="sizeChange" | |
| 83 | + :current-page.sync="page.currentPage" | |
| 84 | + :page-sizes="[10, 20]" | |
| 85 | + :page-size="page.pageSize" | |
| 86 | + layout="total, sizes, prev, pager, next, jumper" | |
| 87 | + :total="page.total" | |
| 88 | + class="pagination" | |
| 89 | + > | |
| 90 | + </el-pagination> | |
| 91 | + </span> | |
| 92 | + </div> | |
| 93 | +</template> | |
| 94 | + | |
| 95 | +<script> | |
| 96 | + import { getPage, getMaterialVideo } from '@/api/wxmp/wxmaterial' | |
| 97 | + // import { tableOptionVoice } from '@/const/crud/wxmp/wxmaterial_voice' | |
| 98 | + // import { tableOptionVideo } from '@/const/crud/wxmp/wxmaterial_video' | |
| 99 | + import WxNews from '@/views/mp/components/wx-news/main.vue'; | |
| 100 | + import {getPage as getPageNews} from '@/api/wxmp/wxfreepublish' | |
| 101 | + import {getPage as getPageNewsDraft} from '@/api/wxmp/wxdraft' | |
| 102 | + | |
| 103 | + export default { | |
| 104 | + name: "wxMaterialSelect", | |
| 105 | + components: { | |
| 106 | + WxNews | |
| 107 | + }, | |
| 108 | + props: { | |
| 109 | + objData: { | |
| 110 | + type: Object, | |
| 111 | + required: true | |
| 112 | + }, | |
| 113 | + //图文类型:1、已发布图文;2、草稿箱图文 | |
| 114 | + newsType:{ | |
| 115 | + type: String, | |
| 116 | + default: "1" | |
| 117 | + }, | |
| 118 | + }, | |
| 119 | + data() { | |
| 120 | + return { | |
| 121 | + tableLoading: false, | |
| 122 | + tableData: [], | |
| 123 | + page: { | |
| 124 | + total: 0, // 总页数 | |
| 125 | + currentPage: 1, // 当前页数 | |
| 126 | + pageSize: 20, // 每页显示多少条 | |
| 127 | + ascs:[],//升序字段 | |
| 128 | + descs:[]//降序字段 | |
| 129 | + }, | |
| 130 | + // tableOptionVoice: tableOptionVoice, | |
| 131 | + // tableOptionVideo: tableOptionVideo, | |
| 132 | + } | |
| 133 | + }, | |
| 134 | + created() { | |
| 135 | + this.getPage(this.page) | |
| 136 | + }, | |
| 137 | + methods:{ | |
| 138 | + selectMaterial(item){ | |
| 139 | + this.$emit('selectMaterial', item) | |
| 140 | + }, | |
| 141 | + getPage(page, params) { | |
| 142 | + this.tableLoading = true | |
| 143 | + if(this.objData.repType == 'news'){ | |
| 144 | + if(this.newsType == '1'){ | |
| 145 | + getPageNews(Object.assign({ | |
| 146 | + current: page.currentPage, | |
| 147 | + size: page.pageSize, | |
| 148 | + appId:this.appId, | |
| 149 | + }, params)).then(response => { | |
| 150 | + let tableData = response.data.items | |
| 151 | + tableData.forEach(item => { | |
| 152 | + item.mediaId = item.articleId | |
| 153 | + item.content.articles = item.content.newsItem | |
| 154 | + }) | |
| 155 | + this.tableData = tableData | |
| 156 | + this.page.total = response.data.totalCount | |
| 157 | + this.page.currentPage = page.currentPage | |
| 158 | + this.page.pageSize = page.pageSize | |
| 159 | + this.tableLoading = false | |
| 160 | + }) | |
| 161 | + }else if(this.newsType == '2'){ | |
| 162 | + getPageNewsDraft(Object.assign({ | |
| 163 | + current: page.currentPage, | |
| 164 | + size: page.pageSize, | |
| 165 | + appId:this.appId, | |
| 166 | + }, params)).then(response => { | |
| 167 | + let tableData = response.data.items | |
| 168 | + tableData.forEach(item => { | |
| 169 | + item.mediaId = item.mediaId | |
| 170 | + item.content.articles = item.content.newsItem | |
| 171 | + }) | |
| 172 | + this.tableData = tableData | |
| 173 | + this.page.total = response.data.totalCount | |
| 174 | + this.page.currentPage = page.currentPage | |
| 175 | + this.page.pageSize = page.pageSize | |
| 176 | + this.tableLoading = false | |
| 177 | + }) | |
| 178 | + } | |
| 179 | + }else{ | |
| 180 | + getPage(Object.assign({ | |
| 181 | + current: page.currentPage, | |
| 182 | + size: page.pageSize, | |
| 183 | + appId:this.appId, | |
| 184 | + type:this.objData.repType | |
| 185 | + }, params)).then(response => { | |
| 186 | + this.tableData = response.data.items | |
| 187 | + this.page.total = response.data.totalCount | |
| 188 | + this.page.currentPage = page.currentPage | |
| 189 | + this.page.pageSize = page.pageSize | |
| 190 | + this.tableLoading = false | |
| 191 | + }) | |
| 192 | + } | |
| 193 | + }, | |
| 194 | + sizeChange(val) { | |
| 195 | + this.page.currentPage = 1 | |
| 196 | + this.page.pageSize = val | |
| 197 | + this.getPage(this.page) | |
| 198 | + }, | |
| 199 | + currentChange(val) { | |
| 200 | + this.page.currentPage = val | |
| 201 | + this.getPage(this.page) | |
| 202 | + }, | |
| 203 | + /** | |
| 204 | + * 刷新回调 | |
| 205 | + */ | |
| 206 | + refreshChange(page) { | |
| 207 | + this.getPage(this.page) | |
| 208 | + } | |
| 209 | + } | |
| 210 | + }; | |
| 211 | +</script> | |
| 212 | + | |
| 213 | +<style lang="scss" scoped> | |
| 214 | + /*瀑布流样式*/ | |
| 215 | + .waterfall { | |
| 216 | + width: 100%; | |
| 217 | + column-gap:10px; | |
| 218 | + column-count: 5; | |
| 219 | + margin: 0 auto; | |
| 220 | + } | |
| 221 | + .waterfall-item { | |
| 222 | + padding: 10px; | |
| 223 | + margin-bottom: 10px; | |
| 224 | + break-inside: avoid; | |
| 225 | + border: 1px solid #eaeaea; | |
| 226 | + } | |
| 227 | + .material-img { | |
| 228 | + width: 100%; | |
| 229 | + } | |
| 230 | + p { | |
| 231 | + line-height: 30px; | |
| 232 | + } | |
| 233 | + @media (min-width: 992px) and (max-width: 1300px) { | |
| 234 | + .waterfall { | |
| 235 | + column-count: 3; | |
| 236 | + } | |
| 237 | + p { | |
| 238 | + color:red; | |
| 239 | + } | |
| 240 | + } | |
| 241 | + @media (min-width: 768px) and (max-width: 991px) { | |
| 242 | + .waterfall { | |
| 243 | + column-count: 2; | |
| 244 | + } | |
| 245 | + p { | |
| 246 | + color: orange; | |
| 247 | + } | |
| 248 | + } | |
| 249 | + @media (max-width: 767px) { | |
| 250 | + .waterfall { | |
| 251 | + column-count: 1; | |
| 252 | + } | |
| 253 | + } | |
| 254 | + /*瀑布流样式*/ | |
| 255 | +</style> | ... | ... |