gitee地址:https://gitee.com/whltaoin_admin/hmtt_cloud-project.git 版本:8f8a9f0984e77680085fdbbb386e7a0b0de69099
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 |
返回结果:
前端提交后端格式
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
@PostMapping("/submit")
public ResponseResult submit(@RequestBody WmNewsDto wmNewsPageReqDto){
return wmNewsService.submit(wmNewsPageReqDto);
}
实现步骤:
// 条件判断dot是否为null或者dto中的内容是否为null
// 1保存或修改文章
// 2 判断是否为草稿,如果是草稿结束方法
// 3 不是草稿,保存文章内容图片和素材的关系
// 4 不是草稿,保存文章封面图片和素材的关系
/**
* 文章提交
* @param wmNewsPageReqDto
* @return
*/
@Override
public 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) {
// 判断图片不为空和null
if (imageList!=null && imageList.size()>0) {
// 通过图表url查询素材id
List<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);
}
}