

实现在网关中将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中
javapackage 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();
}
}
编写图片上传的业务代码
javapackage 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);
}
}

实现流程

参数详情

返回参数说明

发布文章业务层代码
javapackage 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);
}
}
}

业务流程

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