1 server 结构目录
2 app.js (body-parser,cors,mysql,jwt,jsonwebtoken 通过npm 下载就行)
// 引入包
const express = require('express')
const cors = require('cors')
const bodyParser = require('body-parser')
const router = require('./router.js')
const JWT = require('./token.js')
// const tokenFn = require('../src/utils//token')
// const { expressjwt: jwt } = require('express-jwt')
// const JWT = require('./token.js')
// 创建服务器
const app = express()
// 跨域
app.options('/*', function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS')
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With')
res.sendStatus(200)
})
app.all('*', function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*')
next()
})
// 排除 login 相关的路由和接口
app.use((req, res, next) => {
if (req.url.includes('login')) {
next()
return
}
// 获取token
const token = req.headers.authorization?.split(' ')[1]
if (token) {
// 校验 token
const payload = JWT.verifyToken(token)
// console.log(payload)
if (payload) {
// 重新计算 token 过期时间
const newToken = JWT.encryptionToken({ data: payload.data }, '6h')
res.header('Authorization', newToken)
next()
} else {
res.status(401).send({ errCode: -1, err: 'token 过期' })
}
} else {
next()
}
})
app.use(bodyParser.json({ limit: '50mb' })) // 解析json和urlendcoded格式数据
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }))
app.use(cors())
app.use(router)
app.listen(3005, () => {
console.log('http://127.0.0.1:3005', '服务器启动成功')
})
3 db.js (引入 数据库 => 数据库 要和你创建的数据库保持一致,数据库表根据自己需求进行创建表)
const mysql = require('mysql')
const db = mysql.createPool({
host: '127.0.0.1', // 数据库ip地址
user: 'root', // 数据库登录账号
password: '123456', // 数据库密码
database: 'wangyou'// 要操作的数据库
})
module.exports = db
4 router.js (后端路由模块,捕捉发起的那个请求)
const express = require('express')
const router = express.Router()
// 登录
const login = require('./serverApi/login.js')
// 更新用户数据
const updateUser = require('./serverApi/updateUser.js')
// 发送邮箱验证码
const sendEmail = require('./serverApi/sendemail.js')
// 验证邮箱验证码
const register = require('./serverApi/register.js')
// 更新用户密码
const updatePwd = require('./serverApi/updatePwd')
// 上传日记
const addDiary = require('./serverApi/addDiary')
// base64 上传日记图片
const upArticleImg = require('./serverApi/uploaderImg.js')
// 获取用户日记
const getUserDiary = require('./serverApi/getUserDiary')
// 删除用户日记
const deleteDiary = require('./serverApi/deleteDiary')
// 更新用户日记
const updateDiary = require('./serverApi/updateDiary')
// 获取 回收站 的日记
const getRecycleDiary = require('./serverApi/getRecycleDiary')
// 删除 回收站 的某个日记
const delRecycleDiary = require('./serverApi/delRecycleDiary')
// 恢复 回收站 的日记
const postRecycleDiary = require('./serverApi/postRecycleDiary')
// 删除 回收站 所有日记
const delRecycleAllDiary = require('./serverApi/delRecycleAllDiary')
router.post('/login', login.post)
router.put('/updateUser', updateUser.put)
router.post('/sendEmail', sendEmail.post)
router.post('/register', register.post)
router.post('/updatePwd', updatePwd.post)
router.post('/addDiary', addDiary.post)
router.post('/upArticleImg', upArticleImg.post)
router.get('/getUserDiary', getUserDiary.get)
router.delete('/delUserDiary', deleteDiary.delete)
router.post('/updateDiary', updateDiary.post)
router.get('/getRecycleDiary', getRecycleDiary.get)
router.delete('/delRecycleDiary', delRecycleDiary.delete)
router.post('/postRecycleDiary', postRecycleDiary.post)
router.delete('/delRecycleAllDiary', delRecycleAllDiary.delete)
module.exports = router
5 token.js (后端生成token / 解密token 的 方法 )
const jsonwebtoken = require('jsonwebtoken')
const signKey = 'wangyou2023'
const JWT = {
// 加密 token
encryptionToken (data, expires) {
// data 加密数据 signKey 密钥 expires 过期时间
return jsonwebtoken.sign({ data }, signKey, { expiresIn: expires })
},
// 解密 token
verifyToken (token) {
try {
return jsonwebtoken.verify(token, signKey)
} catch (error) {
return false
}
}
}
module.exports = JWT
6 登录接口 (以登录接口为例)
1. 后端 登录接口 逻辑
// 登录接口
const JWT = require('../token.js')
const db = require('../db')
exports.post = (req, res) => {
const { email, password } = req.body // 将传递进来的数据保存
const sql = `select * from users where email = "${email}" and password = "${password}"`
db.query(sql, (err, data) => {
if (err) { // 数据库语句执行失败
return res.send('错误:' + err.sqlMessage)
} else if (data.length < 1) { // 返回的值为空数组
return res.send({ data: null, mes: '用户名或密码错误', status: 403 })
} else {
// console.log(data + '/')
// 调用 生成 token 方法 6h 为 token 过期时间
const token = JWT.encryptionToken({ data }, '6h')
res.send({ data, status: 201, token: token })
}
})
}
2.前端封装的 登录接口
// 登录接口
export const getLoginApi = ({ email, password }) =>
request({
url: 'http://116.205.180.109:3005/login',
method: 'post',
data: {
email,
password
}
})
3 前端发起请求接口 (先引入封装的 登录接口)
import { getLoginApi } from '@/api/index.js'
const { data: res } = await getLoginApi(this.user)
console.log(res)
4. 查看数据响应 是否成功 (响应数据就是你在 后端登录接口 返回的 data,status,token)