当前位置: 首页 > news >正文

黑马头条_SpringCloud项目阶段四:多媒体短文章提交功能实现详解

gitee地址:https://gitee.com/whltaoin_admin/hmtt_cloud-project.git
版本:8f8a9f0984e77680085fdbbb386e7a0b0de69099

需求

  1. 功能:
    1. 可以定时发布
    2. 当封面为选为自动时,封面图片为文章中的图片
      1. 内容中没有图片,该文章为无图封面
      2. 大于1小于3,为单图
      3. 大于等于三:三张图

表结构分析

  1. 本功能需要使用到三张表
    1. wm_material 素材表
    2. wm_news 文章表
    3. wm_new_material 文章素材关系表

  1. 关系
    1. 文章和文章素材表:一对多
    2. 素材和文章素材表:一对多
    3. 文章表和素材表:多对多

实现思路

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);}}
  • 完成提交
http://www.dtcms.com/a/392248.html

相关文章:

  • TraceID串联数据孤岛:勤源全链路可观测性平台破解微服务“黑箱困境”
  • 随机梯度下降(SGD)算法及其在机器学习中的应用
  • 趣谈bug - the Norway problem
  • $attrs 和 $listeners 的使用场景和用法是什么?
  • [Linux]学习笔记系列 -- lib/radix-tree.c 基数树(Radix Tree) 整数键到指针的高效映射
  • Scikit-learn Python机器学习 - 回归分析算法 - 线性回归 (LinearRegression SGDRegressor)
  • ts的内置工具类型
  • 扫地车:守护多元场景的清洁 “多面手”
  • 力扣 136.只出现一次的数字
  • 【序列晋升】38 Spring Data MongoDB 的统一数据访问范式与实践
  • 如何将枯燥的大数据呈现为可视化的图和动画?
  • 前后端分离架构下,如何安全存储和使用 API 密钥?
  • Nano 编辑器快捷键
  • 《智能体教程》——如何构建多智能体系统:开发者实用指南
  • 小杰机器学习高级(three)——逻辑回归、二分类算法
  • Spring注解驱动开发:从XML到注解的完美蜕变
  • 【Spring AI】第三弹:深入解析 RAG 核心特性、关键流程、基于 Spring AI + 知识库实现 RAG 检索增强器
  • 【剪映】官方下载方式?【图文详解】电脑版下载?正版安全下载?最新版下载?
  • 《UE5_C++多人TPS完整教程》学习笔记56 ——《P57 未装备武器的蹲伏(Crouch Unequipped)》
  • AI人工智能训练师五级(初级)考试题库(1)1~100题
  • 【Python精讲 02】编程第一课:彻底掌握Python变量、数字、字符串与布尔值
  • Unity2D-Sprite
  • 本地实现视频分析与总结工具
  • Vue 开发常见报错及解决方案指南
  • Linux 进程状态
  • 基于自然语言处理的文本敏感内容检测系统的设计与实现
  • JDBC小白入门项目创建 IDEA 空项目+模块配置 JavaWeb MySQL
  • 笔记 Docker(离线)安装(24.0.9)
  • Docker-Android+cpolar:移动开发的环境革命
  • uniapp首先对战匹配简单实现