网关进行登录验证,微服务使用Threadlocal存储用户uid
为什么要在网关进行登录验证,把userId 放入请求头继续传递。
网关的过滤器,全局过滤器
拦截器 从请求头获取userId,放入Threadlocal中 在业务中直接用
/**
* 新增,修改,提交
* @param dto
* @return
*/
@PostMapping("/api/v1/news/submit")
public ResponseResult submit(@RequestBody WmNewsDto dto){
wmNewsService.submit(dto);
return ResponseResult.ok();
}
/**
* 新增,修改,提交
* 保存文章,素材文章中间表
* @param dto
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void submit(WmNewsDto dto) {
// 用户id
Integer userId = UserThreadLocalUtils.getUserId();
// 对象转换
WmNews wmNews = BeanHelper.copyProperties(dto, WmNews.class);
if(dto.getId() == null){
// 新增
wmNews.setCreatedTime(new Date());
wmNews.setWmUserId(userId);
}
if(!dto.getDraft()){
// 提交操作
wmNews.setSubmitedTime(new Date());
}
if(!CollectionUtils.isEmpty(dto.getImages())){
// 有封面
// String imageStr = "";
// for (String url : dto.getImages()) {
// if(imageStr.length()>0){
// imageStr +=",";
// }
// imageStr += url;
// }
String imageStr = dto.getImages().stream().collect(Collectors.joining(","));
wmNews.setImages(imageStr);
}
// 新增后修改自媒体文章
boolean b = saveOrUpdate(wmNews);
if(!b){
throw new LeadException(AppHttpCodeEnum.SERVER_ERROR);
}
// 获取自媒体文章id
Integer wmNewsId = wmNews.getId();
// 如果是修改文章,先根据wmNewsId删除中间表数据
if(dto.getId() != null){
// 修改操作,先根据wmNewsId删除中间表数据
// delete from wm_news_material where news_id=?
newsMaterialService.deleteByNewsId(wmNewsId);
}
// 解析content,获取内容中的图片id
if(StringUtils.isNotBlank(wmNews.getContent())){
// 把content的json字符串转java对象
List<Map<String,Object>> list = JsonUtils.nativeRead(wmNews.getContent(),
new TypeReference<List<Map<String, Object>>>() {});
// 从内容中获取素材id集合
List<Integer> ids = getMaterialIdsByContent(list);
// 保存文章素材中间表
newsMaterialService.saveNewsAndMaterial(wmNewsId,ids,0);
}
// 如果有封面,需要用封面的url,获取对应的图片id
if(!CollectionUtils.isEmpty(dto.getImages())){
// select * from material where url in (1,2,3)
// 从封面获取素材id集合
List<Integer> ids = getMaterialIdsByImages(dto.getImages());
// 保存文章素材中间表
newsMaterialService.saveNewsAndMaterial(wmNewsId,ids,1);
}
}
/**
* 从封面获取素材id集合
* @param images
* @return
*/
private List<Integer> getMaterialIdsByImages(List<String> images) {
if(CollectionUtils.isEmpty(images)){
return null;
}
// select * from material where url in (1,2,3)
LambdaQueryWrapper<WmMaterial> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(WmMaterial::getUrl,images);
List<WmMaterial> wmMaterialList = materialService.list(queryWrapper);
List<Integer> ids = wmMaterialList.stream().map(WmMaterial::getId).collect(Collectors.toList());
return ids;
}
/**
* 从内容中获取素材的id集合
* @param list
* @return
*/
private List<Integer> getMaterialIdsByContent(List<Map<String, Object>> list) {
if(CollectionUtils.isEmpty(list)){
return null;
}
List<Integer> ids = new ArrayList<>();
for (Map<String, Object> map : list) {
String type = map.get("type").toString();
if("image".equals(type)){
Integer id = Integer.valueOf(map.get("id").toString());
ids.add(id);
}
}
return ids;
}
package com.heima.wemedia.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.heima.wemedia.entity.WmNewsMaterial;
import com.heima.wemedia.mapper.WmNewsMaterialMapper;
import com.heima.wemedia.service.WmNewsMaterialService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
* 自媒体图文引用素材信息表 服务实现类
* @author HM
* @since 2022-09-15
@Service
public class WmNewsMaterialServiceImpl extends ServiceImpl<WmNewsMaterialMapper, WmNewsMaterial> implements WmNewsMaterialService {
@Override
public void deleteByNewsId(Integer wmNewsId) {
// delete from wm_news_material where news_id=?
LambdaQueryWrapper<WmNewsMaterial> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(WmNewsMaterial::getNewsId,wmNewsId);
remove(queryWrapper);
}
@Override
public void saveNewsAndMaterial(Integer wmNewsId, List<Integer> materialIds, int type) {
List<WmNewsMaterial> list = new ArrayList<>();
for (Integer materialId : materialIds) {
WmNewsMaterial wmNewsMaterial = new WmNewsMaterial();
wmNewsMaterial.setNewsId(wmNewsId);
wmNewsMaterial.setMaterialId(materialId);
wmNewsMaterial.setType(type);
list.add(wmNewsMaterial);
}
saveBatch(list);
}
}