
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);
    }
}