Commit 73fac5235f0df2d599c6ab54c0c2f8a2e0368a63
1 parent
f48276d2
mp:实现 wx-editor 图片的上传
Showing
6 changed files
with
73 additions
and
7 deletions
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 | } | ... | ... |