微服务项目收获和总结---第4天(文章审核和保存)

文章审核以及APP端保存文章

业务流程: 

App端保存接口:

数据库表详情

文章的基本信息表:id,标题,作者id,频道id......

文章的权限/配置表:存储文章是否可以评论,是否上架,是否转发,是否下架

文章的内容表:为文章的内容数据量大,所以被分库分表出来,记录文章的内容 

分布式ID的技术选型:雪花算法

 

MybatisPlus中已经集成了雪花算法,所以只需要在id上配置类型为id_worker。并且可以在配置文件中配置机器id和服务id 

@TableId(value = "id",type = IdType.ID_WORKER)
private Long id;

 

业务流程

①首先将文章的信息作为参数传过来,然后判断文章是否已经存在,因为不知道是保存新的文章还是修改之前的文章。②然后如果是新的文章,就要保存文章,保存文章的配置和保存文章的内容。③如果是修改已经存在的文章,则先把文章修改成新的数据,然后再保存文章的内容。

第一步:在heima-leadnews-fegin-api中定义Feign的接口
@FeignClient(value = "leadnews_article")
public interface IArticleClient {

    @PostMapping("/api/v1/article/save")
    public ResponseResult saveArticle(@RequestBody ArticleDto dto);
}
第二步:在heima-leadnews-article中实现Feign的接口
@RestController
public class ArticleClient implements IArticleClient {

    @Autowired
    private ApArticleService apArticleService;

