管理平台人工审核

前言

这节谈谈人工审核,前面提到了,审核有阿里云内容安全,或者现在刚出来的阿里云视觉智能开放平台,也有DFA算法这种自定义敏感词过滤,也可以借助第三方工具,比如百度OCR,提取图片中的文字,做下一步操作,但是机器也会有迷糊的时候,也会有不确定的时候,所以这个时候人脑就是最后的杀手锏,按照袁朗的话来说,就是藏着掖着,最后出奇制胜的那张王牌,还有谁,记得这个妖艳的贱货,哈哈
在这里插入图片描述
下面依次讲下分页查询,查看,和审核

自媒体文章分页查询

当前分页查询和之前管理平台里的其他模块不一样,这次是多表查询,即wm_news和wm_user,还是使用mybatisplus,下面是实现类代码

    private WmUserService wmUserService;
    @Override
    public ResponseResult pageList(WmNewsPageDto dto) {
        //1.检查参数
        if (dto == null){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }

        //分页参数检查
        dto.checkParam();

        //获取当前登录人信息

//        AdUser user = AdminThreadLocalUtil.getUser();
//        if (user == null){
//            return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
//        }

        //2.分页条件查询
        IPage page = new Page(dto.getPage(), dto.getSize());
        LambdaQueryWrapper<WmNews> lambdaQueryWrapper = new LambdaQueryWrapper<>();


        //频道名称模糊查询
        if (dto.getTitle()!=null){
            lambdaQueryWrapper.like(WmNews::getTitle,dto.getTitle());
        }

        //状态精确
        if (dto.getStatus()!=null){
            lambdaQueryWrapper.eq(WmNews::getStatus,dto.getStatus());
        }



        //发布时间倒序查询
        lambdaQueryWrapper.orderByDesc(WmNews::getCreatedTime);

        page = page(page, lambdaQueryWrapper);

        // 获取WmUser中的name字段
        List<WmNews> wmNewsList = page.getRecords();
        List<WmNewsWithUserInfo> result = wmNewsList.stream().map(wmNews -> {
            WmNewsWithUserInfo wmNewsWithUserInfo = new WmNewsWithUserInfo();
            BeanUtils.copyProperties(wmNews,wmNewsWithUserInfo); // 设置WmNews对象
            WmUser wmUser = wmUserService.getById(wmNews.getUserId()); // 查询对应的WmUser对象
            if (wmUser != null) {
                wmNewsWithUserInfo.setAuthorName(wmUser.getName()); // 设置对应的用户名
            }
            return wmNewsWithUserInfo;
        }).collect(Collectors.toList());

        //3.结果返回
        PageResponseResult pageResponseResult = new PageResponseResult(dto.getPage(), dto.getSize(), (int) page.getTotal());
        pageResponseResult.setData(result);
        return pageResponseResult;
    }

这里是自定义了一个自媒体对象的类,将自媒体用户的名字,即作者名字放了进去,下面是这个实体类

@Data
public class WmNewsWithUserInfo {
	private static final long serialVersionUID = 1L;

	/**
	 * 主键
	 */
	@TableId(value = "id", type = IdType.AUTO)
	private Integer id;

	/**
	 * 自媒体用户ID
	 */
	@TableField("user_id")
	private Integer userId;

	/**
	 * 标题
	 */
	@TableField("title")
	private String title;

	/**
	 * 登录用户名
	 */
	private String authorName;

	/**
	 * 图文内容
	 */
	@TableField("content")
	private String content;

	/**
	 * 文章布局
	 0 无图文章
	 1 单图文章
	 3 多图文章
	 */
	@TableField("type")
	private Short type;

	/**
	 * 图文频道ID
	 */
	@TableField("channel_id")
	private Integer channelId;

	@TableField("labels")
	private String labels;

	/**
	 * 创建时间
	 */
	@TableField("created_time")
	private Date createdTime;

	/**
	 * 提交时间
	 */
	@TableField("submited_time")
	private Date submitedTime;

	/**
	 * 当前状态
	 0 草稿
	 1 提交(待审核)
	 2 审核失败
	 3 人工审核
	 4 人工审核通过
	 8 审核通过(待发布)
	 9 已发布
	 */
	@TableField("status")
	private Short status;

	/**
	 * 定时发布时间,不定时则为空
	 */
	@TableField("publish_time")
	private Date publishTime;

	/**
	 * 拒绝理由
	 */
	@TableField("reason")
	private String reason;

	/**
	 * 发布库文章ID
	 */
	@TableField("article_id")
	private Long articleId;

	/**
	 * //图片用逗号分隔
	 */
	@TableField("images")
	private String images;

	@TableField("enable")
	private Short enable;

	//状态枚举类
	@Alias("WmNewsStatus")
	public enum Status{
		NORMAL((short)0),SUBMIT((short)1),FAIL((short)2),ADMIN_AUTH((short)3),ADMIN_SUCCESS((short)4),SUCCESS((short)8),PUBLISHED((short)9);
		short code;
		Status(short code){
			this.code = code;
		}
		public short getCode(){
			return this.code;
		}
	}


}

查看自媒体文章

查看自媒体文章,也是一样,需要把作者返回回来,这里实现就要稍微简洁点,下面是代码

	@Override
	@GetMapping("/api/v1/news/one_vo/{id}")
	public ResponseResult oneVo(Integer id) {
		WmNews wmNews = wmNewsService.getById(id);
		WmUser wmUser = wmUserService.getOne(Wrappers.<WmUser>lambdaQuery().eq(WmUser::getId, wmNews.getUserId()));
		WmNewsWithUserInfo wmNewsWithUserInfo = new WmNewsWithUserInfo();
		BeanUtils.copyProperties(wmNews,wmNewsWithUserInfo);
		wmNewsWithUserInfo.setAuthorName(wmUser.getName());

		return ResponseResult.okResult(wmNewsWithUserInfo);
	}

