一路繁花似锦绣前程
失败的越多,成功才越有价值

导航

 

十六、编辑器服务端基础API开发

1、技术方案设计和基本功能开发
* 引言
    - 需求指导设计,设计指导开发。无设计不开发。
* 标题
    - 服务端技术方案设计 & 基础功能开发
* 将收获什么
    - 服务端技术方案设计的方法
    - B端和编辑器基本功能API
* 主要内容
    - 技术方案设计
    - 基本功能开发
* 关键词
    - 技术方案设计文档(架构设计、接口设计、数据库设计)
* 学习方法
    - 亲自写出来,无论是代码还是文档
* 注意事项
    - 业务代码不会一行一行写
    - 回顾一下之前的“整体架构设计”,各个项目之间的关系,以及和数据库之间的关系。
2、技术方案设计
* 引言
    - 领导技术方案设计、评审技术方案设计,这就是架构师和基层程序员的区别之一。
* 主要产出
    - 《biz-editor-server端技术方案》文档
* 主要内容
    - 接口设计
    - 选择Restful API,不是GraphQL
    - 数据库设计
    - server整体设计
* 注意事项
    - 正视技术方案设计,设计不会浪费时间,只会节约时间
    - GraphQL不是课程主线,不要跑偏
3、接口设计
* 引言
    - 把server端当做一个黑盒,它将怎样与前端通讯?
* 功能范围
    - B端,用户注册,作品管理,模板
    - 编辑器,单个作品的内容获取、修改、预览和发布
* 功能拆分
    - 用户信息
    - 作品管理
    - 模板
    - 编辑器(发布和渠道,可以单独设计)
    - 工具类
* 用户信息
    - 获取手机短信验证码
    - 登录(包含注册)
    - 获取用户信息
    - 修改用户信息
* 模板
    - 首页推荐模板列表(搜索,分页)--不需要登录校验
    - 获取单个模板信息--不需要登录校验
    - 我的模板列表(搜索,分页)
* 作品管理
    - 创建空白作品
    - 复制作品(通过模板创建)PS:模板即作品,只是有一个标志而已,数据库设计时可以看出来
    - 删除作品
    - 恢复作品
    - 转赠作品
    - 我的作品列表(搜索,分页)
    - 我的回收站列表(搜索,分页)
* 编辑器
    - 设计时分开,但代码中可能会和作品管理写在一起,因为都是针对作品的。
        ~ 查询单个作品信息
        ~ 保存作品
        ~ 预览作品
        ~ 发布作品
        ~ 发布为模板
* 渠道
    - 创建渠道
    - 删除渠道
    - 修改渠道名称
    - 获取单个作品的所有渠道
* 工具类
    - 上传图片
* 统一的输出格式
########
{
    errno: 0, // 错误码,无错误则返回0
    data: {...}, // 或者[...]
    message: 'xxx'
}
########
    - 留作业,设计每个接口的输入和输出,可使用第三方工具YAPI。
* 其他
    - 作品统计,会用到单独的统计服务,不在这里出数据
    - 预览作品,在h5-server中
* 小结
    - 功能拆分
    - 详细的接口设计
    - 统一输出格式
4、Restful API vs GraphQL
* 引言
    - 默认所有同学都已非常熟悉Restful API。而GraphQL大家可能比较陌生,会放慢节奏。
    - 而GraphQL是和Restful API完全不同的两种设计和实现方式,
      两者也尽量不要混用(虽然混用也能做到无bug)
* 什么是GraphQL
    - GraphQL-Graph Query Language图查询语言。意思是擅长处理“图”数据结构的查询,
      即多个数据对象,各个之间还有关联关系。
    - 核心概念:
        ~ schema - 数据规范
        ~ rootValue - 数据源
    - 代码演示,可参考中文官网。注意,在此不要深入进去,还是沿着课程主线走。
########
var express = require('express');
var graphqlHTTP = require('express-graphql');
var { buildSchema } = require('graphql');

