├── .gitignore ├── README.md ├── app.js ├── config └── index.js ├── controller ├── client.js ├── dataVisual.js ├── store.js └── user.js ├── middleware ├── 404-handler.js ├── error-handler.js └── jwtAuth.js ├── model ├── client.js ├── dataVisual.js ├── index.js ├── store.js └── user.js ├── package-lock.json ├── package.json ├── router ├── client.js ├── dataVisual.js ├── index.js ├── store.js └── user.js ├── utils └── index.js ├── wms.sql └── wms_nodata.sql /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | Github Stars 4 | 5 | 6 | Github Forks 7 | 8 | 9 | Code-size 10 | 11 |

12 | 13 | 14 | ## :triangular_flag_on_post:前言 15 | 16 | 此项目是配合`wms-client`前端项目所开发的项目,此后端项目使用的是`Node`、`Express`、`Mysql`,没有什么复杂的架构,只是快速生成接口。 17 | 18 | ## :door:传送门 19 | 20 | - 配合的`wms-client`前端项目::link:[使劲点我](https://github.com/Hyrmm/wms-client) 21 | - 接口文档::link:[使劲点我](https://www.apifox.cn/apidoc/shared-cc2e15b2-0ea5-4e16-91e9-6b113015a758/api-51164289) 22 | 23 | ## :rocket:运行项目 24 | 25 | :one:拉取项目文件 26 | 27 | git clone https://github.com/Hyrmm/wms-server 28 | 29 | :two:切换到项目目录 30 | 31 | cd wms-server 32 | 33 | :three:安装依赖包 34 | 35 | npm install 36 | 37 | :four:配置数据库 38 | 39 | - 自行搭建好`Mysql`数据库服务,我使用的是`Mysql5.6` 40 | 41 | - 编辑相关配置文件,位于项目位置:`/config/index.js` 42 | 43 | ```js 44 | //jwt配置 45 | jwt_config: { 46 | // jwt密钥 47 | secretKey: '...', 48 | //加密模式,默认可不修改 49 | algorithms: ["HS256"] 50 | }, 51 | //数据库配置 52 | dataBaseConfig: { 53 | host: '数据库地址', 54 | port: "端口", 55 | user: '用户名', 56 | password: '密码', 57 | database: '数据库名称' 58 | }, 59 | ``` 60 | 61 | - 为数据库生成数据,项目提供了结构和数据`wms.sql`、仅的结构`wms_nodata.sql`文件,可以为你快速生成所需表的结构和数据。(关于sql文件如何导入数据库,可自行百度) 62 | 63 | - 所有接口路径都是以`/api`开头,想要自定义内容,可配置相关文件,位于项目目录:`/app.js` `/router/index.js` 64 | 65 | ```js 66 | // app.js 67 | const router = require("./router"); 68 | app.use("/api", router) 69 | ``` 70 | 71 | ```js 72 | // router/index.js 73 | const express = require("express"); 74 | const router = express.Router(); 75 | router.use("/user", require("./user")); 76 | router.use("/store", require("./store")); 77 | router.use("/client", require("./client")); 78 | router.use("/dataVisual", require("./dataVisual")); 79 | module.exports = router; 80 | ``` 81 | 82 | :five:启动项目 83 | 84 | npm run dev 85 | 86 | > 此项目配合wms-client项目,都会进行长期维护。如有问题请直接在 Issues 中提,或者您发现问题并有非常好的解决方案,欢迎 PR 👍。 -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | //数据库挂载 2 | const sql = require("./model") 3 | 4 | 5 | 6 | 7 | const express = require("express") 8 | const app = express() 9 | 10 | // 中间件:解析请求体 日志输出 跨域请求 11 | const morgan = require("morgan"); 12 | const cors = require('cors') 13 | app.use(express.json()) 14 | app.use(express.urlencoded()) 15 | app.use(morgan("dev")); 16 | app.use(cors()); 17 | 18 | const jwtAuth = require("./middleware/jwtAuth") 19 | 20 | // gzip压缩 21 | var compression = require('compression'); 22 | app.use(compression()); 23 | //静态文件挂载 24 | app.use(express.static('./static')) 25 | 26 | //jwt认证中间件 27 | app.use("/api", jwtAuth); 28 | 29 | // 挂载路由 30 | const router = require("./router"); 31 | app.use("/api", router) 32 | 33 | 34 | 35 | // 统一错误处理中间件 36 | const errorHandler = require("./middleware/error-handler"); 37 | app.use(errorHandler()); 38 | 39 | // 统一404处理中间件 40 | const notFound = require("./middleware/404-handler"); 41 | app.use(notFound()); 42 | 43 | 44 | 45 | 46 | 47 | const PORT = process.env.PORT || 5000; 48 | app.listen(PORT, () => { 49 | console.log(`Server is running at http://localhost:${PORT}`); 50 | }); -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: Hyrm 1358188945@qq.com 3 | * @Date: 2022-11-02 20:34:03 4 | * @LastEditors: Hyrm 1358188945@qq.com 5 | * @LastEditTime: 2023-01-01 14:36:29 6 | * @FilePath: \wms-server\config\index.js 7 | * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE 8 | */ 9 | module.exports = { 10 | // jwt密钥 11 | jwt_config: { 12 | secretKey: 'hyrm_wms', 13 | algorithms: ["HS256"] 14 | }, 15 | dataBaseConfig: { 16 | host: 'sh-cynosdbmysql-grp-qbmsgrx2.sql.tencentcdb.com', 17 | port: "21051", 18 | user: 'wms', 19 | password: 'Wms12345678', 20 | database: 'wms' 21 | }, 22 | res_data: { 23 | auth_fail: { 24 | status: 401, 25 | msg: "用户登录身份已失效", 26 | data: {} 27 | }, 28 | login_fail: { 29 | status: 400, 30 | msg: "账户或密码不正确", 31 | data: [] 32 | }, 33 | route_fail: { 34 | status: 500, 35 | msg: "访问路径不存在", 36 | data: {} 37 | }, 38 | route_dev: { 39 | status: 501, 40 | msg: "接口正在维护", 41 | data: {} 42 | }, 43 | query_fail: { 44 | status: 300, 45 | msg: "查询格式非法", 46 | data: {} 47 | }, 48 | field_fail: { 49 | status: 301, 50 | msg: "字段验证失败", 51 | data: {} 52 | }, 53 | add_stock_fail: { 54 | status: 302, 55 | msg: "已存库存冲突", 56 | data: {} 57 | }, 58 | modify_store_fail: { 59 | status: 303, 60 | msg: "库存变动失败", 61 | data: {} 62 | }, 63 | modify_client_fail: { 64 | status: 304, 65 | msg: "客户不存在", 66 | data: {} 67 | }, 68 | add_client_fail: { 69 | status: 305, 70 | msg: "客户已存在", 71 | data: {} 72 | } 73 | 74 | }, 75 | pagination: { 76 | pageSize: 20 77 | } 78 | 79 | } -------------------------------------------------------------------------------- /controller/client.js: -------------------------------------------------------------------------------- 1 | 2 | const { client } = require("../model") 3 | const { res_data } = require("../config") 4 | const { json } = require("express") 5 | 6 | 7 | //查询客户 8 | exports.get_client = async (req, res) => { 9 | 10 | let page = req.query.page ? req.query.page : 1 11 | let filter_name = req.query.filter_name ? req.query.filter_name : "" 12 | //过滤后总记录数 13 | let total_sql_result = await client.get_client(page, filter_name) 14 | let sql_result = await client.get_client(page, filter_name, true) 15 | //标记索引 16 | sql_result.forEach((element, index) => { 17 | element.index = (Number(page) - 1) * 20 + index + 1 18 | }); 19 | return res.json({ status: 200, msg: "查询成功", current_page: Number(page), total: total_sql_result.length, data: sql_result }) 20 | } 21 | exports.get_client_options = async (req, res) => { 22 | let sql_result = await client.get_client_options() 23 | return res.json({ status: 200, msg: "查询成功", data: sql_result }) 24 | } 25 | 26 | //修改客户信息 27 | exports.modify_client = async (req, res) => { 28 | let client_id, modify_name, modify_tel, modify_address 29 | client_id = req.body.client_id ? req.body.client_id : 0 30 | modify_name = req.body.modify_name ? req.body.modify_name : "" 31 | modify_tel = req.body.modify_tel ? req.body.modify_tel : "" 32 | modify_address = req.body.modify_address ? req.body.modify_address : "" 33 | //参数验证 34 | if (!client_id) return res.json(res_data.field_fail) 35 | 36 | //client_id合法性验证 37 | let sql_result = await client.$get_client(client_id) 38 | if (!sql_result.length) return res.json(res_data.modify_client_fail) 39 | 40 | sql_result = await client.modify_client(client_id, modify_name, modify_tel, modify_address) 41 | 42 | return res.json({ status: 200, msg: "修改成功", data: sql_result }) 43 | } 44 | //新增客户 45 | exports.add_client = async (req, res) => { 46 | 47 | let client_name = req.body.name 48 | let client_tel = req.body.tel 49 | let client_address = req.body.address 50 | //参数验证 51 | if (!(client_name && client_tel && client_address)) return res.json(res_data.field_fail) 52 | 53 | //验证用户是否重复 54 | let sql_result = await client.$get_client_byName(client_name) 55 | if (sql_result.length) return res.json(res_data.add_client_fail) 56 | 57 | sql_result = await client.add_client(client_name, client_tel, client_address) 58 | return res.json({ status: 200, msg: "新增成功", data: sql_result }) 59 | } 60 | //删除客户 61 | exports.del_client = async (req, res) => { 62 | let client_id = req.body.client_id 63 | //参数验证 64 | if (!client_id) return res.json(res_data.field_fail) 65 | 66 | //验证id合法性 67 | let sql_result = await client.$get_client(client_id) 68 | if (!sql_result.length) return res.json(res_data.modify_client_fail) 69 | 70 | sql_result = await client.del_client(client_id) 71 | return res.json({ status: 200, msg: "删除成功", data: sql_result }) 72 | 73 | 74 | } -------------------------------------------------------------------------------- /controller/dataVisual.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: Hyrm 1358188945@qq.com 3 | * @Date: 2022-12-06 19:02:13 4 | * @LastEditors: Hyrm 1358188945@qq.com 5 | * @LastEditTime: 2023-01-22 00:19:36 6 | * @FilePath: \wms-server\controller\dataVisual.js 7 | * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD% 8 | */ 9 | const { dataVisual } = require("../model") 10 | const { get_stockRecording } = require("../model/store") 11 | const { res_data } = require("../config") 12 | 13 | 14 | 15 | exports.get_common_info = async (req, res) => { 16 | //获取总库存 17 | let stocks_sql_result = await dataVisual.get_total_stock() 18 | let total_stocks = stocks_sql_result[0].total 19 | //获取总客户 20 | let client_sql_result = await dataVisual.get_total_client() 21 | let total_client = client_sql_result[0].total 22 | //获取出库总记录 23 | let outOrder_sql_result = await dataVisual.get_total_outOrder() 24 | let total_outOrder = outOrder_sql_result[0].total 25 | //获取入库总记录 26 | let inOrder_sql_result = await dataVisual.get_total_inOrder() 27 | let total_inOrder = inOrder_sql_result[0].total 28 | //获取不同状态订单总数量 29 | // 未出货 30 | let order_unSend = (await dataVisual.get_order_count(1))[0].total 31 | // 已出货 32 | let order_sended = (await dataVisual.get_order_count(2))[0].total 33 | // 已收货 34 | let order_received = (await dataVisual.get_order_count(3))[0].total 35 | // 退回仓库 36 | let order_backStore = (await dataVisual.get_order_count(4))[0].total 37 | // 退回原厂 38 | let order_backOri = (await dataVisual.get_order_count(5))[0].total 39 | return res.json({ 40 | status: 200, msg: "获取成功", data: { 41 | total_stocks, 42 | total_client, 43 | total_outOrder, 44 | total_inOrder, 45 | order_unSend, 46 | order_sended, 47 | order_received, 48 | order_backStore, 49 | order_backOri 50 | } 51 | }) 52 | } 53 | 54 | exports.get_yearFiniishOrder = async (req, res) => { 55 | let year = req.query.year || "" 56 | let month = req.query.month || "" 57 | //字段验证 58 | if (!year) return res.json(res_data.query_fail) 59 | //获取指定一年每月实际完成订单 1.已收货, 退回仓库4, 退回原厂5 60 | let yearFinishOrder = { received: [], backOri: [], backStore: [] } 61 | let statusMap = new Map() 62 | statusMap.set(yearFinishOrder.received, 1) 63 | statusMap.set(yearFinishOrder.backOri, 4) 64 | statusMap.set(yearFinishOrder.backStore, 5) 65 | 66 | //验证获取的是年还是月 67 | for (let key in yearFinishOrder) { 68 | let cur_orderStatus = statusMap.get(yearFinishOrder[key]) 69 | if (month) { 70 | //具体到日 71 | for (let i = 0; i < 31; i++) { 72 | let temp = (await dataVisual.get_order(cur_orderStatus, `${year}-${month}-${i + 1}`, `${year}-${month}-${i + 2}`))[0].total 73 | yearFinishOrder[key].push(temp) 74 | } 75 | } else { 76 | //具体到月 77 | for (let i = 0; i < 12; i++) { 78 | let temp = (await dataVisual.get_order(cur_orderStatus, `${year}-${i + 1}-1`, `${year}-${i + 1}-31`))[0].total 79 | yearFinishOrder[key].push(temp) 80 | } 81 | } 82 | } 83 | //横坐标消息 84 | let xData = [] 85 | if (month) { 86 | for (let i = 0; i < 31; i++) { 87 | xData.push(`${i + 1}`) 88 | } 89 | 90 | } else { 91 | xData = ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"] 92 | } 93 | return res.json({ status: 200, msg: "获取成功", data: Object.assign({ year, month, xData }, yearFinishOrder) }) 94 | } 95 | exports.get_storeInfo = async (req, res) => { 96 | let sql_result = await dataVisual.get_store() 97 | let cache = {} 98 | let options = [] 99 | for (let item of sql_result) { 100 | if (cache[item.name]) { 101 | //有缓存 102 | let index = cache[item.name].index 103 | options[index].children.push({ name: item.type, value: item.stock }) 104 | options[index].value += item.stock 105 | 106 | } else { 107 | //首次推入数据以及记录位置 108 | let index = options.push({ name: item.name, value: item.stock, children: [{ name: item.type, value: item.stock }] }) - 1 109 | //记录缓存 110 | cache[item.name] = { name: item.name, index: index } 111 | } 112 | } 113 | return res.json({ status: 200, msg: "获取成功", data: options }) 114 | } 115 | exports.get_salesInfo = async (req, res) => { 116 | let year = req.query.year 117 | let month = req.query.month 118 | let filter_date_start, filter_date_end 119 | 120 | let chartsData = {} 121 | let clientRank = {} 122 | let categoriesPerCache = {} 123 | let categoriesPerTemp = [] 124 | let categoriesPer = { totalSales: 0, totalCost: 0, totalProfit: 0, sales: [], cost: [], profit: [], } 125 | 126 | //查询所有数据 127 | if (year) { 128 | filter_date_start = `${year}-${month ? month : 1}-1` 129 | filter_date_end = `${year}-${month ? month : 12}-31` 130 | } 131 | let sql_result = await get_stockRecording("out_order", "finish_date", "ASC", "", "", "", filter_date_start, filter_date_end, 3, "", "", false, true) 132 | let total = sql_result.length 133 | if (month) { 134 | chartsData.xData = Array.from(new Array(31), (element, index) => index + 1) 135 | chartsData.salesData = Array.from(new Array(31), ele => 0) 136 | chartsData.costData = Array.from(new Array(31), ele => 0) 137 | chartsData.profitData = Array.from(new Array(31), ele => 0) 138 | //数据处理 139 | for (let item of sql_result) { 140 | //销售额 141 | chartsData.salesData[new Date(item.finish_date).getDate() - 1] += item.amount * item.price 142 | 143 | //成本 144 | chartsData.costData[new Date(item.finish_date).getDate() - 1] += item.another_fee 145 | 146 | //利润 147 | chartsData.profitData[new Date(item.finish_date).getDate() - 1] = + item.amount * item.price - item.another_fee 148 | 149 | //销售额排名客户 150 | if (clientRank[item.client]) { 151 | clientRank[item.client] += item.amount * item.price 152 | } else { 153 | clientRank[item.client] = item.amount * item.price 154 | } 155 | 156 | //类别占比 157 | if (categoriesPerCache[item.stock_id]) { 158 | //有缓存 159 | let index = categoriesPerCache[item.stock_id] 160 | categoriesPerTemp[index].sales.value += item.amount * item.price 161 | categoriesPerTemp[index].cost.value += item.another_fee 162 | categoriesPerTemp[index].profit.value += item.amount * item.price - item.another_fee 163 | 164 | } else { 165 | //无缓存 166 | let index = categoriesPerTemp.push( 167 | { 168 | sales: { name: `${item.name}/${item.type}`, value: item.amount * item.price }, 169 | cost: { name: `${item.name}/${item.type}`, value: item.another_fee }, 170 | profit: { name: `${item.name}/${item.type}`, value: item.amount * item.price - item.another_fee } 171 | } 172 | ) - 1 173 | categoriesPerCache[item.stock_id] = index 174 | } 175 | 176 | } 177 | 178 | } else { 179 | chartsData.xData = ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月",] 180 | chartsData.salesData = Array.from(new Array(12), ele => 0) 181 | chartsData.costData = Array.from(new Array(12), ele => 0) 182 | chartsData.profitData = Array.from(new Array(12), ele => 0) 183 | //数据处理 184 | for (let item of sql_result) { 185 | //销售额 186 | chartsData.salesData[new Date(item.finish_date).getMonth()] += item.amount * item.price 187 | 188 | //成本 189 | chartsData.costData[new Date(item.finish_date).getMonth()] += item.another_fee 190 | 191 | //利润 192 | chartsData.profitData[new Date(item.finish_date).getMonth()] = + item.amount * item.price - item.another_fee 193 | 194 | //销售额排名客户 195 | if (clientRank[item.client]) { 196 | clientRank[item.client] += item.amount * item.price 197 | } else { 198 | clientRank[item.client] = item.amount * item.price 199 | } 200 | 201 | //类别占比 202 | if (categoriesPerCache[item.stock_id]) { 203 | //有缓存 204 | let index = categoriesPerCache[item.stock_id] 205 | categoriesPerTemp[index].sales.value += item.amount * item.price 206 | categoriesPerTemp[index].cost.value += item.another_fee 207 | categoriesPerTemp[index].profit.value += item.amount * item.price - item.another_fee 208 | 209 | } else { 210 | //无缓存 211 | let index = categoriesPerTemp.push( 212 | { 213 | sales: { name: `${item.name}/${item.type}`, value: item.amount * item.price }, 214 | cost: { name: `${item.name}/${item.type}`, value: item.another_fee }, 215 | profit: { name: `${item.name}/${item.type}`, value: item.amount * item.price - item.another_fee } 216 | } 217 | ) - 1 218 | categoriesPerCache[item.stock_id] = index 219 | } 220 | } 221 | } 222 | 223 | 224 | //detail 格式化 225 | for (let item of sql_result) { 226 | //合并简写name_type 227 | item.name_type = `${item.name}/${item.type}` 228 | //销售额 229 | item.sales = item.amount * item.price 230 | //成本 231 | item.cost = item.another_fee 232 | //利润 233 | item.profit = item.amount * item.price - item.another_fee 234 | } 235 | 236 | //类别占比扁平化处理 237 | for (let item of categoriesPerTemp) { 238 | categoriesPer.totalSales += item.sales.value 239 | categoriesPer.totalCost += item.cost.value 240 | categoriesPer.totalProfit += item.profit.value 241 | categoriesPer.sales.push(item.sales) 242 | categoriesPer.cost.push(item.cost) 243 | categoriesPer.profit.push(item.profit) 244 | } 245 | 246 | //clientRank 247 | //扁平化处理 248 | let newClientRank = [] 249 | for (let name in clientRank) { 250 | newClientRank.push({ name, value: clientRank[name] }) 251 | } 252 | //冒泡排序 253 | for (let i = 0; i < newClientRank.length - 1; i++) { 254 | for (let j = 0; j < newClientRank.length - 1 - i; j++) { 255 | if (newClientRank[j].value > newClientRank[j + 1].value) { 256 | let temp = newClientRank[j + 1]; 257 | newClientRank[j + 1] = newClientRank[j]; 258 | newClientRank[j] = temp; 259 | } 260 | } 261 | } 262 | 263 | 264 | return res.json({ status: 200, msg: '获取成功', data: { categoriesPer, chartsData, clientRank: newClientRank.reverse().slice(0, 7), detail: { total, data: sql_result }, } }) 265 | } 266 | exports._get_yearFinishOrder = async (req, res) => { 267 | let xData, year = req.query.year, month = req.query.month, received, backOri, backStore 268 | //字段验证 269 | if (!year) { 270 | return res.json(res_data.query_fail) 271 | } 272 | 273 | xData = month ? Array.from(new Array(31), (element, index) => index + 1) : ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月",] 274 | received = Array.from(new Array(month ? 31 : 12), element => 0) 275 | backOri = Array.from(new Array(month ? 31 : 12), element => 0) 276 | backStore = Array.from(new Array(month ? 31 : 12), element => 0) 277 | filter_date_start = `${year}-${month ? month : 1}-1` 278 | filter_date_end = `${year}-${month ? month : 12}-31` 279 | let sql_result = await dataVisual.get_order(filter_date_start, filter_date_end) 280 | for (let item of sql_result) { 281 | 282 | switch (item.transport_status) { 283 | //status 1:未收货 2:已发货 3:已收货 4:退回仓库 5:退回原厂 284 | case "3": 285 | received[month ? new Date(item.updata_date).getDate() - 1 : new Date(item.updata_date).getMonth()] += 1 286 | break 287 | case "4": 288 | backStore[month ? new Date(item.updata_date).getDate() - 1 : new Date(item.updata_date).getMonth()] += 1 289 | break 290 | case "5": 291 | backOri[month ? new Date(item.updata_date).getDate() - 1 : new Date(item.updata_date).getMonth()] += 1 292 | break 293 | } 294 | } 295 | 296 | 297 | return res.json({ status: 200, msg: "获取成功", data: { sql_result, year, month, xData, received, backOri, backStore } }) 298 | 299 | 300 | 301 | 302 | } -------------------------------------------------------------------------------- /controller/store.js: -------------------------------------------------------------------------------- 1 | 2 | const { store } = require("../model") 3 | const { res_data } = require("../config") 4 | const { formatDate } = require("../utils") 5 | exports.get_stock = async (req, res) => { 6 | // 拦截未传或为空的参数 7 | let order_by = req.query.order_by ? req.query.order_by : "id" 8 | let direction = req.query.direction ? req.query.direction : "ASC" 9 | let page = req.query.page ? Number(req.query.page) : 1 10 | let name = req.query.name ? req.query.name : "" 11 | // 过滤后总记录数 12 | let total_sql_result = await store.get_stock(order_by, direction, page, name, false) 13 | // 分页结果 14 | let sql_result = await store.get_stock(order_by, direction, page, name) 15 | //标记索引 16 | sql_result.forEach((element, index) => { 17 | element.index = (Number(page) - 1) * 20 + index + 1 18 | }); 19 | 20 | 21 | return res.json({ status: 200, msg: "查询成功", current_page: Number(page), total: total_sql_result.length, data: sql_result }) 22 | } 23 | 24 | 25 | //查询出入库记录 26 | exports.get_stockRecording = async (req, res) => { 27 | //参数初始化,过滤为空情况 28 | let page, type, order_by, direction, filter_name, filter_type, filter_date_start, filter_date_end, filter_clientId, filter_clientName 29 | order_by = req.query.order_by ? req.query.order_by : "id" 30 | direction = req.query.direction ? req.query.direction : "ASC" 31 | filter_name = req.query.filter_name ? req.query.filter_name : "" 32 | filter_type = req.query.filter_type ? req.query.filter_type : "" 33 | filter_clientId = req.query.filter_clientId ? req.query.filter_clientId : "" 34 | filter_clientName = req.query.filter_clientName ? req.query.filter_clientName : "" 35 | filter_date_start = req.query.filter_date_start ? req.query.filter_date_start : "" 36 | filter_date_end = req.query.filter_date_end ? req.query.filter_date_end : "" 37 | filter_transportStatus = req.query.filter_transportStatus ? req.query.filter_transportStatus : "" 38 | // type,page 必填参数,filter_data解析拦截 39 | page = req.query.page 40 | type = req.query.type 41 | if (!type || !page) return res.json(res_data.query_fail) 42 | // 过滤后总记录数 43 | let total_sql_result = await store.get_stockRecording(type, order_by, direction, page, filter_name, filter_type, filter_date_start, filter_date_end, filter_transportStatus, filter_clientId, filter_clientName, false) 44 | // 分页结果 45 | let sql_result = await store.get_stockRecording(type, order_by, direction, page, filter_name, filter_type, filter_date_start, filter_date_end, filter_transportStatus, filter_clientId, filter_clientName) 46 | //标记索引 47 | sql_result.forEach((element, index) => { 48 | element.index = (Number(page) - 1) * 20 + index + 1 49 | }); 50 | return res.json({ status: 200, msg: "查询成功", current_page: Number(page), total: total_sql_result.length, data: sql_result }) 51 | } 52 | //查询库存可选项 53 | exports.get_storeOptions = async (req, res) => { 54 | let sql_result = await store.get_storeOptions() 55 | return res.json({ status: 200, msg: "查询成功", data: sql_result }) 56 | } 57 | //查询订单状态 58 | exports.get_transportStatusOptions = async (req, res) => { 59 | let sql_result = await store.get_transportStatusOptions() 60 | return res.json({ status: 200, msg: "查询成功", data: sql_result }) 61 | } 62 | 63 | 64 | //入库 65 | exports.in_store = async (req, res) => { 66 | let stock_id = req.body.stock_id 67 | let price = req.body.price 68 | let amount = req.body.amount 69 | let updata_date = req.body.updata_date 70 | let user_id = req.auth.user_id 71 | //日期默认处理 72 | if (updata_date) { 73 | updata_date = `"${formatDate(new Date(updata_date))}"` 74 | } else { 75 | updata_date = "CURRENT_TIMESTAMP()" 76 | } 77 | //必填参数验证 78 | if (!(stock_id && price && amount)) return res.json(res_data.field_fail) 79 | //修改变动库存 80 | let sql_result = await store.modify_stock("add", stock_id, amount) 81 | if (!sql_result) return res.json(res_data.modify_store_fail) 82 | 83 | //生成入库记录 84 | let payload = { stock_id, price, amount, updata_date, user_id } 85 | let recording_result = await store.add_stock_recording("in_stock", payload) 86 | if (!recording_result) return res.json(res_data.modify_store_fail) 87 | 88 | return res.json({ status: 200, msg: "入库成功", data: {} }) 89 | } 90 | //出库 91 | exports.out_store = async (req, res) => { 92 | let stock_id = req.body.stock_id 93 | let price = req.body.price 94 | let amount = req.body.amount 95 | let another_fee = req.body.another_fee 96 | let client_id = req.body.client_id 97 | let transport_status = req.body.transport_status 98 | let transport_order = req.body.transport_order 99 | let updata_date = req.body.updata_date 100 | let user_id = req.auth.user_id 101 | //日期默认处理 102 | if (updata_date) { 103 | updata_date = `"${formatDate(new Date(updata_date))}"` 104 | } else { 105 | updata_date = "CURRENT_TIMESTAMP()" 106 | } 107 | //必填参数验证 108 | if (!(stock_id && price && amount && another_fee && client_id && transport_status)) return res.json(res_data.field_fail) 109 | //修改变动库存 110 | //针对退回仓库订单状态 特殊处理,不去变动库存,maybe只是做记录处理? 111 | if (transport_order != 4) { 112 | let sql_result = await store.modify_stock("reduce", stock_id, amount) 113 | if (!sql_result) return res.json(res_data.modify_store_fail) 114 | } 115 | 116 | //生成入库记录 117 | let payload = { stock_id, price, amount, updata_date, another_fee, client_id, transport_order, transport_status, user_id } 118 | let recording_result = await store.add_stock_recording("out_stock", payload) 119 | if (!recording_result) return res.json(res_data.modify_store_fail) 120 | 121 | return res.json({ status: 200, msg: "出库成功", data: {} }) 122 | 123 | } 124 | //更改出库状态 125 | exports.modify_out_store_status = async (req, res) => { 126 | let order_id = req.body.order_id 127 | let modify_status = req.body.modify_status 128 | 129 | //必填参数验证 数据类型验证 130 | if (!(order_id && modify_status && typeof modify_status == "number")) return res.json(res_data.field_fail) 131 | let sql_result = await store.ruled_transport_status(modify_status) 132 | if (!sql_result.length) return res.json(res_data.field_fail) 133 | 134 | //获取原订单状态 stock_id 135 | let { ori_status, stock_id, amount } = (await store.$get_out_store_recording(order_id))[0] 136 | 137 | //验证要变更状态是否为合法状态id 138 | sql_result = await store.modify_out_store_status(order_id, modify_status) 139 | if (!sql_result.affectedRows) return res.json(res_data.modify_store_fail) 140 | 141 | //变动库存 142 | if (ori_status == 4 && modify_status != 4) { 143 | //退回仓库=>任意状态 当作首次出库处理,对应仓库商品数量减少 144 | sql_result = await store.modify_stock('reduce', stock_id, amount) 145 | } else if (modify_status == 4 && ori_status != 4) { 146 | //任意状态=>退回仓库 对应仓库商品的数量修正(增加) 147 | sql_result = await store.modify_stock('add', stock_id, amount) 148 | } 149 | 150 | //生成订单完成时间 151 | //其他未完成状态=>完成状态(完成收货、退回仓库、退回原厂) 生成时间 152 | //完成状态(完成收货、退回仓库、退回原厂)=>其他状态 修正成默认值 153 | if ((ori_status == 1 || ori_status == 2) && (modify_status == 3 || modify_status == 4 || modify_status == 5)) { 154 | sql_result = await store.$set_out_store_finish_date(order_id) 155 | } else if ((ori_status == 3 || ori_status == 4 || ori_status == 5) && (modify_status == 1 || modify_status == 2)) { 156 | sql_result = await store.$set_out_store_finish_date(order_id, "NULL") 157 | } 158 | 159 | 160 | return res.json({ status: 200, msg: "修改成功", data: {} }) 161 | } 162 | //新增库存 163 | exports.add_store = async (req, res) => { 164 | let name = req.body.name 165 | let type = req.body.type 166 | let stock = req.body.stock 167 | 168 | //必填参数验证 169 | if (!(name && type && stock != undefined)) return res.json(res_data.field_fail) 170 | let sql_result = await store.add_stock(name, type, stock) 171 | //已存在库存冲突 172 | 173 | if (!sql_result) return res.json(res_data.add_stock_fail) 174 | return res.json({ status: 200, msg: "新增库存成功", data: sql_result }) 175 | } 176 | //编辑库存 177 | exports.edit_store = async (req, res) => { 178 | let stock_id = req.body.stockId 179 | let edit_name = req.body.name 180 | let edit_type = req.body.type 181 | let edit_stock = req.body.stock 182 | //验证必填参数 183 | if (!stock_id) return res.json(res_data.field_fail) 184 | 185 | //验证stock_id合法 186 | let sql_result = await store.ruled_stock_id(stock_id) 187 | if (!sql_result.length) return res.json({ status: 200, msg: "库存不存在", data: sql_result }) 188 | 189 | console.log(stock_id, edit_name, edit_type, edit_stock) 190 | sql_result = await store.edit_stock(stock_id, edit_name, edit_type, edit_stock) 191 | return res.json({ status: 200, msg: "编辑库存成功", data: sql_result }) 192 | } 193 | //删除库存 194 | exports.del_store = async (req, res) => { 195 | let stock_id = req.body.stockId 196 | //验证必填参数 197 | if (!stock_id) return res.json(res_data.field_fail) 198 | //验证stock_id合法 199 | let sql_result = await store.ruled_stock_id(stock_id) 200 | if (!sql_result.length) return res.json({ status: 200, msg: "库存不存在", data: sql_result }) 201 | 202 | sql_result = await store.del_stock(stock_id) 203 | 204 | 205 | 206 | return res.json({ status: 200, msg: "删除成功", data: sql_result }) 207 | } 208 | 209 | 210 | 211 | -------------------------------------------------------------------------------- /controller/user.js: -------------------------------------------------------------------------------- 1 | const { user } = require("../model") 2 | const { res_data, jwt_config } = require("../config") 3 | var jwt = require('jsonwebtoken'); 4 | const { json } = require("express"); 5 | exports.login = async (req, res, next) => { 6 | try { 7 | // 处理请求 8 | let req_data = req.body 9 | let sql_result = await user.login(req_data.account, req_data.passward) 10 | if (sql_result.length) { 11 | // 验证通过,生成token 12 | let token = jwt.sign({ user_id: sql_result[0].id, account: sql_result[0].account, nick: sql_result[0].nick, role: sql_result[0].role_name }, jwt_config.secretKey, { algorithm: jwt_config.algorithms[0] }); 13 | return res.json( 14 | { 15 | status: 200, 16 | msg: "登陆成功", 17 | data: { 18 | user_id: sql_result[0].id, 19 | account: sql_result[0].account, 20 | nick: sql_result[0].nick, 21 | role: sql_result[0].role_name, 22 | updata_date: sql_result[0].updata_date, 23 | iat: parseInt(Date.now() / 1000, 10), 24 | token: token 25 | } 26 | } 27 | ) 28 | } 29 | 30 | return res.json(res_data.login_fail); 31 | } catch (err) { 32 | next(err); 33 | } 34 | }; 35 | exports.register = async (req, res, next) => { 36 | try { 37 | // 处理请求 38 | res.send("post /user/login"); 39 | } catch (err) { 40 | next(err); 41 | } 42 | }; 43 | 44 | 45 | //获取用户信息 46 | exports.get_userInfo = async (req, res, next) => { 47 | //Token的payload部分若有所变动,根据数据库最新内容生成新的Token 48 | let payload = req.auth; 49 | let sql_result = await user.get_userInfo(payload.user_id) 50 | if (sql_result.length && (payload.user_id == sql_result[0].id) && (payload.account == sql_result[0].account) && (payload.nick == sql_result[0].nick) && (payload.role == sql_result[0].role_name)) { 51 | //用户信息并没有变更,直接返回当前token 52 | let token = req.headers.authorization 53 | return res.json({ status: 200, msg: "获取成功", data: { ...payload, token: token } }) 54 | } else { 55 | //用户信息变动生成新的token,新的信息返回 56 | let token = jwt.sign({ user_id: sql_result[0].id, account: sql_result[0].account, nick: sql_result[0].nick, role: sql_result[0].role_name }, jwt_config.secretKey, { algorithm: jwt_config.algorithms[0] }); 57 | return res.json({ 58 | status: 200, 59 | msg: "获取成功", 60 | data: { 61 | user_id: sql_result[0].id, 62 | account: sql_result[0].account, 63 | nick: sql_result[0].nick, 64 | role: sql_result[0].role_name, 65 | updata_date: sql_result[0].updata_date, 66 | iat: parseInt(Date.now() / 1000, 10), 67 | token: token 68 | } 69 | }) 70 | } 71 | } 72 | 73 | -------------------------------------------------------------------------------- /middleware/404-handler.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | const { res_data } = require("../config") 4 | module.exports = () => { 5 | return (req, res, next) => { 6 | res.status(200).json(res_data.route_fail); 7 | }; 8 | }; -------------------------------------------------------------------------------- /middleware/error-handler.js: -------------------------------------------------------------------------------- 1 | const { res_data } = require("../config") 2 | module.exports = () => { 3 | return (err, req, res, next) => { 4 | if (err.name === "UnauthorizedError") return res.status(200).json(res_data.auth_fail) 5 | res.status(500).json({ 6 | error: err 7 | }); 8 | }; 9 | }; -------------------------------------------------------------------------------- /middleware/jwtAuth.js: -------------------------------------------------------------------------------- 1 | const { expressjwt } = require("express-jwt"); 2 | // jwt密钥 3 | const { jwt_config } = require("../config") 4 | const { get_revoked_token } = require('../model/user') 5 | 6 | 7 | //Token是否失效 8 | const isRevokedCallback = async (req, token) => { 9 | const signature = token.signature 10 | let sql_result = await get_revoked_token(signature) 11 | return Boolean(sql_result.length); 12 | } 13 | 14 | 15 | const jwtAuth = expressjwt({ 16 | secret: jwt_config.secretKey, 17 | algorithms: jwt_config.algorithms, 18 | getToken: (req) => { 19 | return req.headers.authorization 20 | }, 21 | isRevoked: isRevokedCallback, 22 | }).unless({ path: ["/api/user/login", "/api/user/register"] }); 23 | 24 | module.exports = jwtAuth; 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /model/client.js: -------------------------------------------------------------------------------- 1 | exports.get_client = (page, filter_name, is_limit = false) => { 2 | 3 | // 分页器偏移量 4 | let sql_query 5 | let offset = (page - 1) * 20 6 | let limit_sql_query = "" 7 | if (is_limit) limit_sql_query = `LIMIT ${offset},20` 8 | 9 | 10 | //过滤条件不为空 11 | if (filter_name) { 12 | sql_query = `SELECT * FROM client 13 | WHERE name LIKE "%${filter_name}%" 14 | ORDER BY id DESC 15 | ${limit_sql_query}` 16 | } else { 17 | sql_query = `SELECT * FROM client 18 | ORDER BY id DESC 19 | ${limit_sql_query}` 20 | } 21 | 22 | 23 | 24 | return global.sql_query(sql_query) 25 | } 26 | 27 | 28 | 29 | exports.get_client_options = (max_amount = 1000) => { 30 | let sql_query = `SELECT id,name AS 'value' FROM client 31 | ORDER BY id DESC 32 | LIMIT 0,${1000}` 33 | return global.sql_query(sql_query) 34 | } 35 | 36 | exports.modify_client = (client_id, modify_name, modify_tel, modify_address) => { 37 | 38 | let modify_query = "" 39 | //存在条件性修改 40 | if (modify_name) modify_query += `${modify_query ? "," : ""} name = "${modify_name}"` 41 | if (modify_tel) modify_query += `${modify_query ? "," : ""} tel = "${modify_tel}"` 42 | if (modify_address) modify_query += `${modify_query ? "," : ""} address = "${modify_address}"` 43 | let sql_query = `UPDATE client 44 | SET ${modify_query} 45 | WHERE id = ${client_id}` 46 | return global.sql_query(sql_query) 47 | 48 | } 49 | 50 | 51 | exports.$get_client = (client_id) => { 52 | let sql_query = `SELECT * FROM client 53 | WHERE id = ${client_id}` 54 | return global.sql_query(sql_query) 55 | } 56 | exports.$get_client_byName = (client_name) => { 57 | let sql_query = `SELECT * FROM client 58 | WHERE name = "${client_name}"` 59 | return global.sql_query(sql_query) 60 | } 61 | 62 | exports.add_client = (name, tel, address) => { 63 | let sql_query = `INSERT INTO client (name,tel,address) 64 | VALUES ("${name}","${tel}","${address}");` 65 | return global.sql_query(sql_query) 66 | } 67 | exports.del_client = (client_id) => { 68 | let sql_query = `DELETE FROM client 69 | WHERE id = ${client_id}` 70 | return global.sql_query(sql_query) 71 | } -------------------------------------------------------------------------------- /model/dataVisual.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: Hyrm 1358188945@qq.com 3 | * @Date: 2022-12-06 19:03:08 4 | * @LastEditors: Hyrm 1358188945@qq.com 5 | * @LastEditTime: 2022-12-30 19:22:09 6 | * @FilePath: \wms-server\model\dataVisual.js 7 | * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE 8 | */ 9 | 10 | 11 | 12 | 13 | exports.get_total_stock = () => { 14 | let sql_query = `SELECT COUNT(*) AS total FROM stocks` 15 | return global.sql_query(sql_query) 16 | } 17 | exports.get_total_client = () => { 18 | let sql_query = `SELECT COUNT(*) AS total FROM client` 19 | return global.sql_query(sql_query) 20 | } 21 | 22 | exports.get_total_inOrder = () => { 23 | let sql_query = `SELECT COUNT(*) AS total FROM in_order` 24 | return global.sql_query(sql_query) 25 | } 26 | exports.get_total_outOrder = () => { 27 | let sql_query = `SELECT COUNT(*) AS total FROM out_order` 28 | return global.sql_query(sql_query) 29 | } 30 | //获取不同状态订单 31 | exports.get_order = (start_date, end_date) => { 32 | //status 1:未收货 2:已发货 3:已收货 4:退回仓库 5:退回原厂 33 | //date: 34 | let filter_query = "" 35 | if (start_date && end_date) filter_query += `AND updata_date BETWEEN "${start_date}" AND "${end_date}"` 36 | let sql_query = `SELECT * FROM out_order 37 | WHERE transport_status IN (3,4,5) ${filter_query}` 38 | return global.sql_query(sql_query) 39 | } 40 | 41 | 42 | exports.get_order_count = (status) => { 43 | let sql_query = `SELECT COUNT(*) AS total FROM out_order 44 | WHERE transport_status = ${status}` 45 | return global.sql_query(sql_query) 46 | } 47 | 48 | 49 | exports.get_store = () => { 50 | let sql_query = `SELECT * FROM stocks` 51 | return global.sql_query(sql_query) 52 | } 53 | exports.get_date_order = (year, month) => { 54 | 55 | } 56 | -------------------------------------------------------------------------------- /model/index.js: -------------------------------------------------------------------------------- 1 | const { dataBaseConfig } = require("../config") 2 | const mysql = require('mysql'); 3 | const pool = mysql.createPool(dataBaseConfig); 4 | 5 | 6 | 7 | 8 | //全局暴露方法 9 | global.sql_query = (query) => { 10 | return new Promise((resolve, reject) => { 11 | pool.getConnection((err, connection) => { 12 | if (err) { 13 | return reject(err); 14 | } 15 | let sql_query = query 16 | connection.query(sql_query, (err, result) => { 17 | //释放连接 18 | pool.releaseConnection(connection) 19 | // connection.release(); 20 | if (err) { 21 | return reject(err); 22 | } 23 | resolve(result); 24 | }); 25 | }) 26 | }) 27 | } 28 | 29 | 30 | 31 | 32 | 33 | exports.user = require("./user") 34 | exports.store = require("./store") 35 | exports.client = require("./client") 36 | exports.dataVisual = require("./dataVisual") 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /model/store.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | exports.get_stock = (order_by, direction, page, name, is_limit = true) => { 5 | let offset = (page - 1) * 20 6 | 7 | 8 | 9 | let limit_sql_query = `LIMIT 0,300000` 10 | if (is_limit) limit_sql_query = `LIMIT ${offset},20` 11 | 12 | let filter_sql_query = "" 13 | if (name) filter_sql_query = `WHERE name = "${name}"` 14 | 15 | 16 | 17 | 18 | return global.sql_query(`SELECT * FROM stocks 19 | ${filter_sql_query} 20 | ORDER BY ${order_by} ${direction} 21 | ${limit_sql_query}`) 22 | } 23 | exports.get_stockRecording = (type, order_by, direction, page, filter_name, filter_type, filter_date_start, filter_date_end, filter_transportStatus, filter_clientId, filter_clientName, is_limit = true, is_finishDate = false) => { 24 | // 分页器偏移量 25 | let offset = (page - 1) * 20 26 | let sql_query, filter_sql_query = "" 27 | 28 | let limit_sql_query = `LIMIT 0,300000` 29 | if (is_limit) { 30 | limit_sql_query = `LIMIT ${offset},20` 31 | } 32 | 33 | 34 | 35 | //名称、类型过滤处理 36 | if (filter_name) filter_sql_query += ` AND stocks.name="${filter_name}"` 37 | if (filter_type) filter_sql_query += ` AND stocks.type="${filter_type}"` 38 | //时间过滤处理 39 | let filterDate_key 40 | if (is_finishDate) { 41 | filterDate_key = "finish_date" 42 | } else { 43 | filterDate_key = "updata_date" 44 | } 45 | 46 | 47 | 48 | 49 | if (filter_date_start && filter_date_end) { 50 | filter_sql_query += ` AND ${filterDate_key} BETWEEN "${filter_date_start}" AND "${filter_date_end}"` 51 | } else { 52 | if (filter_date_start) filter_sql_query += ` AND ${filterDate_key} >= "${filter_date_start}"` 53 | if (filter_date_end) filter_sql_query += ` AND ${filterDate_key} <= "${filter_date_end}"` 54 | } 55 | 56 | 57 | 58 | //出库订单状态过滤处理 59 | if (type == "out_order" && filter_transportStatus) { 60 | filter_sql_query += `AND transport_status = ${filter_transportStatus}` 61 | } 62 | 63 | // //客户ID过滤(废弃) 64 | // if (type == "out_order" && filter_clientId) { 65 | // filter_sql_query += `AND client_id = ${filter_clientId}` 66 | // } 67 | 68 | //客户名模糊过滤 69 | if (type == "out_order" && filter_clientName) { 70 | filter_sql_query += ` AND client.name LIKE "%${filter_clientName}%"` 71 | } 72 | 73 | 74 | 75 | //查询类型处理 76 | 77 | if (type == "in_order") { 78 | sql_query = `SELECT SQL_CALC_FOUND_ROWS in_order.id,stocks.name,stocks.type,price,amount,updata_date,price*amount AS total_cost,nick 79 | FROM in_order,stocks,users 80 | WHERE in_order.stock_id = stocks.id AND in_order.user_id=users.id ${filter_sql_query} 81 | ORDER BY ${order_by} ${direction} 82 | ${limit_sql_query}` 83 | } else { 84 | sql_query = `SELECT SQL_CALC_FOUND_ROWS out_order.id,stocks.name,stocks.type,stock_id,price,amount,another_fee,client.name AS 'client',client.tel AS client_tel,client.address AS client_address,status_name AS 'status' ,order_status.id AS status_id,transport_order,updata_date,finish_date,nick 85 | FROM out_order,stocks,order_status,users,client 86 | WHERE client_id = client.id AND out_order.stock_id = stocks.id AND out_order.transport_status = order_status.id AND out_order.user_id=users.id ${filter_sql_query} 87 | ORDER BY ${order_by} ${direction} 88 | ${limit_sql_query}` 89 | } 90 | 91 | return global.sql_query(sql_query) 92 | } 93 | 94 | exports.get_storeOptions = (max_amount = 500) => { 95 | let sql_query = `SELECT id,name,type FROM stocks 96 | LIMIT 0,${max_amount}` 97 | return global.sql_query(sql_query) 98 | } 99 | exports.get_transportStatusOptions = () => { 100 | return global.sql_query(`SELECT * FROM order_status`) 101 | } 102 | 103 | 104 | //变动库存(在原有基础上增删改) 105 | //1.直接变动:直接对库存增删查改 106 | //2.间接变动:撤销删除出入库记录 修改更改出入库记录 107 | exports.modify_stock = async (type, stock_id, amount) => { 108 | //type:cover,add,reduce 109 | //stock_id:变动id 110 | //amount:变动数量 111 | //验证stock_id合法性,以及获取修改前的数量 112 | let sql_query = `SELECT id,stock FROM stocks 113 | WHERE id = ${stock_id}` 114 | let sql_result = await global.sql_query(sql_query) 115 | if (!sql_result.length) return Promise.resolve(false) 116 | let cur_stock = sql_result[0].stock 117 | let modify_sql_query; 118 | switch (type) { 119 | case "add": 120 | modify_sql_query = `UPDATE stocks 121 | SET stock = ${cur_stock + amount}, last_updata = CURRENT_TIMESTAMP() 122 | WHERE id = ${stock_id}` 123 | break 124 | case "reduce": 125 | modify_sql_query = `UPDATE stocks 126 | SET stock = ${cur_stock - amount}, last_updata = CURRENT_TIMESTAMP() 127 | WHERE id = ${stock_id}` 128 | break 129 | case "cover": 130 | modify_sql_query = `UPDATE stocks 131 | SET stock = ${amount}, last_updata = CURRENT_TIMESTAMP() 132 | WHERE id = ${stock_id}` 133 | break 134 | default: 135 | return Promise.resolve(false) 136 | } 137 | 138 | 139 | return global.sql_query(modify_sql_query) 140 | } 141 | 142 | //新增出入库记录 143 | exports.add_stock_recording = async (type, payload) => { 144 | //type:出/入库记录 in_stock,out_stock 145 | //payload:相关字段 146 | let sql_query 147 | if (type == "in_stock") sql_query = `INSERT INTO in_order(stock_id,price,amount,updata_date,user_id) 148 | VALUES(${payload.stock_id},${payload.price},${payload.amount},${payload.updata_date},${payload.user_id})` 149 | if (type == "out_stock") sql_query = `INSERT INTO out_order(stock_id,price,amount,another_fee,client_id,transport_status,transport_order,updata_date,user_id) 150 | VALUES(${payload.stock_id},${payload.price},${payload.amount},${payload.another_fee},${payload.client_id},${payload.transport_status},"${payload.transport_order}",${payload.updata_date},${payload.user_id})` 151 | return global.sql_query(sql_query) 152 | 153 | } 154 | 155 | //新增库存 156 | exports.add_stock = async (name, type, stock) => { 157 | //验证是否存在冲突 158 | let exist_sql_query = `SELECT * FROM stocks 159 | WHERE name ="${name}" AND type = "${type}"` 160 | let exist_result = await global.sql_query(exist_sql_query) 161 | if (exist_result.length) return Promise.resolve(false) 162 | let sql_query = `INSERT INTO stocks(name,type,stock,last_updata) 163 | VALUES("${name}","${type}",${stock},CURRENT_TIMESTAMP())` 164 | return global.sql_query(sql_query) 165 | } 166 | //编辑库存 167 | exports.edit_stock = (stock_id, name, type, stock) => { 168 | let setQuery = "" 169 | if (name) setQuery += `${setQuery ? ',' : ""}name = '${name}'` 170 | if (type) setQuery += `${setQuery ? ',' : ""}type = '${type}'` 171 | if (stock || stock == 0) setQuery += `${setQuery ? ',' : ""}stock = ${stock}` 172 | let sql_query = `UPDATE stocks 173 | SET ${setQuery} 174 | WHERE id = ${stock_id}` 175 | 176 | return global.sql_query(sql_query) 177 | } 178 | //删除库存 179 | exports.del_stock = (stock_id) => { 180 | let sql_query = `DELETE FROM stocks 181 | WHERE id = ${stock_id};` 182 | return global.sql_query(sql_query) 183 | } 184 | exports.modify_out_store_status = async (id, modify_status) => { 185 | let sql_query = `UPDATE out_order 186 | SET transport_status = ${modify_status} 187 | WHERE id='${id}'` 188 | return global.sql_query(sql_query) 189 | 190 | } 191 | 192 | //验证transport_status合法 193 | exports.ruled_transport_status = async (transport_status) => { 194 | let sql_query = `SELECT id from order_status 195 | WHERE id = ${transport_status}` 196 | return global.sql_query(sql_query) 197 | } 198 | //验证stock_id合法 199 | exports.ruled_stock_id = (stock_id) => { 200 | let sql_query = `SELECT * FROM stocks 201 | WHERE id = ${stock_id}` 202 | return global.sql_query(sql_query) 203 | 204 | } 205 | 206 | exports.$get_out_store_recording = async (order_id) => { 207 | let sql_query = `SELECT transport_status AS ori_status,stock_id,amount FROM out_order 208 | WHERE id = ${order_id}` 209 | return global.sql_query(sql_query) 210 | 211 | } 212 | 213 | //生成订单完成时间 214 | exports.$set_out_store_finish_date = async (order_id, modify = "CURRENT_TIMESTAMP()") => { 215 | let sql_query = `UPDATE out_order 216 | SET finish_date = ${modify} 217 | WHERE id = ${order_id}` 218 | return global.sql_query(sql_query) 219 | } -------------------------------------------------------------------------------- /model/user.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | exports.login = (nick, password) => { 4 | return global.sql_query(`SELECT users.id,account,nick,role_name,latest_login FROM users,roles 5 | WHERE (account = "${nick}" and users.passward = "${password}") AND users.role_id = roles.id`) 6 | } 7 | // 查询Token是否过期 8 | exports.get_revoked_token = (signature) => { 9 | let sql_query = `SELECT * FROM revoked_tokens 10 | WHERE signature = "${signature}"` 11 | return global.sql_query(sql_query) 12 | } 13 | // 记录失效Token 14 | exports.add_revoked_token = (signature, user_id) => { 15 | let sql_query = `INSERT revoked_tokens(signature,user_id) 16 | VALUES("${signature}",${user_id})` 17 | return global.sql_query(sql_query) 18 | } 19 | //查询用户信息 20 | exports.get_userInfo = (user_id) => { 21 | let sql_query = `SELECT users.id,account,nick,role_name 22 | FROM users,roles 23 | WHERE users.id =${user_id} AND roles.id = role_id` 24 | return global.sql_query(sql_query) 25 | } 26 | 27 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "server", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "compression": "^1.7.4", 13 | "cors": "^2.8.5", 14 | "express": "^4.18.2", 15 | "express-jwt": "^7.7.7", 16 | "jsonwebtoken": "^8.5.1", 17 | "morgan": "^1.10.0", 18 | "mysql": "^2.18.1" 19 | }, 20 | "devDependencies": { 21 | "nodemon": "^2.0.20" 22 | } 23 | }, 24 | "node_modules/@types/jsonwebtoken": { 25 | "version": "8.5.9", 26 | "resolved": "https://registry.npmmirror.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", 27 | "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", 28 | "dependencies": { 29 | "@types/node": "*" 30 | } 31 | }, 32 | "node_modules/@types/node": { 33 | "version": "18.11.9", 34 | "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.11.9.tgz", 35 | "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" 36 | }, 37 | "node_modules/abbrev": { 38 | "version": "1.1.1", 39 | "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz", 40 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 41 | "dev": true 42 | }, 43 | "node_modules/accepts": { 44 | "version": "1.3.8", 45 | "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", 46 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 47 | "dependencies": { 48 | "mime-types": "~2.1.34", 49 | "negotiator": "0.6.3" 50 | }, 51 | "engines": { 52 | "node": ">= 0.6" 53 | } 54 | }, 55 | "node_modules/anymatch": { 56 | "version": "3.1.2", 57 | "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz", 58 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 59 | "dev": true, 60 | "dependencies": { 61 | "normalize-path": "^3.0.0", 62 | "picomatch": "^2.0.4" 63 | }, 64 | "engines": { 65 | "node": ">= 8" 66 | } 67 | }, 68 | "node_modules/array-flatten": { 69 | "version": "1.1.1", 70 | "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", 71 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 72 | }, 73 | "node_modules/balanced-match": { 74 | "version": "1.0.2", 75 | "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", 76 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 77 | "dev": true 78 | }, 79 | "node_modules/basic-auth": { 80 | "version": "2.0.1", 81 | "resolved": "https://registry.npmmirror.com/basic-auth/-/basic-auth-2.0.1.tgz", 82 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 83 | "dependencies": { 84 | "safe-buffer": "5.1.2" 85 | }, 86 | "engines": { 87 | "node": ">= 0.8" 88 | } 89 | }, 90 | "node_modules/basic-auth/node_modules/safe-buffer": { 91 | "version": "5.1.2", 92 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", 93 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 94 | }, 95 | "node_modules/bignumber.js": { 96 | "version": "9.0.0", 97 | "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.0.0.tgz", 98 | "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", 99 | "engines": { 100 | "node": "*" 101 | } 102 | }, 103 | "node_modules/binary-extensions": { 104 | "version": "2.2.0", 105 | "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", 106 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 107 | "dev": true, 108 | "engines": { 109 | "node": ">=8" 110 | } 111 | }, 112 | "node_modules/body-parser": { 113 | "version": "1.20.1", 114 | "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz", 115 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 116 | "dependencies": { 117 | "bytes": "3.1.2", 118 | "content-type": "~1.0.4", 119 | "debug": "2.6.9", 120 | "depd": "2.0.0", 121 | "destroy": "1.2.0", 122 | "http-errors": "2.0.0", 123 | "iconv-lite": "0.4.24", 124 | "on-finished": "2.4.1", 125 | "qs": "6.11.0", 126 | "raw-body": "2.5.1", 127 | "type-is": "~1.6.18", 128 | "unpipe": "1.0.0" 129 | }, 130 | "engines": { 131 | "node": ">= 0.8", 132 | "npm": "1.2.8000 || >= 1.4.16" 133 | } 134 | }, 135 | "node_modules/brace-expansion": { 136 | "version": "1.1.11", 137 | "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", 138 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 139 | "dev": true, 140 | "dependencies": { 141 | "balanced-match": "^1.0.0", 142 | "concat-map": "0.0.1" 143 | } 144 | }, 145 | "node_modules/braces": { 146 | "version": "3.0.2", 147 | "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", 148 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 149 | "dev": true, 150 | "dependencies": { 151 | "fill-range": "^7.0.1" 152 | }, 153 | "engines": { 154 | "node": ">=8" 155 | } 156 | }, 157 | "node_modules/buffer-equal-constant-time": { 158 | "version": "1.0.1", 159 | "resolved": "https://registry.npmmirror.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 160 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" 161 | }, 162 | "node_modules/bytes": { 163 | "version": "3.1.2", 164 | "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", 165 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 166 | "engines": { 167 | "node": ">= 0.8" 168 | } 169 | }, 170 | "node_modules/call-bind": { 171 | "version": "1.0.2", 172 | "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", 173 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 174 | "dependencies": { 175 | "function-bind": "^1.1.1", 176 | "get-intrinsic": "^1.0.2" 177 | } 178 | }, 179 | "node_modules/chokidar": { 180 | "version": "3.5.3", 181 | "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", 182 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 183 | "dev": true, 184 | "dependencies": { 185 | "anymatch": "~3.1.2", 186 | "braces": "~3.0.2", 187 | "glob-parent": "~5.1.2", 188 | "is-binary-path": "~2.1.0", 189 | "is-glob": "~4.0.1", 190 | "normalize-path": "~3.0.0", 191 | "readdirp": "~3.6.0" 192 | }, 193 | "engines": { 194 | "node": ">= 8.10.0" 195 | }, 196 | "optionalDependencies": { 197 | "fsevents": "~2.3.2" 198 | } 199 | }, 200 | "node_modules/compressible": { 201 | "version": "2.0.18", 202 | "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz", 203 | "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", 204 | "dependencies": { 205 | "mime-db": ">= 1.43.0 < 2" 206 | }, 207 | "engines": { 208 | "node": ">= 0.6" 209 | } 210 | }, 211 | "node_modules/compression": { 212 | "version": "1.7.4", 213 | "resolved": "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz", 214 | "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", 215 | "dependencies": { 216 | "accepts": "~1.3.5", 217 | "bytes": "3.0.0", 218 | "compressible": "~2.0.16", 219 | "debug": "2.6.9", 220 | "on-headers": "~1.0.2", 221 | "safe-buffer": "5.1.2", 222 | "vary": "~1.1.2" 223 | }, 224 | "engines": { 225 | "node": ">= 0.8.0" 226 | } 227 | }, 228 | "node_modules/compression/node_modules/bytes": { 229 | "version": "3.0.0", 230 | "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz", 231 | "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", 232 | "engines": { 233 | "node": ">= 0.8" 234 | } 235 | }, 236 | "node_modules/compression/node_modules/safe-buffer": { 237 | "version": "5.1.2", 238 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", 239 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 240 | }, 241 | "node_modules/concat-map": { 242 | "version": "0.0.1", 243 | "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", 244 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 245 | "dev": true 246 | }, 247 | "node_modules/content-disposition": { 248 | "version": "0.5.4", 249 | "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", 250 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 251 | "dependencies": { 252 | "safe-buffer": "5.2.1" 253 | }, 254 | "engines": { 255 | "node": ">= 0.6" 256 | } 257 | }, 258 | "node_modules/content-type": { 259 | "version": "1.0.4", 260 | "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.4.tgz", 261 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 262 | "engines": { 263 | "node": ">= 0.6" 264 | } 265 | }, 266 | "node_modules/cookie": { 267 | "version": "0.5.0", 268 | "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz", 269 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 270 | "engines": { 271 | "node": ">= 0.6" 272 | } 273 | }, 274 | "node_modules/cookie-signature": { 275 | "version": "1.0.6", 276 | "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz", 277 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 278 | }, 279 | "node_modules/core-util-is": { 280 | "version": "1.0.3", 281 | "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", 282 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 283 | }, 284 | "node_modules/cors": { 285 | "version": "2.8.5", 286 | "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz", 287 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 288 | "dependencies": { 289 | "object-assign": "^4", 290 | "vary": "^1" 291 | }, 292 | "engines": { 293 | "node": ">= 0.10" 294 | } 295 | }, 296 | "node_modules/debug": { 297 | "version": "2.6.9", 298 | "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", 299 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 300 | "dependencies": { 301 | "ms": "2.0.0" 302 | } 303 | }, 304 | "node_modules/depd": { 305 | "version": "2.0.0", 306 | "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", 307 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 308 | "engines": { 309 | "node": ">= 0.8" 310 | } 311 | }, 312 | "node_modules/destroy": { 313 | "version": "1.2.0", 314 | "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", 315 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 316 | "engines": { 317 | "node": ">= 0.8", 318 | "npm": "1.2.8000 || >= 1.4.16" 319 | } 320 | }, 321 | "node_modules/ecdsa-sig-formatter": { 322 | "version": "1.0.11", 323 | "resolved": "https://registry.npmmirror.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 324 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 325 | "dependencies": { 326 | "safe-buffer": "^5.0.1" 327 | } 328 | }, 329 | "node_modules/ee-first": { 330 | "version": "1.1.1", 331 | "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", 332 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 333 | }, 334 | "node_modules/encodeurl": { 335 | "version": "1.0.2", 336 | "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", 337 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 338 | "engines": { 339 | "node": ">= 0.8" 340 | } 341 | }, 342 | "node_modules/escape-html": { 343 | "version": "1.0.3", 344 | "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", 345 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 346 | }, 347 | "node_modules/etag": { 348 | "version": "1.8.1", 349 | "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", 350 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 351 | "engines": { 352 | "node": ">= 0.6" 353 | } 354 | }, 355 | "node_modules/express": { 356 | "version": "4.18.2", 357 | "resolved": "https://registry.npmmirror.com/express/-/express-4.18.2.tgz", 358 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 359 | "dependencies": { 360 | "accepts": "~1.3.8", 361 | "array-flatten": "1.1.1", 362 | "body-parser": "1.20.1", 363 | "content-disposition": "0.5.4", 364 | "content-type": "~1.0.4", 365 | "cookie": "0.5.0", 366 | "cookie-signature": "1.0.6", 367 | "debug": "2.6.9", 368 | "depd": "2.0.0", 369 | "encodeurl": "~1.0.2", 370 | "escape-html": "~1.0.3", 371 | "etag": "~1.8.1", 372 | "finalhandler": "1.2.0", 373 | "fresh": "0.5.2", 374 | "http-errors": "2.0.0", 375 | "merge-descriptors": "1.0.1", 376 | "methods": "~1.1.2", 377 | "on-finished": "2.4.1", 378 | "parseurl": "~1.3.3", 379 | "path-to-regexp": "0.1.7", 380 | "proxy-addr": "~2.0.7", 381 | "qs": "6.11.0", 382 | "range-parser": "~1.2.1", 383 | "safe-buffer": "5.2.1", 384 | "send": "0.18.0", 385 | "serve-static": "1.15.0", 386 | "setprototypeof": "1.2.0", 387 | "statuses": "2.0.1", 388 | "type-is": "~1.6.18", 389 | "utils-merge": "1.0.1", 390 | "vary": "~1.1.2" 391 | }, 392 | "engines": { 393 | "node": ">= 0.10.0" 394 | } 395 | }, 396 | "node_modules/express-jwt": { 397 | "version": "7.7.7", 398 | "resolved": "https://registry.npmmirror.com/express-jwt/-/express-jwt-7.7.7.tgz", 399 | "integrity": "sha512-7s04HZ7sAahx7lwKU5AInhVon1kWVitRFxd7cGUKQaLDOQJsAQjB/OEBXaN0GS22RBgX75TjOJXGY7myQmVz5A==", 400 | "dependencies": { 401 | "@types/jsonwebtoken": "^8.5.8", 402 | "express-unless": "^2.1.3", 403 | "jsonwebtoken": "^8.5.1" 404 | }, 405 | "engines": { 406 | "node": ">= 8.0.0" 407 | } 408 | }, 409 | "node_modules/express-unless": { 410 | "version": "2.1.3", 411 | "resolved": "https://registry.npmmirror.com/express-unless/-/express-unless-2.1.3.tgz", 412 | "integrity": "sha512-wj4tLMyCVYuIIKHGt0FhCtIViBcwzWejX0EjNxveAa6dG+0XBCQhMbx+PnkLkFCxLC69qoFrxds4pIyL88inaQ==" 413 | }, 414 | "node_modules/fill-range": { 415 | "version": "7.0.1", 416 | "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", 417 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 418 | "dev": true, 419 | "dependencies": { 420 | "to-regex-range": "^5.0.1" 421 | }, 422 | "engines": { 423 | "node": ">=8" 424 | } 425 | }, 426 | "node_modules/finalhandler": { 427 | "version": "1.2.0", 428 | "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz", 429 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 430 | "dependencies": { 431 | "debug": "2.6.9", 432 | "encodeurl": "~1.0.2", 433 | "escape-html": "~1.0.3", 434 | "on-finished": "2.4.1", 435 | "parseurl": "~1.3.3", 436 | "statuses": "2.0.1", 437 | "unpipe": "~1.0.0" 438 | }, 439 | "engines": { 440 | "node": ">= 0.8" 441 | } 442 | }, 443 | "node_modules/forwarded": { 444 | "version": "0.2.0", 445 | "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", 446 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 447 | "engines": { 448 | "node": ">= 0.6" 449 | } 450 | }, 451 | "node_modules/fresh": { 452 | "version": "0.5.2", 453 | "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", 454 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 455 | "engines": { 456 | "node": ">= 0.6" 457 | } 458 | }, 459 | "node_modules/fsevents": { 460 | "version": "2.3.2", 461 | "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", 462 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 463 | "dev": true, 464 | "hasInstallScript": true, 465 | "optional": true, 466 | "os": [ 467 | "darwin" 468 | ], 469 | "engines": { 470 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 471 | } 472 | }, 473 | "node_modules/function-bind": { 474 | "version": "1.1.1", 475 | "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", 476 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 477 | }, 478 | "node_modules/get-intrinsic": { 479 | "version": "1.1.3", 480 | "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 481 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 482 | "dependencies": { 483 | "function-bind": "^1.1.1", 484 | "has": "^1.0.3", 485 | "has-symbols": "^1.0.3" 486 | } 487 | }, 488 | "node_modules/glob-parent": { 489 | "version": "5.1.2", 490 | "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", 491 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 492 | "dev": true, 493 | "dependencies": { 494 | "is-glob": "^4.0.1" 495 | }, 496 | "engines": { 497 | "node": ">= 6" 498 | } 499 | }, 500 | "node_modules/has": { 501 | "version": "1.0.3", 502 | "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", 503 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 504 | "dependencies": { 505 | "function-bind": "^1.1.1" 506 | }, 507 | "engines": { 508 | "node": ">= 0.4.0" 509 | } 510 | }, 511 | "node_modules/has-flag": { 512 | "version": "3.0.0", 513 | "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", 514 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 515 | "dev": true, 516 | "engines": { 517 | "node": ">=4" 518 | } 519 | }, 520 | "node_modules/has-symbols": { 521 | "version": "1.0.3", 522 | "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", 523 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 524 | "engines": { 525 | "node": ">= 0.4" 526 | } 527 | }, 528 | "node_modules/http-errors": { 529 | "version": "2.0.0", 530 | "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", 531 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 532 | "dependencies": { 533 | "depd": "2.0.0", 534 | "inherits": "2.0.4", 535 | "setprototypeof": "1.2.0", 536 | "statuses": "2.0.1", 537 | "toidentifier": "1.0.1" 538 | }, 539 | "engines": { 540 | "node": ">= 0.8" 541 | } 542 | }, 543 | "node_modules/iconv-lite": { 544 | "version": "0.4.24", 545 | "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", 546 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 547 | "dependencies": { 548 | "safer-buffer": ">= 2.1.2 < 3" 549 | }, 550 | "engines": { 551 | "node": ">=0.10.0" 552 | } 553 | }, 554 | "node_modules/ignore-by-default": { 555 | "version": "1.0.1", 556 | "resolved": "https://registry.npmmirror.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 557 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 558 | "dev": true 559 | }, 560 | "node_modules/inherits": { 561 | "version": "2.0.4", 562 | "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", 563 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 564 | }, 565 | "node_modules/ipaddr.js": { 566 | "version": "1.9.1", 567 | "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 568 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 569 | "engines": { 570 | "node": ">= 0.10" 571 | } 572 | }, 573 | "node_modules/is-binary-path": { 574 | "version": "2.1.0", 575 | "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", 576 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 577 | "dev": true, 578 | "dependencies": { 579 | "binary-extensions": "^2.0.0" 580 | }, 581 | "engines": { 582 | "node": ">=8" 583 | } 584 | }, 585 | "node_modules/is-extglob": { 586 | "version": "2.1.1", 587 | "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", 588 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 589 | "dev": true, 590 | "engines": { 591 | "node": ">=0.10.0" 592 | } 593 | }, 594 | "node_modules/is-glob": { 595 | "version": "4.0.3", 596 | "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", 597 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 598 | "dev": true, 599 | "dependencies": { 600 | "is-extglob": "^2.1.1" 601 | }, 602 | "engines": { 603 | "node": ">=0.10.0" 604 | } 605 | }, 606 | "node_modules/is-number": { 607 | "version": "7.0.0", 608 | "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", 609 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 610 | "dev": true, 611 | "engines": { 612 | "node": ">=0.12.0" 613 | } 614 | }, 615 | "node_modules/isarray": { 616 | "version": "1.0.0", 617 | "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", 618 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 619 | }, 620 | "node_modules/jsonwebtoken": { 621 | "version": "8.5.1", 622 | "resolved": "https://registry.npmmirror.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 623 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 624 | "dependencies": { 625 | "jws": "^3.2.2", 626 | "lodash.includes": "^4.3.0", 627 | "lodash.isboolean": "^3.0.3", 628 | "lodash.isinteger": "^4.0.4", 629 | "lodash.isnumber": "^3.0.3", 630 | "lodash.isplainobject": "^4.0.6", 631 | "lodash.isstring": "^4.0.1", 632 | "lodash.once": "^4.0.0", 633 | "ms": "^2.1.1", 634 | "semver": "^5.6.0" 635 | }, 636 | "engines": { 637 | "node": ">=4", 638 | "npm": ">=1.4.28" 639 | } 640 | }, 641 | "node_modules/jsonwebtoken/node_modules/ms": { 642 | "version": "2.1.3", 643 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", 644 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 645 | }, 646 | "node_modules/jwa": { 647 | "version": "1.4.1", 648 | "resolved": "https://registry.npmmirror.com/jwa/-/jwa-1.4.1.tgz", 649 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 650 | "dependencies": { 651 | "buffer-equal-constant-time": "1.0.1", 652 | "ecdsa-sig-formatter": "1.0.11", 653 | "safe-buffer": "^5.0.1" 654 | } 655 | }, 656 | "node_modules/jws": { 657 | "version": "3.2.2", 658 | "resolved": "https://registry.npmmirror.com/jws/-/jws-3.2.2.tgz", 659 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 660 | "dependencies": { 661 | "jwa": "^1.4.1", 662 | "safe-buffer": "^5.0.1" 663 | } 664 | }, 665 | "node_modules/lodash.includes": { 666 | "version": "4.3.0", 667 | "resolved": "https://registry.npmmirror.com/lodash.includes/-/lodash.includes-4.3.0.tgz", 668 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" 669 | }, 670 | "node_modules/lodash.isboolean": { 671 | "version": "3.0.3", 672 | "resolved": "https://registry.npmmirror.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 673 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" 674 | }, 675 | "node_modules/lodash.isinteger": { 676 | "version": "4.0.4", 677 | "resolved": "https://registry.npmmirror.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 678 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" 679 | }, 680 | "node_modules/lodash.isnumber": { 681 | "version": "3.0.3", 682 | "resolved": "https://registry.npmmirror.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 683 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" 684 | }, 685 | "node_modules/lodash.isplainobject": { 686 | "version": "4.0.6", 687 | "resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 688 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" 689 | }, 690 | "node_modules/lodash.isstring": { 691 | "version": "4.0.1", 692 | "resolved": "https://registry.npmmirror.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 693 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" 694 | }, 695 | "node_modules/lodash.once": { 696 | "version": "4.1.1", 697 | "resolved": "https://registry.npmmirror.com/lodash.once/-/lodash.once-4.1.1.tgz", 698 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" 699 | }, 700 | "node_modules/media-typer": { 701 | "version": "0.3.0", 702 | "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", 703 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 704 | "engines": { 705 | "node": ">= 0.6" 706 | } 707 | }, 708 | "node_modules/merge-descriptors": { 709 | "version": "1.0.1", 710 | "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 711 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 712 | }, 713 | "node_modules/methods": { 714 | "version": "1.1.2", 715 | "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", 716 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 717 | "engines": { 718 | "node": ">= 0.6" 719 | } 720 | }, 721 | "node_modules/mime": { 722 | "version": "1.6.0", 723 | "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", 724 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 725 | "bin": { 726 | "mime": "cli.js" 727 | }, 728 | "engines": { 729 | "node": ">=4" 730 | } 731 | }, 732 | "node_modules/mime-db": { 733 | "version": "1.52.0", 734 | "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", 735 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 736 | "engines": { 737 | "node": ">= 0.6" 738 | } 739 | }, 740 | "node_modules/mime-types": { 741 | "version": "2.1.35", 742 | "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", 743 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 744 | "dependencies": { 745 | "mime-db": "1.52.0" 746 | }, 747 | "engines": { 748 | "node": ">= 0.6" 749 | } 750 | }, 751 | "node_modules/minimatch": { 752 | "version": "3.1.2", 753 | "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", 754 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 755 | "dev": true, 756 | "dependencies": { 757 | "brace-expansion": "^1.1.7" 758 | }, 759 | "engines": { 760 | "node": "*" 761 | } 762 | }, 763 | "node_modules/morgan": { 764 | "version": "1.10.0", 765 | "resolved": "https://registry.npmmirror.com/morgan/-/morgan-1.10.0.tgz", 766 | "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", 767 | "dependencies": { 768 | "basic-auth": "~2.0.1", 769 | "debug": "2.6.9", 770 | "depd": "~2.0.0", 771 | "on-finished": "~2.3.0", 772 | "on-headers": "~1.0.2" 773 | }, 774 | "engines": { 775 | "node": ">= 0.8.0" 776 | } 777 | }, 778 | "node_modules/morgan/node_modules/on-finished": { 779 | "version": "2.3.0", 780 | "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz", 781 | "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", 782 | "dependencies": { 783 | "ee-first": "1.1.1" 784 | }, 785 | "engines": { 786 | "node": ">= 0.8" 787 | } 788 | }, 789 | "node_modules/ms": { 790 | "version": "2.0.0", 791 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", 792 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 793 | }, 794 | "node_modules/mysql": { 795 | "version": "2.18.1", 796 | "resolved": "https://registry.npmmirror.com/mysql/-/mysql-2.18.1.tgz", 797 | "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", 798 | "dependencies": { 799 | "bignumber.js": "9.0.0", 800 | "readable-stream": "2.3.7", 801 | "safe-buffer": "5.1.2", 802 | "sqlstring": "2.3.1" 803 | }, 804 | "engines": { 805 | "node": ">= 0.6" 806 | } 807 | }, 808 | "node_modules/mysql/node_modules/safe-buffer": { 809 | "version": "5.1.2", 810 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", 811 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 812 | }, 813 | "node_modules/negotiator": { 814 | "version": "0.6.3", 815 | "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", 816 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 817 | "engines": { 818 | "node": ">= 0.6" 819 | } 820 | }, 821 | "node_modules/nodemon": { 822 | "version": "2.0.20", 823 | "resolved": "https://registry.npmmirror.com/nodemon/-/nodemon-2.0.20.tgz", 824 | "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", 825 | "dev": true, 826 | "dependencies": { 827 | "chokidar": "^3.5.2", 828 | "debug": "^3.2.7", 829 | "ignore-by-default": "^1.0.1", 830 | "minimatch": "^3.1.2", 831 | "pstree.remy": "^1.1.8", 832 | "semver": "^5.7.1", 833 | "simple-update-notifier": "^1.0.7", 834 | "supports-color": "^5.5.0", 835 | "touch": "^3.1.0", 836 | "undefsafe": "^2.0.5" 837 | }, 838 | "bin": { 839 | "nodemon": "bin/nodemon.js" 840 | }, 841 | "engines": { 842 | "node": ">=8.10.0" 843 | } 844 | }, 845 | "node_modules/nodemon/node_modules/debug": { 846 | "version": "3.2.7", 847 | "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", 848 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 849 | "dev": true, 850 | "dependencies": { 851 | "ms": "^2.1.1" 852 | } 853 | }, 854 | "node_modules/nodemon/node_modules/ms": { 855 | "version": "2.1.3", 856 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", 857 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 858 | "dev": true 859 | }, 860 | "node_modules/nopt": { 861 | "version": "1.0.10", 862 | "resolved": "https://registry.npmmirror.com/nopt/-/nopt-1.0.10.tgz", 863 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 864 | "dev": true, 865 | "dependencies": { 866 | "abbrev": "1" 867 | }, 868 | "bin": { 869 | "nopt": "bin/nopt.js" 870 | }, 871 | "engines": { 872 | "node": "*" 873 | } 874 | }, 875 | "node_modules/normalize-path": { 876 | "version": "3.0.0", 877 | "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", 878 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 879 | "dev": true, 880 | "engines": { 881 | "node": ">=0.10.0" 882 | } 883 | }, 884 | "node_modules/object-assign": { 885 | "version": "4.1.1", 886 | "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", 887 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 888 | "engines": { 889 | "node": ">=0.10.0" 890 | } 891 | }, 892 | "node_modules/object-inspect": { 893 | "version": "1.12.2", 894 | "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.2.tgz", 895 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" 896 | }, 897 | "node_modules/on-finished": { 898 | "version": "2.4.1", 899 | "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", 900 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 901 | "dependencies": { 902 | "ee-first": "1.1.1" 903 | }, 904 | "engines": { 905 | "node": ">= 0.8" 906 | } 907 | }, 908 | "node_modules/on-headers": { 909 | "version": "1.0.2", 910 | "resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz", 911 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", 912 | "engines": { 913 | "node": ">= 0.8" 914 | } 915 | }, 916 | "node_modules/parseurl": { 917 | "version": "1.3.3", 918 | "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", 919 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 920 | "engines": { 921 | "node": ">= 0.8" 922 | } 923 | }, 924 | "node_modules/path-to-regexp": { 925 | "version": "0.1.7", 926 | "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 927 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 928 | }, 929 | "node_modules/picomatch": { 930 | "version": "2.3.1", 931 | "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", 932 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 933 | "dev": true, 934 | "engines": { 935 | "node": ">=8.6" 936 | } 937 | }, 938 | "node_modules/process-nextick-args": { 939 | "version": "2.0.1", 940 | "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 941 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 942 | }, 943 | "node_modules/proxy-addr": { 944 | "version": "2.0.7", 945 | "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", 946 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 947 | "dependencies": { 948 | "forwarded": "0.2.0", 949 | "ipaddr.js": "1.9.1" 950 | }, 951 | "engines": { 952 | "node": ">= 0.10" 953 | } 954 | }, 955 | "node_modules/pstree.remy": { 956 | "version": "1.1.8", 957 | "resolved": "https://registry.npmmirror.com/pstree.remy/-/pstree.remy-1.1.8.tgz", 958 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 959 | "dev": true 960 | }, 961 | "node_modules/qs": { 962 | "version": "6.11.0", 963 | "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", 964 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 965 | "dependencies": { 966 | "side-channel": "^1.0.4" 967 | }, 968 | "engines": { 969 | "node": ">=0.6" 970 | } 971 | }, 972 | "node_modules/range-parser": { 973 | "version": "1.2.1", 974 | "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", 975 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 976 | "engines": { 977 | "node": ">= 0.6" 978 | } 979 | }, 980 | "node_modules/raw-body": { 981 | "version": "2.5.1", 982 | "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz", 983 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 984 | "dependencies": { 985 | "bytes": "3.1.2", 986 | "http-errors": "2.0.0", 987 | "iconv-lite": "0.4.24", 988 | "unpipe": "1.0.0" 989 | }, 990 | "engines": { 991 | "node": ">= 0.8" 992 | } 993 | }, 994 | "node_modules/readable-stream": { 995 | "version": "2.3.7", 996 | "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz", 997 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 998 | "dependencies": { 999 | "core-util-is": "~1.0.0", 1000 | "inherits": "~2.0.3", 1001 | "isarray": "~1.0.0", 1002 | "process-nextick-args": "~2.0.0", 1003 | "safe-buffer": "~5.1.1", 1004 | "string_decoder": "~1.1.1", 1005 | "util-deprecate": "~1.0.1" 1006 | } 1007 | }, 1008 | "node_modules/readable-stream/node_modules/safe-buffer": { 1009 | "version": "5.1.2", 1010 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", 1011 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1012 | }, 1013 | "node_modules/readdirp": { 1014 | "version": "3.6.0", 1015 | "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", 1016 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1017 | "dev": true, 1018 | "dependencies": { 1019 | "picomatch": "^2.2.1" 1020 | }, 1021 | "engines": { 1022 | "node": ">=8.10.0" 1023 | } 1024 | }, 1025 | "node_modules/safe-buffer": { 1026 | "version": "5.2.1", 1027 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", 1028 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1029 | }, 1030 | "node_modules/safer-buffer": { 1031 | "version": "2.1.2", 1032 | "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", 1033 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1034 | }, 1035 | "node_modules/semver": { 1036 | "version": "5.7.1", 1037 | "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz", 1038 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1039 | "bin": { 1040 | "semver": "bin/semver" 1041 | } 1042 | }, 1043 | "node_modules/send": { 1044 | "version": "0.18.0", 1045 | "resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz", 1046 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1047 | "dependencies": { 1048 | "debug": "2.6.9", 1049 | "depd": "2.0.0", 1050 | "destroy": "1.2.0", 1051 | "encodeurl": "~1.0.2", 1052 | "escape-html": "~1.0.3", 1053 | "etag": "~1.8.1", 1054 | "fresh": "0.5.2", 1055 | "http-errors": "2.0.0", 1056 | "mime": "1.6.0", 1057 | "ms": "2.1.3", 1058 | "on-finished": "2.4.1", 1059 | "range-parser": "~1.2.1", 1060 | "statuses": "2.0.1" 1061 | }, 1062 | "engines": { 1063 | "node": ">= 0.8.0" 1064 | } 1065 | }, 1066 | "node_modules/send/node_modules/ms": { 1067 | "version": "2.1.3", 1068 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", 1069 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1070 | }, 1071 | "node_modules/serve-static": { 1072 | "version": "1.15.0", 1073 | "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz", 1074 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1075 | "dependencies": { 1076 | "encodeurl": "~1.0.2", 1077 | "escape-html": "~1.0.3", 1078 | "parseurl": "~1.3.3", 1079 | "send": "0.18.0" 1080 | }, 1081 | "engines": { 1082 | "node": ">= 0.8.0" 1083 | } 1084 | }, 1085 | "node_modules/setprototypeof": { 1086 | "version": "1.2.0", 1087 | "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", 1088 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1089 | }, 1090 | "node_modules/side-channel": { 1091 | "version": "1.0.4", 1092 | "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", 1093 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1094 | "dependencies": { 1095 | "call-bind": "^1.0.0", 1096 | "get-intrinsic": "^1.0.2", 1097 | "object-inspect": "^1.9.0" 1098 | } 1099 | }, 1100 | "node_modules/simple-update-notifier": { 1101 | "version": "1.0.7", 1102 | "resolved": "https://registry.npmmirror.com/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", 1103 | "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", 1104 | "dev": true, 1105 | "dependencies": { 1106 | "semver": "~7.0.0" 1107 | }, 1108 | "engines": { 1109 | "node": ">=8.10.0" 1110 | } 1111 | }, 1112 | "node_modules/simple-update-notifier/node_modules/semver": { 1113 | "version": "7.0.0", 1114 | "resolved": "https://registry.npmmirror.com/semver/-/semver-7.0.0.tgz", 1115 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 1116 | "dev": true, 1117 | "bin": { 1118 | "semver": "bin/semver.js" 1119 | } 1120 | }, 1121 | "node_modules/sqlstring": { 1122 | "version": "2.3.1", 1123 | "resolved": "https://registry.npmmirror.com/sqlstring/-/sqlstring-2.3.1.tgz", 1124 | "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", 1125 | "engines": { 1126 | "node": ">= 0.6" 1127 | } 1128 | }, 1129 | "node_modules/statuses": { 1130 | "version": "2.0.1", 1131 | "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", 1132 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1133 | "engines": { 1134 | "node": ">= 0.8" 1135 | } 1136 | }, 1137 | "node_modules/string_decoder": { 1138 | "version": "1.1.1", 1139 | "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", 1140 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1141 | "dependencies": { 1142 | "safe-buffer": "~5.1.0" 1143 | } 1144 | }, 1145 | "node_modules/string_decoder/node_modules/safe-buffer": { 1146 | "version": "5.1.2", 1147 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", 1148 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1149 | }, 1150 | "node_modules/supports-color": { 1151 | "version": "5.5.0", 1152 | "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", 1153 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1154 | "dev": true, 1155 | "dependencies": { 1156 | "has-flag": "^3.0.0" 1157 | }, 1158 | "engines": { 1159 | "node": ">=4" 1160 | } 1161 | }, 1162 | "node_modules/to-regex-range": { 1163 | "version": "5.0.1", 1164 | "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", 1165 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1166 | "dev": true, 1167 | "dependencies": { 1168 | "is-number": "^7.0.0" 1169 | }, 1170 | "engines": { 1171 | "node": ">=8.0" 1172 | } 1173 | }, 1174 | "node_modules/toidentifier": { 1175 | "version": "1.0.1", 1176 | "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", 1177 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1178 | "engines": { 1179 | "node": ">=0.6" 1180 | } 1181 | }, 1182 | "node_modules/touch": { 1183 | "version": "3.1.0", 1184 | "resolved": "https://registry.npmmirror.com/touch/-/touch-3.1.0.tgz", 1185 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1186 | "dev": true, 1187 | "dependencies": { 1188 | "nopt": "~1.0.10" 1189 | }, 1190 | "bin": { 1191 | "nodetouch": "bin/nodetouch.js" 1192 | } 1193 | }, 1194 | "node_modules/type-is": { 1195 | "version": "1.6.18", 1196 | "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", 1197 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1198 | "dependencies": { 1199 | "media-typer": "0.3.0", 1200 | "mime-types": "~2.1.24" 1201 | }, 1202 | "engines": { 1203 | "node": ">= 0.6" 1204 | } 1205 | }, 1206 | "node_modules/undefsafe": { 1207 | "version": "2.0.5", 1208 | "resolved": "https://registry.npmmirror.com/undefsafe/-/undefsafe-2.0.5.tgz", 1209 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 1210 | "dev": true 1211 | }, 1212 | "node_modules/unpipe": { 1213 | "version": "1.0.0", 1214 | "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", 1215 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1216 | "engines": { 1217 | "node": ">= 0.8" 1218 | } 1219 | }, 1220 | "node_modules/util-deprecate": { 1221 | "version": "1.0.2", 1222 | "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", 1223 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1224 | }, 1225 | "node_modules/utils-merge": { 1226 | "version": "1.0.1", 1227 | "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", 1228 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1229 | "engines": { 1230 | "node": ">= 0.4.0" 1231 | } 1232 | }, 1233 | "node_modules/vary": { 1234 | "version": "1.1.2", 1235 | "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", 1236 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1237 | "engines": { 1238 | "node": ">= 0.8" 1239 | } 1240 | } 1241 | }, 1242 | "dependencies": { 1243 | "@types/jsonwebtoken": { 1244 | "version": "8.5.9", 1245 | "resolved": "https://registry.npmmirror.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", 1246 | "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", 1247 | "requires": { 1248 | "@types/node": "*" 1249 | } 1250 | }, 1251 | "@types/node": { 1252 | "version": "18.11.9", 1253 | "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.11.9.tgz", 1254 | "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" 1255 | }, 1256 | "abbrev": { 1257 | "version": "1.1.1", 1258 | "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz", 1259 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 1260 | "dev": true 1261 | }, 1262 | "accepts": { 1263 | "version": "1.3.8", 1264 | "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", 1265 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 1266 | "requires": { 1267 | "mime-types": "~2.1.34", 1268 | "negotiator": "0.6.3" 1269 | } 1270 | }, 1271 | "anymatch": { 1272 | "version": "3.1.2", 1273 | "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz", 1274 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 1275 | "dev": true, 1276 | "requires": { 1277 | "normalize-path": "^3.0.0", 1278 | "picomatch": "^2.0.4" 1279 | } 1280 | }, 1281 | "array-flatten": { 1282 | "version": "1.1.1", 1283 | "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", 1284 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 1285 | }, 1286 | "balanced-match": { 1287 | "version": "1.0.2", 1288 | "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", 1289 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1290 | "dev": true 1291 | }, 1292 | "basic-auth": { 1293 | "version": "2.0.1", 1294 | "resolved": "https://registry.npmmirror.com/basic-auth/-/basic-auth-2.0.1.tgz", 1295 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 1296 | "requires": { 1297 | "safe-buffer": "5.1.2" 1298 | }, 1299 | "dependencies": { 1300 | "safe-buffer": { 1301 | "version": "5.1.2", 1302 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", 1303 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1304 | } 1305 | } 1306 | }, 1307 | "bignumber.js": { 1308 | "version": "9.0.0", 1309 | "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.0.0.tgz", 1310 | "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" 1311 | }, 1312 | "binary-extensions": { 1313 | "version": "2.2.0", 1314 | "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", 1315 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1316 | "dev": true 1317 | }, 1318 | "body-parser": { 1319 | "version": "1.20.1", 1320 | "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz", 1321 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 1322 | "requires": { 1323 | "bytes": "3.1.2", 1324 | "content-type": "~1.0.4", 1325 | "debug": "2.6.9", 1326 | "depd": "2.0.0", 1327 | "destroy": "1.2.0", 1328 | "http-errors": "2.0.0", 1329 | "iconv-lite": "0.4.24", 1330 | "on-finished": "2.4.1", 1331 | "qs": "6.11.0", 1332 | "raw-body": "2.5.1", 1333 | "type-is": "~1.6.18", 1334 | "unpipe": "1.0.0" 1335 | } 1336 | }, 1337 | "brace-expansion": { 1338 | "version": "1.1.11", 1339 | "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", 1340 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1341 | "dev": true, 1342 | "requires": { 1343 | "balanced-match": "^1.0.0", 1344 | "concat-map": "0.0.1" 1345 | } 1346 | }, 1347 | "braces": { 1348 | "version": "3.0.2", 1349 | "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", 1350 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1351 | "dev": true, 1352 | "requires": { 1353 | "fill-range": "^7.0.1" 1354 | } 1355 | }, 1356 | "buffer-equal-constant-time": { 1357 | "version": "1.0.1", 1358 | "resolved": "https://registry.npmmirror.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 1359 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" 1360 | }, 1361 | "bytes": { 1362 | "version": "3.1.2", 1363 | "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", 1364 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 1365 | }, 1366 | "call-bind": { 1367 | "version": "1.0.2", 1368 | "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", 1369 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1370 | "requires": { 1371 | "function-bind": "^1.1.1", 1372 | "get-intrinsic": "^1.0.2" 1373 | } 1374 | }, 1375 | "chokidar": { 1376 | "version": "3.5.3", 1377 | "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", 1378 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1379 | "dev": true, 1380 | "requires": { 1381 | "anymatch": "~3.1.2", 1382 | "braces": "~3.0.2", 1383 | "fsevents": "~2.3.2", 1384 | "glob-parent": "~5.1.2", 1385 | "is-binary-path": "~2.1.0", 1386 | "is-glob": "~4.0.1", 1387 | "normalize-path": "~3.0.0", 1388 | "readdirp": "~3.6.0" 1389 | } 1390 | }, 1391 | "compressible": { 1392 | "version": "2.0.18", 1393 | "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz", 1394 | "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", 1395 | "requires": { 1396 | "mime-db": ">= 1.43.0 < 2" 1397 | } 1398 | }, 1399 | "compression": { 1400 | "version": "1.7.4", 1401 | "resolved": "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz", 1402 | "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", 1403 | "requires": { 1404 | "accepts": "~1.3.5", 1405 | "bytes": "3.0.0", 1406 | "compressible": "~2.0.16", 1407 | "debug": "2.6.9", 1408 | "on-headers": "~1.0.2", 1409 | "safe-buffer": "5.1.2", 1410 | "vary": "~1.1.2" 1411 | }, 1412 | "dependencies": { 1413 | "bytes": { 1414 | "version": "3.0.0", 1415 | "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz", 1416 | "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" 1417 | }, 1418 | "safe-buffer": { 1419 | "version": "5.1.2", 1420 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", 1421 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1422 | } 1423 | } 1424 | }, 1425 | "concat-map": { 1426 | "version": "0.0.1", 1427 | "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", 1428 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1429 | "dev": true 1430 | }, 1431 | "content-disposition": { 1432 | "version": "0.5.4", 1433 | "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", 1434 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 1435 | "requires": { 1436 | "safe-buffer": "5.2.1" 1437 | } 1438 | }, 1439 | "content-type": { 1440 | "version": "1.0.4", 1441 | "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.4.tgz", 1442 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 1443 | }, 1444 | "cookie": { 1445 | "version": "0.5.0", 1446 | "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz", 1447 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 1448 | }, 1449 | "cookie-signature": { 1450 | "version": "1.0.6", 1451 | "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz", 1452 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 1453 | }, 1454 | "core-util-is": { 1455 | "version": "1.0.3", 1456 | "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", 1457 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 1458 | }, 1459 | "cors": { 1460 | "version": "2.8.5", 1461 | "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz", 1462 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 1463 | "requires": { 1464 | "object-assign": "^4", 1465 | "vary": "^1" 1466 | } 1467 | }, 1468 | "debug": { 1469 | "version": "2.6.9", 1470 | "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", 1471 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1472 | "requires": { 1473 | "ms": "2.0.0" 1474 | } 1475 | }, 1476 | "depd": { 1477 | "version": "2.0.0", 1478 | "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", 1479 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 1480 | }, 1481 | "destroy": { 1482 | "version": "1.2.0", 1483 | "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", 1484 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 1485 | }, 1486 | "ecdsa-sig-formatter": { 1487 | "version": "1.0.11", 1488 | "resolved": "https://registry.npmmirror.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 1489 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 1490 | "requires": { 1491 | "safe-buffer": "^5.0.1" 1492 | } 1493 | }, 1494 | "ee-first": { 1495 | "version": "1.1.1", 1496 | "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", 1497 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 1498 | }, 1499 | "encodeurl": { 1500 | "version": "1.0.2", 1501 | "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", 1502 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 1503 | }, 1504 | "escape-html": { 1505 | "version": "1.0.3", 1506 | "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", 1507 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1508 | }, 1509 | "etag": { 1510 | "version": "1.8.1", 1511 | "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", 1512 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 1513 | }, 1514 | "express": { 1515 | "version": "4.18.2", 1516 | "resolved": "https://registry.npmmirror.com/express/-/express-4.18.2.tgz", 1517 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 1518 | "requires": { 1519 | "accepts": "~1.3.8", 1520 | "array-flatten": "1.1.1", 1521 | "body-parser": "1.20.1", 1522 | "content-disposition": "0.5.4", 1523 | "content-type": "~1.0.4", 1524 | "cookie": "0.5.0", 1525 | "cookie-signature": "1.0.6", 1526 | "debug": "2.6.9", 1527 | "depd": "2.0.0", 1528 | "encodeurl": "~1.0.2", 1529 | "escape-html": "~1.0.3", 1530 | "etag": "~1.8.1", 1531 | "finalhandler": "1.2.0", 1532 | "fresh": "0.5.2", 1533 | "http-errors": "2.0.0", 1534 | "merge-descriptors": "1.0.1", 1535 | "methods": "~1.1.2", 1536 | "on-finished": "2.4.1", 1537 | "parseurl": "~1.3.3", 1538 | "path-to-regexp": "0.1.7", 1539 | "proxy-addr": "~2.0.7", 1540 | "qs": "6.11.0", 1541 | "range-parser": "~1.2.1", 1542 | "safe-buffer": "5.2.1", 1543 | "send": "0.18.0", 1544 | "serve-static": "1.15.0", 1545 | "setprototypeof": "1.2.0", 1546 | "statuses": "2.0.1", 1547 | "type-is": "~1.6.18", 1548 | "utils-merge": "1.0.1", 1549 | "vary": "~1.1.2" 1550 | } 1551 | }, 1552 | "express-jwt": { 1553 | "version": "7.7.7", 1554 | "resolved": "https://registry.npmmirror.com/express-jwt/-/express-jwt-7.7.7.tgz", 1555 | "integrity": "sha512-7s04HZ7sAahx7lwKU5AInhVon1kWVitRFxd7cGUKQaLDOQJsAQjB/OEBXaN0GS22RBgX75TjOJXGY7myQmVz5A==", 1556 | "requires": { 1557 | "@types/jsonwebtoken": "^8.5.8", 1558 | "express-unless": "^2.1.3", 1559 | "jsonwebtoken": "^8.5.1" 1560 | } 1561 | }, 1562 | "express-unless": { 1563 | "version": "2.1.3", 1564 | "resolved": "https://registry.npmmirror.com/express-unless/-/express-unless-2.1.3.tgz", 1565 | "integrity": "sha512-wj4tLMyCVYuIIKHGt0FhCtIViBcwzWejX0EjNxveAa6dG+0XBCQhMbx+PnkLkFCxLC69qoFrxds4pIyL88inaQ==" 1566 | }, 1567 | "fill-range": { 1568 | "version": "7.0.1", 1569 | "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", 1570 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1571 | "dev": true, 1572 | "requires": { 1573 | "to-regex-range": "^5.0.1" 1574 | } 1575 | }, 1576 | "finalhandler": { 1577 | "version": "1.2.0", 1578 | "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz", 1579 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 1580 | "requires": { 1581 | "debug": "2.6.9", 1582 | "encodeurl": "~1.0.2", 1583 | "escape-html": "~1.0.3", 1584 | "on-finished": "2.4.1", 1585 | "parseurl": "~1.3.3", 1586 | "statuses": "2.0.1", 1587 | "unpipe": "~1.0.0" 1588 | } 1589 | }, 1590 | "forwarded": { 1591 | "version": "0.2.0", 1592 | "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", 1593 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 1594 | }, 1595 | "fresh": { 1596 | "version": "0.5.2", 1597 | "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", 1598 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 1599 | }, 1600 | "fsevents": { 1601 | "version": "2.3.2", 1602 | "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", 1603 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1604 | "dev": true, 1605 | "optional": true 1606 | }, 1607 | "function-bind": { 1608 | "version": "1.1.1", 1609 | "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", 1610 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1611 | }, 1612 | "get-intrinsic": { 1613 | "version": "1.1.3", 1614 | "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 1615 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 1616 | "requires": { 1617 | "function-bind": "^1.1.1", 1618 | "has": "^1.0.3", 1619 | "has-symbols": "^1.0.3" 1620 | } 1621 | }, 1622 | "glob-parent": { 1623 | "version": "5.1.2", 1624 | "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", 1625 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1626 | "dev": true, 1627 | "requires": { 1628 | "is-glob": "^4.0.1" 1629 | } 1630 | }, 1631 | "has": { 1632 | "version": "1.0.3", 1633 | "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", 1634 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1635 | "requires": { 1636 | "function-bind": "^1.1.1" 1637 | } 1638 | }, 1639 | "has-flag": { 1640 | "version": "3.0.0", 1641 | "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", 1642 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1643 | "dev": true 1644 | }, 1645 | "has-symbols": { 1646 | "version": "1.0.3", 1647 | "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", 1648 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 1649 | }, 1650 | "http-errors": { 1651 | "version": "2.0.0", 1652 | "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", 1653 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1654 | "requires": { 1655 | "depd": "2.0.0", 1656 | "inherits": "2.0.4", 1657 | "setprototypeof": "1.2.0", 1658 | "statuses": "2.0.1", 1659 | "toidentifier": "1.0.1" 1660 | } 1661 | }, 1662 | "iconv-lite": { 1663 | "version": "0.4.24", 1664 | "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", 1665 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1666 | "requires": { 1667 | "safer-buffer": ">= 2.1.2 < 3" 1668 | } 1669 | }, 1670 | "ignore-by-default": { 1671 | "version": "1.0.1", 1672 | "resolved": "https://registry.npmmirror.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 1673 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 1674 | "dev": true 1675 | }, 1676 | "inherits": { 1677 | "version": "2.0.4", 1678 | "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", 1679 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1680 | }, 1681 | "ipaddr.js": { 1682 | "version": "1.9.1", 1683 | "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1684 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1685 | }, 1686 | "is-binary-path": { 1687 | "version": "2.1.0", 1688 | "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", 1689 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1690 | "dev": true, 1691 | "requires": { 1692 | "binary-extensions": "^2.0.0" 1693 | } 1694 | }, 1695 | "is-extglob": { 1696 | "version": "2.1.1", 1697 | "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", 1698 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1699 | "dev": true 1700 | }, 1701 | "is-glob": { 1702 | "version": "4.0.3", 1703 | "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", 1704 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1705 | "dev": true, 1706 | "requires": { 1707 | "is-extglob": "^2.1.1" 1708 | } 1709 | }, 1710 | "is-number": { 1711 | "version": "7.0.0", 1712 | "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", 1713 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1714 | "dev": true 1715 | }, 1716 | "isarray": { 1717 | "version": "1.0.0", 1718 | "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", 1719 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 1720 | }, 1721 | "jsonwebtoken": { 1722 | "version": "8.5.1", 1723 | "resolved": "https://registry.npmmirror.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 1724 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 1725 | "requires": { 1726 | "jws": "^3.2.2", 1727 | "lodash.includes": "^4.3.0", 1728 | "lodash.isboolean": "^3.0.3", 1729 | "lodash.isinteger": "^4.0.4", 1730 | "lodash.isnumber": "^3.0.3", 1731 | "lodash.isplainobject": "^4.0.6", 1732 | "lodash.isstring": "^4.0.1", 1733 | "lodash.once": "^4.0.0", 1734 | "ms": "^2.1.1", 1735 | "semver": "^5.6.0" 1736 | }, 1737 | "dependencies": { 1738 | "ms": { 1739 | "version": "2.1.3", 1740 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", 1741 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1742 | } 1743 | } 1744 | }, 1745 | "jwa": { 1746 | "version": "1.4.1", 1747 | "resolved": "https://registry.npmmirror.com/jwa/-/jwa-1.4.1.tgz", 1748 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 1749 | "requires": { 1750 | "buffer-equal-constant-time": "1.0.1", 1751 | "ecdsa-sig-formatter": "1.0.11", 1752 | "safe-buffer": "^5.0.1" 1753 | } 1754 | }, 1755 | "jws": { 1756 | "version": "3.2.2", 1757 | "resolved": "https://registry.npmmirror.com/jws/-/jws-3.2.2.tgz", 1758 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 1759 | "requires": { 1760 | "jwa": "^1.4.1", 1761 | "safe-buffer": "^5.0.1" 1762 | } 1763 | }, 1764 | "lodash.includes": { 1765 | "version": "4.3.0", 1766 | "resolved": "https://registry.npmmirror.com/lodash.includes/-/lodash.includes-4.3.0.tgz", 1767 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" 1768 | }, 1769 | "lodash.isboolean": { 1770 | "version": "3.0.3", 1771 | "resolved": "https://registry.npmmirror.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 1772 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" 1773 | }, 1774 | "lodash.isinteger": { 1775 | "version": "4.0.4", 1776 | "resolved": "https://registry.npmmirror.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 1777 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" 1778 | }, 1779 | "lodash.isnumber": { 1780 | "version": "3.0.3", 1781 | "resolved": "https://registry.npmmirror.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 1782 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" 1783 | }, 1784 | "lodash.isplainobject": { 1785 | "version": "4.0.6", 1786 | "resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1787 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" 1788 | }, 1789 | "lodash.isstring": { 1790 | "version": "4.0.1", 1791 | "resolved": "https://registry.npmmirror.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1792 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" 1793 | }, 1794 | "lodash.once": { 1795 | "version": "4.1.1", 1796 | "resolved": "https://registry.npmmirror.com/lodash.once/-/lodash.once-4.1.1.tgz", 1797 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" 1798 | }, 1799 | "media-typer": { 1800 | "version": "0.3.0", 1801 | "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", 1802 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 1803 | }, 1804 | "merge-descriptors": { 1805 | "version": "1.0.1", 1806 | "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1807 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1808 | }, 1809 | "methods": { 1810 | "version": "1.1.2", 1811 | "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", 1812 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 1813 | }, 1814 | "mime": { 1815 | "version": "1.6.0", 1816 | "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", 1817 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1818 | }, 1819 | "mime-db": { 1820 | "version": "1.52.0", 1821 | "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", 1822 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1823 | }, 1824 | "mime-types": { 1825 | "version": "2.1.35", 1826 | "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", 1827 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1828 | "requires": { 1829 | "mime-db": "1.52.0" 1830 | } 1831 | }, 1832 | "minimatch": { 1833 | "version": "3.1.2", 1834 | "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", 1835 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1836 | "dev": true, 1837 | "requires": { 1838 | "brace-expansion": "^1.1.7" 1839 | } 1840 | }, 1841 | "morgan": { 1842 | "version": "1.10.0", 1843 | "resolved": "https://registry.npmmirror.com/morgan/-/morgan-1.10.0.tgz", 1844 | "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", 1845 | "requires": { 1846 | "basic-auth": "~2.0.1", 1847 | "debug": "2.6.9", 1848 | "depd": "~2.0.0", 1849 | "on-finished": "~2.3.0", 1850 | "on-headers": "~1.0.2" 1851 | }, 1852 | "dependencies": { 1853 | "on-finished": { 1854 | "version": "2.3.0", 1855 | "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz", 1856 | "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", 1857 | "requires": { 1858 | "ee-first": "1.1.1" 1859 | } 1860 | } 1861 | } 1862 | }, 1863 | "ms": { 1864 | "version": "2.0.0", 1865 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", 1866 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1867 | }, 1868 | "mysql": { 1869 | "version": "2.18.1", 1870 | "resolved": "https://registry.npmmirror.com/mysql/-/mysql-2.18.1.tgz", 1871 | "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", 1872 | "requires": { 1873 | "bignumber.js": "9.0.0", 1874 | "readable-stream": "2.3.7", 1875 | "safe-buffer": "5.1.2", 1876 | "sqlstring": "2.3.1" 1877 | }, 1878 | "dependencies": { 1879 | "safe-buffer": { 1880 | "version": "5.1.2", 1881 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", 1882 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1883 | } 1884 | } 1885 | }, 1886 | "negotiator": { 1887 | "version": "0.6.3", 1888 | "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", 1889 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1890 | }, 1891 | "nodemon": { 1892 | "version": "2.0.20", 1893 | "resolved": "https://registry.npmmirror.com/nodemon/-/nodemon-2.0.20.tgz", 1894 | "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", 1895 | "dev": true, 1896 | "requires": { 1897 | "chokidar": "^3.5.2", 1898 | "debug": "^3.2.7", 1899 | "ignore-by-default": "^1.0.1", 1900 | "minimatch": "^3.1.2", 1901 | "pstree.remy": "^1.1.8", 1902 | "semver": "^5.7.1", 1903 | "simple-update-notifier": "^1.0.7", 1904 | "supports-color": "^5.5.0", 1905 | "touch": "^3.1.0", 1906 | "undefsafe": "^2.0.5" 1907 | }, 1908 | "dependencies": { 1909 | "debug": { 1910 | "version": "3.2.7", 1911 | "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", 1912 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 1913 | "dev": true, 1914 | "requires": { 1915 | "ms": "^2.1.1" 1916 | } 1917 | }, 1918 | "ms": { 1919 | "version": "2.1.3", 1920 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", 1921 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1922 | "dev": true 1923 | } 1924 | } 1925 | }, 1926 | "nopt": { 1927 | "version": "1.0.10", 1928 | "resolved": "https://registry.npmmirror.com/nopt/-/nopt-1.0.10.tgz", 1929 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 1930 | "dev": true, 1931 | "requires": { 1932 | "abbrev": "1" 1933 | } 1934 | }, 1935 | "normalize-path": { 1936 | "version": "3.0.0", 1937 | "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", 1938 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1939 | "dev": true 1940 | }, 1941 | "object-assign": { 1942 | "version": "4.1.1", 1943 | "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", 1944 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" 1945 | }, 1946 | "object-inspect": { 1947 | "version": "1.12.2", 1948 | "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.2.tgz", 1949 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" 1950 | }, 1951 | "on-finished": { 1952 | "version": "2.4.1", 1953 | "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", 1954 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1955 | "requires": { 1956 | "ee-first": "1.1.1" 1957 | } 1958 | }, 1959 | "on-headers": { 1960 | "version": "1.0.2", 1961 | "resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz", 1962 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" 1963 | }, 1964 | "parseurl": { 1965 | "version": "1.3.3", 1966 | "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", 1967 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1968 | }, 1969 | "path-to-regexp": { 1970 | "version": "0.1.7", 1971 | "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1972 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1973 | }, 1974 | "picomatch": { 1975 | "version": "2.3.1", 1976 | "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", 1977 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1978 | "dev": true 1979 | }, 1980 | "process-nextick-args": { 1981 | "version": "2.0.1", 1982 | "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1983 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1984 | }, 1985 | "proxy-addr": { 1986 | "version": "2.0.7", 1987 | "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", 1988 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1989 | "requires": { 1990 | "forwarded": "0.2.0", 1991 | "ipaddr.js": "1.9.1" 1992 | } 1993 | }, 1994 | "pstree.remy": { 1995 | "version": "1.1.8", 1996 | "resolved": "https://registry.npmmirror.com/pstree.remy/-/pstree.remy-1.1.8.tgz", 1997 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 1998 | "dev": true 1999 | }, 2000 | "qs": { 2001 | "version": "6.11.0", 2002 | "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", 2003 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 2004 | "requires": { 2005 | "side-channel": "^1.0.4" 2006 | } 2007 | }, 2008 | "range-parser": { 2009 | "version": "1.2.1", 2010 | "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", 2011 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 2012 | }, 2013 | "raw-body": { 2014 | "version": "2.5.1", 2015 | "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz", 2016 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 2017 | "requires": { 2018 | "bytes": "3.1.2", 2019 | "http-errors": "2.0.0", 2020 | "iconv-lite": "0.4.24", 2021 | "unpipe": "1.0.0" 2022 | } 2023 | }, 2024 | "readable-stream": { 2025 | "version": "2.3.7", 2026 | "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz", 2027 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 2028 | "requires": { 2029 | "core-util-is": "~1.0.0", 2030 | "inherits": "~2.0.3", 2031 | "isarray": "~1.0.0", 2032 | "process-nextick-args": "~2.0.0", 2033 | "safe-buffer": "~5.1.1", 2034 | "string_decoder": "~1.1.1", 2035 | "util-deprecate": "~1.0.1" 2036 | }, 2037 | "dependencies": { 2038 | "safe-buffer": { 2039 | "version": "5.1.2", 2040 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", 2041 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2042 | } 2043 | } 2044 | }, 2045 | "readdirp": { 2046 | "version": "3.6.0", 2047 | "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", 2048 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2049 | "dev": true, 2050 | "requires": { 2051 | "picomatch": "^2.2.1" 2052 | } 2053 | }, 2054 | "safe-buffer": { 2055 | "version": "5.2.1", 2056 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", 2057 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2058 | }, 2059 | "safer-buffer": { 2060 | "version": "2.1.2", 2061 | "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", 2062 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2063 | }, 2064 | "semver": { 2065 | "version": "5.7.1", 2066 | "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz", 2067 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 2068 | }, 2069 | "send": { 2070 | "version": "0.18.0", 2071 | "resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz", 2072 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 2073 | "requires": { 2074 | "debug": "2.6.9", 2075 | "depd": "2.0.0", 2076 | "destroy": "1.2.0", 2077 | "encodeurl": "~1.0.2", 2078 | "escape-html": "~1.0.3", 2079 | "etag": "~1.8.1", 2080 | "fresh": "0.5.2", 2081 | "http-errors": "2.0.0", 2082 | "mime": "1.6.0", 2083 | "ms": "2.1.3", 2084 | "on-finished": "2.4.1", 2085 | "range-parser": "~1.2.1", 2086 | "statuses": "2.0.1" 2087 | }, 2088 | "dependencies": { 2089 | "ms": { 2090 | "version": "2.1.3", 2091 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", 2092 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2093 | } 2094 | } 2095 | }, 2096 | "serve-static": { 2097 | "version": "1.15.0", 2098 | "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz", 2099 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 2100 | "requires": { 2101 | "encodeurl": "~1.0.2", 2102 | "escape-html": "~1.0.3", 2103 | "parseurl": "~1.3.3", 2104 | "send": "0.18.0" 2105 | } 2106 | }, 2107 | "setprototypeof": { 2108 | "version": "1.2.0", 2109 | "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", 2110 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 2111 | }, 2112 | "side-channel": { 2113 | "version": "1.0.4", 2114 | "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", 2115 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2116 | "requires": { 2117 | "call-bind": "^1.0.0", 2118 | "get-intrinsic": "^1.0.2", 2119 | "object-inspect": "^1.9.0" 2120 | } 2121 | }, 2122 | "simple-update-notifier": { 2123 | "version": "1.0.7", 2124 | "resolved": "https://registry.npmmirror.com/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", 2125 | "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", 2126 | "dev": true, 2127 | "requires": { 2128 | "semver": "~7.0.0" 2129 | }, 2130 | "dependencies": { 2131 | "semver": { 2132 | "version": "7.0.0", 2133 | "resolved": "https://registry.npmmirror.com/semver/-/semver-7.0.0.tgz", 2134 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 2135 | "dev": true 2136 | } 2137 | } 2138 | }, 2139 | "sqlstring": { 2140 | "version": "2.3.1", 2141 | "resolved": "https://registry.npmmirror.com/sqlstring/-/sqlstring-2.3.1.tgz", 2142 | "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==" 2143 | }, 2144 | "statuses": { 2145 | "version": "2.0.1", 2146 | "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", 2147 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 2148 | }, 2149 | "string_decoder": { 2150 | "version": "1.1.1", 2151 | "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", 2152 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2153 | "requires": { 2154 | "safe-buffer": "~5.1.0" 2155 | }, 2156 | "dependencies": { 2157 | "safe-buffer": { 2158 | "version": "5.1.2", 2159 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", 2160 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2161 | } 2162 | } 2163 | }, 2164 | "supports-color": { 2165 | "version": "5.5.0", 2166 | "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", 2167 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2168 | "dev": true, 2169 | "requires": { 2170 | "has-flag": "^3.0.0" 2171 | } 2172 | }, 2173 | "to-regex-range": { 2174 | "version": "5.0.1", 2175 | "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", 2176 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2177 | "dev": true, 2178 | "requires": { 2179 | "is-number": "^7.0.0" 2180 | } 2181 | }, 2182 | "toidentifier": { 2183 | "version": "1.0.1", 2184 | "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", 2185 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 2186 | }, 2187 | "touch": { 2188 | "version": "3.1.0", 2189 | "resolved": "https://registry.npmmirror.com/touch/-/touch-3.1.0.tgz", 2190 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 2191 | "dev": true, 2192 | "requires": { 2193 | "nopt": "~1.0.10" 2194 | } 2195 | }, 2196 | "type-is": { 2197 | "version": "1.6.18", 2198 | "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", 2199 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2200 | "requires": { 2201 | "media-typer": "0.3.0", 2202 | "mime-types": "~2.1.24" 2203 | } 2204 | }, 2205 | "undefsafe": { 2206 | "version": "2.0.5", 2207 | "resolved": "https://registry.npmmirror.com/undefsafe/-/undefsafe-2.0.5.tgz", 2208 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 2209 | "dev": true 2210 | }, 2211 | "unpipe": { 2212 | "version": "1.0.0", 2213 | "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", 2214 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 2215 | }, 2216 | "util-deprecate": { 2217 | "version": "1.0.2", 2218 | "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", 2219 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 2220 | }, 2221 | "utils-merge": { 2222 | "version": "1.0.1", 2223 | "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", 2224 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 2225 | }, 2226 | "vary": { 2227 | "version": "1.1.2", 2228 | "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", 2229 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 2230 | } 2231 | } 2232 | } 2233 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "dev": "nodemon ./app.js" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "compression": "^1.7.4", 14 | "cors": "^2.8.5", 15 | "express": "^4.18.2", 16 | "express-jwt": "^7.7.7", 17 | "jsonwebtoken": "^8.5.1", 18 | "morgan": "^1.10.0", 19 | "mysql": "^2.18.1" 20 | }, 21 | "devDependencies": { 22 | "nodemon": "^2.0.20" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /router/client.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | 4 | 5 | const { get_client, get_client_options, modify_client, add_client, del_client } = require("../controller/client"); 6 | 7 | router.get("/getClient", get_client) 8 | router.get("/getClientOptions", get_client_options) 9 | router.post("/addClient", add_client) 10 | router.post("/modifyClient", modify_client) 11 | router.post("/delClient", del_client) 12 | 13 | module.exports = router -------------------------------------------------------------------------------- /router/dataVisual.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: Hyrm 1358188945@qq.com 3 | * @Date: 2022-12-06 19:03:24 4 | * @LastEditors: Hyrm 1358188945@qq.com 5 | * @LastEditTime: 2022-12-30 17:18:46 6 | * @FilePath: \wms-server\router\dataVisual.js 7 | * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE 8 | */ 9 | const express = require("express"); 10 | const router = express.Router(); 11 | 12 | const { get_common_info, get_yearFiniishOrder, get_storeInfo, get_salesInfo,_get_yearFinishOrder } = require("../controller/dataVisual") 13 | 14 | 15 | router.get("/getCommonInfo", get_common_info) 16 | 17 | router.get("/getYearFinishOrder", _get_yearFinishOrder) 18 | router.get("/getStoreInfo", get_storeInfo) 19 | router.get("/getSalesInfo", get_salesInfo) 20 | module.exports = router -------------------------------------------------------------------------------- /router/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: Hyrm 1358188945@qq.com 3 | * @Date: 2022-11-02 15:40:50 4 | * @LastEditors: Hyrm 1358188945@qq.com 5 | * @LastEditTime: 2023-01-01 14:30:07 6 | * @FilePath: \wms-server\router\index.js 7 | * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE 8 | */ 9 | const express = require("express"); 10 | const router = express.Router(); 11 | router.use("/user", require("./user")); 12 | router.use("/store", require("./store")); 13 | router.use("/client", require("./client")); 14 | router.use("/dataVisual", require("./dataVisual")); 15 | module.exports = router; -------------------------------------------------------------------------------- /router/store.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | 4 | const { get_stock, get_stockRecording, get_storeOptions, get_transportStatusOptions, in_store, out_store, add_store, modify_out_store_status, edit_store, del_store } = require("../controller/store") 5 | 6 | 7 | 8 | router.get("/getStock", get_stock) 9 | router.get("/getStockRecording", get_stockRecording) 10 | router.get("/getStoreOptions", get_storeOptions) 11 | router.get("/getTransportStatusOptions", get_transportStatusOptions) 12 | router.post("/inStore", in_store) 13 | router.post('/outStore', out_store) 14 | router.post('/addStore', add_store) 15 | router.post('/modifyOutStoreStatus', modify_out_store_status) 16 | router.post('/editStore', edit_store) 17 | router.post('/delStore', del_store) 18 | 19 | module.exports = router -------------------------------------------------------------------------------- /router/user.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const { login, register, get_userInfo } = require("../controller/user") 4 | 5 | 6 | 7 | 8 | router.post("/login", login) 9 | router.post("/register", register) 10 | router.get("/getUserInfo", get_userInfo) 11 | 12 | module.exports = router -------------------------------------------------------------------------------- /utils/index.js: -------------------------------------------------------------------------------- 1 | exports.formatDate = (date, fmt = "yyyy-MM-dd hh:mm:ss") => { 2 | 3 | var o = { 4 | 'M+': date.getMonth() + 1, //月份 5 | 'd+': date.getDate(), // 日 6 | 'h+': date.getHours(), //时 7 | 'm+': date.getMinutes(), // 分 8 | 's+': date.getSeconds(), // 秒 9 | 'q+': Math.floor((date.getMonth() + 3) / 3), // 季度 10 | 'S': date.getMilliseconds(), //毫秒 11 | } 12 | 13 | if (!date || date == null) return null; 14 | 15 | if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) 16 | for (var k in o) { 17 | if (new RegExp('(' + k + ')').test(fmt)) { 18 | fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))); 19 | } 20 | } 21 | return fmt; 22 | } -------------------------------------------------------------------------------- /wms_nodata.sql: -------------------------------------------------------------------------------- 1 | SET NAMES utf8mb4; 2 | SET FOREIGN_KEY_CHECKS = 0; 3 | 4 | -- ---------------------------- 5 | -- Table structure for client 6 | -- ---------------------------- 7 | DROP TABLE IF EXISTS `client`; 8 | CREATE TABLE `client` ( 9 | `id` int(11) NOT NULL AUTO_INCREMENT, 10 | `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, 11 | `tel` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, 12 | `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, 13 | PRIMARY KEY (`id`) USING BTREE 14 | ) ENGINE = InnoDB AUTO_INCREMENT = 1009 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; 15 | 16 | -- ---------------------------- 17 | -- Table structure for in_order 18 | -- ---------------------------- 19 | DROP TABLE IF EXISTS `in_order`; 20 | CREATE TABLE `in_order` ( 21 | `id` int(11) NOT NULL AUTO_INCREMENT, 22 | `stock_id` int(11) NULL DEFAULT NULL, 23 | `price` decimal(10, 2) NULL DEFAULT NULL, 24 | `amount` int(11) NULL DEFAULT NULL, 25 | `updata_date` datetime NULL DEFAULT NULL, 26 | `user_id` int(11) NULL DEFAULT NULL, 27 | PRIMARY KEY (`id`) USING BTREE 28 | ) ENGINE = InnoDB AUTO_INCREMENT = 1051 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC; 29 | 30 | -- ---------------------------- 31 | -- Table structure for order_status 32 | -- ---------------------------- 33 | DROP TABLE IF EXISTS `order_status`; 34 | CREATE TABLE `order_status` ( 35 | `id` int(11) NOT NULL AUTO_INCREMENT, 36 | `status_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, 37 | PRIMARY KEY (`id`) USING BTREE 38 | ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC; 39 | 40 | -- ---------------------------- 41 | -- Table structure for out_order 42 | -- ---------------------------- 43 | DROP TABLE IF EXISTS `out_order`; 44 | CREATE TABLE `out_order` ( 45 | `id` int(11) NOT NULL AUTO_INCREMENT, 46 | `user_id` int(11) NOT NULL, 47 | `stock_id` int(11) NULL DEFAULT NULL, 48 | `price` decimal(10, 2) NULL DEFAULT NULL, 49 | `amount` int(11) NULL DEFAULT NULL, 50 | `another_fee` decimal(10, 2) NULL DEFAULT NULL, 51 | `client_id` int(11) NULL DEFAULT NULL, 52 | `transport_status` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, 53 | `transport_order` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, 54 | `updata_date` datetime NULL DEFAULT NULL, 55 | `finish_date` datetime NULL DEFAULT NULL, 56 | PRIMARY KEY (`id`) USING BTREE 57 | ) ENGINE = InnoDB AUTO_INCREMENT = 2002 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC; 58 | 59 | -- ---------------------------- 60 | -- Table structure for revoked_tokens 61 | -- ---------------------------- 62 | DROP TABLE IF EXISTS `revoked_tokens`; 63 | CREATE TABLE `revoked_tokens` ( 64 | `id` int(11) NOT NULL AUTO_INCREMENT, 65 | `signature` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, 66 | `user_id` int(11) NOT NULL, 67 | PRIMARY KEY (`id`, `user_id`) USING BTREE 68 | ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC; 69 | 70 | -- ---------------------------- 71 | -- Table structure for roles 72 | -- ---------------------------- 73 | DROP TABLE IF EXISTS `roles`; 74 | CREATE TABLE `roles` ( 75 | `id` int(11) NOT NULL AUTO_INCREMENT, 76 | `role_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, 77 | PRIMARY KEY (`id`) USING BTREE 78 | ) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC; 79 | 80 | -- ---------------------------- 81 | -- Table structure for stocks 82 | -- ---------------------------- 83 | DROP TABLE IF EXISTS `stocks`; 84 | CREATE TABLE `stocks` ( 85 | `id` int(11) NOT NULL AUTO_INCREMENT, 86 | `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, 87 | `type` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, 88 | `stock` int(11) NULL DEFAULT NULL, 89 | `last_updata` datetime NULL DEFAULT NULL, 90 | PRIMARY KEY (`id`) USING BTREE 91 | ) ENGINE = InnoDB AUTO_INCREMENT = 138 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC; 92 | 93 | -- ---------------------------- 94 | -- Table structure for users 95 | -- ---------------------------- 96 | DROP TABLE IF EXISTS `users`; 97 | CREATE TABLE `users` ( 98 | `id` int(11) NOT NULL AUTO_INCREMENT, 99 | `account` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', 100 | `passward` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '12345678', 101 | `role_id` smallint(6) NOT NULL, 102 | `latest_login` datetime NULL DEFAULT NULL, 103 | `nick` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, 104 | PRIMARY KEY (`id`) USING BTREE 105 | ) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC; 106 | 107 | SET FOREIGN_KEY_CHECKS = 1; 108 | --------------------------------------------------------------------------------