一、配置后端环境配置
这样就后端的环境就基本配置好了
注意:
1.要使用express框架必须要npm下载
2.nodemon工具能让我们的代码更新的时候不用重新启动服务器
3.cors的作用就是为了解决跨域问题,也是需要npm下载的
4.body-parser是用于解决表单的中间件,处理表单里面的数据,也是需要npm下载的
二、将后端代码上传gitee
https://gitee.com/zzwlbb/back.git
本人利用的工具是SourceTree相比于Git Bash图形化操作比较方便,无需使用git命令
三、完成本地数据库的配置
1.利用小皮面板创建一个数据库
2.创建完数据库之后使用Navicat来连接数据库
3.分析用户字段:
通常我们的用户要设计的字段为
数据库的唯一id(自增),账户account,密码password,身份identity,部门department,姓名name,性别gender,邮箱email或电话number,创建时间create_time,更新时间update_time(修改账号时间),账号状态status(用于判断用户是否冻结)
我们可以画出ER图
4.创建表
四、注册与登录功能分析
1.分析注册与登录模块需要考虑的逻辑
(1)要考虑用户有没有输入账号和密码
(2)注册的账号会不会存在
(3)对注册的密码进行加密
(4)账号的输入是否正确
(5)输入的账号是否被冻结
(6)输入的密码是否正确
(7)登陆后返回token
2.创建路由模块和路由函数处理模块
3.安装joi,对数据进行限制的中间件
4.安装brcyptjs,对密码进行加密的中间件
5.安装jwt,生成token的中间件
6.安装express-jwt,解析token的中间件
7.测试接口
五、完成后端登录与注册功能
1.创建与数据库之间的连接
const mysql = require('mysql');
//创建连接
const db = mysql.createPool({
host: 'localhost',
user:'back_system',
password:'123321',
database:'back_system'
})
module.exports = db
2.需要创建router_handle文件夹路由处理函数模块
3.创建router文件夹用于处理登录和注册功能的路由
4.在app.js中导入router
5.注册步骤
const db = require('../db/index')
const bcrypt = require('bcrypt.js')
exports.register = (req,res)=>{
//前端传的数据 req
//返回给前端的数据 res
const reginfo = req.body
//第一步 传过来的数据是否为空
if(!reginfo.account || !reginfo.password){
return res.send({
status:1,
msg:'用户名或密码不能为空'
})
}
//第二步 判断用户名是否存在
const sql = 'select * from userinfo where account = ?'
//执行sql语句 接收到的参数
db.query(sql,reginfo.account,(err,result)=>{
if(result.length>0){
return res.send({
status:1,
message:'用户名已存在'
})
}
})
//第三步 对密码加密 需要bcrypt.js
reginfo.password = bcrypt.hashSync(reginfo.password,10)
//第四步 插入数据
const sql1 = 'insert into userinfo set ?'
const identity = '普通用户'
const create_time = new Date()
db.query(sql1,{
account:reginfo.account,
password:reginfo.password,
identity:identity,
create_time:create_time,
status:0
},(err,results)=>{
if(results.affectedRows !== 1){
return res.send({
status:1,
message:'注册失败'
})
}
res.send({
status:0,
message:'注册成功'
})
})
}
6.使用加密算法 排除不需要携带token的接口
(1)创建jwt-config文件夹 用来存放密钥
(2)在app.js引入和使用jwt
const {expressjwt:jwt} = require('express-jwt');
const jwtConfig = require('./jwt_config/index');
// 使用加密算法 排除不需要携带token的接口
app.use(jwt({
secret:jwtConfig.jwtSecretKey,
algorithms:['HS256']
}).unless({
path:[/^\/api\/login/]
}))
6.登录步骤
exports.login = (req,res)=>{
const loginfo = req.body
//第一步 查看有没有前端传过来的账号
const sql = 'select * from userinfo where account = ?'
db.query(sql,loginfo.account,(err,results)=>{
//数据库连接失败会执行err
//自定义中间件 在app.js定义
if(err) return res.cc(err)
if(results.length!==1) return res.cc('登录失败')
//第二步 对前端密码进行解密 需要bcrypt.js 前端密码 数据库密码
const compareResult = bcrypt.compareSync(loginfo.password,results[0].password)
//比较失败
if(!compareResult) return res.cc('登录失败')
//第三步 是否冻结账号
if(results[0].status === 1) return res.cc('账号已被冻结')
//第四步 生成token
//要剔除加密后的密码和其他数据
const user = {
...results[0],
password:'',
identity:'',
create_time:'',
update_time:''
}
//设置token过期时间
const tokenStr = jwt.sign(user,jwtconfig.jwtSecretKey,{
expiresIn:'24h'
})
res.send({
results,
status:0,
message:'登录成功',
token:'Bearer '+ tokenStr
})
})
}
7.限制规则
(1)在写完登录代码后要通过expressjoi来对前端传递过来的参数进行限制
(2)创建一个limit文件夹,在limit login中定义规则
const joi = require('joi')
const account = joi.string().alphanum().min(3).max(10).required()
const password = joi.string().pattern(/^[\S]{6,12}$/).required()
exports.login_limit = {
body:{
account,
password
}
}
(3)在app.js中对不符合规则的进行报错
//使用 joi中间件
app.use((err,req,res,next)=>{
if(err instanceof joi.ValidationError){
res.cc(err)
}
})
(4)然后在router中进行引入expressjoi来对账号密码进行限制
// 导入joi规则
const expressJoi = require('@escook/express-joi')
const {login_limit} = require('../limit/login')
router.post('/register',expressJoi(login_limit),loginHandler.register)
router.post('/login',expressJoi(login_limit),loginHandler.login)