学服务端(项目接口文档,jwt技术)的第14-18天(做项目)


一、项目介绍

1.1 学习此项目目的

能够把所学知识进行复盘和总结,进行灵活运用。

1.2 使用技术栈

前后端分离

后端技术栈:Node,Express,MySQL,JWT

前端技术栈:HTML5,CSS3,Ajax,本地存储

1.3 功能描述

实现了首页课程渲染、列表页筛选课程,搜索课程,课程详情介绍,视频播放,报名课程,登录,注册,个人中心等。

具体实现如下:

● 使用Node,Express,MySQL完成底层接口(编写的路由返回的是json)的编写

● 登入模块整合JWT,为每个学生用户生成一个单独的token

● 使用存储在本地缓存(localstorage)中的token进行用户的身份验证,保证用户可以报名课程和个人信息的管理

● 使用Jquery的Ajax方法进行请求接口,进行渲染页面

● 最后要部署上线

1.4 项目人员构成

产品(1) 负责功能分析,对接用户需求,提出设计方案
UI(1) 负责产品的样式设计,产出设计图
前端(2) 负责HTML页面效果编写
后端(2) 负责业务逻辑的实现和数据库操作
移动端(2) app ios/安卓,负责移动端效果设计开发
测试(1) 对完成的功能进行测试,检查BUG
运维(1) 对产品上线需要的服务器进行管理,维护
推广(1) 对产品上线后,需要对产品进行推广,以达到盈利

1.5 项目工作流程

针对项目型的任务,简单的说就是走下面的流程:了解需求,开需求分析会议,确定开发任务,推进开发进度,测试,试点,交付。当然每一项又会有具体的流程。

● 前期调研(调查你这个项目值不值得开发)

● 产品提出需求,给出产品原型图(RP图)

● 需求评审,早例会进行需求评审,产品经理阐述原型图。

● 指派研发任务(排期)

○ 前端任务

○ 后端任务

○ UI任务

○ 移动端任务(如果有) app / 小程序

● 阶段验收,根据进度,进行效果验收

● 功能测试

● 项目发布

● 额外的:文档编写技巧(后端的)

○ 接口功能描述

○ 请求方式描述

○ 接口请求参数描述

○ 接口响应参数描述

二、初始化项目及组员划分

(1)使用express脚手架,生成项目基本结构

D:\>express --view=ejs  uCourse
​
D:\>cd uCourse
​
D:\uCourse>npm i

(2)把nodemon工具配置到 package.json

    "scripts": {
        "start": "node ./bin/www",
        "dev": "nodemon ./bin/www"
    }

(3)删除app.js中不需要的一些代码

删除项目app.js文件中的第一行代码。

(4)修改app.js中的404配置和错误配置

// 404错误处理中间件
app.use(function(req, res, next) {
    next('404错误');
});
​
// 逻辑错误处理中间件
app.use(function(err, req, res, next) {
    res.send({ "status": 500, "msg": err });
});
​

(5)使用navicat工具导入数据库

(6)安装必备模块包:cors、formidable、mysql 等

D:\uCourse>npm i  mysql  cors  formidable

(7)运行项目进行开发

(8) 使用git和码云进行托管项目

2.1 小组长要干的

1)、使用git init命令 来初始化项目:

2)、在项目根目录中新建.gitignore文件,文件内容如下:

node_modules/
package-lock.json
*.md

3)、将工作区中的代码提交到暂存区:

git  add .

4)、在码云平台上新建远程私有仓库,并将相关开发人员添加到仓库中:

5)、其他开发成员克隆远程仓库:

git clone  远程仓库地址

6)、其他开发成员在克隆后本地项目中进行开发,开发完成分别使用git add . 、git commit -m 、git push 、git pull来管理git:

三、数据模型分析

使用navicat工具导入数据库

四、接口开发

4.1 首页课程列表

功能描述:根据请求类别参数的不同获取同步课程或精品课程数据

