作者:UOrb

声明:文章为稀土技能社区首发签约文章,14天内制止转载,14天后未获授权制止转载,侵权必究!

前言

首先我 不是 专业的后端,所以服务端的技能计划规划或许不那么 专业,比方 功能规划 那块其实应该愈加详细的,会触及到一些 状况判定、数据来历、 事务逻辑 等一些内容(当然这一块的内容大部分是从需求文档中转化而来的),我这里仅仅简略的运用接口的排列;数据库规划也是一样,不够专业,仅仅直白的规划。

不过尽管相对来说粗糙了一些,但是麻雀虽小五脏俱全吧!

其间 接口规划(单独转换之后也可以叫做接口文档)是对前端开发 影响 最大的了,前端的事务逻辑和接口数据 Mock 都需求 依靠 它。

在前后端别离的状况下,前后端一起进行开发,没有预先进行接口规划(接口文档)的话,对前端的影响是非常大的,最常见的便是前端只能把静态页面先写完,等后端接口出来后再配合着进行事务逻辑的开发,然后大部分的工作量都堆积在后期,就导致了加班或项目延期等状况;就算是前端预先依据需求和规划稿自定义了数据结构,等后端接口给出后经过数据模型转换,也是变相的增加了前端的工作量和负担。

项目背景

这里大部分都是从 需求文档 中的引用,所以就不再重写了。

此处省略一万个字…

技能选型

服务端言语毫无疑问是 Node.js

服务端结构将会运用 Nest.js,原因是 Nest.js 是一套 计划、架构 ,一起也会愈加贴近真实的后端开发,熟悉 Java 的 Spring 结构的兄弟就会感觉 Nest.js 非常像 Spring,缺陷是国内 Nest.js 不太昌盛,也很少有其相关教程,只能翻翻官方文档比较难上手;

数据库运用 mysql5.7 和 redis

功能规划

这里需求依据需求文档、原型图或规划图来规划出功能模块以及相关的一些规则和约好,大多数状况其实便是 产品需求 转换成后端技能需求的一个过程。

登陆

手把手从零到一打造在线文档之书写服务端技术方案设计

触及接口

  1. 用户注册接口
  2. 用户登陆认证接口
  3. 用户信息获取接口

个人中心

手把手从零到一打造在线文档之书写服务端技术方案设计

触及接口

  1. 用户信息获取接口
  2. 文档查询接口
  3. 获取用户空间列表接口
  4. 新增用户空间接口
  5. 修正指定空间接口
  6. 删去指定空间接口
  7. 获取指定空间的知识库列表接口
  8. 新增指定空间的知识库接口
  9. 修正指定知识库接口
  10. 删去指定知识库接口

知识库

手把手从零到一打造在线文档之书写服务端技术方案设计

触及接口

  1. 获取指定知识库信息接口
  2. 修正指定知识库信息接口
  3. 获取指定知识库的文档列表接口
  4. 新增指定空间文档接口
  5. 修正指定文档装备接口
  6. 删去指定文档接口

最近阅读

手把手从零到一打造在线文档之书写服务端技术方案设计

触及接口

  1. 文档查询接口
  2. 获取用户阅读文档记载列表接口

回收站

手把手从零到一打造在线文档之书写服务端技术方案设计

触及接口

  1. 文档查询接口
  2. 获取用户已删去列表接口
  3. 康复文档接口
  4. 直接删去接口

文档

手把手从零到一打造在线文档之书写服务端技术方案设计

触及接口

  1. 获取指定文档信息数据接口
  2. 修正/保存指定文档接口
  3. 修正指定文档装备接口

数据库规划

这里需求依据需求文档和转换后的技能需求(功能规划)的内容进行数据库的规划,大体便是看有多少种 载体 ,每个载体基本上就可以规划成一个 数据表 再依据 需求 规划字段,基本上除了事务会用到的数据字段惯例的都会带上 创立人、创立时刻、更新人、更新时刻、私有状况(假删去等逻辑判断) 之类的字段,基本上你事务逻辑整理(需求 or 功能规划)清楚了,数据库规划基本上不会有太大的问题。

手把手从零到一打造在线文档之书写服务端技术方案设计

用户表

CREATE TABLE `online_document`.`user` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '仅有 ID',
  `name` VARCHAR(45) NULL COMMENT '昵称',
  `username` VARCHAR(45) NOT NULL COMMENT '帐号',
  `password` VARCHAR(45) NOT NULL COMMENT '暗码',
  `create_time` DATETIME NOT NULL COMMENT '创立时刻',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC),
  UNIQUE INDEX `username_UNIQUE` (`username` ASC))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COMMENT = '用户';

空间表

