1-自定义常量,保存用户信息,方便全局使用
/**
* 描述: 自定义常量
*/
module.exports = {
CODE_ERROR: -1, // 请求响应失败code码
CODE_SUCCESS: 200, // 请求响应成功code码
CODE_TOKEN_EXPIRED: 401, // 授权失败
PRIVATE_KEY: 'jackchen', // 自定义jwt加密的私钥
JWT_EXPIRED: 60 * 60 * 24, // 过期时间24小时
USER_MESSAGE: [ //用户信息
{
username: '001',
userMessage: {
userChinese: 'hsj',
department: 0,
departChinese: '技术一部'
}
},
{
username: '002',
userMessage: {
userChinese: 'swh',
department: 1,
departChinese: '技术二部'
}
},
{
username: '003',
userMessage: {
userChinese: 'gjy',
department: 1,
departChinese: '技术二部'
}
}
]
}
2-封装md5方法
const crypto = require('crypto');
function md5(s) {
return crypto.createHash('md5').update('' + s).digest('hex');
}
module.exports = md5;
3-设置token验证,目前还未使用,在app中当作中间件调用,关键的一点是设置白名单,不进行验证
const jwt = require('jsonwebtoken');
const expressJwt = require('express-jwt');
const { PRIVATE_KEY } = require('./constant');
const jwtAuth = expressJwt({
// 设置密钥
secret: PRIVATE_KEY,
// 设置为true表示校验,false表示不校验
credentialsRequired: true,
// 自定义获取token的函数
getToken: (req) => {
if (req.headers.authorization) {
return req.headers.authorization
} else if (req.query && req.query.token) {
return req.query.token
}
}
}).unless({
path: [
'/',
'/api/login',
'/api/queryTaskList',
'/api/queryTaskProject',
'/api/addTaskProject',
'/api/editTaskProject',
'/api/updateListStatus',
'/api/queryHistoryList',
'/api/queryManageList',
'/api/addManageList',
'/api/editManageList',
'/api/deleteManageList',
'/api/exportExcel',
'/api/exportTotalExcel'
]
})
function decode(req) {
const token = req.get('Authorization')
return jwt.verify(token, PRIVATE_KEY);
}
module.exports = {
jwtAuth,
decode
}
4-建立连接_封装根据sql语法查询连接_封装根据sql语法查询一条语句
const mysql = require('mysql');
const config = require('../db/dbConfig');
function connect() {
const { host, user, password, database } = config;
return mysql.createConnection({
host,
user,
password,
database
})
}
function querySql(sql) {
const conn = connect();
return new Promise((resolve, reject) => {
try {
conn.query(sql, (err, res) => {
if (err) {
reject(err);
} else {
resolve(res);
}
})
} catch (e) {
reject(e);
} finally {
conn.end();
}
})
}
function queryOne(sql) {
return new Promise((resolve, reject) => {
querySql(sql).then(res => {
console.log('res===查询一条语句',res)
if (res && res.length > 0) {
resolve(res[0]);
} else {
resolve(null);
}
}).catch(err => {
reject(err);
})
})
}
function getUerMessage(userData, userName) {
let getUser = userData.find((item)=> item.username==userName)
return getUser
}
module.exports = {
querySql,
queryOne,
connect,
getUerMessage
}
5-根据项目需求,需要实现swagger效果,方便测试和前端联调。封装完成后需要在入口文件中调用
const path = require('path')
const express = require('express')
const swaggerUI = require('swagger-ui-express')
const swaggerDoc = require('swagger-jsdoc')
const options = {
definition: {
openapi: '3.0.0',
info: {
title: 'api',
version: '1.0.0',
description: `后台api`
}
},
apis: [path.join(__dirname,'../routes/*.js')]
}
var swaggerJson = function (req, res) {
res.setHeader('Content-Type', 'application/json');
res.send(swaggerSpec);
}
const swaggerSpec = swaggerDoc(options)
var swaggerInstall = function(app) {
if (!app){
app = express()
}
app.get('/swagger.json', swaggerJson);
app.use('/swagger', swaggerUI.serve, swaggerUI.setup(swaggerSpec));
}
module.exports = swaggerInstall