前言
这节谈谈人工审核,前面提到了,审核有阿里云内容安全,或者现在刚出来的阿里云视觉智能开放平台,也有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));
}
每日更新,各位小伙伴,还请一键三连,你的支持是我更新的动力,谢谢