设计思路:

(1)接口地址 “/course” get请求

(2)传递参数为type:区分课程类别

接口文档:

(1)、接口地址:http://localhost:3000/course

(2)、调用方式:get

(3)、请求参数:

参数名称 是否必填 默认值 备注
cid 必填 1 (1:为同步 2:为精品) 课程类型

(4)、返回值(json):

名称 备注
status 200/500 状态值(200表示成功 500表示失败)
msg 课程数据成功/课程数据失败 提示信息
datas 数组 接口数据

4.2 分类相关接口

自主实现

4.2.1 地区

功能描述:获取地区数据

设计思路:

(1)接口地址 “/citys” get请求

(2)查看数据表信息及数据库字典

(3)设置sql语句

接口文档:

(1)、接口地址:http://localhost:3000/citys

(2)、请求方式:get

(3)、请求参数: 无

(4)、返回数据(json)

4.2.2 年级

功能描述:获取年级数据

设计思路:

(1)接口地址 “/grade”get请求

(2)查看数据表信息及数据库字典

(3)设置sql语句

接口文档:

(1)、接口地址:http://localhost:3000/grade

(2)、请求方式:get

(3)、请求参数: 无

(4)、返回数据(json)

4.2.3 学科

功能描述:获取学科数据

设计思路:

(1)接口地址 “/subjects” get请求

(2)查看数据表信息及数据库字典

(3)设置sql语句

接口文档:

(1)、接口地址:http://localhost:3000/subjects

(2)、请求方式:get

(3)、请求参数: 无

(4)、返回数据(json)

4.2.4 考试类别

功能描述:获取考试类型数据

设计思路:

(1)接口地址 “/category”get请求

(2)查看数据表信息及数据库字典

(3)设置sql语句

接口文档:

(1)、接口地址:http://localhost:3000/category

(2)、请求方式:get

(3)、请求参数: 无

(4)、返回数据(json)

4.3 列表页

功能描述:获取课程列表

设计思路:

(1)接口地址 “/courselist”get请求

(2)查看数据表信息及数据库字典

(3)设置sql语句

接口文档:

(1)、接口地址:http://localhost:3000/courselist

(2)、请求方式:get

(3)、请求参数:

序号 参数名 参数类型 是否必填 备注
1 city 字符串 城市
2 grade 字符串 年级
3 subject 字符串 学科
4 category 字符串 考试类别
5 pages 整数 第几页,默认为1
6 limits 整数 每页要显示的条数,默认为3
7 ctype 整数 课程类别,默认为1(同步课程)

(4)、返回数据(json)

4.4 搜索

自主实现

功能描述:根据查询关键字获取课程列表

设计思路:

(1)接口地址 “/searchlist”get请求

(2)查看数据表信息及数据库字典

(3)设置sql语句

4.5 课程详情

自主实现

功能描述:根据课程id获取课程详情信息

设计思路:

(1)接口地址 “/details” get请求

(2)查看数据表信息及数据库字典

(3)设置sql语句

接口文档:

(1)、接口地址:http://localhost:3000/details

(2)、请求方式:get

(3)、请求参数:

cid 课程id 必填

(4)、返回数据(json)

4.6 课程视频

功能描述:根据视频id获取课程的视频地址

设计思路:

(1)接口地址 “/videoplay” get请求

(2)查看数据表信息及数据库字典

(3)设置sql语句

接口文档:

(1)、接口地址:http://localhost:3000/details

(2)、请求方式:get

(3)、请求参数:

cid 课程id 必填

(4)、返回数据(json)

4.7 报名课程

自主实现

功能描述:根据当前登录用户和课程id进行报名

设计思路:

(1)接口地址 “/study” post请求

(2)查看数据表信息及数据库字典

(3)设置sql语句

4.8 个人中心

4.8.1 注册

功能描述:根据用户名和密码实现注册