// 使用GraphQL Schema Language创建一个schema
var schema = buildSchema(`
  type Query {
    hello: String,
  }
`)

// root提供所有API入口端点相应的解析器函数
var rootValue = {
  hello: () => {
    return 'Hello world';
  },
};

var app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: rootValue,
  graphiql: true,
}));
app.listen(4000);
console.log('Running a GraphQL API server at http://localhost:4000/graphql');
########
    - 另外,虽然GraphQL主要用于查询,但它也支持输入和更新,参考官网input和Mutation。
      课程就不在继续扩展了。
* GraphQL的应用场景
    - 数据关系比较复杂。PS:和我们正好相反,我们是作品的数据结构复杂(前端编辑器复杂),
      而数据实体之间的关系比较清晰。
    - 前端查询需求多变,如果用Restful API会导致频繁地修改API,不灵活。
    - 有一个独立的数据提供方,对接很多使用方,不能一一定制开发
* 如何选择
    - 选择使用Restful API,放弃GraphQL。
    - 并不匹配它的使用场景
    - 考虑它的缺点:
        ~ 学习使用成本高,不如Restful API普及
        ~ 当数据结构复杂时,效率较低
        ~ 维护数据源和schema也比较复杂
* 小结
    - GraphQL介绍
    - 应用场景
    - 选择Restful API
5、数据库设计
* 需要存储的数据
    - 用户
    - 项目/模板(包含项目内容,组件信息)
    - 渠道
* 数据之间的关系
* 数据表设计
    - 注意,使用sequelize和mongoose,会自动创建id、createdAt和updatedAt,无需再自己手动创建。
* 用户
* 作品/模板
* 渠道
* 作品内容
    - 未发布
    - 发布
########
{
    // 页面的组件列表
    components: [Object],
    // 页面的属性,如页面背景图片
    props: Object,
    // 配置信息,如微信分享配置
    setting: Object,
}
########
* 代码演示
    - sequelize Model以及关联关系
    - mongoose Schema和Model
* 小结
    - 数据表设计
    - 数据表的关系
    - 代码演示
类型 注释
username varchar 用户名,唯一
password varchar 密码,保留字段,暂时用不到
phoneNumber varchar 手机号
nickName varchar 昵称
gender int 性别(1男性,2女性,0保密)
picture varchar 用户头像
latestLoginAt date 最后登录时间
isFrozen boolean 用户是否冻结
类型 注释
uuid varchar uuid,h5 url中使用,隐藏真正的id,避免被爬
title varchar 标题
desc varchar 副标题
contentId varchar 未发布内容id,内容存储在mongodb中
publishContentId varchar 发布内容id,内容存储在mongodb中,未发布的为空
author varchar 作者username,和用户表关联
coverImg varchar 封面图片url
isTemplate boolean 是否模板
status int 状态:0-删除,1-未发布,2-发布,3-强制下线
copiedCount int 模板被使用的次数
lastestPublishAt date 最近一次发布的时间
isHot boolean hot标签,模板使用
isNew boolean new标签,模板使用
orderIndex int 排序参数
isPublic boolean 模板是否公开显示
类型 注释
name varchar 渠道名称
workId int 作品id
status int 状态:0-删除,1-正常
6、server架构设计
* 引言
    - 回顾egg.js的代码结构。
* 整体架构图
* 写文档
    - 在语雀中新建文档《biz-editor-server端技术方案》,目录
        ~ 范围(以及和其他项目的关系)
        ~ 技术选型
        ~ 整体架构设计
        ~ 接口设计
        ~ 数据库设计
* 小结
    - 架构设计图
    - 写文档
7、技术方案设计
* 引言
    - 领导技术方案设计、评审技术方案设计,这就是架构师和基层程序员的区别之一。
* 主要产出
    - 《biz-editor-server端技术方案》文档
* 主要内容
    - 接口设计
    - 选择Restful API,不是GraphQL
    - 数据库设计
    - server整体设计
* 注意事项
    - 正视技术方案设计,设计不会浪费时间,只会节约时间
    - GraphQL不是课程主线,不要跑偏
