|
@@ -0,0 +1,405 @@
|
|
|
|
|
+package com.zhaozhaonews.wemedia.service.impl;
|
|
|
|
|
+
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
|
+import com.zhaozhaonews.common.constants.WemediaConstants;
|
|
|
|
|
+import com.zhaozhaonews.common.exception.CustomException;
|
|
|
|
|
+import com.zhaozhaonews.model.common.dto.PageResponseResult;
|
|
|
|
|
+import com.zhaozhaonews.model.common.dto.ResponseResult;
|
|
|
|
|
+import com.zhaozhaonews.model.common.enums.AppHttpCodeEnum;
|
|
|
|
|
+import com.zhaozhaonews.model.wemedia.dto.WmNewsDto;
|
|
|
|
|
+import com.zhaozhaonews.model.wemedia.dto.WmNewsPageReqDto;
|
|
|
|
|
+import com.zhaozhaonews.model.wemedia.entity.WmMaterial;
|
|
|
|
|
+import com.zhaozhaonews.model.wemedia.entity.WmNews;
|
|
|
|
|
+import com.zhaozhaonews.model.wemedia.entity.WmNewsMaterial;
|
|
|
|
|
+import com.zhaozhaonews.model.wemedia.entity.WmUser;
|
|
|
|
|
+import com.zhaozhaonews.util.thread.WmThreadLocalUtil;
|
|
|
|
|
+import com.zhaozhaonews.wemedia.mapper.WmMaterialMapper;
|
|
|
|
|
+import com.zhaozhaonews.wemedia.mapper.WmNewsMapper;
|
|
|
|
|
+import com.zhaozhaonews.wemedia.mapper.WmNewsMaterialMapper;
|
|
|
|
|
+import com.zhaozhaonews.wemedia.service.WmNewsService;
|
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+import org.apache.commons.lang.StringUtils;
|
|
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
+
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
|
+import java.util.Date;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+import java.util.Map;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 自媒体文章信息 Service 实现类
|
|
|
|
|
+ *
|
|
|
|
|
+ * @author zhaozhaonews
|
|
|
|
|
+ * @description 针对表 wm_news 的业务逻辑实现
|
|
|
|
|
+ * @create 2026/5/10
|
|
|
|
|
+ */
|
|
|
|
|
+@Slf4j
|
|
|
|
|
+@Service
|
|
|
|
|
+@Transactional
|
|
|
|
|
+public class WmNewsServiceImpl extends ServiceImpl<WmNewsMapper, WmNews> implements WmNewsService {
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 查询所有文章(多条件筛选)
|
|
|
|
|
+ * 条件拼接规则:
|
|
|
|
|
+ * 所有查询条件都是“可选”的,前端传什么,就过滤什么
|
|
|
|
|
+ * LambdaQueryWrapper<WmNews> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ * 它支持链式调用,可以动态拼接SQL语句
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param dto 查询条件
|
|
|
|
|
+ * @return 分页结果
|
|
|
|
|
+ */
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public ResponseResult findAll(WmNewsPageReqDto dto) {
|
|
|
|
|
+ //1、参数校验
|
|
|
|
|
+ if (dto == null) {
|
|
|
|
|
+ return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID); //参数无效
|
|
|
|
|
+ }
|
|
|
|
|
+ //2、校验并初始化分页参数
|
|
|
|
|
+ dto.checkParam();
|
|
|
|
|
+
|
|
|
|
|
+ //3、获取当前登录用户
|
|
|
|
|
+ WmUser user = WmThreadLocalUtil.getUser();
|
|
|
|
|
+ if (user == null) {
|
|
|
|
|
+ return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN); //需要登录
|
|
|
|
|
+ }
|
|
|
|
|
+ //4、创建分页对象
|
|
|
|
|
+ Page<WmNews> page = new Page<>(dto.getPage(), dto.getSize());
|
|
|
|
|
+
|
|
|
|
|
+ //5、构建动态查询条件
|
|
|
|
|
+ LambdaQueryWrapper<WmNews> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+
|
|
|
|
|
+ //条件1:按照状态筛选 status不为空的时候就添加
|
|
|
|
|
+ if (dto.getStatus() != null) {
|
|
|
|
|
+ // WHERE status = ?
|
|
|
|
|
+ queryWrapper.eq(WmNews::getStatus, dto.getStatus());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //条件2:按照关键字筛选 keyword不为空的时候就添加
|
|
|
|
|
+ if (StringUtils.isNotBlank(dto.getKeyword())) {
|
|
|
|
|
+ // WHERE title LIKE ?
|
|
|
|
|
+ queryWrapper.like(WmNews::getTitle, dto.getKeyword());
|
|
|
|
|
+ }
|
|
|
|
|
+ //条件3:按照发布时间筛选 发布开始时间(范围查询起始时间)和发布结束时间(范围查询结束时间)都不为空时添加 BETWEEN
|
|
|
|
|
+ if (dto.getBeginPubDate() != null && dto.getEndPubDate() != null) {
|
|
|
|
|
+ // WHERE publish_time BETWEEN ? AND ?
|
|
|
|
|
+ queryWrapper.between(WmNews::getPublishTime, dto.getBeginPubDate(), dto.getEndPubDate());
|
|
|
|
|
+ }
|
|
|
|
|
+ //条件4: 按照频道实现 channelId不为空的时候就添加
|
|
|
|
|
+ if (dto.getChannelId() != null) {
|
|
|
|
|
+ // WHERE channel_id = ?
|
|
|
|
|
+ queryWrapper.eq(WmNews::getChannelId, dto.getChannelId());
|
|
|
|
|
+ }
|
|
|
|
|
+ //条件5:用户隔离,只查询当前登录用户的新闻
|
|
|
|
|
+ queryWrapper.eq(WmNews::getUserId, user.getId());
|
|
|
|
|
+
|
|
|
|
|
+ //排序:按照创建时间降序排列
|
|
|
|
|
+ queryWrapper.orderByDesc(WmNews::getCreatedTime);
|
|
|
|
|
+
|
|
|
|
|
+ //6、执行分页查询
|
|
|
|
|
+ // SELECT * FROM wm_news WHERE suer_id = ? AND ...... ORDER BY 创建时间 DESC LIMIT ?,?
|
|
|
|
|
+ page = page(page, queryWrapper);
|
|
|
|
|
+
|
|
|
|
|
+ //7、构建分页响应结果
|
|
|
|
|
+ PageResponseResult result = new PageResponseResult(
|
|
|
|
|
+ dto.getPage(), // 当前页码
|
|
|
|
|
+ dto.getSize(), //每页大小
|
|
|
|
|
+ (int) page.getTotal()//总条数
|
|
|
|
|
+ );
|
|
|
|
|
+ result.setData(page.getRecords()); //数据列表
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 根据id查询文章
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param id 文章id
|
|
|
|
|
+ * @return 文章详情
|
|
|
|
|
+ */
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public ResponseResult findById(Integer id) {
|
|
|
|
|
+ if (id == null) {
|
|
|
|
|
+ return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
|
|
|
|
|
+ }
|
|
|
|
|
+ WmUser user = WmThreadLocalUtil.getUser();
|
|
|
|
|
+ if (user == null) {
|
|
|
|
|
+ return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
|
|
|
|
|
+ }
|
|
|
|
|
+ WmNews wmNews = baseMapper.selectById(id);
|
|
|
|
|
+ if (wmNews == null) {
|
|
|
|
|
+ return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!wmNews.getUserId().equals(user.getId())) {
|
|
|
|
|
+ return ResponseResult.errorResult(AppHttpCodeEnum.NO_PERMISSION);
|
|
|
|
|
+ }
|
|
|
|
|
+ return ResponseResult.okResult(wmNews);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 发布/修改新闻 或 保存草稿
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param dto 新闻提交的数据
|
|
|
|
|
+ * @return 操作结果
|
|
|
|
|
+ */
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public ResponseResult submitNews(WmNewsDto dto) {
|
|
|
|
|
+ //1、入参校验
|
|
|
|
|
+ if (dto == null || StringUtils.isBlank(dto.getTitle()) || StringUtils.isBlank(dto.getContent())) {
|
|
|
|
|
+ return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID); //参数无效
|
|
|
|
|
+ }
|
|
|
|
|
+ //2、DTO --copy--> Entity
|
|
|
|
|
+ WmNews wmNews = new WmNews();
|
|
|
|
|
+ BeanUtils.copyProperties(dto, wmNews);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ //3、处理封面图片(无图、单图、三图)
|
|
|
|
|
+ // 数据库longtext是用于存储超长文本的数据类型,最大容量4GB,而varchar是用于存储较短的文本数据,最大容量是65535个字节。
|
|
|
|
|
+ // 所以,如果需要存储的文本数据超过了varchar的最大容量,那么就需要使用longtext数据类型。
|
|
|
|
|
+ if (dto.getImages() != null && dto.getImages().size() > 0) {
|
|
|
|
|
+ //把list里面的元素用逗号拼接,然后放到images中
|
|
|
|
|
+ String imageStr = StringUtils.join(dto.getImages(), ",");
|
|
|
|
|
+ //最后 赋值
|
|
|
|
|
+ wmNews.setImages(imageStr);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ //4、处理自动封面类型
|
|
|
|
|
+ //如果前端选择的是自动封面,就先把type设置为null
|
|
|
|
|
+ //后续再根据新闻内容的图片数量进行设定
|
|
|
|
|
+ if (dto.getType() != null && dto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)) {
|
|
|
|
|
+ wmNews.setType(null);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ //5、处理文章内容--保存/修改到数据库
|
|
|
|
|
+ saveOrUpdateWmNews(wmNews);
|
|
|
|
|
+
|
|
|
|
|
+ //6、判断是否为草稿,是草稿,就结束流程。
|
|
|
|
|
+ if (dto.getStatus() != null && dto.getStatus().equals(WmNews.Status.NORMAL.getCode())) {
|
|
|
|
|
+ return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //7、不是草稿,处理素材关联
|
|
|
|
|
+ List<String> materials = getImageUrl4Content(dto.getContent());
|
|
|
|
|
+ //7.1 内容图片关联素材
|
|
|
|
|
+ log.info("submitNews---->素材列表----->{}", materials);
|
|
|
|
|
+ log.info("submitNews---->素材列表长度----->{}",materials.size());
|
|
|
|
|
+ saveRelationalInfoForContent(materials, wmNews.getId());
|
|
|
|
|
+ //7.2 封面图片关联素材
|
|
|
|
|
+ saveRelationalInfoForCover(dto, wmNews, materials);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 保存封面图片和素材的关联关系(包含自动封面类型匹配)
|
|
|
|
|
+ * - 我们是把两个功能合并到一起
|
|
|
|
|
+ * |- 1、自动匹配封面类型 比如 dto.type = -1
|
|
|
|
|
+ * |- 2、保存封面图片和素材的关联关系
|
|
|
|
|
+ * 自动匹配的策略:
|
|
|
|
|
+ * - 内容没图片,就无图 type=0
|
|
|
|
|
+ * - 内容图片 < 3 张,就单图 type=1
|
|
|
|
|
+ * - 内容图片>= 3 张,就三图 type=3
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param dto 前端传过来的新闻数据
|
|
|
|
|
+ * @param wmNews 已经保存的新闻实体
|
|
|
|
|
+ * @param materials 从内容中提取出来的图片url列表
|
|
|
|
|
+ */
|
|
|
|
|
+ private void saveRelationalInfoForCover(WmNewsDto dto, WmNews wmNews, List<String> materials) {
|
|
|
|
|
+ //前端传过来的封面图片列表 (可能为null)
|
|
|
|
|
+ List<String> images = dto.getImages();
|
|
|
|
|
+
|
|
|
|
|
+ //1、自动封装类型匹配
|
|
|
|
|
+ //判断 当前端设置了type= -1 的时候
|
|
|
|
|
+ if (dto.getType() != null && dto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)) {
|
|
|
|
|
+ //规则1、内容图片>= 3 张,就三图 type=3
|
|
|
|
|
+ if (materials != null && materials.size() >= 3) {
|
|
|
|
|
+ //取内容中的前3张图片作为封面
|
|
|
|
|
+ images = materials.subList(0, 3);
|
|
|
|
|
+ }
|
|
|
|
|
+ //规则2、内容图片 < 3 张,就单图 type=1
|
|
|
|
|
+ else if (materials != null && materials.size() >= 1) {
|
|
|
|
|
+ //设置封面的类型为单图
|
|
|
|
|
+ wmNews.setType(WemediaConstants.WM_NEWS_SINGLE_IMAGE);
|
|
|
|
|
+ //取内容中的第一张图片作为封面
|
|
|
|
|
+ images = materials.subList(0, 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ //规则3、内容没图片,就无图 type=0
|
|
|
|
|
+ else {
|
|
|
|
|
+ //设置封面的类型为无图
|
|
|
|
|
+ wmNews.setType(WemediaConstants.WM_NEWS_NONE_IMAGE);
|
|
|
|
|
+ }
|
|
|
|
|
+ //更新封面类型到数据库中
|
|
|
|
|
+ if(images !=null && images.size()>0){
|
|
|
|
|
+ wmNews.setImages(StringUtils.join(images, ","));
|
|
|
|
|
+ }
|
|
|
|
|
+ //更新
|
|
|
|
|
+ updateById(wmNews);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //2、保存封面图片和素材的关联关系
|
|
|
|
|
+ //如果有图片,就建立关系
|
|
|
|
|
+ if (images!=null && images.size()>0) {
|
|
|
|
|
+ //保存图片和素材关系的方法
|
|
|
|
|
+ saveRelationalInfo(images,wmNews.getId(),WemediaConstants.WM_COVER_REFERENCE);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private WmMaterialMapper weMaterialMapper;
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 保存图片和素材关系的方法
|
|
|
|
|
+ * 这个方法被两个上层方法调用:
|
|
|
|
|
+ * |-saveRelationalInfoForCover() 保存封面图片和素材关系的方法
|
|
|
|
|
+ * |-saveRelationalInfoForContent() 保存内容图片和素材关系的方法
|
|
|
|
|
+ * 核心逻辑:
|
|
|
|
|
+ * 1、根据图片URL查询数据库中的素材记录
|
|
|
|
|
+ * 2、校验素材记录是否存在,关联表中有没有 素材id -> url对应的情况
|
|
|
|
|
+ * 3、检查素材数量是否匹配,防止重复或缺失
|
|
|
|
|
+ * 4、批量保存关联关系
|
|
|
|
|
+ * @param materials
|
|
|
|
|
+ * @param newId
|
|
|
|
|
+ * @param type
|
|
|
|
|
+ */
|
|
|
|
|
+ private void saveRelationalInfo(List<String> materials, Integer newId, Short type) {
|
|
|
|
|
+ //前置条件---有图片才能处理
|
|
|
|
|
+ if (materials ==null || materials.isEmpty()) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ //1、 根据图片的url查询素材记录
|
|
|
|
|
+ //把图片的URL列表作为查询条件。从素材表中获取到对应的素材ID
|
|
|
|
|
+ List<WmMaterial> dbMaterials = weMaterialMapper.selectList(
|
|
|
|
|
+ new LambdaQueryWrapper<WmMaterial>()
|
|
|
|
|
+ .in(WmMaterial::getUrl, materials)
|
|
|
|
|
+ );
|
|
|
|
|
+ //2、校验素材是否存在
|
|
|
|
|
+ if (dbMaterials == null || dbMaterials.size() == 0) {
|
|
|
|
|
+ //抛出异常..这个异常是属于业务异常,不是 JDK Java的异常 我们需要自定义一场
|
|
|
|
|
+ //throw new RuntimeException(AppHttpCodeEnum.MATERIASL_REFERENCE_FAIL.getErrorMessage());
|
|
|
|
|
+ throw new CustomException(AppHttpCodeEnum.MATERIASL_REFERENCE_FAIL);
|
|
|
|
|
+ }
|
|
|
|
|
+ //3、校验数量是否匹配
|
|
|
|
|
+ //如果传入了4个URL,但数据库只有3条,说明URL无效
|
|
|
|
|
+ if (materials.size() != dbMaterials.size()) {
|
|
|
|
|
+ //throw new RuntimeException(AppHttpCodeEnum.MATERIASL_REFERENCE_FAIL.getErrorMessage());
|
|
|
|
|
+ throw new CustomException(AppHttpCodeEnum.MATERIASL_REFERENCE_FAIL);
|
|
|
|
|
+ }
|
|
|
|
|
+ //4、批量保存关联关系
|
|
|
|
|
+ //4.1 把 从数据库里查到的 素材列表 取出所有的id,形成新的列表
|
|
|
|
|
+ List<Integer> idList = dbMaterials.stream()
|
|
|
|
|
+ .map(WmMaterial::getId)
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ //5、批量保存关联关系
|
|
|
|
|
+ wmNewsMaterialMapper.saveRelations(idList,newId,type);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 保存内容图片和素材的关联关系
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param materials
|
|
|
|
|
+ * @param id
|
|
|
|
|
+ */
|
|
|
|
|
+ private void saveRelationalInfoForContent(List<String> materials, Integer id) {
|
|
|
|
|
+ log.info("素材列表------>{}",materials.toString());
|
|
|
|
|
+ //内容图片 type = 0,
|
|
|
|
|
+ saveRelationalInfo(materials,id,WemediaConstants.WM_CONTENT_REFERENCE);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 从新闻内容中获取素材url列表的方法
|
|
|
|
|
+ * 新闻content格式就是一组JSON字符串
|
|
|
|
|
+ * [
|
|
|
|
|
+ * {"type": "text","value": "...."},
|
|
|
|
|
+ * {"type": "image", "value": "http://192.168.200.129:.....2fb.jpg"},
|
|
|
|
|
+ * {"type": "image", "value": "http://192.168.32.128:9000/....c164.jpg"}
|
|
|
|
|
+ * ]
|
|
|
|
|
+ * 我们要提取的结果是:
|
|
|
|
|
+ * ["http://192.168.200.129:.....2fb.jpg","http://192.168.32.128:9000/....c164.jpg"]
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param content 新闻内容的JSON字符串
|
|
|
|
|
+ * @return 图片的URL列表,如果没有图片就返回null
|
|
|
|
|
+ */
|
|
|
|
|
+ private List<String> getImageUrl4Content(String content) {
|
|
|
|
|
+ List<String> materials = new ArrayList<>();
|
|
|
|
|
+
|
|
|
|
|
+ //判空,如果是空的,就直接返回
|
|
|
|
|
+ if (StringUtils.isBlank(content)) {
|
|
|
|
|
+ return materials;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ try{
|
|
|
|
|
+ //1、将JSON字符串解析为List<Map>
|
|
|
|
|
+ List<Map> maps = JSON.parseArray(content, Map.class);
|
|
|
|
|
+
|
|
|
|
|
+ //2、遍历每一项
|
|
|
|
|
+ for (Map map : maps) {
|
|
|
|
|
+ //3、判断是否是图片
|
|
|
|
|
+ if (WemediaConstants.WM_NEWS_TYPE_IMAGE.equals(map.get("type"))) {
|
|
|
|
|
+ //提取图片的url
|
|
|
|
|
+ String imgUrl = (String)map.get("value");
|
|
|
|
|
+ //添加到图片列表中
|
|
|
|
|
+ materials.add(imgUrl);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }catch (Exception e){
|
|
|
|
|
+ //JSON解析的时候可能会因为格式不对,触发异常
|
|
|
|
|
+ log.error("getImageUrl4Content error:{}",e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return materials;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private WmNewsMaterialMapper wmNewsMaterialMapper;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 保存或修改文章
|
|
|
|
|
+ * 新增和修改新闻的统一处理
|
|
|
|
|
+ * 主要的参数条件就是看id是否为空:
|
|
|
|
|
+ * id==null 新增
|
|
|
|
|
+ * id!=null 修改
|
|
|
|
|
+ * |-如果是修改,那么就要先清除关联,因为后面要重新建立图片(封面/内容)和素材的关联关系,如果旧的不删除,就会重复
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param wmNews
|
|
|
|
|
+ */
|
|
|
|
|
+ private void saveOrUpdateWmNews(WmNews wmNews) {
|
|
|
|
|
+ //1、先补全新闻需要的基本属性
|
|
|
|
|
+ //1.1、设置当前的登录用户
|
|
|
|
|
+ Integer userId = WmThreadLocalUtil.getUser().getId();
|
|
|
|
|
+ wmNews.setUserId(userId);
|
|
|
|
|
+ //1.2、设置创建时间
|
|
|
|
|
+ Date date = new Date();
|
|
|
|
|
+ wmNews.setCreatedTime(date);
|
|
|
|
|
+ //1.3、设置提交时间 和创建时间相同,表示本次操作的时间
|
|
|
|
|
+ wmNews.setSubmitedTime(date);
|
|
|
|
|
+ //1.4、设置状态
|
|
|
|
|
+ wmNews.setEnable((short) 1);
|
|
|
|
|
+
|
|
|
|
|
+ //2、判断是新增还是修改
|
|
|
|
|
+ if (wmNews.getId() == null) {
|
|
|
|
|
+ // 新增
|
|
|
|
|
+ //save方法是Mybatis-Plus提供的
|
|
|
|
|
+ //Mybatis-Plus在新增之后还会自动回填id到wmNews.getId()
|
|
|
|
|
+ save(wmNews);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ //修改
|
|
|
|
|
+ //2.1、先清除关联关系
|
|
|
|
|
+ wmNewsMaterialMapper.delete(
|
|
|
|
|
+ new LambdaQueryWrapper<WmNewsMaterial>() //创建LambdaQueryWrapper对象
|
|
|
|
|
+ .eq(WmNewsMaterial::getNewsId, wmNews.getId()) //封装删除条件 newsId = wmNews.getId()
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ //2.2、再保存新的关联关系
|
|
|
|
|
+ updateById(wmNews);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|