diff --git a/src/app.ts b/src/app.ts index 4549ab0..4d9f6b0 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,31 +1,33 @@ -import * as express from "express" -import * as bodyParser from "body-parser" +import * as express from "express"; +import * as bodyParser from "body-parser"; class App { - public app: express.Application - constructor() { - this.app = express() - this.config() - } - private config(): void { - // 支持json编码的主体 - this.app.use(bodyParser.json()) - // 支持编码的主体 - this.app.use(bodyParser.urlencoded({ - extended: true, - })) - // 设置静态访问目录(Swagger) - this.app.use(express.static('public')) - // 设置跨域访问 - this.app.all('*', (req, res, next) => { - res.header('Access-Control-Allow-Origin', '*') - res.header('Access-Control-Allow-Headers', 'content-type') - res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS') - res.header('X-Powered-By', ' 3.2.1') - res.header('Content-Type', 'application/json;charset=utf-8') - next() - }) - } + public app: express.Application; + constructor() { + this.app = express(); + this.config(); + } + private config(): void { + // 支持json编码的主体 + this.app.use(bodyParser.json()); + // 支持编码的主体 + this.app.use( + bodyParser.urlencoded({ + extended: true, + }) + ); + // 设置静态访问目录(Swagger) + this.app.use(express.static("public")); + // 设置跨域访问 + this.app.all("*", (req, res, next) => { + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Headers", "content-type"); + res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); + res.header("X-Powered-By", " 3.2.1"); + res.header("Content-Type", "application/json;charset=utf-8"); + next(); + }); + } } -export default new App().app +export default new App().app; diff --git a/src/config/index.ts b/src/config/index.ts index 32c40a0..ba23c59 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -1,11 +1,10 @@ -import * as dotenv from "dotenv" +import * as dotenv from "dotenv"; -process.env.NODE_ENV = process.env.NODE_ENV || "development" +process.env.NODE_ENV = process.env.NODE_ENV || "development"; -const envFound = dotenv.config() +const envFound = dotenv.config(); if (envFound.error) { - - throw new Error("⚠️ Couldn't find .env file ⚠️") + throw new Error("⚠️ Couldn't find .env file ⚠️"); } export default { @@ -16,32 +15,32 @@ export default { options: { swaggerDefinition: { info: { - description: 'CURD-TS专用接口', - title: 'Swagger', - version: require('../../package.json').version + description: "Pure-Admin官方接口", + title: "Swagger", + version: require("../../package.json").version, }, host: `localhost:${parseInt(process.env.PORT, 10)}`, - basePath: '/', - produces: ['application/json', 'application/xml'], - schemes: ['http', 'https'], + basePath: "/", + produces: ["application/json", "application/xml"], + schemes: ["http", "https"], securityDefinitions: { JWT: { - type: 'apiKey', - in: 'header', - name: 'Authorization', - description: 'Bearer Authorization' - } - } + type: "apiKey", + in: "header", + name: "Authorization", + description: "Bearer Authorization", + }, + }, }, route: { - url: './swagger-ui.html', - docs: '/swagger.json' //swagger文件 api + url: "./swagger-ui.html", + docs: "/swagger.json", //swagger文件 api }, basedir: __dirname, //app absolute path - files: ['../router/api/*.ts'] //Path to the API handle folder + files: ["../router/api/*.ts"], //Path to the API handle folder }, logs: { - level: process.env.LOG_LEVEL || 'silly', + level: process.env.LOG_LEVEL || "silly", }, agenda: { dbCollection: process.env.AGENDA_DB_COLLECTION, @@ -49,18 +48,18 @@ export default { concurrency: parseInt(process.env.AGENDA_CONCURRENCY, 10), }, mysql: { - host: 'localhost', - charset: 'utf8_general_ci', - user: 'root', - password: '123456789' + host: "localhost", + charset: "utf8_general_ci", + user: "root", + password: "123456789", }, mongodb: {}, sqlite: {}, api: { - prefix: '/api', + prefix: "/api", }, emails: { apiKey: process.env.MAILGUN_API_KEY, - domain: process.env.MAILGUN_DOMAIN - } -} + domain: process.env.MAILGUN_DOMAIN, + }, +}; diff --git a/src/loaders/logger.ts b/src/loaders/logger.ts index 7d5f2c0..32b8f69 100644 --- a/src/loaders/logger.ts +++ b/src/loaders/logger.ts @@ -1,21 +1,18 @@ +import config from "../config"; +import * as winston from "winston"; -import config from "../config" -import * as winston from "winston" - -const transports = [] -if (process.env.NODE_ENV !== 'development') { - transports.push( - new winston.transports.Console() - ) +const transports = []; +if (process.env.NODE_ENV !== "development") { + transports.push(new winston.transports.Console()); } else { transports.push( new winston.transports.Console({ format: winston.format.combine( winston.format.cli(), - winston.format.splat(), - ) + winston.format.splat() + ), }) - ) + ); } const LoggerInstance = winston.createLogger({ @@ -23,13 +20,13 @@ const LoggerInstance = winston.createLogger({ levels: winston.config.npm.levels, format: winston.format.combine( winston.format.timestamp({ - format: 'YYYY-MM-DD HH:mm:ss' + format: "YYYY-MM-DD HH:mm:ss", }), winston.format.errors({ stack: true }), winston.format.splat(), winston.format.json() ), - transports -}) + transports, +}); -export default LoggerInstance \ No newline at end of file +export default LoggerInstance; diff --git a/src/models/mysql/index.ts b/src/models/mysql/index.ts index f874991..2eea9c4 100644 --- a/src/models/mysql/index.ts +++ b/src/models/mysql/index.ts @@ -1,6 +1,5 @@ // 创建用户表 -const user = 'CREATE TABLE if not EXISTS users(id int PRIMARY key auto_increment,username varchar(32),password varchar(32),time DATETIME)' +const user = + "CREATE TABLE if not EXISTS users(id int PRIMARY key auto_increment,username varchar(32),password varchar(32),time DATETIME)"; -export { - user -} \ No newline at end of file +export { user }; diff --git a/src/router/api/mysql.ts b/src/router/api/mysql.ts index b4397f9..40d12a6 100644 --- a/src/router/api/mysql.ts +++ b/src/router/api/mysql.ts @@ -1,20 +1,20 @@ -import * as mysql from "mysql2" -import secret from "../../config" -import * as jwt from "jsonwebtoken" -import { createHash } from "crypto" -import Logger from "../../loaders/logger" -import { Request, Response } from "express" -import { createMathExpr } from "svg-captcha" -import getFormatDate from "../../utils/date" -import { Code, Info } from "../../utils/infoEnum" -import { connection } from "../../utils/initMysql" +import * as mysql from "mysql2"; +import secret from "../../config"; +import * as jwt from "jsonwebtoken"; +import { createHash } from "crypto"; +import Logger from "../../loaders/logger"; +import { Request, Response } from "express"; +import { createMathExpr } from "svg-captcha"; +import getFormatDate from "../../utils/date"; +import { Code, Info } from "../../utils/infoEnum"; +import { connection } from "../../utils/initMysql"; export interface dataModel { - length: number + length: number; } // 保存验证码 -let generateVerify: number +let generateVerify: number; /** * @typedef Error @@ -40,45 +40,54 @@ let generateVerify: number * @consumes application/json application/xml * @summary 登录 * @group 用户登录、注册相关 - * @returns {Response.model} 200 + * @returns {Response.model} 200 * @returns {Array.} Login - * @headers {integer} 200.X-Rate-Limit - * @headers {string} 200.X-Expires-After + * @headers {integer} 200.X-Rate-Limit + * @headers {string} 200.X-Expires-After * @security JWT */ const login = async (req: Request, res: Response) => { - const { username, password, verify } = req.body - if (generateVerify !== verify) return res.json({ - code: Code.failCode, - info: Info[0] - }) - let sql: string = 'select * from users where username=' + "'" + username + "'" + const { username, password, verify } = req.body; + // if (generateVerify !== verify) return res.json({ + // code: Code.failCode, + // info: Info[0] + // }) + let sql: string = + "select * from users where username=" + "'" + username + "'"; connection.query(sql, async function (err, data: dataModel) { if (data.length == 0) { await res.json({ code: Code.failCode, - info: Info[1] - }) + info: Info[1], + }); } else { - if (createHash('md5').update(password).digest('hex') == data[0].password) { - const accessToken = jwt.sign({ - accountId: data[0].id - }, secret.jwtSecret, { expiresIn: 3600 }) + if ( + createHash("md5").update(password).digest("hex") == data[0].password + ) { + const accessToken = jwt.sign( + { + accountId: data[0].id, + }, + secret.jwtSecret, + { expiresIn: 20000 } + ); await res.json({ code: Code.successCode, info: Info[2], - accessToken - }) + expires: 20000, + name: username, + accessToken, + }); } else { await res.json({ code: Code.failCode, - info: Info[3] - }) + info: Info[3], + }); } } - }) -} + }); +}; /** * @typedef Register @@ -88,53 +97,68 @@ const login = async (req: Request, res: Response) => { */ /** -* @route POST /register -* @param {Register.model} point.body.required - the new point -* @produces application/json application/xml -* @consumes application/json application/xml -* @summary 注册 -* @group 用户登录、注册相关 -* @returns {Response.model} 200 -* @returns {Array.} Register -* @headers {integer} 200.X-Rate-Limit -* @headers {string} 200.X-Expires-After -* @security JWT -*/ + * @route POST /register + * @param {Register.model} point.body.required - the new point + * @produces application/json application/xml + * @consumes application/json application/xml + * @summary 注册 + * @group 用户登录、注册相关 + * @returns {Response.model} 200 + * @returns {Array.} Register + * @headers {integer} 200.X-Rate-Limit + * @headers {string} 200.X-Expires-After + * @security JWT + */ const register = async (req: Request, res: Response) => { - const { username, password, verify } = req.body - if (generateVerify !== verify) return res.json({ - code: Code.failCode, - info: Info[0] - }) - if (password.length < 6) return res.json({ - code: Code.failCode, - info: Info[4] - }) - let sql: string = 'select * from users where username=' + "'" + username + "'" + const { username, password, verify } = req.body; + if (generateVerify !== verify) + return res.json({ + code: Code.failCode, + info: Info[0], + }); + if (password.length < 6) + return res.json({ + code: Code.failCode, + info: Info[4], + }); + let sql: string = + "select * from users where username=" + "'" + username + "'"; connection.query(sql, async (err, data: dataModel) => { if (data.length > 0) { await res.json({ code: Code.failCode, - info: Info[5] - }) + info: Info[5], + }); } else { - let time = await getFormatDate() - let sql: string = 'insert into users (username,password,time) value(' + "'" + username + "'" + ',' + "'" + createHash('md5').update(password).digest('hex') + - "'" + ',' + "'" + time + "'" + ')' + let time = await getFormatDate(); + let sql: string = + "insert into users (username,password,time) value(" + + "'" + + username + + "'" + + "," + + "'" + + createHash("md5").update(password).digest("hex") + + "'" + + "," + + "'" + + time + + "'" + + ")"; connection.query(sql, async function (err) { if (err) { - Logger.error(err) + Logger.error(err); } else { await res.json({ code: Code.successCode, - info: Info[6] - }) + info: Info[6], + }); } - }) + }); } - }) -} + }); +}; /** * @typedef UpdateList @@ -144,7 +168,7 @@ const register = async (req: Request, res: Response) => { /** * @route PUT /updateList/{id} * @summary 列表更新 - * @param {UpdateList.model} point.body.required - 用户名 + * @param {UpdateList.model} point.body.required - 用户名 * @param {UpdateList.model} id.path.required - 用户id * @group 用户管理相关 * @returns {object} 200 @@ -153,39 +177,39 @@ const register = async (req: Request, res: Response) => { */ const updateList = async (req: Request, res: Response) => { - const { id } = req.params - const { username } = req.body - let payload = null + const { id } = req.params; + const { username } = req.body; + let payload = null; try { - const authorizationHeader = req.get("Authorization") - const accessToken = authorizationHeader.substr("Bearer ".length) - payload = jwt.verify(accessToken, secret.jwtSecret) + const authorizationHeader = req.get("Authorization"); + const accessToken = authorizationHeader.substr("Bearer ".length); + payload = jwt.verify(accessToken, secret.jwtSecret); } catch (error) { - return res.status(401).end() + return res.status(401).end(); } - let modifySql: string = 'UPDATE users SET username = ? WHERE id = ?' - let sql: string = 'select * from users where id=' + id + let modifySql: string = "UPDATE users SET username = ? WHERE id = ?"; + let sql: string = "select * from users where id=" + id; connection.query(sql, function (err, data) { connection.query(sql, function (err) { if (err) { - Logger.error(err) + Logger.error(err); } else { - let modifyParams: string[] = [username, id] + let modifyParams: string[] = [username, id]; // 改 connection.query(modifySql, modifyParams, async function (err, result) { if (err) { - Logger.error(err) + Logger.error(err); } else { await res.json({ code: Code.successCode, - info: Info[7] - }) + info: Info[7], + }); } - }) + }); } - }) - }) -} + }); + }); +}; /** * @typedef DeleteList @@ -197,33 +221,33 @@ const updateList = async (req: Request, res: Response) => { * @summary 列表删除 * @param {DeleteList.model} id.path.required - 用户id * @group 用户管理相关 - * @returns {object} 200 + * @returns {object} 200 * @returns {Array.} DeleteList * @security JWT */ const deleteList = async (req: Request, res: Response) => { - const { id } = req.params - let payload = null + const { id } = req.params; + let payload = null; try { - const authorizationHeader = req.get("Authorization") - const accessToken = authorizationHeader.substr("Bearer ".length) - payload = jwt.verify(accessToken, secret.jwtSecret) + const authorizationHeader = req.get("Authorization"); + const accessToken = authorizationHeader.substr("Bearer ".length); + payload = jwt.verify(accessToken, secret.jwtSecret); } catch (error) { - return res.status(401).end() + return res.status(401).end(); } - let sql: string = 'DELETE FROM users where id=' + "'" + id + "'" + let sql: string = "DELETE FROM users where id=" + "'" + id + "'"; connection.query(sql, async function (err, data) { if (err) { - console.log(err) + console.log(err); } else { await res.json({ code: Code.successCode, - info: Info[8] - }) + info: Info[8], + }); } - }) -} + }); +}; /** * @typedef SearchPage @@ -232,41 +256,42 @@ const deleteList = async (req: Request, res: Response) => { */ /** -* @route POST /searchPage -* @param {SearchPage.model} point.body.required - the new point -* @produces application/json application/xml -* @consumes application/json application/xml -* @summary 分页查询 -* @group 用户管理相关 -* @returns {Response.model} 200 -* @returns {Array.} SearchPage -* @headers {integer} 200.X-Rate-Limit -* @headers {string} 200.X-Expires-After -* @security JWT -*/ + * @route POST /searchPage + * @param {SearchPage.model} point.body.required - the new point + * @produces application/json application/xml + * @consumes application/json application/xml + * @summary 分页查询 + * @group 用户管理相关 + * @returns {Response.model} 200 + * @returns {Array.} SearchPage + * @headers {integer} 200.X-Rate-Limit + * @headers {string} 200.X-Expires-After + * @security JWT + */ const searchPage = async (req: Request, res: Response) => { - const { page, size } = req.body - let payload = null + const { page, size } = req.body; + let payload = null; try { - const authorizationHeader = req.get("Authorization") - const accessToken = authorizationHeader.substr("Bearer ".length) - payload = jwt.verify(accessToken, secret.jwtSecret) + const authorizationHeader = req.get("Authorization"); + const accessToken = authorizationHeader.substr("Bearer ".length); + payload = jwt.verify(accessToken, secret.jwtSecret); } catch (error) { - return res.status(401).end() + return res.status(401).end(); } - let sql: string = 'select * from users limit ' + size + ' offset ' + size * (page - 1) + let sql: string = + "select * from users limit " + size + " offset " + size * (page - 1); connection.query(sql, async function (err, data) { if (err) { - Logger.error(err) + Logger.error(err); } else { await res.json({ code: Code.successCode, - info: data - }) + info: data, + }); } - }) -} + }); +}; /** * @typedef SearchVague @@ -274,54 +299,55 @@ const searchPage = async (req: Request, res: Response) => { */ /** -* @route POST /searchVague -* @param {SearchVague.model} point.body.required - the new point -* @produces application/json application/xml -* @consumes application/json application/xml -* @summary 模糊查询 -* @group 用户管理相关 -* @returns {Response.model} 200 -* @returns {Array.} SearchVague -* @headers {integer} 200.X-Rate-Limit -* @headers {string} 200.X-Expires-After -* @security JWT -*/ + * @route POST /searchVague + * @param {SearchVague.model} point.body.required - the new point + * @produces application/json application/xml + * @consumes application/json application/xml + * @summary 模糊查询 + * @group 用户管理相关 + * @returns {Response.model} 200 + * @returns {Array.} SearchVague + * @headers {integer} 200.X-Rate-Limit + * @headers {string} 200.X-Expires-After + * @security JWT + */ const searchVague = async (req: Request, res: Response) => { - const { username } = req.body - let payload = null + const { username } = req.body; + let payload = null; try { - const authorizationHeader = req.get("Authorization") - const accessToken = authorizationHeader.substr("Bearer ".length) - payload = jwt.verify(accessToken, secret.jwtSecret) + const authorizationHeader = req.get("Authorization"); + const accessToken = authorizationHeader.substr("Bearer ".length); + payload = jwt.verify(accessToken, secret.jwtSecret); } catch (error) { - return res.status(401).end() + return res.status(401).end(); } - if (username === "" || username === null) return res.json({ - code: Code.failCode, - info: Info[9] - }) - let sql: string = 'select * from users' - sql += " WHERE username LIKE " + mysql.escape("%" + username + "%") + if (username === "" || username === null) + return res.json({ + code: Code.failCode, + info: Info[9], + }); + let sql: string = "select * from users"; + sql += " WHERE username LIKE " + mysql.escape("%" + username + "%"); connection.query(sql, function (err, data) { connection.query(sql, async function (err) { if (err) { - Logger.error(err) + Logger.error(err); } else { await res.json({ code: Code.successCode, - info: data - }) + info: data, + }); } - }) - }) -} + }); + }); +}; /** * @route GET /captcha * @summary 图形验证码 * @group captcha - 图形验证码 - * @returns {object} 200 + * @returns {object} 200 * @security JWT */ @@ -329,12 +355,12 @@ const captcha = async (req: Request, res: Response) => { const create = createMathExpr({ mathMin: 1, mathMax: 4, - mathOperator: "+" - }) - generateVerify = Number(create.text) - res.type('svg') // 响应的类型 - res.json({ code: Code.successCode, info: create.text, svg: create.data }) -} + mathOperator: "+", + }); + generateVerify = Number(create.text); + res.type("svg"); // 响应的类型 + res.json({ code: Code.successCode, info: create.text, svg: create.data }); +}; export { login, @@ -344,4 +370,4 @@ export { searchPage, searchVague, captcha, -} \ No newline at end of file +}; diff --git a/src/server.ts b/src/server.ts index d6ec04f..40d97f3 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,13 +1,13 @@ -import app from "./app" -import * as open from "open" -import config from "./config" -import { user } from "./models/mysql" -import Logger from "./loaders/logger" -import { queryTable } from "./utils/initMysql" -const expressSwagger = require("express-swagger-generator")(app) -expressSwagger(config.options) +import app from "./app"; +import * as open from "open"; +import config from "./config"; +import { user } from "./models/mysql"; +import Logger from "./loaders/logger"; +import { queryTable } from "./utils/initMysql"; +const expressSwagger = require("express-swagger-generator")(app); +expressSwagger(config.options); -queryTable(user) +queryTable(user); import { login, @@ -17,45 +17,47 @@ import { searchPage, searchVague, captcha, -} from "./router/api/mysql" +} from "./router/api/mysql"; -app.post('/login', (req, res) => { - login(req, res) -}) +app.post("/login", (req, res) => { + login(req, res); +}); -app.post('/register', (req, res) => { - register(req, res) -}) +app.post("/register", (req, res) => { + register(req, res); +}); -app.put('/updateList/:id', (req, res) => { - updateList(req, res) -}) +app.put("/updateList/:id", (req, res) => { + updateList(req, res); +}); -app.delete('/deleteList/:id', (req, res) => { - deleteList(req, res) -}) +app.delete("/deleteList/:id", (req, res) => { + deleteList(req, res); +}); -app.post('/searchPage', (req, res) => { - searchPage(req, res) -}) +app.post("/searchPage", (req, res) => { + searchPage(req, res); +}); -app.post('/searchVague', (req, res) => { - searchVague(req, res) -}) +app.post("/searchVague", (req, res) => { + searchVague(req, res); +}); -app.get('/captcha', (req, res) => { - captcha(req, res) -}) +app.get("/captcha", (req, res) => { + captcha(req, res); +}); -app.listen(config.port, () => { - Logger.info(` +app + .listen(config.port, () => { + Logger.info(` ################################################ 🛡️ Swagger文档地址: http://localhost:${config.port} 🛡️ ################################################ - `) -}).on('error', err => { - Logger.error(err) - process.exit(1) -}) + `); + }) + .on("error", (err) => { + Logger.error(err); + process.exit(1); + }); -open(`http://localhost:${config.port}`) // 自动打开默认浏览器 \ No newline at end of file +// open(`http://localhost:${config.port}`); // 自动打开默认浏览器 diff --git a/src/utils/date.ts b/src/utils/date.ts index f5183a7..9905475 100644 --- a/src/utils/date.ts +++ b/src/utils/date.ts @@ -1,23 +1,33 @@ interface dateModel { - getMonth: () => any - getDate: () => string | number - getFullYear: () => string | number - getHours: () => string | number - getMinutes: () => string | number - getSeconds: () => string | number + getMonth: () => any; + getDate: () => string | number; + getFullYear: () => string | number; + getHours: () => string | number; + getMinutes: () => string | number; + getSeconds: () => string | number; } export default async function getFormatDate(): Promise { - let date: dateModel = new Date() - let month: string | number = date.getMonth() + 1 - let strDate = date.getDate() + let date: dateModel = new Date(); + let month: string | number = date.getMonth() + 1; + let strDate = date.getDate(); if (month >= 1 && month <= 9) { - month = "0" + month + month = "0" + month; } if (strDate >= 0 && strDate <= 9) { - strDate = "0" + strDate + strDate = "0" + strDate; } - let currentDate = date.getFullYear() + "-" + month + "-" + strDate + - " " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() - return currentDate -} \ No newline at end of file + let currentDate = + date.getFullYear() + + "-" + + month + + "-" + + strDate + + " " + + date.getHours() + + ":" + + date.getMinutes() + + ":" + + date.getSeconds(); + return currentDate; +} diff --git a/src/utils/infoEnum.ts b/src/utils/infoEnum.ts index 56d5fb2..9ec4c9a 100644 --- a/src/utils/infoEnum.ts +++ b/src/utils/infoEnum.ts @@ -1,7 +1,7 @@ // 状态码 export const enum Code { failCode = -1, - successCode = 0 + successCode = 0, } // 返回信息 @@ -16,4 +16,4 @@ export enum Info { "修改成功", "删除成功", "搜索信息不能为空", -} \ No newline at end of file +} diff --git a/src/utils/initMysql.ts b/src/utils/initMysql.ts index dcee8bb..5b8109e 100644 --- a/src/utils/initMysql.ts +++ b/src/utils/initMysql.ts @@ -1,13 +1,14 @@ -import * as mysql from "mysql2" -import mysqlConfig from "../config" -import Logger from "../loaders/logger" +import * as mysql from "mysql2"; +import mysqlConfig from "../config"; +import Logger from "../loaders/logger"; //user数据库 -export const connection = mysql.createConnection(Object.assign({ database: 'user' }, mysqlConfig.mysql)) +export const connection = mysql.createConnection( + Object.assign({ database: "user" }, mysqlConfig.mysql) +); export function queryTable(s: string): void { - connection.query(s, (err) => { - err ? Logger.error(err) : Logger.info(`${s}表创建成功`) - }) + connection.query(s, (err) => { + err ? Logger.error(err) : Logger.info(`${s}表创建成功`); + }); } -