8、基本功能开发
* 主要产出
    - 基础功能的接口,并发布到测试机
* 主要内容
    - 登录功能
    - 用户信息接口
    - 作品接口
    - 模板接口
* 注意事项
    - 发布相关的接口和渠道接口,会在下一周讲解
    - 发送短信功能还没有,先模拟
    - 简单的代码不在从0手写
    - 注意规范的研发流程,如git分支规范、commit规范、合并代码等
9、登录功能
* 引言
    - 回顾JWT的登录校验过程
* 短信验证过程
* 初次获取验证码
    - request - 输入手机号,请求短信验证码
    - server - 生成4位随机数,缓存2min
    - res
        ~ 发短信验证码
        ~ 返回给前端{ errno: 0 }
* 再次获取验证码
    - request - 输入手机号,请求短信验证码
    - server - 检查缓存,无则生成,并再次缓存
    - res
        ~ 有缓存,则返回错误:不能频繁获取
        ~ 发送短信验证码,并返回给前端{ errno: 0 }
* 登录验证
    - request - 书记好、验证码,请求登录验证
    - server - 匹配缓存
    - res
        ~ 匹配成功,则验证通过
        ~ 匹配失败,则验证不通过
* 重点考虑
    - 费用
        ~ 缓存,禁止频繁发送
        ~ 短信服务的提示和报警(后面会讲)
    - 用户体验
        ~ 短信发送失败,不会缓存,可以立马重新生成验证码
    - 稳定性
        ~ 如果server缓存失败,那就允许用户重复调用。情况较少,没关系
        ~ 短信服务挂掉,报警(后面会讲)
    - 注意事项
        ~ 发送短信,暂时模拟
        ~ 可以写个文档,虽然已经经过了技术方案设计,但有些写在开发前如果感觉复杂,
          可以写个设计文档再评审一下。及时发现问题,及时沟通。
* 小结
    - 短信验证过程
        ~ 生成验证码
        ~ 验证
    - 重点关注
10、用户信息接口
* 研发过程
    - 研发规范的细节,会在课程最后总结,先实践起来。
        ~ 拉新分支feature-xxx fix-xxx hotfix-xxx
        ~ 修改代码
        ~ commit,参考.cz-config.js
        ~ 往dev分支提交pr Pull Request(gitlal中是mr Merge Request)
        ~ 代码走查
        ~ 合并代码到dev
        ~ 等待发布上线
* 接口
    - 获取手机短信验证码
    - 登录(包含注册)
    - 获取用户信息
    - 修改用户信息
* 代码演示
    - routes/users.js
    - controller/users/
    - service/users.js
    - cache/users/
    - __test__/apis/users.js接口测试
* 测试
    - npm run test:local
    - 使用postman手动测试
* 小结
    - 注意研发过程
    - 接口
    - 代码演示
    - 测试
11、作品管理接口
* 接口
    - 创建空白作品
    - 复制作品(通过模板创建)
    - 删除作品
    - 恢复作品
    - 转赠作品
    - 我的作品列表(搜索,分页)
    - 我的回收站列表(搜索,分页)
    - 查询单个作品信息
    - 保存作品
* 代码演示
    - routes/works.js
    - controller/works/
    - service/works.js
    - __test__/apis/works.js
    - PS:发布相关的,下周再讲解
* 测试
    - npm run test:local
    - 使用postman手动测试
* 小结
    - 接口
    - 代码演示
    - 测试
12、模板接口
* 接口
    - 首页推荐模板列表(搜索,分页)--不需要登录校验
    - 获取单个模板信息--不需要登录校验
    - 我的模板列表(搜索,分页)
* 代码演示
    - routes/templates.js
    - controller/works/findTemplate
    - cache/works/templates
    - __test__/apis/template.js
* 测试
    - npm run test:local
    - 使用postman手动测试
* 小结
    - 接口
    - 代码演示
    - 测试

十七、编辑器服务端调用第三方服务

