Commit 73fac5235f0df2d599c6ab54c0c2f8a2e0368a63

Authored by YunaiV
1 parent f48276d2

mp:实现 wx-editor 图片的上传

yudao-module-mp/yudao-module-mp-api/src/main/java/cn/iocoder/yudao/module/mp/enums/ErrorCodeConstants.java
... ... @@ -33,6 +33,7 @@ public interface ErrorCodeConstants {
33 33  
34 34 // ========== 公众号素材 1006004000============
35 35 ErrorCode MATERIAL_UPLOAD_FAIL = new ErrorCode(1006004000, "上传素材失败,原因:{}");
  36 + ErrorCode MATERIAL_IMAGE_UPLOAD_FAIL = new ErrorCode(1006004000, "上传图片失败,原因:{}");
36 37  
37 38 // ========== 公众号消息 1006005000============
38 39 ErrorCode MESSAGE_SEND_FAIL = new ErrorCode(1006005000, "发送消息失败,原因:{}");
... ...
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/material/MpMaterialController.java
... ... @@ -20,6 +20,8 @@ import java.io.IOException;
20 20  
21 21 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
22 22  
  23 +// TODO @芋艿:权限
  24 +
23 25 @Api(tags = "管理后台 - 公众号素材")
24 26 @RestController
25 27 @RequestMapping("/mp/material")
... ... @@ -45,6 +47,13 @@ public class MpMaterialController {
45 47 return success(MpMaterialConvert.INSTANCE.convert(material));
46 48 }
47 49  
  50 + @ApiOperation("上传图文内容中的图片")
  51 + @PostMapping("/upload-news-image")
  52 + public CommonResult<String> uploadNewsImage(@Valid MpMaterialUploadNewsImageReqVO reqVO)
  53 + throws IOException {
  54 + return success(mpMaterialService.uploadNewsImage(reqVO));
  55 + }
  56 +
48 57 @ApiOperation("获得素材分页")
49 58 @GetMapping("/page")
50 59 public CommonResult<PageResult<MpMaterialRespVO>> getMaterialPage(@Valid MpMaterialPageReqVO pageReqVO) {
... ... @@ -52,4 +61,5 @@ public class MpMaterialController {
52 61 return success(MpMaterialConvert.INSTANCE.convertPage(pageResult));
53 62 }
54 63  
  64 +
55 65 }
... ...
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/material/vo/MpMaterialUploadNewsImageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mp.controller.admin.material.vo;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonIgnore;
  4 +import io.swagger.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
  6 +import lombok.Data;
  7 +import org.springframework.web.multipart.MultipartFile;
  8 +
  9 +import javax.validation.constraints.NotNull;
  10 +
  11 +@ApiModel("管理后台 - 公众号素材上传图文内容中的图片 Request VO")
  12 +@Data
  13 +public class MpMaterialUploadNewsImageReqVO {
  14 +
  15 + @ApiModelProperty(value = "公众号账号的编号", required = true, example = "2048")
  16 + @NotNull(message = "公众号账号的编号不能为空")
  17 + private Long accountId;
  18 +
  19 + @ApiModelProperty(value = "文件附件", required = true)
  20 + @NotNull(message = "文件不能为空")
  21 + @JsonIgnore // 避免被操作日志,进行序列化,导致报错
  22 + private MultipartFile file;
  23 +
  24 +}
... ...
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/material/MpMaterialService.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mp.service.material;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialPageReqVO;
  5 +import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadNewsImageReqVO;
5 6 import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadPermanentReqVO;
6 7 import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadTemporaryReqVO;
7 8 import cn.iocoder.yudao.module.mp.dal.dataobject.material.MpMaterialDO;
... ... @@ -50,6 +51,14 @@ public interface MpMaterialService {
50 51 MpMaterialDO uploadPermanentMaterial(@Valid MpMaterialUploadPermanentReqVO reqVO) throws IOException;
51 52  
52 53 /**
  54 + * 上传图文内容中的图片
  55 + *
  56 + * @param reqVO 上传请求
  57 + * @return 图片地址
  58 + */
  59 + String uploadNewsImage(MpMaterialUploadNewsImageReqVO reqVO) throws IOException;
  60 +
  61 + /**
53 62 * 获得素材分页
54 63 *
55 64 * @param pageReqVO 分页请求
... ...
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/material/MpMaterialServiceImpl.java
... ... @@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
7 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 8 import cn.iocoder.yudao.module.infra.api.file.FileApi;
9 9 import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialPageReqVO;
  10 +import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadNewsImageReqVO;
10 11 import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadPermanentReqVO;
11 12 import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadTemporaryReqVO;
12 13 import cn.iocoder.yudao.module.mp.convert.material.MpMaterialConvert;
... ... @@ -31,6 +32,7 @@ import java.util.Collection;
31 32 import java.util.List;
32 33  
33 34 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  35 +import static cn.iocoder.yudao.module.mp.enums.ErrorCodeConstants.MATERIAL_IMAGE_UPLOAD_FAIL;
34 36 import static cn.iocoder.yudao.module.mp.enums.ErrorCodeConstants.MATERIAL_UPLOAD_FAIL;
35 37  
36 38 /**
... ... @@ -144,6 +146,23 @@ public class MpMaterialServiceImpl implements MpMaterialService {
144 146 }
145 147  
146 148 @Override
  149 + public String uploadNewsImage(MpMaterialUploadNewsImageReqVO reqVO) throws IOException {
  150 + WxMpService mpService = mpServiceFactory.getRequiredMpService(reqVO.getAccountId());
  151 + File file = null;
  152 + try {
  153 + // 写入到临时文件
  154 + file = FileUtil.newFile(FileUtil.getTmpDirPath() + reqVO.getFile().getOriginalFilename());
  155 + reqVO.getFile().transferTo(file);
  156 + // 上传到公众号
  157 + return mpService.getMaterialService().mediaImgUpload(file).getUrl();
  158 + } catch (WxErrorException e) {
  159 + throw exception(MATERIAL_IMAGE_UPLOAD_FAIL, e.getError().getErrorMsg());
  160 + } finally {
  161 + FileUtil.del(file);
  162 + }
  163 + }
  164 +
  165 + @Override
147 166 public PageResult<MpMaterialDO> getMaterialPage(MpMaterialPageReqVO pageReqVO) {
148 167 return mpMaterialMapper.selectPage(pageReqVO);
149 168 }
... ...
yudao-ui-admin/src/views/mp/components/wx-editor/WxEditor.vue
... ... @@ -6,7 +6,7 @@
6 6 <div id="wxEditor">
7 7 <div v-loading="quillUpdateImg" element-loading-text="请稍等,图片上传中">
8 8 <!-- 图片上传组件辅助-->
9   - <el-upload class="avatar-uploader" name="file" :action="serverUrl" :headers="header"
  9 + <el-upload class="avatar-uploader" name="file" :action="actionUrl" :headers="headers"
10 10 :show-file-list="false" :data="uploadData"
11 11 :on-success="uploadSuccess" :on-error="uploadError" :before-upload="beforeUpload">
12 12 </el-upload>
... ... @@ -95,7 +95,7 @@ export default {
95 95 }
96 96 }
97 97 },
98   - serverUrl: process.env.VUE_APP_BASE_API +'/wxmaterial/newsImgUpload', // 这里写你要上传的图片服务器地址
  98 + actionUrl: process.env.VUE_APP_BASE_API +'/admin-api/mp/material/upload-news-image', // 这里写你要上传的图片服务器地址
99 99 headers: { Authorization: "Bearer " + getAccessToken() }, // 设置上传的请求头部
100 100 }
101 101 },
... ... @@ -107,31 +107,34 @@ export default {
107 107  
108 108 // 富文本图片上传前
109 109 beforeUpload() {
110   - // 显示loading动画
  110 + // 显示 loading 动画
111 111 this.quillUpdateImg = true
112 112 },
113 113  
  114 + // 图片上传成功
  115 + // 注意!由于微信公众号的图片有访问限制,所以会显示“此图片来自微信公众号,未经允许不可引用”
114 116 uploadSuccess(res, file) {
115 117 // res为图片服务器返回的数据
116 118 // 获取富文本组件实例
117 119 let quill = this.$refs.myQuillEditor.quill
118 120 // 如果上传成功
119   - if(res.link){
  121 + const link = res.data
  122 + if (link){
120 123 // 获取光标所在位置
121 124 let length = quill.getSelection().index;
122 125 // 插入图片 res.info为服务器返回的图片地址
123   - quill.insertEmbed(length, 'image', res.link)
  126 + quill.insertEmbed(length, 'image', link)
124 127 // 调整光标到最后
125 128 quill.setSelection(length + 1)
126 129 } else {
127 130 this.$message.error('图片插入失败')
128 131 }
129   - // loading动画消失
  132 + // loading 动画消失
130 133 this.quillUpdateImg = false;
131 134 },
132 135 // 富文本图片上传失败
133 136 uploadError() {
134   - // loading动画消失
  137 + // loading 动画消失
135 138 this.quillUpdateImg = false;
136 139 this.$message.error("图片插入失败");
137 140 }
... ...