作者:UOrb
声明:文章为稀土技能社区首发签约文章,14天内制止转载,14天后未获授权制止转载,侵权必究!
前言
首先我 不是 专业的后端,所以服务端的技能计划规划或许不那么 专业,比方 功能规划 那块其实应该愈加详细的,会触及到一些 状况判定、数据来历、 事务逻辑
等一些内容(当然这一块的内容大部分是从需求文档中转化而来的),我这里仅仅简略的运用接口的排列;数据库规划也是一样,不够专业,仅仅直白的规划。
不过尽管相对来说粗糙了一些,但是麻雀虽小五脏俱全吧!
其间 接口规划(单独转换之后也可以叫做接口文档)是对前端开发 影响 最大的了,前端的事务逻辑和接口数据 Mock 都需求 依靠 它。
在前后端别离的状况下,前后端一起进行开发,没有预先进行接口规划(接口文档)的话,对前端的影响是非常大的,最常见的便是前端只能把静态页面先写完,等后端接口出来后再配合着进行事务逻辑的开发,然后大部分的工作量都堆积在后期,就导致了加班或项目延期等状况;就算是前端预先依据需求和规划稿自定义了数据结构,等后端接口给出后经过数据模型转换,也是变相的增加了前端的工作量和负担。
项目背景
这里大部分都是从 需求文档 中的引用,所以就不再重写了。
此处省略一万个字…
技能选型
服务端言语毫无疑问是 Node.js
服务端结构将会运用 Nest.js,原因是 Nest.js 是一套 计划、架构
,一起也会愈加贴近真实的后端开发,熟悉 Java 的 Spring 结构的兄弟就会感觉 Nest.js 非常像 Spring,缺陷是国内 Nest.js 不太昌盛,也很少有其相关教程,只能翻翻官方文档比较难上手;
数据库运用 mysql5.7 和 redis
功能规划
这里需求依据需求文档、原型图或规划图来规划出功能模块以及相关的一些规则和约好,大多数状况其实便是 产品需求 转换成后端技能需求的一个过程。
登陆
触及接口
- 用户注册接口
- 用户登陆认证接口
- 用户信息获取接口
个人中心
触及接口
- 用户信息获取接口
- 文档查询接口
- 获取用户空间列表接口
- 新增用户空间接口
- 修正指定空间接口
- 删去指定空间接口
- 获取指定空间的知识库列表接口
- 新增指定空间的知识库接口
- 修正指定知识库接口
- 删去指定知识库接口
知识库
触及接口
- 获取指定知识库信息接口
- 修正指定知识库信息接口
- 获取指定知识库的文档列表接口
- 新增指定空间文档接口
- 修正指定文档装备接口
- 删去指定文档接口
最近阅读
触及接口
- 文档查询接口
- 获取用户阅读文档记载列表接口
回收站
触及接口
- 文档查询接口
- 获取用户已删去列表接口
- 康复文档接口
- 直接删去接口
文档
触及接口
- 获取指定文档信息数据接口
- 修正/保存指定文档接口
- 修正指定文档装备接口
数据库规划
这里需求依据需求文档和转换后的技能需求(功能规划)的内容进行数据库的规划,大体便是看有多少种 载体 ,每个载体基本上就可以规划成一个 数据表 再依据 需求 规划字段,基本上除了事务会用到的数据字段惯例的都会带上 创立人、创立时刻、更新人、更新时刻、私有状况(假删去等逻辑判断)
之类的字段,基本上你事务逻辑整理(需求 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 删去失利
}
总结
技能计划是为了研究解决各类技能问题,有针对性、系统性的提出办法和应对措施及相关对策。
技能计划对项目的质量和周期有着紧密的相关,技能计划相当于定下了一个大纲和详细方向,对项目的规范化、标准化、工作量估算以及详细的研制过程有着重要的指导作用。