1、重要功能 & 第三方服务
* 引言
    - 根据2/8原则,关键的一小部分功能,将花费大部分设计和开发成本。
* 将收获什么
    - 完整的发布功能(考虑线上业务闭环)
    - 新技术/第三方服务调研(初次使用的,并非新发明的)
* 主要内容
    - 发布相关的功能
    - 接入短信服务
    - 上传图片到阿里云oss
    - 内容安全检查
* 关键词
    - 第三方服务
    - 新技术调研
* 学习方法
    - 自己去申请第三方服务,一般可试用或费用很低
    - 第一次使用一个新技术,要写一个单独的demo去体验一下,别直接拿到项目中
* 注意事项
    - 业务代码不会一行一行写
    - 课程中会隐藏第三方服务的秘钥,请理解
    - 第三方服务的价格、控制台、文档、API都可能会有调整
    - 特别是内容安全检查,可能会频繁调整(制作课程期间,就遇到了一次调整)
2、发布相关的功能
* 引言
    - 发布,是一个作品的生命周期里,最重要的一个环节。有很多事情需要考虑。
* 主要产出
    - 完成发布功能相关的接口
* 主要内容
    - 发布功能的设计
    - 如何强制下线?
    - 功能开发
* 注意事项
    - 考虑业务闭环,如重新发布时链接不能变
    - 分渠道的重要性!
3、发布功能的设计
* 引言
    - 发布,即获取一个url,能外网访问该作品。
* 功能范围
    - 发布作品
    - 支持多渠道
    - 发布为模板
* 划重点
    - url不能太长,因为要生成二维码。
    - 作品发布之后,重新编辑,保存,未发布。此时不能在线上生效。
    - 再次发布时,url不能变,渠道号也不能变。
    - 用户访问url时必须带有渠道号,否则无法分渠道统计。
    - 注意数据保密,防爬。
    - 发布时进行内容安全检查--本周后续的课程会讲。
    - PS:此时也能体现出,真实线上业务和demo是不一样的,业务闭环。
* 发布作品
    - 回顾:多个项目公用一个数据库。
* url
    - 发布作品,就是拼接一个url,其中有作品的id。可让h5-server访问该作品数据,并渲染出页面。
    - 例如http:127.0.0.1:3002/p/100,其中p发布作品(预览时可以改为preview),100是作品id。
* 标记
    - 未发布的作品,不能通过该url访问到。因此发布的作品要加一个标志。
    - 数据库设计,作品数据表status“0-删除,1-未发布,2-发布,3-强制下线”
* url加uuid
    - 还要防爬,所以要加上uuid,如http:127.0.0.1:3002/p/100-xxx。
    - 所以,这就是为何在设计数据表时要增加一个uuid。
    - 这就要求h5-server,必须同时匹配id uuid status。如有一条不满足,则返回404。
* 重新修改作品
    - 作品发布了,重新编辑,重新保存,尚未重新发布。
    - 此时访问作品,应该是原来发布的内容。
    - 所以,mongodb中作品内容和发布内容,要分开。
    - 参考数据库设计时的关系图。
* 多渠道
    - 回顾:多渠道统计需求,对于运营人员的重要性。
    - 渠道就是一个url参数,如http:127.0.0.1:3002/p/100-xxx?channel=1。
    - 一个作品可以对应对应多个渠道,至少要有一个渠道。回顾数据库设计时的关系。
    - 从技术角度,一个作品就是一个资源实体一个url,渠道仅仅是一个参数。
    - 但从用户使用角度,一个作品就可以发布出多个页面,多个二维码。
    - PS:直接访问一个无渠道的作品,也是可以的,但不建议这样做,h5-server应该做限制。
* 发布为模板
    - 模板就是作品,一个标记isTemplate而已。使用模板创建,其实就是复制。
    - 发布模板也是拼接一个url http:127.0.0.1:3002/p/100-xxx,然后修改status。
    - 但是,模板没有渠道,也不需要渠道。
