code

39 阅读2分钟

网关进行登录验证,微服务使用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);
    }
}