设计思路:(1)接口地址 “/register”post请求 (2)查看数据表信息及数据库字典 (3)设置sql语句

注意:在项目根目录下安装第三方md5包,md5包用来加密密码。

什么是md5?【重点】

md5是一种加密算法,使用这种加密算法加密后的数据是不可逆,并且加密码后的数据长度是固定的32位,同一个字符串使用md5加密后的数据是一样的。

注册新用户接口文档

接口地址:http://localhost:3000/register

调用方式:post

接口参数:

参数名称 是否必填 默认值 备注
user 帐号
pwd 密码
repwd 确认密码

返回参数(json):

参数名称 默认值 备注
status 200/500 200表示成功 500表示失败 状态值
msg 提示信息
data 数组 返回的数据

4.8.2 登录

功能描述:根据用户名和密码实现登录功能,返回登录标识token

设计思路:(1)接口地址 “/login”post请求 (2)查看数据表信息及数据库字典 (3)设置sql语句

接口文档:

(1)、接口地址:http://localhost:3000/login

(2)、请求方式:post

(3)、请求参数:

序号 参数名 参数类型 是否必填 备注
1 user 字符串 帐号
2 pass 字符串 密码
3 codes 字符串 用户输入的验证码
4 syscode 字符串 系统生成的验证码

(4)、返回数据(json)

4.8.3 token

4.8.3.1 JWT介绍【重点】

什么是JWT(token)?【重点】

Json web token(jwt),jwt用来在不同主机或不同系统之间传递数据,以解决在不同主机或不同系统之间实现用户身份认证的。

JWT数据由三部分组成:A.B.C【重点】

A:头部(header) {typ:'jwt',alg:'加密算法'}

B:有效载荷(payload) 用来存放用户自定义的数据 比如: {"uid":12354,"uname":"李四"}

C:签名(signature) 用来校验jwt数据是否有效 C=加密算法(加密算法(A).加密算法(B))

本地存储技术:【重点】

1)、cookie: cookie有大小及个数的限制,同时可以被禁用,默认有效时间为整个有效会话期间,但可以设置有效时间;

2)、localStorage:没有大小及个数的限制,不能设置有效时间,默认永久有效;

3)、sessionStorage:没有大小及个数据的限制,不能设置有效时间,默认有效时间为整个有效会话期间;

4.8.3.2 使用步骤

(1) 安装jsonwebtoken

npm i  jsonwebtoken 

引入:

const jwt=requir("jsonwebtoken")

(2) 设置要加密的数据

(3) 加密已知的数据

语法:

jwt.sign(data,secret,option);

描述:把源数据进行加密返回token

(4) 验证token是否过期

语法:

jwt.verify( token,serect )

描述:验证token是否有效

(5) 代码案例:

(6) 模块化token

4.8.4 获取用户

自主实现

功能描述:根据用户id,获取对应的用户信息

设计思路:

(1)接口地址 “/user” get请求

(2)查看数据表信息及数据库字典

(3)设置sql语句

难点:需要验证token

4.8.5 更新用户

自主实现

功能描述:根据用户id,更新对应的用户信息

设计思路:

(1)接口地址 “/user”post请求

(2)查看数据表信息及数据库字典

(3)设置sql语句

难点:参数较多,需要验证token

4.8.6 更新用户头像

功能描述:根据用户id和传递过来的头像,更新用户头像

设计思路:

(1)接口地址 “/uploadhead”post请求

(2)查看数据表信息及数据库字典

(3)设置sql语句

难点:需要验证token,文件上传

4.8.7 用户的学习记录

自主实现

功能描述:获取当前登录用户的学习记录

设计思路:

(1)接口地址 “/orders” get请求

(2)查看数据表信息及数据库字典

(3)设置sql语句

难点:需要验证token,连表查询

上一篇:Session token vs JWT (JSON web token)


下一篇:使用jwt_decode破解后端返回的token