* 小结
    - 发布为作品,以及重新修改
    - 多渠道
    - 发布为模板
    - PS:发布功能,是biz-editor-server和h5-server的共同功能,所以要两者都要考虑。
4、如何强制下线
* 引言
    - 这是一个必要的需求,用于人工保障内容安全,后台管理的重要功能。
    - 这个功能也影响了设计方案,原本是想要将作品发布到CDN上的。
* 发布项目到CDN
    - 直接将组件内容渲染成一个html,然后上传到oss,然后绑定CDN,可自定义域名。
    - 优点:
        ~ 不用专门搭建h5-server
        ~ CDN访问速度快(比现在h5-server的SSR速度还要快)
        ~ 不用担心“重新编辑,但未发布”的情况
    - 缺点
        ~ 后端渲染并发布CDN,导致biz-editor-server逻辑过于复杂(或者单独弄一个服务,
          渲染页面,上传CND)
        ~ 无法紧急下线
        ~ CDN一般用于存储静态资源,做强缓存,只增不减
        ~ 如果强行对一个资源做替换,不符合CDN的使用习惯,“反习惯”不可取
    - 结论,因为无法紧急下线,弃用CDN的发布方式。
* 紧急下线
    - 采用当前h5-server的方式。作品加一个标记status,即可实现紧急下线。
    - PS:h5-server不会每次都访问数据库,也是有缓存机智的,这个到时候再说。
* 小结
    - 发布项目到CDN
    - 紧急下线
    - PS:CDN还会用于其他地方
5、功能开发
* 引言
    - 功能要点搞明白,写代码就简单了。
* 发布作品和模板
    - routes/works.js发布相关的路由
    - controller/works/publishWorks.js
    - service/works.js发布功能
    - cache/works/publish.js
    - __test__/apis/works.js发布功能
* 渠道接口
    - routes/channel.js
    - controller/channel/
    - service/channel.js
    - __test__/apis/channel.js
* 测试
    - 接口测试
    - postman测试
* 小结
    - 发布作品和模板
    - 渠道接口
    - PS:预览功能,在h5-server开发,到时再讲。
6、发布相关的功能
* 引言
    - 发布,是一个作品的生命周期里,最重要的一个环节。有很多事情需要考虑。
* 主要产出
    - 完成发布功能相关的接口
* 主要内容
    - 发布功能的设计
    - 如何强制下线?
    - 功能开发
* 注意事项
    - 考虑业务闭环,如重新发布时链接不能变
    - 分渠道的重要性!
7、短信服务
* 引言
    - 真实项目项目,考虑用户体验。
* 主要产出
    - 《短信服务调研》文档
    - 登录验证码对接短信服务
* 主要内容
    - 短信服务调研
    - 配置短信服务
    - 实验demo
    - 代码演示
* 注意事项
    - 开通短信服务很容易,但使用短信服务需要审核(如需要域名备案的截图信息)
    - 课程中用到的手机号都是临时的。学习时,可以改用你自己的手机号。
8、短信服务调研
* 调研新技术方案的一般步骤
    - 列出所有竟品,根据品牌、功能、价格,选择一个最合适的
    - 购买或试用服务
    - 查阅文档和配置
    - 要单独写一个demo,体验一下
* 竟品对比
    - 已写到语雀文档中
        ~ 七牛云
        ~ 阿里云
        ~ 网易云
        ~ 腾讯云
    - 最后因为品牌、价格的原因,选择了腾讯云。
* 购买服务
    - 学习用,买最便宜的即可,少买。关注等待营销活动。
* 小结
    - 调研步骤
    - 竟品对比
    - 购买服务
9、配置短信服务
* 引言
    - 登录控制台:https://console.cloud.tencent.com/smsv2
* 基本配置
    - 创建签名
    - 创建模板
    - 群发测试
    - 配置成功后注意下面几个地方
    - appId-应用管理,应用列表
    - 签名的ID和名称-国内短信,签名管理
    - 模板ID和内容-国内短信,正文模板管理