CREATE TABLE `online_document`.`space` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '仅有ID',
  `user_id` INT UNSIGNED NOT NULL COMMENT '所属用户',
  `name` VARCHAR(45) NOT NULL COMMENT '空间名',
  `describe` VARCHAR(255) NULL COMMENT '简介',
  `create` INT NULL COMMENT '创立人',
  `create_time` DATETIME NULL COMMENT '创立时刻',
  `update` INT NULL COMMENT '更新人',
  `update_time` DATETIME NULL COMMENT '更新时刻',
  `status` CHAR(1) NOT NULL DEFAULT 1 COMMENT '状况 1: 正常; 0: 删去',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COMMENT = '空间';

知识库表

CREATE TABLE `online_document`.`library` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` INT UNSIGNED NOT NULL COMMENT '所属用户',
  `space_id` INT UNSIGNED NOT NULL COMMENT '所属空间',
  `name` VARCHAR(45) NOT NULL COMMENT '知识库称号',
  `describe` VARCHAR(255) NULL COMMENT '简介',
  `create` INT NULL COMMENT '创立人',
  `create_time` DATETIME NULL COMMENT '创立时刻',
  `update` INT NULL COMMENT '更新人',
  `update_time` DATETIME NULL COMMENT '更新时刻',
  `status` CHAR(1) NOT NULL DEFAULT 1 COMMENT '状况 1: 正常; 0: 删去',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COMMENT = '知识库';

文档表

CREATE TABLE `online_document`.`doc` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '仅有 ID',
  `user_id` INT UNSIGNED NOT NULL COMMENT '所属用户',
  `space_id` INT UNSIGNED NOT NULL COMMENT '所属空间',
  `library_id` INT UNSIGNED NOT NULL COMMENT '所属知识库',
  `content_id` INT UNSIGNED NOT NULL COMMENT '文档内容',
  `title` VARCHAR(45) NULL COMMENT '文档标题',
  `create` INT NULL COMMENT '创立人',
  `create_time` DATETIME NULL COMMENT '创立时刻',
  `update` INT NULL COMMENT '更新人',
  `update_time` DATETIME NULL COMMENT '更新时刻',
  `status` CHAR(1) NOT NULL DEFAULT 1 COMMENT '状况 1: 正常; 0: 删去',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COMMENT = '文档';

文档内容表

CREATE TABLE `online_document`.`content` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '仅有 ID',
  `doc_id` INT NOT NULL COMMENT '所属文档',
  `content` LONGTEXT NULL COMMENT '文档内容',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COMMENT = '文档内容';

阅读记载表

CREATE TABLE `online_document`.`doc_record` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` INT NOT NULL COMMENT '所属用户',
  `doc_id` INT NOT NULL COMMENT '所属文档',
  `space_id` INT NOT NULL COMMENT '所属空间',
  `library_id` INT NOT NULL COMMENT '所属知识库',
  `doc_title` VARCHAR(45) NULL COMMENT '文档标题',
  `visit_time` DATETIME NOT NULL COMMENT '拜访时刻',
  `status` CHAR(1) NOT NULL DEFAULT 1 COMMENT '状况 1: 正常; 0: 删去',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
COMMENT = '阅读记载';

接口规划

接口规划在惯例文档中或许更多的运用 表格 的方式,不过写 表格 会花费更多的时刻和精力,相对来说就会更精准和详细一些,我这里运用的类 JSON 字符串的方式来书写的。

用户模块

用户注册接口

恳求地址:/api/register
恳求类型:POST
恳求体:

{
  name: string // 昵称
  username: string // 帐号
  password: string // 暗码
}

呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: {
    token: string // 认证
  }
}

用户登陆认证接口

恳求地址:/api/login
恳求类型:POST
恳求体:

{
  name: string // 昵称
  username: string // 帐号
  password: string // 暗码
}

呼应体: { msg: string // 音讯 code: number // 状况码 data: { token: string // 认证 } }

用户信息获取接口

恳求地址:/api/user
恳求类型:GET
恳求体:无
呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: {
    id: number // 用户 id
    name: string // 用户昵称
  }
}

空间模块

获取用户空间列表接口

恳求地址:/api/space
恳求类型:GET
恳求体:无
呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: [
    {
      id: number // 空间 ID
      name: string // 空间称号
      describe: string // 空间简介
    }
  ]
}

新增用户空间接口

恳求地址:/api/space
恳求类型:POST
恳求体:

{
  name: string // 空间称号
  describe: string // 空间简介
}

呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: boolean // true 创立成功;false 创立失利
}

修正指定空间接口

恳求地址:/api/space/:id
恳求类型:PATCH
恳求体:

{
  name: string // 空间称号
  describe: string // 简介
}

呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: boolean // true 修正成功;false 修正失利
}

删去指定空间接口

