编辑
2025-11-20
黑马头条
00

目录

1.自媒体环境详情
2.图片上传功能
3.发布文章功能
4.自媒体文章自动审核

1.自媒体环境详情

image.png

2.图片上传功能

image.png

实现在网关中将userId存入请求头中,在网关中添加

java
// 获取用户信息 Object userId = claimsBody.get("id"); // 存储到header中 ServerHttpRequest serverHttpRequest = request.mutate().headers(httpHeaders -> httpHeaders.add("userId",userId+"")).build(); // 重置请求 exchange.mutate().request(serverHttpRequest);

在wmedia中添加自定义拦截器并将userId存入ThreadLocal中

java
package com.heima.wemedia.interceptor; import com.heima.model.wemedia.pojos.WmUser; import com.heima.utils.thread.WmThreadLocalUtil; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Enumeration; public class WmTokenInterceptor implements HandlerInterceptor { /** * 得到header中的用户信息并且存入到当前线程中 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String userId = request.getHeader("userId"); if (userId != null){ WmUser wmUser = new WmUser(); wmUser.setId(Integer.valueOf(userId)); WmThreadLocalUtil.setWmUser(wmUser); } return true; } /** * 清理线程中的数据 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { WmThreadLocalUtil.clear(); } }

编写图片上传的业务代码

java
package com.heima.wemedia.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.heima.file.service.FileStorageService; import com.heima.model.common.dtos.ResponseResult; import com.heima.model.common.enums.AppHttpCodeEnum; import com.heima.model.wemedia.pojos.WmMaterial; import com.heima.utils.thread.WmThreadLocalUtil; import com.heima.wemedia.mapper.WmMaterialMapper; import com.heima.wemedia.service.WmMaterialService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.Date; import java.util.UUID; @Slf4j @Service @Transactional public class WmMaterialServiceImpl extends ServiceImpl<WmMaterialMapper, WmMaterial> implements WmMaterialService { @Autowired private FileStorageService fileStorageService; /** * 图片上传实现类 * @param multipartFile * @return */ @Override public ResponseResult uploadPicture(MultipartFile multipartFile) { // 1.检查参数 if (multipartFile == null || multipartFile.getSize() == 0) { return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID); } // 2.上传图片到MinIO String fileId = null; String fileName = UUID.randomUUID().toString().replace("-",""); String originalFilename = multipartFile.getOriginalFilename(); String postfix = originalFilename.substring(originalFilename.lastIndexOf(".")); try { fileId = fileStorageService.uploadImgFile("",fileName+postfix,multipartFile.getInputStream()); log.info("上传图片到MinIo中{}",fileId); } catch (IOException e) { e.printStackTrace(); log.error("WmMaterialServiceImpl上传文件失败"); } // 3.将图片存储到数据库中 WmMaterial wmMaterial = new WmMaterial(); wmMaterial.setUserId(WmThreadLocalUtil.getWmUser().getId()); wmMaterial.setUrl(fileId); wmMaterial.setIsCollection((short)0); wmMaterial.setType((short)0); wmMaterial.setCreatedTime(new Date()); save(wmMaterial); // 4.返回结果 return ResponseResult.okResult(wmMaterial); } }

3.发布文章功能

image.png

实现流程

image.png

参数详情

image.png

返回参数说明

image.png

发布文章业务层代码

java
package com.heima.wemedia.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.heima.common.constants.WemediaConstants; import com.heima.common.exception.CustomException; import com.heima.model.common.dtos.PageResponseResult; import com.heima.model.common.dtos.ResponseResult; import com.heima.model.common.enums.AppHttpCodeEnum; import com.heima.model.wemedia.dtos.WmNewsDto; import com.heima.model.wemedia.dtos.WmNewsPageReqDto; import com.heima.model.wemedia.pojos.WmMaterial; import com.heima.model.wemedia.pojos.WmNews; import com.heima.model.wemedia.pojos.WmNewsMaterial; import com.heima.model.wemedia.pojos.WmUser; import com.heima.utils.thread.WmThreadLocalUtil; import com.heima.wemedia.mapper.WmMaterialMapper; import com.heima.wemedia.mapper.WmNewsMapper; import com.heima.wemedia.mapper.WmNewsMaterialMapper; import com.heima.wemedia.service.WmNewsService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.servlet.View; import java.util.*; import java.util.stream.Collectors; @Service @Slf4j @Transactional public class WmNewsServiceImpl extends ServiceImpl<WmNewsMapper, WmNews> implements WmNewsService { private final View error; public WmNewsServiceImpl(View error) { this.error = error; } @Autowired private WmNewsMaterialMapper wmNewsMaterialMapper; @Autowired private WmMaterialMapper wmMaterialMapper; /** * 媒体端文章查询接口 * @param dto * @return */ @Override public ResponseResult findAll(WmNewsPageReqDto dto) { // 参数检查 dto.checkParam(); // 分页条件查询 IPage page = new Page<>(dto.getPage(),dto.getSize()); LambdaQueryWrapper<WmNews> lambdaQueryWrapper = new LambdaQueryWrapper<>(); // 状态精确查询 if (dto.getStatus() !=null){ lambdaQueryWrapper.eq(WmNews::getStatus,dto.getStatus()); } // 频道精确查询 if (dto.getChannelId() !=null){ lambdaQueryWrapper.eq(WmNews::getChannelId,dto.getChannelId()); } // 根据时间查询 if (dto.getBeginPubDate() !=null&& dto.getEndPubDate()!=null){ lambdaQueryWrapper.between(WmNews::getPublishTime,dto.getBeginPubDate(),dto.getEndPubDate()); } // 关键字模糊查询 if (StringUtils.isNotBlank(dto.getKeyword())){ lambdaQueryWrapper.like(WmNews::getTitle,dto.getKeyword()); } WmUser user = WmThreadLocalUtil.getWmUser(); // 当前登录人检索 lambdaQueryWrapper.eq(WmNews::getUserId,user.getId()); // 按照发布时间倒序排序 lambdaQueryWrapper.orderByDesc(WmNews::getPublishTime); page = page(page, lambdaQueryWrapper); ResponseResult responseResult = new PageResponseResult(dto.getPage(),dto.getSize(),(int)page.getTotal()); responseResult.setData(page.getRecords()); return responseResult; } /** * 文章保存修改或存为草稿实现方法 * @param dto * @return */ @Override public ResponseResult submitNews(WmNewsDto dto) { // 条件判断 if (dto == null || dto.getContent() == null){ return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID); } // 保存或修改文章 WmNews wmNews = new WmNews(); // 属性名称和类型相同能够拷贝 拷贝属性到文章类中 BeanUtils.copyProperties(dto,wmNews); if (dto.getImages() !=null){ // 将images列表转换成字符串s String imageStr = org.apache.commons.lang.StringUtils.join(dto.getImages(),","); wmNews.setImages(imageStr); } // 封面类型为-1 if (dto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)){ wmNews.setType(null); } saveOrUpdateWmNews(wmNews); // 判断是否为草稿,如果为草稿结束当前方法 if (dto.getStatus().equals(WmNews.Status.NORMAL.getCode())){ return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS); } // 提取图片url信息 List<String> materials = extractUrlInfo(dto.getContent()); // 提取封面url信息 // 保存文章内容图片与素材的关系 saveRelativeInfoForContent(materials,wmNews.getId()); // 保存文章封面图片与素材的关系 如果设置为自动则自动匹配封面 saveRelativeInfoForCover(dto,wmNews,materials); return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS); } /** * 保存文章封面图片与素材的关系 如果设置为自动则自动匹配封面 * 1.如果内容图片大于1小于3则设置单图 type 1 * 2.如果内容图片大于等于3则设置3图 type 3 * 3.如果内容图片没有则不设置图片 type 0 * 保存封面与文章的关系 * @param dto * @param wmNews * @param materials */ private void saveRelativeInfoForCover(WmNewsDto dto, WmNews wmNews, List<String> materials) { List<String> images = dto.getImages(); if (dto.getType() == WemediaConstants.WM_NEWS_TYPE_AUTO){ // 多图 if (materials.size() >=3){ wmNews.setType(WemediaConstants.WM_NEWS_MANY_IMAGE); images = materials.stream().limit(3).collect(Collectors.toList()); // 单图 } else if (materials.size()>=1) { wmNews.setType(WemediaConstants.WM_NEWS_SINGLE_IMAGE); images = materials.stream().limit(1).collect(Collectors.toList()); // 无图 } else{ wmNews.setType(WemediaConstants.WM_NEWS_NONE_IMAGE); } // 修改文章 if (images != null && images.size() > 0){ wmNews.setImages(org.apache.commons.lang.StringUtils.join(images,",")); } updateById(wmNews); if (images != null && images.size() > 0){ saveRelativeInfo(images,wmNews.getId(),WemediaConstants.WM_COVER_REFERENCE); } } } /** * 提取文章内容分中的图片信息 * @param content * @return */ private List<String> extractUrlInfo(String content) { List<Map> maps = JSON.parseArray(content,Map.class); List<String> materials = new ArrayList<>(); for (Map map : maps) { if (map.get("type") .equals( "image")){ String imageUrl= (String) map.get("value"); materials.add(imageUrl); } } return materials; } /** * 保存图片与内容的关系 * @param materials */ private void saveRelativeInfoForContent(List<String> materials,Integer newsId) { saveRelativeInfo(materials,newsId,WemediaConstants.WM_CONTENT_REFERENCE); } /** * 保存文章与图片的关系到数据库中 * @param materials * @param newsId * @param wmContentReference */ private void saveRelativeInfo(List<String> materials, Integer newsId, Short wmContentReference) { // 根据图片的url查询图片id List<WmMaterial> wmMaterials= wmMaterialMapper.selectList(Wrappers.<WmMaterial>lambdaQuery().in(WmMaterial::getUrl, materials)); // 判断素材是否有效 if (wmMaterials == null ||wmMaterials.size()==0){ throw new CustomException(AppHttpCodeEnum.MATERIALS_REFERENCE_FAIL); } // 判断数据库查询的数据和url的数据是否 if (wmMaterials.size() != materials.size()){ throw new CustomException(AppHttpCodeEnum.MATERIALS_REFERENCE_FAIL); } List<Integer> idList = wmMaterials.stream().map(WmMaterial::getId).collect(Collectors.toList()); wmNewsMaterialMapper.saveRelations(idList,newsId,wmContentReference); } private void saveOrUpdateWmNews(WmNews wmNews) { wmNews.setUserId(WmThreadLocalUtil.getWmUser().getId()); wmNews.setCreatedTime(new Date()); wmNews.setSubmitedTime(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); } } }

4.自媒体文章自动审核

image.png

业务流程

image.png

本文作者:钱小杰

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!