* 安全配置
    - 防刷接口,导致短信调用量过大。
* 小结
    - 基本配置
    - 安全配置
10、实验demo
* 引言
    - 参考文档:https://cloud.tencent.com/document/product/382/43197
* 获取密钥
    - 右上角个人名称-->访问管理-->左侧菜单“访问密钥”:https://console.cloud.tencent.com/cam/capi
* demo
    - 先不要直接用于项目,先做一个单独的demo体验一下用法。
    - 抛开复杂的项目环境,才能获得最真实的体验。
    - 代码演示,注意判断发送是否成功。
* SDK升级
    - 在课程制作过程中tencentcloud-sdk-nodejs就升级过。导致安装了最新版本,之前的代码运行报错。
    - 而且,SDK升级了,但腾讯云的文档并没有更新,npm上的文档更新了。
    - 但是,目前npm文档还不全,没有写如何发短信。所以对于这种情况,我们没法使用最新版,还是依然使用之前的v3.0.263版本。
    - 待文档都更新了,再切换到新版本。
* 小结
    - 获取密钥(注意保密)
    - demo
    - 注意升级
11、功能开发
* 代码修改
    - vendor/sendMsg.js
    - controller/users/sendVeriCode.js(看相关代码,不用做演示)
    - __test__/vendor.test.js
* 测试
    - 单元测试
    - postman测试
* 小结
    - 代码修改
    - 测试
12、上传图片到阿里云OSS
* 引言
    - 文件存储交给OSS,我们只做server的业务逻辑。
* 主要产出
    - 开发上传接口
* 主要内容
    - 配置阿里云OSS
    - 实验demo
    - 代码演示
* 注意事项
    - 阿里云OSS要配置CDN,Sam老师会讲
13、配置阿里云OSS
* 引言
    - 文件存储使用阿里云OSS这是业界的最常见选择,不用再做技术调研。
    - PS:我还用过腾讯云的COS,不过配置操作和使用细节,跟阿里云OSS肯定不一样。作为参考吧。
* 购买
* 寻找折扣套餐
    - 此时OSS首页有一个折扣活动,非常便宜。
    - PS:折扣活动是有期限的,仅做为参考。
* 按量付费
    - 学习用,按量付费也很便宜。例如此时的几种价格,仅作为参考。具体的自己去官网看。
* 配置OSS
    - 购买之后,登录进入控制台
        ~ 创建Bucket。Bucket就像是你电脑里的硬盘。文档是以Bucket为单位来管理和存储的,可以创建多个Bucket。
        ~ 外网访问权限:公共读
* 小结
    - 购买
    - 配置
    - PS:配置CDN和自定义域名,Sam老师会讲解
14、实验demo
* 引言
    - 文档:https:/help.aliyun.com/document_detail/32068.html?spm=a2c4g.11186623.6.1382.42de2cc69fJBTZ
* 获取密钥
* demo
    - put
    - putStream
    - 存储到某个文件夹
    - isExist
    - 其他API,可以继续查阅文档。
* 小结
    - 获取密钥
    - demo
    - PS:参考你当前的文档,SDK和接口都可能发生变化。
15、代码演示
* 实现思路
    - 上传文件到服务器
    - 服务器上传到OSS
* 代码修改
    - routes/utils.js
    - controller/utils/uploadImg.js
    - vendor/uploadOSS.js
    - __test__/vendor.test.js OSS部分
    - PS:config线上环境和测试环境,两个bucket
* 测试
    - 单元测试
    - postman测试(需发布到测试机)
* 小结
    - 实现思路
    - 代码修改
    - 测试
16、内容安全检查
* 引言
    - 真实线上服务,内容安全非常重要,要能识别出:黄色、暴力、敏感内容。
* 主要产出
    - 《内容审查服务调研》调研
    - 发布作品接入内容安全检查
* 主要内容
    - 内容审查服务调研
    - 实验demo
    - 代码演示
* 注意事项
    - 内容安全检查,可能会随时调整
    - 偏重用户体验,还是偏重内容安全,自己抉择