    @PostMapping("/api/v1/article/save")
    @Override
    public ResponseResult saveArticle(@RequestBody ArticleDto dto) {
        return apArticleService.saveArticle(dto);
    }
}
第三步:实现类,保存文章的内容,包括配置和内容
    @Autowired
    private ApArticleConfigMapper apArticleConfigMapper;
    @Autowired
    private ApArticleContentMapper apArticleContentMapper;
    /**
     * 保存app端的文章
     * @param dto
     * @return
     */
    @Override
    public ResponseResult saveArticle(ArticleDto dto) {
        //检查参数
        if(dto == null){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        //创建文章的对象,并且拷贝过来
        ApArticle article = new ApArticle();
        BeanUtils.copyProperties(dto,article);

        //判断是否文章是否存在id
        if(dto.getId() == null){
            //不存在id 则需要保存文章
            save(article);

            //保存配置
            ApArticleConfig apArticleConfig = new ApArticleConfig(article.getId());
            apArticleConfigMapper.insert(apArticleConfig);

            //保存内容
            ApArticleContent apArticleContent = new ApArticleContent();
            apArticleContent.setArticleId(article.getId());
            apArticleContent.setContent(dto.getContent());
            apArticleContentMapper.insert(apArticleContent);

        }else{
            //存在id 修改 文章 文章内容
            updateById(article);

            //修改文章内容
            ApArticleContent apArticleContent = apArticleContentMapper.selectOne(Wrappers.<ApArticleContent>lambdaQuery().eq(ApArticleContent::getArticleId, dto.getId()));
            apArticleContent.setContent(dto.getContent());
            apArticleContentMapper.updateById(apArticleContent);
        }

        //结果返回 文章id
        return ResponseResult.okResult(article.getId());
    }

 

文章内容审核:

数据库表详情

status字段:0 草稿 1 待审核 2 审核失败 3 人工审核 4 人工审核通过 8 审核通过(待发布) 9 已发布

业务流程

首先根据传过来的参数去查询文章,如果文章不存在则会报错,如果存在则将文章并且判断文章是处于待审核状态。就把内容中的图片和文本提取出来。再把图片和文本通过阿里官方接口进行审核,并且修改文章的状态,设置审核失败或者需要人工审核。当所有的准备都完成后就可以远程调用Fegin接口去实现文章审核通过保存文章的操作

media微服务要远程调用article微服务,需要在启动类上添加扫描类

@Service
@Transactional
@Slf4j
public class WmNewsAutoScanServiceimpl implements WmNewsAutoScanService {


    @Autowired
    private WmNewsMapper wmNewsMapper;

    /**
     * 自媒体文章审核
     * @param id 参数是文章的id
     */
    @Override
    public void autoScanWmnews(Integer id) {
        //1.查询目标文章
        WmNews wmNews = wmNewsMapper.selectById(id);
        if(wmNews == null){
            throw new RuntimeException("文章不存在");
        }
        //判断文章是否处于待审核阶段,如果在就进行内容审核
        if(wmNews.getStatus().equals(WmNews.Status.SUBMIT.getCode())){

            //调用方法从内容中提取纯文本内容和图片,去用于审核
            Map<String,Object> textAndImages = handleTextAndImages(wmNews);

            //2.审核文本内容  //直接默认通过,不使用阿里云的验证

            //3.审核图片     //直接默认通过,不使用阿里云的验证

            //4.审核成功调用方法去保存APP端的相关数据
            ResponseResult responseResult = saveAppArticle(wmNews);
            if(!responseResult.getCode().equals(200)){
                throw new RuntimeException("文章审核保存app端失败");
            }

            //回填articleid
            wmNews.setArticleId((Long) responseResult.getData());

            //状态设置成功状态
            updateWmNews(wmNews, (short) 9,"审核成功");
        }
    }

    @Autowired
    private IArticleClient iArticleClient;
    @Autowired
    private WmChannelMapper wmChannelMapper;
    @Autowired
    private WmUserMapper wmUserMapper;

    //更新文章的状态
    private void updateWmNews(WmNews wmNews, short status, String reason) {
        wmNews.setStatus(status);
        wmNews.setReason(reason);
        wmNewsMapper.updateById(wmNews);
    }

    //保存app端相关的文章数据
    private ResponseResult saveAppArticle(WmNews wmNews) {

        //创建对象
        ArticleDto articleDto = new ArticleDto();
        BeanUtils.copyProperties(wmNews,articleDto);
        //设置文章布局
        articleDto.setLayout(wmNews.getType());
        //设置频道信息
        WmChannel wmChannel = wmChannelMapper.selectById(wmNews.getChannelId());
        if(wmChannel != null){
            articleDto.setChannelName(wmChannel.getName());
        }
        //设置作者信息
        articleDto.setAuthorId(wmNews.getUserId().longValue());
        WmUser wmUser = wmUserMapper.selectById(wmNews.getUserId());
        if(wmUser != null){
            articleDto.setAuthorName(wmUser.getName());
        }
        //设置文章id
        if(wmNews.getArticleId() != null){
            articleDto.setId(wmNews.getArticleId());
        }
        //设置时间
        articleDto.setCreatedTime(new Date());

        //远程调用
        ResponseResult responseResult = iArticleClient.saveArticle(articleDto);
        //返回数据
        return responseResult;
    }

    //从文章内容中提取文章内容和图片
    private Map<String, Object> handleTextAndImages(WmNews wmNews) {

        //存储纯文本内容
        StringBuilder stringBuilder = new StringBuilder();
        //存储图片信息
        List<String> images = new ArrayList<>();
        //当亲内容不为空
        if(StringUtils.isNotBlank(wmNews.getContent())){
            List<Map> maps = JSONArray.parseArray(wmNews.getContent(), Map.class);
            for (Map map : maps) {
                if(map.get("type").equals("text")){
                    stringBuilder.append(map.get("value"));
                }

                if(map.get("type").equals("images")){
                    images.add((String) map.get("value"));
                }
            }
        }

        //提取封面图片
        if(StringUtils.isNotBlank(wmNews.getImages())){
            String[] split = wmNews.getImages().split(",");
            images.addAll(Arrays.asList(split));
        }

        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("content",stringBuilder.toString());
        resultMap.put("images",images);

        return resultMap;
    }
}
Fegin远程调用服务降级

由于上级的微服务的服务异常不可用,最终会蔓延到下游所有的服务,导致下游的服务都崩掉,所以这里使用hystrix实现降级

 文章审核的异步调用

 第一步:

    @Override
    @Async //表名方法为异步方法
    public void autoScanWmnews(Integer id) 

 第二步:

        //保存文章封面图片与素材的关系
        saveRelativeInfoForCover(dto,wmNews,materials);

        //审核文章
        wmNewsAutoScanService.autoScanWmnews(wmNews.getId());

第三步:

@SpringBootApplication
@EnableDiscoveryClient
@MapperScan("com.heima.wemedia.mapper")
@EnableFeignClients(basePackages = "com.heima.apis")
@EnableAsync//开启异步调用
public class WemediaApplication {

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/639737.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在docker中运行SLAM十四讲程序

《十四讲》的示例程序依赖比较多&#xff0c;而且系统有点旧。可以在容器中运行。 拉取镜像 docker pull ddhogan/slambook:v0.1这个docker对应的github&#xff1a;HomeLH/slambook2-docker 拉下来之后&#xff0c;假如是Windows系统&#xff0c;需要使用XLaunch用于提供X11…

番外篇 | YOLOv5-SPD:用最简单的方式完成低分辨率图像和小目标检测升级

前言:Hello大家好,我是小哥谈。论文提出了一个新的CNN构建模块称为SPD-Conv,用来替换每个步长卷转层和每个池化层(从而完全消除它们)。SPD-Conv由一个空间到深度(SPD)层和一个非步长卷积(Conv)层组成。本文详细介绍了如何在YOLOv5中引入SPD-Conv,助力助力低分辨率与小…

掌握代码注释:提升代码可读性的秘密武器

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、为什么我们需要注释&#xff1f; 二、如何添加单行注释&#xff1f; 使用井号 # 添加单…

C++贪心算法(4)

过河的最短时间 #include<bits/stdc.h> using namespace std; int main() {int a[1010]{0};int n;cin>>n;for(int i0;i<n;i){cin>>a[i];}sort(a0,an);int xn-2;int yn-1;int tmpa[1];while(true){int tmp1a[0]a[y]a[1]a[1];int tmp2a[0]a[y]a[0]a[x];if(t…

Golang | Leetcode Golang题解之第110题平衡二叉树

题目&#xff1a; 题解&#xff1a; func isBalanced(root *TreeNode) bool {return height(root) > 0 }func height(root *TreeNode) int {if root nil {return 0}leftHeight : height(root.Left)rightHeight : height(root.Right)if leftHeight -1 || rightHeight -1 …

2024年收集搜索引擎蜘蛛大全以及浏览器模拟蜘蛛方法

对于做SEOer来说经常和搜索引擎蜘蛛打交道&#xff0c;下面整理收集了最全的搜索引擎蜘蛛大全。供有需要的朋友使用&#xff0c;建议收藏。 搜索引擎蜘蛛大全 "TencentTraveler", "Baiduspider", "BaiduGame", "bingbot",//必应蜘蛛…

MaxEnt模型文章中存在的问题和处理方法(050B更新)2024.5.24

目前多数MaxEnt文章中存在的问题和处理方案。 **问题一&#xff1a;**变量数据使用问题&#xff0c;很多文章把所有变量数据直接使用&#xff0c;但是温度和土壤、植被类型等属于不同数据类型&#xff0c;在数据使用时参数配置是不一样的&#xff0c;产生的结果文件也是不一样的…

Generative Action Description Prompts for Skeleton-based Action Recognition

标题&#xff1a;基于骨架的动作识别的生成动作描述提示 源文链接&#xff1a;https://openaccess.thecvf.com/content/ICCV2023/papers/Xiang_Generative_Action_Description_Prompts_for_Skeleton-based_Action_Recognition_ICCV_2023_paper.pdfhttps://openaccess.thecvf.c…

【openlayers系统学习】1.5交互-捕捉要素

五、捕捉要素 Snapping 捕捉 您可能已经注意到&#xff0c;很容易绘制与现有要素不完全对齐的要素。此外&#xff0c;在修改要素时&#xff0c;我们可能会破坏拓扑关系&#xff0c;导致原本相邻的多边形之间出现空隙。Snap 交互操作可以帮助在绘制和编辑要素时保持拓扑关系。…

vue 纵向滚动菜单, 点击滚动到选中菜单

1 背景 需要设计一个纵向滚动菜单&#xff0c;要求丝滑点&#xff0c;默认显示选中菜单 2 思路 给定一个容器&#xff0c;样式包含overflow:hidden&#xff0c;默认高宽足够显示一个菜单&#xff08;以下用图标代替菜单&#xff09;&#xff0c;鼠标悬浮时增大容器高度&#…

时代终结,微软宣布淘汰VBScript;Flink漏洞被广泛利用;Grandoreiro银行木马强势回归,1500多家银行成攻击目标 | 安全周报0524

揭秘SolarMarker恶意软件&#xff1a;多层次基础设施让清除工作陷入困境 Recorded Future的新发现表明&#xff0c;SolarMarker信息窃取恶意软件背后的持续威胁行为者已经建立了一个多层次的基础设施&#xff0c;以使执法部门的清除工作变得复杂。 该公司在上周发布的一份报告…

Linux环境中部署docker私有仓库Registry与远程访问详细流程

目录 前言 1. 部署Docker Registry 2. 本地测试推送镜像 3. Linux 安装cpolar 4. 配置Docker Registry公网访问地址 5. 公网远程推送Docker Registry 6. 固定Docker Registry公网地址 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊…

How Blink Works

How Blink Works TL;NR 在 Blink 上开发绝非易事。对于新接触 Blink的开发者来说&#xff0c;要实现一个高效的渲染引擎&#xff0c;需要了解大量Blink特有的概念和编码约定。对于经验丰富的开发者来说亦非易事&#xff0c;因为 Blink 非常庞大&#xff0c;对性能、内存和安全…

Ubuntu22.04本地部署qwen模型、jupyterlab开发环境、LoRA微调全流程

前言 这段时间在自己的Win11系统上部署了chatGLM以及Qwen模型&#xff0c;进行对话、推理以及工具调用都没有问题&#xff0c;但是在尝试进行微调的时候发现好像并不能成功&#xff0c;因此花费了很大的力气&#xff0c;又分别在ubuntu桌面版、windows子系统WSL2 Ubuntu上部署…

C++多生产者,多消费者模型

C11实现多生产者&#xff0c;多消费者模型 在C标准库中实现多生产者多消费者模型&#xff0c;可以使用std::thread、std::queue、互斥锁(std::mutex)、条件变量(std::condition_variable)等组件。下面是一个简单的示例&#xff0c;展示如何创建多生产者和多消费者模型&#xf…

Java进阶学习笔记1——课程介绍

课程适合学习的人员&#xff1a; 1&#xff09;具备一定java基础的人员&#xff1b; 2&#xff09;想深刻体会Java编程思想&#xff0c;成为大牛的人员&#xff1b; 学完有什么收获&#xff1f; 1&#xff09;掌握完整的Java基础技术体系&#xff1b; 2&#xff09;极强的编…

【学习笔记】Windows GDI绘图(五)图形路径GraphicsPath详解(上)

文章目录 图形路径GraphicsPath填充模式FillMode构造函数GraphicsPath()GraphicsPath(FillMode)GraphicsPath(Point[],Byte[])和GraphicsPath(PointF[], Byte[])GraphicsPath(Point[], Byte[], FillMode)和GraphicsPath(PointF[], Byte[], FillMode)PathPointType 属性FillMode…

DAMA:数据治理 CDGA/CDGP 认证考试备考经验分享

一、关于DAMA中国和CDGA/CDGP考试 国际数据管理协会&#xff08;DAMA国际&#xff09;是一个全球性的专业组织&#xff0c;由数据管理和相关的专业人士组成&#xff0c;非营利性机构&#xff0c;厂商中立。协会自1980年成立以来&#xff0c;一直致力于数据管理和数字化的研究、…

IJNM-International Journal of Network Management 智能网络管理

文章目录 一、期刊简介二、征稿信息三、期刊表现四、投稿须知五、投稿咨询 一、期刊简介 International Journal of Network Management 是一本网络管理领域的研究人员、开发人员和从业人员向国际观众展示其工作的论坛。该杂志致力于传播信息&#xff0c;这将改善计算机网络和…

leetcode-55 跳跃游戏

leetcode Problem: 55. 跳跃游戏 思路 假设我们是一个小人&#xff0c;从第一个下标开始&#xff0c;每次经过一个位置&#xff0c;我们就可以根据当前位置的数值nums[i]和位置下标i计算出该位置所能到达的后续位置的最大值rnums[i]i。而这个r之前的区域一定都是可以经过的。…