首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringCloud项目阶段四:多媒体短文章提交功能实现详解

SpringCloud项目阶段四:多媒体短文章提交功能实现详解

作者头像
varin
发布2025-09-28 13:12:10
发布2025-09-28 13:12:10
10900
代码可运行
举报
文章被收录于专栏:/root/root
运行总次数:0
代码可运行

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

前端提交后端格式

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
@PostMapping("/submit")
public ResponseResult submit(@RequestBody WmNewsDto wmNewsPageReqDto){
    return wmNewsService.submit(wmNewsPageReqDto);
}

ServiceImp

实现步骤:

代码语言:javascript
代码运行次数:0
运行
复制
    // 条件判断dot是否为null或者dto中的内容是否为null

    // 1保存或修改文章

    // 2 判断是否为草稿,如果是草稿结束方法

    // 3 不是草稿,保存文章内容图片和素材的关系

    // 4 不是草稿,保存文章封面图片和素材的关系
代码语言:javascript
代码运行次数:0
运行
复制
   /**
     * 文章提交
     * @param wmNewsPageReqDto
     * @return
     */

    @Override
    public ResponseResult submit(WmNewsDto wmNewsPageReqDto) {


         // 条件判断dot是否为null或者dto中的内容是否为null
        // 1保存或修改文章
        // 2 判断是否为草稿,如果是草稿结束方法
        // 3 不是草稿,保存文章内容图片和素材的关系
        // 4 不是草稿,保存嗯栈封面图片和素材的关系
        return null;
    }

新增或修改功能实现

代码语言:javascript
代码运行次数:0
运行
复制
/* 文章提交
     * @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);
}
}

判断是否为草稿

代码语言:javascript
代码运行次数:0
运行
复制
// 2 判断是否为草稿,如果是草稿结束方法

if (dto.getStatus().equals(WmNews.Status.NORMAL.getCode())) {
    // 成功返回
    return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}

保存文章内容图片和素材的关系

代码语言:javascript
代码运行次数:0
运行
复制
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;
}

保存文章封面图片和素材的关系

代码语言:javascript
代码运行次数:0
运行
复制
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);
    }

}
  • 完成提交
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求
  • 表结构分析
  • 实现思路
  • 接口定义
  • Dto
  • Controller
  • ServiceImp
  • 新增或修改功能实现
  • 判断是否为草稿
  • 保存文章内容图片和素材的关系
  • 保存文章封面图片和素材的关系
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档