17、内容审核服务调研
* 引言
    - 内容安全审查,不像OSS存储那样用的那么频繁,了解的不多,所以需要调研一下。
* 为何需要第三方服务
    - 内容审核为何非得用第三方服务?自己做一个敏感词检查不行吗?
    - 答案是:不合适,因为成本太高了。
        ~ 需要维护和更新词库
        ~ 自己用简单的indexOf做判断,时间复杂度太高了。如果词库长度m字符串长度n,那么时间复杂度
          就是O(m * (m + n)) (KMP算法时间复杂度是O(m + n))
        ~ 需要判断作弊行为,如敏感词之间加空格
        ~ 扩展性:审核图片、音频、小视频等
* 调研
    - 参考语雀文档。
        ~ 百度云
        ~ 网易云盾
* 创建应用
* 小结
    - 原因
    - 调研
    - 创建应用
18、实验demo
* 引言
    - 参考文档:https://ai.baidu.com/ai-doc/ANTIPORN/Lk3h6xev0
    - 审核数据数据类型
        ~ 文本
        ~ 图片
    - PS:某些不合规的、敏感内容,我们就不演示了,希望理解。但返回结果我会讲清楚。
* 审核文本
* 内容合规
    - { conclusion: '合规', conclusionType: 1, log_id: 159920000460984 }
* 内容不合规
    - 特别注意,有些内容返回words而有些words为空。
    - 为此,我专门咨询过百度云的技术人员,得到的答案是“未命中他们的词库”,但我觉得不是这个原因。
########
{
    conclusion: '不合规',
    conclusionType: 2,
    log_id: 159920000460984,
    data: [
        {
            msg: '存在政治敏感不合规',
            conclusion: '不合规',
            hits: [
                {
                    datasetName: '百度默认黑词库',
                    words: ['xxx', 'yyy']
                }
            ],
            subType: 3,
            conclusionType: 2,
            type: 12
        }
    ]
}
########
* 审核图片
* 图片合规
    - { conclusionType: 1, conclusion: '合规', log_id: 159920000682630 }
* 图片不合规
    - 注意,有些不合规的就没有stars,如血腥图片。
    - 我觉得这是合理的,血腥图片没有特别的关键字,也不好头像识别。
########
{
    conclusionType: 2,
    conclusion: '不合规',
    log_id: 159920000682630,
    data: [
        {
            msg: '存在政治敏感不合规',
            conclusion: '不合规',
            subType: 0,
            conclusionType: 2,
            type: 5,
            
            // 有些不合规的就没有stars,如血腥图片
            stars: [
                {
                    "probability": 0.94308,
                    "name": "xxx"
                },
                {
                    "probability": 0.44308,
                    "name": "yyy"
                }
            ],
        }
    ]
}
########
* 如何判断审核失败?
    - 你有两种选择,但选择了,就要负责。所以要认真考虑。
* 以用户体验为主
    - 提示内容审核失败时,一定要提示关键字,哪里失败了。
    - 这样用户就能快速修改,再次发起审核。
    - 但是,有些审核失败是没有关键字提示的。
* 以内容安全为主
    - 不管有没有关键字,只看审核结果。
    - 但这样用户有时候很迷茫,只知道什么失败,但不知道失败在哪里,只能猜测、重拾。
    - 掘进博客的内容审核,就不提示关键字。
* 小结
    - 审核文本
    - 审核图片
    - 如何判断审核失败?
    - PS:一切以你当前的文档为主,文档可能就有调整
19、代码演示
* 引言
    - 线上环境,作品发布时,才出发内容审核,其他时候不需要。
* 代码修改
    - vendor/contentSensor.js
    - controller/works/publishWorks.js接入内容审核
    - __test__/vendor.test.js内容审核部分
* 测试
    - 单元测试
    - postman测试
* 小结
    - 代码修改
    - 测试
posted on 2023-10-13 14:27  一路繁花似锦绣前程  阅读(21)  评论(0编辑  收藏  举报