palapalapla/GT-Manual
0
1import fs from 'node:fs'2import path from 'node:path'3import YAML from 'yaml'4import multer from 'multer'5import rateLimit from 'express-rate-limit'6 7export default class plugin {8 /**9 * @param name 插件名称10 * @param dsc 插件描述11 * @param priority 插件优先级12 * @param rule.method 请求方法13 * @param rule.path 请求路径14 * @param rule.use 请求处理15 * @param rule.fnc 请求处理16 */17 constructor (data = {}) {18 /** 插件名称 */19 this.name = data.name || ''20 /** 插件描述 */21 this.dsc = data.dsc || ''22 /** 插件优先级 */23 this.priority = data.priority || 524 /** 插件优先级 */25 this.route = data.route || ''26 /** 定时任务,可以是数组 */27 this.task = {28 /** 任务名 */29 name: '',30 /** 任务方法名 */31 fnc: data.task?.fnc || '',32 /** 任务cron表达式 */33 cron: data.task?.cron || ''34 }35 /** 命令规则 */36 this.rule = data.rule || []37 }38 39 /** 读json */40 readJson (filePath, format = 'json') {41 try {42 if (format == 'yaml') {43 return YAML.parse(fs.readFileSync(filePath, 'utf8'))44 }45 return JSON.parse(fs.readFileSync(filePath, 'utf8'))46 } catch (err) {47 return false48 }49 }50 51 /** 写json */52 writeJson (savePath, data, format = 'json') {53 this.mkdir(path.dirname(savePath))54 if (format == 'yaml') return fs.writeFileSync(savePath, YAML.stringify(data))55 return fs.writeFileSync(savePath, JSON.stringify(data, null, 2))56 }57 58 /** 创建文件夹 */59 mkdir (dirname) {60 if (fs.existsSync(dirname)) {61 return true62 } else {63 if (this.mkdir(path.dirname(dirname))) {64 fs.mkdirSync(dirname)65 return true66 }67 }68 }69 70 /** 休眠函数 */71 sleep (ms) {72 return new Promise((resolve) => setTimeout(resolve, ms))73 }74 75 /** 速率限制 */76 limiter (limit = 15, cd = 60, options = {}) {77 options = {78 limit: limit,79 windowMs: cd * 1000,80 legacyHeaders: false,81 message: { status: 1, message: 'Frequent requests, please try again later' },82 ...options83 }84 return rateLimit(options)85 }86 87 /** 文件上传, single, array, any */88 upload (savaPath = './public/upload', filename, options = {}) {89 options = {90 storage: multer.diskStorage({91 destination: (req, file, cb) => {92 cb(null, savaPath)93 },94 filename: filename || ((req, file, cb) => {95 cb(null, Date.now() + path.extname(file.originalname))96 })97 }),98 limits: { fileSize: 5 * 1024 * 1024, files: 1 },99 ...options100 }101 return multer(options)102 }103}104 