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,6 +33,7 @@ public interface ErrorCodeConstants { | ||
| 33 | 33 | ||
| 34 | // ========== 公众号素材 1006004000============ | 34 | // ========== 公众号素材 1006004000============ |
| 35 | ErrorCode MATERIAL_UPLOAD_FAIL = new ErrorCode(1006004000, "上传素材失败,原因:{}"); | 35 | ErrorCode MATERIAL_UPLOAD_FAIL = new ErrorCode(1006004000, "上传素材失败,原因:{}"); |
| 36 | + ErrorCode MATERIAL_IMAGE_UPLOAD_FAIL = new ErrorCode(1006004000, "上传图片失败,原因:{}"); | ||
| 36 | 37 | ||
| 37 | // ========== 公众号消息 1006005000============ | 38 | // ========== 公众号消息 1006005000============ |
| 38 | ErrorCode MESSAGE_SEND_FAIL = new ErrorCode(1006005000, "发送消息失败,原因:{}"); | 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,6 +20,8 @@ import java.io.IOException; | ||
| 20 | 20 | ||
| 21 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 21 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 22 | 22 | ||
| 23 | +// TODO @芋艿:权限 | ||
| 24 | + | ||
| 23 | @Api(tags = "管理后台 - 公众号素材") | 25 | @Api(tags = "管理后台 - 公众号素材") |
| 24 | @RestController | 26 | @RestController |
| 25 | @RequestMapping("/mp/material") | 27 | @RequestMapping("/mp/material") |
| @@ -45,6 +47,13 @@ public class MpMaterialController { | @@ -45,6 +47,13 @@ public class MpMaterialController { | ||
| 45 | return success(MpMaterialConvert.INSTANCE.convert(material)); | 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 | @ApiOperation("获得素材分页") | 57 | @ApiOperation("获得素材分页") |
| 49 | @GetMapping("/page") | 58 | @GetMapping("/page") |
| 50 | public CommonResult<PageResult<MpMaterialRespVO>> getMaterialPage(@Valid MpMaterialPageReqVO pageReqVO) { | 59 | public CommonResult<PageResult<MpMaterialRespVO>> getMaterialPage(@Valid MpMaterialPageReqVO pageReqVO) { |
| @@ -52,4 +61,5 @@ public class MpMaterialController { | @@ -52,4 +61,5 @@ public class MpMaterialController { | ||
| 52 | return success(MpMaterialConvert.INSTANCE.convertPage(pageResult)); | 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,6 +2,7 @@ package cn.iocoder.yudao.module.mp.service.material; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialPageReqVO; | 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 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadPermanentReqVO; | 6 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadPermanentReqVO; |
| 6 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadTemporaryReqVO; | 7 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadTemporaryReqVO; |
| 7 | import cn.iocoder.yudao.module.mp.dal.dataobject.material.MpMaterialDO; | 8 | import cn.iocoder.yudao.module.mp.dal.dataobject.material.MpMaterialDO; |
| @@ -50,6 +51,14 @@ public interface MpMaterialService { | @@ -50,6 +51,14 @@ public interface MpMaterialService { | ||
| 50 | MpMaterialDO uploadPermanentMaterial(@Valid MpMaterialUploadPermanentReqVO reqVO) throws IOException; | 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 | * @param pageReqVO 分页请求 | 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,6 +7,7 @@ import cn.hutool.core.util.StrUtil; | ||
| 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 8 | import cn.iocoder.yudao.module.infra.api.file.FileApi; | 8 | import cn.iocoder.yudao.module.infra.api.file.FileApi; |
| 9 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialPageReqVO; | 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 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadPermanentReqVO; | 11 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadPermanentReqVO; |
| 11 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadTemporaryReqVO; | 12 | import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadTemporaryReqVO; |
| 12 | import cn.iocoder.yudao.module.mp.convert.material.MpMaterialConvert; | 13 | import cn.iocoder.yudao.module.mp.convert.material.MpMaterialConvert; |
| @@ -31,6 +32,7 @@ import java.util.Collection; | @@ -31,6 +32,7 @@ import java.util.Collection; | ||
| 31 | import java.util.List; | 32 | import java.util.List; |
| 32 | 33 | ||
| 33 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 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 | import static cn.iocoder.yudao.module.mp.enums.ErrorCodeConstants.MATERIAL_UPLOAD_FAIL; | 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,6 +146,23 @@ public class MpMaterialServiceImpl implements MpMaterialService { | ||
| 144 | } | 146 | } |
| 145 | 147 | ||
| 146 | @Override | 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 | public PageResult<MpMaterialDO> getMaterialPage(MpMaterialPageReqVO pageReqVO) { | 166 | public PageResult<MpMaterialDO> getMaterialPage(MpMaterialPageReqVO pageReqVO) { |
| 148 | return mpMaterialMapper.selectPage(pageReqVO); | 167 | return mpMaterialMapper.selectPage(pageReqVO); |
| 149 | } | 168 | } |
yudao-ui-admin/src/views/mp/components/wx-editor/WxEditor.vue
| @@ -6,7 +6,7 @@ | @@ -6,7 +6,7 @@ | ||
| 6 | <div id="wxEditor"> | 6 | <div id="wxEditor"> |
| 7 | <div v-loading="quillUpdateImg" element-loading-text="请稍等,图片上传中"> | 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 | :show-file-list="false" :data="uploadData" | 10 | :show-file-list="false" :data="uploadData" |
| 11 | :on-success="uploadSuccess" :on-error="uploadError" :before-upload="beforeUpload"> | 11 | :on-success="uploadSuccess" :on-error="uploadError" :before-upload="beforeUpload"> |
| 12 | </el-upload> | 12 | </el-upload> |
| @@ -95,7 +95,7 @@ export default { | @@ -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 | headers: { Authorization: "Bearer " + getAccessToken() }, // 设置上传的请求头部 | 99 | headers: { Authorization: "Bearer " + getAccessToken() }, // 设置上传的请求头部 |
| 100 | } | 100 | } |
| 101 | }, | 101 | }, |
| @@ -107,31 +107,34 @@ export default { | @@ -107,31 +107,34 @@ export default { | ||
| 107 | 107 | ||
| 108 | // 富文本图片上传前 | 108 | // 富文本图片上传前 |
| 109 | beforeUpload() { | 109 | beforeUpload() { |
| 110 | - // 显示loading动画 | 110 | + // 显示 loading 动画 |
| 111 | this.quillUpdateImg = true | 111 | this.quillUpdateImg = true |
| 112 | }, | 112 | }, |
| 113 | 113 | ||
| 114 | + // 图片上传成功 | ||
| 115 | + // 注意!由于微信公众号的图片有访问限制,所以会显示“此图片来自微信公众号,未经允许不可引用” | ||
| 114 | uploadSuccess(res, file) { | 116 | uploadSuccess(res, file) { |
| 115 | // res为图片服务器返回的数据 | 117 | // res为图片服务器返回的数据 |
| 116 | // 获取富文本组件实例 | 118 | // 获取富文本组件实例 |
| 117 | let quill = this.$refs.myQuillEditor.quill | 119 | let quill = this.$refs.myQuillEditor.quill |
| 118 | // 如果上传成功 | 120 | // 如果上传成功 |
| 119 | - if(res.link){ | 121 | + const link = res.data |
| 122 | + if (link){ | ||
| 120 | // 获取光标所在位置 | 123 | // 获取光标所在位置 |
| 121 | let length = quill.getSelection().index; | 124 | let length = quill.getSelection().index; |
| 122 | // 插入图片 res.info为服务器返回的图片地址 | 125 | // 插入图片 res.info为服务器返回的图片地址 |
| 123 | - quill.insertEmbed(length, 'image', res.link) | 126 | + quill.insertEmbed(length, 'image', link) |
| 124 | // 调整光标到最后 | 127 | // 调整光标到最后 |
| 125 | quill.setSelection(length + 1) | 128 | quill.setSelection(length + 1) |
| 126 | } else { | 129 | } else { |
| 127 | this.$message.error('图片插入失败') | 130 | this.$message.error('图片插入失败') |
| 128 | } | 131 | } |
| 129 | - // loading动画消失 | 132 | + // loading 动画消失 |
| 130 | this.quillUpdateImg = false; | 133 | this.quillUpdateImg = false; |
| 131 | }, | 134 | }, |
| 132 | // 富文本图片上传失败 | 135 | // 富文本图片上传失败 |
| 133 | uploadError() { | 136 | uploadError() { |
| 134 | - // loading动画消失 | 137 | + // loading 动画消失 |
| 135 | this.quillUpdateImg = false; | 138 | this.quillUpdateImg = false; |
| 136 | this.$message.error("图片插入失败"); | 139 | this.$message.error("图片插入失败"); |
| 137 | } | 140 | } |