首页 > 其他分享 >第八章、web前端架构师

第八章、web前端架构师

时间:2023-10-13 14:33:42浏览次数:38  
标签:方案设计 web 接口 API GraphQL 第八章 作品 架构师 模板

目录

十六、编辑器服务端基础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、重要功能 & 第三方服务
* 引言
    - 

标签:方案设计,web,接口,API,GraphQL,第八章,作品,架构师,模板
From: https://www.cnblogs.com/linding/p/17762030.html

相关文章

  • 如何基于three.js(webgl)引擎架构,研发一套通过配置就能自动生成的3D机房系统
    序:这几年观察下来,大部分做物联网三维可视化解决方案的企业或个人,基本都绕不开3D机房。包括前面也讲过这样的案例《使用webgl(three.js)创建自动化抽象化3D机房,3D机房模块详细介绍(抽象版一)》 《 使用webgl(three.js)创建科技版3D机房,3D机房微模块详细介绍(升级版三)——......
  • 文件包含漏洞在phpinfo条件竞争下获取WebShell
    PHP文件包含漏洞(利用phpinfo与条件竞争)在PHP环境下,如果网站存在本地文件包含漏洞,但找不到可以包含的文件时,我们可以通过条件竞争来包含缓存文件的方法来获取webshell。又因为临时文件名是随机的,如果目标网站上存在phpinfo,则可以通过phpinfo来获取临时文件名,进而进行包含。前提......
  • Android WebRTC 编译注意事项
    AndroidWebRTC编译注意事项说明文主要适用于需要从外部C++文件调用WebRTCC++接口的场景本文对应的源码基于m111分支,高版本的也可以参考Android平台用默认参数编译AndroidWebRTC存在的主要问题RTTI默认未开启C++库默认使用了webrtc内部的C++库,与外部C++库abi不兼容,由......
  • PHP 的 Websocket 客户端和服务器
     /*------------------------------------------------------*///--需要安装websocket,我用的是下面链接提供的//--https://github.com/Textalk/websocket-php/*------------------------------------------------------*///客户端require('vendor/autoload.php');$c......
  • Webmin 远程命令执行 (CVE-2019-15107)
    说明内容漏洞编号CVE-2019-15107漏洞名称Webmin远程命令执行漏洞评级影响范围Webmin<=1.920漏洞描述该漏洞由于password_change.cgi文件在重置密码功能在重置密码功能中发现了一个错误,该错误允许恶意第三方由于缺少输入验证而执行恶意代码。修复方......
  • 关于 C# / .Net / IIS Web Service 调用 exe
    转自:https://blog.csdn.net/sby5104/article/details/110189048最近一个面试,面试官说他们现在的架构是通过IIS部署的WebService调用Server端的WindowsApplication也就是exe。面试拉跨之后自己尝试了一下这种实现方式,在这里记录一下自己遇到的坑,然后留一下查到的解决方案。......
  • C# Webapi 简单的依赖注入-构造函数
    控制器部分:usingMicrosoft.AspNetCore.Mvc;usingWebApplication1.IServices;usingWebApplication1.Utility.SwaggerExt;namespaceWebApplication1.Controllers{[ApiController][Route("[controller]")]//指定当前的控制器是哪个Swagger版本的指定给......
  • javaweb第8章源码
    javaweb第8章源码下载链接:https://wwpv.lanzoue.com/iRXto1bmbtqb文件结构CHAPTER08│.classpath│.project│├─.settings│.jsdtscope│org.eclipse.jdt.core.prefs│org.eclipse.wst.common.component│org.eclipse.wst.common.projec......
  • 【Python】FastAPI 使用python3.6+构建API的Web框架
    现代、快速(高性能)的Web框架,用于构建基于Python的 API;基于Starlette和Pydantic库构建而成官网:https://fastapi.tiangolo.com/ 1、安装#对于生产环境,还需要一个ASGI服务器,如Uvicorn或Hypercorn#>pipinstall"uvicorn[standard]"pipinstallfastapipipi......
  • 【webapp】Servlet的生命周期
    Servlet的生命周期可以分为以下几个阶段:加载和实例化:当Servlet容器启动或检测到需要使用Servlet时,会加载Servlet的类文件并创建Servlet的实例。这通常发生在第一次请求到达Servlet或在容器启动时。初始化:在Servlet实例化后,容器会调用Servlet的init()方法来进行初始化。在初......