恳求地址:/api/space/:id
恳求类型:DELETE
恳求体:无
呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: boolean // true 删去成功;false 删去失利
}

知识库模块

获取指定空间的知识库列表接口

恳求地址:/api/library?spaceId=1
恳求类型:GET
恳求体:无
呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: [
    {
      id: number // 知识库 ID
      name: string // 知识库称号
      describe: string // 知识库简介
    }
  ]
}

新增指定空间的知识库接口

恳求地址:/api/library
恳求类型:POST
恳求体:

{
  spaceId: // 空间 ID
  name: string // 知识库称号
  describe: string // 知识库简介
}

呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: boolean // true 创立成功;false 创立失利
}

修正指定知识库接口

恳求地址:/api/library/:id
恳求类型:PATCH
恳求体:

{
  name: string // 知识库称号
  describe: string // 知识库简介
}

呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: boolean // true 修正成功;false 修正失利
}

删去指定知识库接口

恳求地址:/api/library/:id
恳求类型:DELETE
恳求体:无
呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: boolean // true 删去成功;false 删去失利
}

获取指定知识库信息接口

恳求地址:/api/library/:id
恳求类型:GET
恳求体:无
呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: {
    id: number // 知识库 ID
  	userId: number // 所属用户
  	spaceId: number // 所属空间 ID
    name: string // 知识库称号
    describe: string // 知识库简介
    create: number // 创立人
    createTime: string // 创立时刻
    update: number // 更新人
    updateTime: string // 更新时刻
  }
}

获取指定知识库的文档列表接口

恳求地址:/api/library/:id/doc
恳求类型:GET
恳求体:无
呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: [
    {
      id: number // 文章 ID
      userId: number // 所属用户
      spaceId: number // 所属空间 ID
      libraryId: number // 所属知识库 ID
      contentId: number // 内容 ID
      title: string // 标题
      create: number // 创立人
      createTime: string // 创立时刻
      update: number // 更新人
      updateTime: string // 更新时刻
    }
  ]
}

文档模块

获取指定文档内容数据接口

恳求地址:/api/doc/:docId/:contentId
恳求类型:GET
恳求体:无
呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: {
    id: number // 内容 ID
    content: string // 文档内容
  }
}

新增指定知识库文档接口

恳求地址:/api/doc
恳求类型:POST
恳求体:

{
  spaceId: string // 所属空间
  libraryId: string // 所属知识库
}

呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: boolean // true 创立成功;false 创立失利
}

更新指定文档接口

恳求地址:/api/doc/:id/:contentId
恳求类型:PATCH
恳求体:

{
  content: string // 文档内容
}

呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: boolean // true 更新成功;false 更新失利
}

修正指定文档装备信息接口

恳求地址:/api/doc/:id
恳求类型:PATCH
恳求体:

{
  title: string // 文档称号
  ... // 其他
}

呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: boolean // true 修正成功;false 修正失利
}

删去指定文档接口

恳求地址:/api/doc/:id
恳求类型:DELETE
恳求体:无
呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: boolean // true 删去成功;false 删去失利
}

阅读记载模块

用户注册接口

恳求地址:/api/user/recode 恳求类型:GET 恳求体:无 呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: {
    currPage: number // 当时页码
    pageSize: number // 每页数量
    total: number // 总数
    list: [
      {
        id: number // 记载 ID
        userId: number // 所属用户
        spaceId: number // 所属空间
        libraryId: number // 所属知识库
        docId: number // 所属文档
        docTitle: string // 文档标题
        visitTime: string // 拜访时刻
      }
    ]
  }
}

回收站模块

获取用户已删去列表接口

恳求地址:/api/recycle
恳求类型:GET
恳求体:无
呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: [
    {
      id: number // 文章 ID
  		userId: number // 所属用户
      spaceId: number // 所属空间 ID
      libraryId: number // 所属知识库 ID
      contentId: number // 内容 ID
      title: string // 标题
      create: number // 创立人
      createTime: string // 创立时刻
      update: number // 更新人
      updateTime: string // 更新时刻
    }
  ]
}

回复指定文档接口

恳求地址:/api/recycle/:id
恳求类型:PATCH
恳求体:无
呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: boolean // true 康复成功;false 康复失利
}

彻底删去指定文档接口

恳求地址:/api/recycle/:id
恳求类型:DELETE
恳求体:无
呼应体:

{
  msg: string // 音讯
  code: number // 状况码
  data: boolean // true 删去成功;false 删去失利
}

总结

技能计划是为了研究解决各类技能问题,有针对性、系统性的提出办法和应对措施及相关对策。

技能计划对项目的质量和周期有着紧密的相关,技能计划相当于定下了一个大纲和详细方向,对项目的规范化、标准化、工作量估算以及详细的研制过程有着重要的指导作用。