黑马头条_SpringCloud项目阶段四:多媒体短文章提交功能实现详解
gitee地址:https://gitee.com/whltaoin_admin/hmtt_cloud-project.git
版本:8f8a9f0984e77680085fdbbb386e7a0b0de69099
需求
- 功能:
- 可以定时发布
- 当封面为选为自动时,封面图片为文章中的图片
- 内容中没有图片,该文章为无图封面
- 大于1小于3,为单图
- 大于等于三:三张图
表结构分析
- 本功能需要使用到三张表
- wm_material 素材表
- wm_news 文章表
- wm_new_material 文章素材关系表
- 关系
- 文章和文章素材表:一对多
- 素材和文章素材表:一对多
- 文章表和素材表:多对多
实现思路
1.前端提交发布或保存为草稿
2.后台判断请求中是否包含了文章id
3.如果不包含id,则为新增
3.1 执行新增文章的操作
3.2 关联文章内容图片与素材的关系
3.3 关联文章封面图片与素材的关系
4.如果包含了id,则为修改请求
4.1 删除该文章与素材的所有关系
4.2 执行修改操作
4.3 关联文章内容图片与素材的关系
4.4 关联文章封面图片与素材的关系
接口定义
说明 | |
---|---|
接口路径 | /api/v1/news/submit |
请求方式 | POST |
参数 | WmNewsDto |
响应结果 | ResponseResult |
返回结果:
Dto
前端提交后端格式
package com.heima.model.wemedia.dtos;import lombok.Data;import java.util.Date;
import java.util.List;@Data
public class WmNewsDto {private Integer id;/*** 标题*/private String title;/*** 频道id*/private Integer channelId;/*** 标签*/private String labels;/*** 发布时间*/private Date publishTime;/*** 文章内容*/private String content;/*** 文章封面类型 0 无图 1 单图 3 多图 -1 自动*/private Short type;/*** 提交时间*/private Date submitedTime; /*** 状态 提交为1 草稿为0*/private Short status;/*** 封面图片列表 多张图以逗号隔开*/private List<String> images;
}
后端需要接收的json
Controller
@PostMapping("/submit")
public ResponseResult submit(@RequestBody WmNewsDto wmNewsPageReqDto){return wmNewsService.submit(wmNewsPageReqDto);
}
ServiceImp
实现步骤:
// 条件判断dot是否为null或者dto中的内容是否为null// 1保存或修改文章// 2 判断是否为草稿,如果是草稿结束方法// 3 不是草稿,保存文章内容图片和素材的关系// 4 不是草稿,保存文章封面图片和素材的关系
/*** 文章提交* @param wmNewsPageReqDto* @return*/@Overridepublic ResponseResult submit(WmNewsDto wmNewsPageReqDto) {// 条件判断dot是否为null或者dto中的内容是否为null// 1保存或修改文章// 2 判断是否为草稿,如果是草稿结束方法// 3 不是草稿,保存文章内容图片和素材的关系// 4 不是草稿,保存嗯栈封面图片和素材的关系return null;}
新增或修改功能实现
/* 文章提交* @param dto* @return*/@Override
public ResponseResult submit(WmNewsDto dto) {// // 条件判断dot是否为null或者dto中的内容是否为null
if (dto==null || dto.getContent()==null) {// 返回提示无效参数return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
// 1保存或修改文章WmNews wmNews = new WmNews();
try {// 部分属性属性拷贝BeanUtils.copyProperties(dto,wmNews);} catch (IllegalAccessException e) {throw new RuntimeException(e);
} catch (InvocationTargetException e) {throw new RuntimeException(e);
}// 判断是否存储图片
if (dto.getImages()!=null && dto.getImages().size()>0) {String join = StringUtils.join(",", dto.getImages());System.out.println("=========");System.out.println(join);System.out.println("=======");wmNews.setImages(join);
}if (dto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)) {dto.setType(null);
}
saveOrUpdateWmNews(wmNews);// 2 判断是否为草稿,如果是草稿结束方法
// 3 不是草稿,保存文章内容图片和素材的关系
// 4 不是草稿,保存嗯栈封面图片和素材的关系
return null;
}
@Autowired
private WmNewsMaterialMapper wmNewsMaterialMapper;
/*** 提交或更新文章* @param wmNews*/
private void saveOrUpdateWmNews(WmNews wmNews) {
wmNews.setUserId(WmThreadLoadUtil.getWmUser().getId());
wmNews.setCreatedTime(new Date());
wmNews.setPublishTime(new Date());
wmNews.setEnable((short)1); // 默认为发布
// 判断是新增还是修改
if (wmNews.getId() !=null) {save(wmNews);}else{// 删除文章和素材的关系wmNewsMaterialMapper.delete(Wrappers.<WmNewsMaterial>lambdaQuery().eq(WmNewsMaterial::getNewsId,wmNews.getId()));updateById(wmNews);
}
}
判断是否为草稿
// 2 判断是否为草稿,如果是草稿结束方法if (dto.getStatus().equals(WmNews.Status.NORMAL.getCode())) {// 成功返回return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
保存文章内容图片和素材的关系
private void saveNewMaterial(List<String> imageList, Integer id, Short type) {// 判断图片不为空和nullif (imageList!=null && imageList.size()>0) {// 通过图表url查询素材idList<WmMaterial> wmNewsMaterials = wmMaterialMapper.selectList(Wrappers.<WmMaterial>lambdaQuery().in(WmMaterial::getUrl, imageList));System.out.println(wmNewsMaterials);//判断是否查询到id,查询到的数量是否一致/*** imageList.size()!=wmNewsMaterials.size() 需要解决问题:一篇文章连续使用同一张图片,查询会出现不一致的情况* list = list.stream().distinct().collect(Collectors.toList());*/int images = imageList.stream().distinct().collect(Collectors.toList()).size();if (wmNewsMaterials==null || wmNewsMaterials.size()==0 || images != wmNewsMaterials.size() ) {throw new CustomException(AppHttpCodeEnum.MATERIASL_REFERENCE_FAIL);}// 提取素材Id列表List<Integer> idList = wmNewsMaterials.stream().map(WmMaterial::getId).collect(Collectors.toList());//批量保存wmNewsMaterialMapper.saveRelations(idList,id,type);}
}// 提取文章图片
private List<String> getContentImage(String content) {
List<Map> maps = JSON.parseArray(content, Map.class);System.out.println(maps);
List<String> imageList = new ArrayList<>();for(Map map: maps){if (map.get("type").equals("image")) {imageList.add((String) map.get("value"));}
}System.out.println(imageList);
return imageList;
}
保存文章封面图片和素材的关系
private void saveMaterialForCover(WmNewsDto dto, WmNews wmNews, List<String> imageList) {List<String> images = dto.getImages();// 判断自动if (dto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)) {if (imageList.size()>=3) {wmNews.setType(WemediaConstants.WM_NEWS_MANY_IMAGE);images = imageList.stream().limit(3).collect(Collectors.toList());}else if(imageList.size()>=1 && imageList.size()<3){wmNews.setType(WemediaConstants.WM_NEWS_SINGLE_IMAGE);images = imageList.stream().limit(1).collect(Collectors.toList());}else{wmNews.setType(WemediaConstants.WM_NEWS_NONE_IMAGE);}}if (images !=null && images.size()!=0) {wmNews.setImages(StringUtils.join(",", images));}// 更新文章状态updateById(wmNews);if (images !=null && images.size()!=0) {// 存入news——material表中,标记为封面saveNewMaterial(images, wmNews.getId(), WemediaConstants.WM_COVER_REFERENCE);}}
- 完成提交