人工审核通过

这里审核通过,需要将自媒体文章的状态改为人工审核通过,根据自媒体文章信息填充好文章信息后,调用feign,将文章存入数据库,下面是实现类代码

	private WmChannelMapper wmChannelMapper;
	private WmUserMapper wmUserMapper;
	@Resource
	private IArticleClient articleClient;

	private ResponseResult saveAppArticle(WmNews wmNews) throws Exception {
		ArticleDto dto = new ArticleDto();
		//属性的拷贝
		BeanUtils.copyProperties(wmNews,dto);
		//文章的布局
		dto.setLayout(wmNews.getType());
		//频道
		WmChannel wmChannel = wmChannelMapper.selectById(wmNews.getChannelId());
		if (wmChannel!=null){
			dto.setChannelName(wmChannel.getName());
		}
		//作者
		dto.setAuthorId(wmNews.getUserId().longValue());
		WmUser wmUser = wmUserMapper.selectById(wmNews.getUserId());
		if (wmUser!=null){
			dto.setAuthorName(wmUser.getName());
		}
		//设置文章id
		if (wmNews.getArticleId()!=null){
			dto.setId(wmNews.getArticleId());
		}
		dto.setCreatedTime(new Date());

		ResponseResult responseResult = articleClient.saveArticle(dto);
		return responseResult;
	}

同时也会生成静态页面,存入到minio或者oss,然后返回存入地址链接到数据库

    @Resource
    private ArticleFreemarkerService articleFreemarkerService;
    /**
     * 保存app端相关文章
     * @param dto
     * @return
     */
    @Override
    public ResponseResult saveArticle(ArticleDto dto) throws TemplateException, IOException {

//        try {
//            Thread.sleep(3000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }

        //1.检查参数
        if (dto==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }

        ApArticle apArticle = new ApArticle();
        BeanUtils.copyProperties(dto,apArticle);

        //2.判断是否存在id
        if (dto.getId()==null){
            //2.1 不存在id 保存 文章 文章配置 文章内容

            //保存文章
            save(apArticle);

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

            //保存文章内容
            ApArticleContent apArticleContent = new ApArticleContent();
            apArticleContent.setArticleId(apArticle.getId());
            apArticleContent.setContent(dto.getContent());
            apArticleContentMapper.insert(apArticleContent);
        }else {
            //2.2 存在id 修改 文章 文章内容
            //修改 内容
            updateById(apArticle);

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

        //异步调用 生成静态文件上传到minio中
        articleFreemarkerService.buildArticleToMinIO(apArticle,dto.getContent());
        //3.结果返回 文章的id
        return ResponseResult.okResult(apArticle.getId());

    }

生成静态页面


    @Resource
    private Configuration configuration;

    @Resource
    private FileStorageService fileStorageService;

    @Resource
    private ApArticleService apArticleService;
    /**
     * 生成静态文件上传到minIO中
     * @param apArticle
     * @param content
     */
    @Override
    public void buildArticleToMinIO(ApArticle apArticle, String content) throws IOException, TemplateException {
        //已知文章的id
        //4.1 获取文章内容
        if (StringUtils.isNotBlank(content)){
            //4.2 文章内容通过freemarker生成html文件
            Template template = null;
            StringWriter out = new StringWriter();
            try {

                template = configuration.getTemplate("article.ftl");
                //数据模型
                Map<String, Object> contentDataModel = new HashMap<>();
                contentDataModel.put("content", JSONArray.parseArray(content));
                //合成
                template.process(contentDataModel,out);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //4.3 把html文件上传到minio中
            InputStream in = new ByteArrayInputStream(out.toString().getBytes());
            String path = fileStorageService.uploadHtmlFile("", apArticle.getId() + ".html", in);
            //4.4 修改ap_article表,保存static_url字段
            apArticleService.update(Wrappers.<ApArticle>lambdaUpdate().eq(ApArticle::getId,apArticle.getId()).set(ApArticle::getStaticUrl,path));

            //发送消息,创建索引
            createArticleESIndex(apArticle,content,path);

        }

    }

创建新的elastic search索引,并将新文章作为文档存入其中

    @Resource
    private KafkaTemplate kafkaTemplate;
    /**
     * 发送消息,创建索引
     * @param apArticle
     * @param content
     * @param path
     */
    private void createArticleESIndex(ApArticle apArticle, String content, String path) {
        SearchArticleVo vo = new SearchArticleVo();
        BeanUtils.copyProperties(apArticle,vo);
        vo.setContent(content);
        vo.setStaticUrl(path);

        kafkaTemplate.send(ArticleConstants.ARTICLE_ES_SYNC_TOPIC, JSON.toJSONString(vo));
    }

人工审核失败

相比较审核成功,审核失败,只需要将自媒体文章状态改为人工审核失败即可,并更改失败原因

	@Override
	@PostMapping("/api/v1/news/auth_fail")
	public ResponseResult authFail(WmNewsPageDto dto) {
		WmNews wmNews = wmNewsService.getById(dto.getId());
		wmNews.setReason(dto.getMsg());
		wmNews.setStatus((short) 2);
		return ResponseResult.okResult(wmNewsService.updateById(wmNews));
	}

每日更新,各位小伙伴,还请一键三连,你的支持是我更新的动力,谢谢
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐三葬PLUS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值