From bbe1f8628a9b779c7f5222ffc972cd91cab2b5a1 Mon Sep 17 00:00:00 2001 From: npmrun Date: Sat, 17 Dec 2022 12:08:24 +0800 Subject: [PATCH] add --- package.json | 5 +++ packages/hapi-router/dist/hapi-router.cjs.js | 6 ++- packages/hapi-router/dist/hapi-router.cjs.js.map | 2 +- packages/hapi-router/dist/index.d.ts | 4 +- packages/hapi-router/src/index.ts | 7 ++- packages/hapi-router/src/util/decorators.ts | 3 +- patches/hapi-sequelizejs@4.5.0.patch | 14 ++++++ readme.md | 10 ++++- route.txt | 13 +----- source/auth/index.ts | 3 -- source/db/data.db | Bin 81920 -> 94208 bytes source/models/User.ts | 52 ++++++++++++++++++++--- source/plugins/index.ts | 8 ++-- source/route/views/index.ts | 8 +--- source/route/views/user.ts | 9 ++-- source/run.ts | 6 +-- template/views/index.pug | 5 +++ template/views/user.pug | 2 + types/global.d.ts | 7 ++- 19 files changed, 118 insertions(+), 46 deletions(-) create mode 100644 patches/hapi-sequelizejs@4.5.0.patch diff --git a/package.json b/package.json index dd65655..a3a8a95 100644 --- a/package.json +++ b/package.json @@ -64,5 +64,10 @@ "tsc-alias": "^1.7.0", "tsconfig-paths": "^3.9.0", "typescript": "^4.3.2" + }, + "pnpm": { + "patchedDependencies": { + "hapi-sequelizejs@4.5.0": "patches/hapi-sequelizejs@4.5.0.patch" + } } } diff --git a/packages/hapi-router/dist/hapi-router.cjs.js b/packages/hapi-router/dist/hapi-router.cjs.js index c355ca4..cf7a78c 100644 --- a/packages/hapi-router/dist/hapi-router.cjs.js +++ b/packages/hapi-router/dist/hapi-router.cjs.js @@ -327,6 +327,8 @@ var routePlugin = (function () { } } if (validateObj && !!Object.keys(validateObj).length) { + var failReason_1 = validateObj.failReason; + delete validateObj.failReason; if (validateObj.failAction === "log") { if (!options.log) options.log = {}; @@ -345,7 +347,7 @@ var routePlugin = (function () { request = argus[0]; h = argus[1]; if (request.logs && !!request.logs.length && errto_1) { - request.yar.flash('error', request.logs.map(function (v) { return v.error.message; })); + request.yar.flash('error', failReason_1); return [2, h.redirect(errto_1)]; } return [4, ff_1.call.apply(ff_1, __spread([this], argus))]; @@ -381,7 +383,7 @@ var routePlugin = (function () { h = argus[1]; if (request.$joi_error) { loggerSite.debug('传输参数错误: ', request.$joi_error); - request.yar.flash('error', request.$joi_error); + request.yar.flash('error', failReason_1); delete request.$joi_error; return [2, h.redirect(errto_2)]; } diff --git a/packages/hapi-router/dist/hapi-router.cjs.js.map b/packages/hapi-router/dist/hapi-router.cjs.js.map index 7b44d0b..1f93bdf 100644 --- a/packages/hapi-router/dist/hapi-router.cjs.js.map +++ b/packages/hapi-router/dist/hapi-router.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"hapi-router.cjs.js","sources":["../src/util/index.ts","../src/util/decorators.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\r\n\r\nconst path = require(\"path\")\r\nconst fs = require(\"fs\")\r\n\r\nexport function removeIndex(ss:any) {\r\n const remove = (str:any) => {\r\n if (str.endsWith(\"/index\")) {\r\n return str.slice(0, -6);\r\n }\r\n if (str.endsWith(\"index\")) {\r\n return str.slice(0, -5);\r\n }\r\n return str ? str : \"/\";\r\n };\r\n let r = true;\r\n let rr = ss;\r\n while (r) {\r\n if (rr.endsWith(\"/index\")) {\r\n rr = remove(rr);\r\n } else {\r\n r = false;\r\n }\r\n }\r\n return rr ? rr : \"/\";\r\n}\r\n\r\nexport function isIndexEnd(str:any) {\r\n return str.length == 1 && str.endsWith(\"/\");\r\n}\r\n\r\n\r\nexport function walkDir(\r\n filePath:any,\r\n exclude = [\"node_modules\", \"^_\", \".git\", \".idea\", \".gitignore\", \"client\",\"\\.txt$\",\"\\.test\\.js$\",\"\\.test\\.ts$\"]\r\n) {\r\n let files:any[] = [];\r\n function Data(opts:any) {\r\n this.relativeDir = opts.relativeDir;\r\n this.relativeFile = opts.relativeFile;\r\n this.filename = opts.filename;\r\n this.file = opts.file;\r\n this.absoluteFile = opts.absoluteFile;\r\n this.relativeFileNoExt = opts.relativeFileNoExt;\r\n this.absoluteDir = opts.absoluteDir;\r\n }\r\n function readDir(filePath, dirname = \".\") {\r\n let res = fs.readdirSync(filePath);\r\n res.forEach((filename) => {\r\n const filepath = path.resolve(filePath, filename);\r\n const stat = fs.statSync(filepath);\r\n const name = filepath.split(path.sep).slice(-1)[0];\r\n if (typeof exclude === \"string\" && new RegExp(exclude).test(name)) {\r\n return;\r\n }\r\n if (Array.isArray(exclude)) {\r\n for (let i = 0; i < exclude.length; i++) {\r\n const excludeItem = exclude[i];\r\n if (new RegExp(excludeItem).test(name)) {\r\n return;\r\n }\r\n }\r\n }\r\n if (!stat.isFile()) {\r\n readDir(filepath, dirname + path.sep + name);\r\n } else {\r\n const data = new Data({\r\n relativeDir: dirname,\r\n relativeFile: dirname + path.sep + path.parse(filepath).base,\r\n relativeFileNoExt: dirname + path.sep + path.parse(filepath).name,\r\n file: path.parse(filepath).base,\r\n filename: path.parse(filepath).name,\r\n absoluteFile: filepath,\r\n absoluteDir: path.parse(filepath).dir,\r\n });\r\n files.push(data);\r\n }\r\n });\r\n }\r\n readDir(filePath);\r\n return files;\r\n}\r\n","// @ts-nocheck\r\n/**\r\n * 方法\r\n * @param opts 参数\r\n*/\r\nexport function method(opts?:string|Array) {\r\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\r\n target[propertyKey].$method = opts\r\n }\r\n}\r\nexport function route(route?:string) {\r\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\r\n target[propertyKey].$route = route\r\n }\r\n}\r\n\r\nexport function config(options:Object) {\r\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\r\n target[propertyKey].$options = options\r\n }\r\n}\r\n\r\nexport function auth(isAuth:boolean | \"try\" | \"required\" | \"optional\" = true) {\r\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\r\n target[propertyKey].$auth = isAuth\r\n }\r\n}\r\n\r\nexport function validate(validate:Object) {\r\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\r\n target[propertyKey].$validate = validate\r\n }\r\n}\r\n\r\nexport function swagger(desc,notes,tags) {\r\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\r\n target[propertyKey].$swagger = [desc,notes,tags]\r\n }\r\n}\r\n","// @ts-nocheck\n\nimport { walkDir, removeIndex, isIndexEnd } from \"./util\";\nimport * as Joi from \"joi\";\nconst path = require(\"path\");\nconst fs = require(\"fs\");\n\nclass routePlugin {\n public name: string = \"routePlugin\";\n public version: string = \"0.0.1\";\n public register(server: any, opts: any) {\n const sourceDir = opts.sourceDir;\n const type = opts.type || \"jwt\";\n const auth = opts.auth || [];\n let array = [];\n for (let i = 0; i < sourceDir.length; i++) {\n const dir = sourceDir[i];\n console.log(dir);\n array.push(dir.dir + \"对应路径:\");\n array = array.concat(\n this.registerRoute(server, dir.dir, dir.prefix || \"\", auth, type)\n );\n }\n fs.writeFileSync(\n path.resolve(process.cwd(), \"route.txt\"),\n array.join(\"\\n\"),\n {\n encoding: \"utf-8\",\n }\n );\n }\n registerRoute(server, sourceDir, prefix, auth, type) {\n const files = walkDir(sourceDir);\n const routes = [];\n files.forEach((file) => {\n let filename = file.relativeFileNoExt;\n let array = filename.split(path.sep).slice(1);\n let fileNoExt = removeIndex(\"/\" + array.join(\"/\"));\n const moduleName = path.resolve(sourceDir, filename);\n const obj = require(moduleName);\n if (obj.default) {\n const func = new (obj.default || obj)();\n const prototype = Object.getPrototypeOf(func);\n const keys = Reflect.ownKeys(prototype);\n for (const key of keys) {\n if (key !== \"constructor\") {\n let ff = func[key];\n let handler:()=>void = undefined\n // 默认方法\n const method = ff.$method || \"GET\";\n // 路由收集规则\n let route = \"\";\n if (ff.$route) {\n if (isIndexEnd(fileNoExt)) {\n route = ff.$route;\n } else {\n route = fileNoExt + ff.$route;\n }\n } else {\n if (isIndexEnd(fileNoExt)) {\n route = fileNoExt + key.toString();\n } else {\n route = fileNoExt + \"/\" + key.toString();\n }\n }\n route = removeIndex(route);\n route = prefix ? route[0] + prefix + \"/\" + route.slice(1) : route;\n // 配置规则\n const options = ff.$options ? ff.$options : {};\n if (!options.auth) {\n if (ff.$auth == undefined) {\n if (\n auth &&\n auth.length &&\n auth.filter((v) => route.startsWith(v)).length\n ) {\n options.auth = type;\n } else {\n options.auth = false;\n }\n } else if (ff.$auth) {\n options.auth =\n typeof ff.$auth === \"boolean\"\n ? type\n : {\n strategy: type,\n mode: ff.$auth,\n };\n } else {\n options.auth = false;\n }\n }\n if (!options.validate) {\n let validateObj = ff.$validate || {};\n if (options.auth && type === \"jwt\") {\n if (validateObj.headers) {\n validateObj.headers = validateObj.headers.keys({\n Authorization: Joi.string(),\n });\n } else {\n validateObj.headers = Joi.object({\n headers: Joi.object({\n Authorization: Joi.string(),\n }).unknown(), // 注意加上这个\n });\n }\n }\n if (validateObj&&!!Object.keys(validateObj).length) {\n if(validateObj.failAction === \"log\"){\n if(!options.log) options.log = {}\n options.log.collect = true\n let errto = validateObj.$errto\n handler = async function (...argus){\n const request = argus[0]\n const h = argus[1]\n if(request.logs&&!!request.logs.length && errto){\n request.yar.flash('error', request.logs.map((v: any)=>v.error.message));\n return h.redirect(errto);\n }\n return await ff.call(this, ...argus)\n }\n }\n if(validateObj.failAction === \"function\"){\n let errto = validateObj.$errto\n validateObj.failAction = async function(request, h, err){\n if(err.details){\n request.$joi_error = err.details.map(v=>v.message)\n }\n return h.continue;\n }\n handler = async function (...argus){\n const request = argus[0]\n const h = argus[1]\n if(request.$joi_error){\n loggerSite.debug('传输参数错误: ', request.$joi_error)\n request.yar.flash('error', request.$joi_error);\n delete request.$joi_error\n return h.redirect(errto);\n }\n return await ff.call(this, ...argus)\n }\n }\n options.validate = validateObj;\n }\n }\n // && route.startsWith(\"/api\")\n if (ff.$swagger) {\n options.description = ff.$swagger[0];\n options.notes = ff.$swagger[1];\n options.tags = ff.$swagger[2];\n }\n let str = route;\n if (\n (typeof options.auth === \"string\" && options.auth) ||\n (typeof options.auth === \"object\" &&\n options.auth.mode === \"required\")\n ) {\n str =\n \" 需要权限 : \" + \" \" + full(method) + \" \" + str;\n } else if (\n typeof options.auth === \"object\" &&\n options.auth.mode === \"optional\"\n ) {\n str =\n \" 不需权限(提供即需验证): \" + \" \" + full(method) + \" \" + str;\n } else if (\n typeof options.auth === \"object\" &&\n options.auth.mode === \"try\"\n ) {\n str =\n \" 不需权限(提供无需验证): \" + \" \" + full(method) + \" \" + str;\n } else {\n str =\n \" 不需权限 : \" + \" \" + full(method) + \" \" + str;\n }\n routes.push(str);\n\n if(options.validate && options.validate.$errto){\n delete options.validate.$errto\n }\n if(!handler){\n handler = ff\n }\n server.route({\n method: method,\n path: route,\n handler: handler,\n options: options,\n });\n }\n }\n }\n });\n return routes;\n }\n}\n\nfunction full(str: string, length = 10) {\n let len = str.length;\n let need = length - len;\n if (need <= 0) return str;\n return str + [...Array(need)].map((v, i) => \" \").join(\"\");\n}\n\nconst plugin = new routePlugin();\n\nexport { plugin };\nexport * from \"./util/decorators\";\n"],"names":["path","fs","Joi"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hapi-router.cjs.js","sources":["../src/util/index.ts","../src/util/decorators.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\r\n\r\nconst path = require(\"path\")\r\nconst fs = require(\"fs\")\r\n\r\nexport function removeIndex(ss:any) {\r\n const remove = (str:any) => {\r\n if (str.endsWith(\"/index\")) {\r\n return str.slice(0, -6);\r\n }\r\n if (str.endsWith(\"index\")) {\r\n return str.slice(0, -5);\r\n }\r\n return str ? str : \"/\";\r\n };\r\n let r = true;\r\n let rr = ss;\r\n while (r) {\r\n if (rr.endsWith(\"/index\")) {\r\n rr = remove(rr);\r\n } else {\r\n r = false;\r\n }\r\n }\r\n return rr ? rr : \"/\";\r\n}\r\n\r\nexport function isIndexEnd(str:any) {\r\n return str.length == 1 && str.endsWith(\"/\");\r\n}\r\n\r\n\r\nexport function walkDir(\r\n filePath:any,\r\n exclude = [\"node_modules\", \"^_\", \".git\", \".idea\", \".gitignore\", \"client\",\"\\.txt$\",\"\\.test\\.js$\",\"\\.test\\.ts$\"]\r\n) {\r\n let files:any[] = [];\r\n function Data(opts:any) {\r\n this.relativeDir = opts.relativeDir;\r\n this.relativeFile = opts.relativeFile;\r\n this.filename = opts.filename;\r\n this.file = opts.file;\r\n this.absoluteFile = opts.absoluteFile;\r\n this.relativeFileNoExt = opts.relativeFileNoExt;\r\n this.absoluteDir = opts.absoluteDir;\r\n }\r\n function readDir(filePath, dirname = \".\") {\r\n let res = fs.readdirSync(filePath);\r\n res.forEach((filename) => {\r\n const filepath = path.resolve(filePath, filename);\r\n const stat = fs.statSync(filepath);\r\n const name = filepath.split(path.sep).slice(-1)[0];\r\n if (typeof exclude === \"string\" && new RegExp(exclude).test(name)) {\r\n return;\r\n }\r\n if (Array.isArray(exclude)) {\r\n for (let i = 0; i < exclude.length; i++) {\r\n const excludeItem = exclude[i];\r\n if (new RegExp(excludeItem).test(name)) {\r\n return;\r\n }\r\n }\r\n }\r\n if (!stat.isFile()) {\r\n readDir(filepath, dirname + path.sep + name);\r\n } else {\r\n const data = new Data({\r\n relativeDir: dirname,\r\n relativeFile: dirname + path.sep + path.parse(filepath).base,\r\n relativeFileNoExt: dirname + path.sep + path.parse(filepath).name,\r\n file: path.parse(filepath).base,\r\n filename: path.parse(filepath).name,\r\n absoluteFile: filepath,\r\n absoluteDir: path.parse(filepath).dir,\r\n });\r\n files.push(data);\r\n }\r\n });\r\n }\r\n readDir(filePath);\r\n return files;\r\n}\r\n","// @ts-nocheck\r\n/**\r\n * 方法\r\n * @param opts 参数\r\n*/\r\ntype TMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\"\r\nexport function method(opts?:TMethod|Array) {\r\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\r\n target[propertyKey].$method = opts\r\n }\r\n}\r\nexport function route(route?:string) {\r\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\r\n target[propertyKey].$route = route\r\n }\r\n}\r\n\r\nexport function config(options:Object) {\r\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\r\n target[propertyKey].$options = options\r\n }\r\n}\r\n\r\nexport function auth(isAuth:boolean | \"try\" | \"required\" | \"optional\" = true) {\r\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\r\n target[propertyKey].$auth = isAuth\r\n }\r\n}\r\n\r\nexport function validate(validate:Object) {\r\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\r\n target[propertyKey].$validate = validate\r\n }\r\n}\r\n\r\nexport function swagger(desc,notes,tags) {\r\n return function (target, propertyKey: string, descriptor: PropertyDescriptor) {\r\n target[propertyKey].$swagger = [desc,notes,tags]\r\n }\r\n}\r\n","// @ts-nocheck\r\n\r\nimport { walkDir, removeIndex, isIndexEnd } from \"./util\";\r\nimport * as Joi from \"joi\";\r\nconst path = require(\"path\");\r\nconst fs = require(\"fs\");\r\n\r\nclass routePlugin {\r\n public name: string = \"routePlugin\";\r\n public version: string = \"0.0.1\";\r\n public register(server: any, opts: any) {\r\n const sourceDir = opts.sourceDir;\r\n const type = opts.type || \"jwt\";\r\n const auth = opts.auth || [];\r\n let array = [];\r\n for (let i = 0; i < sourceDir.length; i++) {\r\n const dir = sourceDir[i];\r\n console.log(dir);\r\n array.push(dir.dir + \"对应路径:\");\r\n array = array.concat(\r\n this.registerRoute(server, dir.dir, dir.prefix || \"\", auth, type)\r\n );\r\n }\r\n fs.writeFileSync(\r\n path.resolve(process.cwd(), \"route.txt\"),\r\n array.join(\"\\n\"),\r\n {\r\n encoding: \"utf-8\",\r\n }\r\n );\r\n }\r\n registerRoute(server, sourceDir, prefix, auth, type) {\r\n const files = walkDir(sourceDir);\r\n const routes = [];\r\n files.forEach((file) => {\r\n let filename = file.relativeFileNoExt;\r\n let array = filename.split(path.sep).slice(1);\r\n let fileNoExt = removeIndex(\"/\" + array.join(\"/\"));\r\n const moduleName = path.resolve(sourceDir, filename);\r\n const obj = require(moduleName);\r\n if (obj.default) {\r\n const func = new (obj.default || obj)();\r\n const prototype = Object.getPrototypeOf(func);\r\n const keys = Reflect.ownKeys(prototype);\r\n for (const key of keys) {\r\n if (key !== \"constructor\") {\r\n let ff = func[key];\r\n let handler:()=>void = undefined\r\n // 默认方法\r\n const method = ff.$method || \"GET\";\r\n // 路由收集规则\r\n let route = \"\";\r\n if (ff.$route) {\r\n if (isIndexEnd(fileNoExt)) {\r\n route = ff.$route;\r\n } else {\r\n route = fileNoExt + ff.$route;\r\n }\r\n } else {\r\n if (isIndexEnd(fileNoExt)) {\r\n route = fileNoExt + key.toString();\r\n } else {\r\n route = fileNoExt + \"/\" + key.toString();\r\n }\r\n }\r\n route = removeIndex(route);\r\n route = prefix ? route[0] + prefix + \"/\" + route.slice(1) : route;\r\n // 配置规则\r\n const options = ff.$options ? ff.$options : {};\r\n if (!options.auth) {\r\n if (ff.$auth == undefined) {\r\n if (\r\n auth &&\r\n auth.length &&\r\n auth.filter((v) => route.startsWith(v)).length\r\n ) {\r\n options.auth = type;\r\n } else {\r\n options.auth = false;\r\n }\r\n } else if (ff.$auth) {\r\n options.auth =\r\n typeof ff.$auth === \"boolean\"\r\n ? type\r\n : {\r\n strategy: type,\r\n mode: ff.$auth,\r\n };\r\n } else {\r\n options.auth = false;\r\n }\r\n }\r\n if (!options.validate) {\r\n let validateObj = ff.$validate || {};\r\n if (options.auth && type === \"jwt\") {\r\n if (validateObj.headers) {\r\n validateObj.headers = validateObj.headers.keys({\r\n Authorization: Joi.string(),\r\n });\r\n } else {\r\n validateObj.headers = Joi.object({\r\n headers: Joi.object({\r\n Authorization: Joi.string(),\r\n }).unknown(), // 注意加上这个\r\n });\r\n }\r\n }\r\n if (validateObj&&!!Object.keys(validateObj).length) {\r\n const failReason = validateObj.failReason\r\n delete validateObj.failReason\r\n if(validateObj.failAction === \"log\"){\r\n if(!options.log) options.log = {}\r\n options.log.collect = true\r\n let errto = validateObj.$errto\r\n handler = async function (...argus){\r\n const request = argus[0]\r\n const h = argus[1]\r\n if(request.logs&&!!request.logs.length && errto){\r\n // request.yar.flash('error', request.logs.map((v: any)=>v.error.message));\r\n request.yar.flash('error', failReason);\r\n return h.redirect(errto);\r\n }\r\n return await ff.call(this, ...argus)\r\n }\r\n }\r\n if(validateObj.failAction === \"function\"){\r\n let errto = validateObj.$errto\r\n validateObj.failAction = async function(request, h, err){\r\n if(err.details){\r\n request.$joi_error = err.details.map(v=>v.message)\r\n }\r\n return h.continue;\r\n }\r\n handler = async function (...argus){\r\n const request = argus[0]\r\n const h = argus[1]\r\n if(request.$joi_error){\r\n loggerSite.debug('传输参数错误: ', request.$joi_error)\r\n request.yar.flash('error', failReason);\r\n delete request.$joi_error\r\n return h.redirect(errto);\r\n }\r\n return await ff.call(this, ...argus)\r\n }\r\n }\r\n options.validate = validateObj;\r\n }\r\n }\r\n // && route.startsWith(\"/api\")\r\n if (ff.$swagger) {\r\n options.description = ff.$swagger[0];\r\n options.notes = ff.$swagger[1];\r\n options.tags = ff.$swagger[2];\r\n }\r\n let str = route;\r\n if (\r\n (typeof options.auth === \"string\" && options.auth) ||\r\n (typeof options.auth === \"object\" &&\r\n options.auth.mode === \"required\")\r\n ) {\r\n str =\r\n \" 需要权限 : \" + \" \" + full(method) + \" \" + str;\r\n } else if (\r\n typeof options.auth === \"object\" &&\r\n options.auth.mode === \"optional\"\r\n ) {\r\n str =\r\n \" 不需权限(提供即需验证): \" + \" \" + full(method) + \" \" + str;\r\n } else if (\r\n typeof options.auth === \"object\" &&\r\n options.auth.mode === \"try\"\r\n ) {\r\n str =\r\n \" 不需权限(提供无需验证): \" + \" \" + full(method) + \" \" + str;\r\n } else {\r\n str =\r\n \" 不需权限 : \" + \" \" + full(method) + \" \" + str;\r\n }\r\n routes.push(str);\r\n\r\n if(options.validate && options.validate.$errto){\r\n delete options.validate.$errto\r\n }\r\n if(!handler){\r\n handler = ff\r\n }\r\n server.route({\r\n method: method,\r\n path: route,\r\n handler: handler,\r\n options: options,\r\n });\r\n }\r\n }\r\n }\r\n });\r\n return routes;\r\n }\r\n}\r\n\r\nfunction full(str: string, length = 10) {\r\n let len = str.length;\r\n let need = length - len;\r\n if (need <= 0) return str;\r\n return str + [...Array(need)].map((v, i) => \" \").join(\"\");\r\n}\r\n\r\nconst plugin = new routePlugin();\r\n\r\nexport { plugin };\r\nexport * from \"./util/decorators\";\r\n"],"names":["path","fs","Joi"],"mappings":"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"} \ No newline at end of file diff --git a/packages/hapi-router/dist/index.d.ts b/packages/hapi-router/dist/index.d.ts index 238cff9..2074ecb 100644 --- a/packages/hapi-router/dist/index.d.ts +++ b/packages/hapi-router/dist/index.d.ts @@ -13,11 +13,13 @@ declare module '@noderun/hapi-router' { } declare module '@noderun/hapi-router/util/decorators' { - export function method(opts?: string | Array): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void; + type TMethod = "GET" | "POST" | "PUT" | "DELETE"; + export function method(opts?: TMethod | Array): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void; export function route(route?: string): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void; export function config(options: Object): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void; export function auth(isAuth?: boolean | "try" | "required" | "optional"): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void; export function validate(validate: Object): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void; export function swagger(desc: any, notes: any, tags: any): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void; + export {}; } diff --git a/packages/hapi-router/src/index.ts b/packages/hapi-router/src/index.ts index 43fe50d..b5ad8a5 100755 --- a/packages/hapi-router/src/index.ts +++ b/packages/hapi-router/src/index.ts @@ -106,6 +106,8 @@ class routePlugin { } } if (validateObj&&!!Object.keys(validateObj).length) { + const failReason = validateObj.failReason + delete validateObj.failReason if(validateObj.failAction === "log"){ if(!options.log) options.log = {} options.log.collect = true @@ -114,7 +116,8 @@ class routePlugin { const request = argus[0] const h = argus[1] if(request.logs&&!!request.logs.length && errto){ - request.yar.flash('error', request.logs.map((v: any)=>v.error.message)); + // request.yar.flash('error', request.logs.map((v: any)=>v.error.message)); + request.yar.flash('error', failReason); return h.redirect(errto); } return await ff.call(this, ...argus) @@ -133,7 +136,7 @@ class routePlugin { const h = argus[1] if(request.$joi_error){ loggerSite.debug('传输参数错误: ', request.$joi_error) - request.yar.flash('error', request.$joi_error); + request.yar.flash('error', failReason); delete request.$joi_error return h.redirect(errto); } diff --git a/packages/hapi-router/src/util/decorators.ts b/packages/hapi-router/src/util/decorators.ts index a2d72d6..79cda4c 100644 --- a/packages/hapi-router/src/util/decorators.ts +++ b/packages/hapi-router/src/util/decorators.ts @@ -3,7 +3,8 @@ * 方法 * @param opts 参数 */ -export function method(opts?:string|Array) { +type TMethod = "GET" | "POST" | "PUT" | "DELETE" +export function method(opts?:TMethod|Array) { return function (target, propertyKey: string, descriptor: PropertyDescriptor) { target[propertyKey].$method = opts } diff --git a/patches/hapi-sequelizejs@4.5.0.patch b/patches/hapi-sequelizejs@4.5.0.patch new file mode 100644 index 0000000..dda4da0 --- /dev/null +++ b/patches/hapi-sequelizejs@4.5.0.patch @@ -0,0 +1,14 @@ +diff --git a/lib/models.js b/lib/models.js +index f545bf6e0fb2cab3cf9e39408f0552b35ee7a955..11591b2096df7d9c06e06a89fd2d80b846933933 100644 +--- a/lib/models.js ++++ b/lib/models.js +@@ -40,7 +40,8 @@ async function load(files, sequelize) { + return files.reduce((acc, file) => { + const models = {}; + const filepath = Path.isAbsolute(file) ? file : Path.join(process.cwd(), file); +- const Model = require(filepath)(sequelize, sequelize.Sequelize.DataTypes); ++ const m = require(filepath) ++ const Model = (m.default || m)(sequelize, sequelize.Sequelize.DataTypes); + models[Model.name] = Model; + return Object.assign({}, acc, models); + }, {}); \ No newline at end of file diff --git a/readme.md b/readme.md index 20727cf..ec7aeba 100644 --- a/readme.md +++ b/readme.md @@ -15,4 +15,12 @@ ## 对于验证库的处理方式参考 https://docs4dev.com/questions/345443 -https://github.com/nelsonic/hapi-validation-question \ No newline at end of file +https://github.com/nelsonic/hapi-validation-question + +## 缓存 +https://github.com/hapijs/catbox-redis/blob/master/test/cluster.js +https://hapi.dev/module/catbox/api/?v=12.1.0 + + + +https://juejin.cn/post/7067093432737398792 \ No newline at end of file diff --git a/route.txt b/route.txt index 48fe151..744d4ac 100644 --- a/route.txt +++ b/route.txt @@ -1,15 +1,6 @@ -D:\@code\project\hapi-demo\source\route\api对应路径: - 不需权限 : GET /api/{path*} - 需要权限 : GET /api/v1/upload - 需要权限 : POST /api/v1/upload/upload - 不需权限 : POST /api/v1/user/register - 需要权限 : POST /api/v1/user/logout - 不需权限 : POST /api/v1/user/login - 需要权限 : DELETE /api/v1/user/del - 需要权限 : GET /api/v1/user/userinfo -D:\@code\project\hapi-demo\source\route\htmx对应路径: +D:\1XYX\demo\hapi-demo\source\route\htmx对应路径: 不需权限 : GET /htmx/clicked -D:\@code\project\hapi-demo\source\route\views对应路径: +D:\1XYX\demo\hapi-demo\source\route\views对应路径: 不需权限(提供无需验证): GET /404 不需权限 : GET /css 不需权限(提供无需验证): GET / diff --git a/source/auth/index.ts b/source/auth/index.ts index f61f204..67e182d 100644 --- a/source/auth/index.ts +++ b/source/auth/index.ts @@ -14,9 +14,6 @@ export async function validateJwt(decoded, request: Req, h) { } export async function validateSession(request: Req, session) { - console.log(request.path); - console.log(session); - console.log(`session id: ${session.id}`); const User = request.getModel("User") if (session.id) { const result = await User.findOne({ where: { id: session.id } }); diff --git a/source/db/data.db b/source/db/data.db index fd6ad666936f1570256c638ec8c92d75bb87691f..80e27197d18901476bb4d569240997d50054547c 100644 GIT binary patch delta 2657 zcmZo@U~PE7IzdW^=>Y=+gE$aF0aMLH9V0WKsGj!(R-hOo|8J0tIR9@xM&5}$lH60c z`MI1pFL9h^f5qOwcAHh1rG@z((;r4hM$3r{S9o%OR5x2xu#2m!Gq&lMBqrsgW+dvC z7N-`)XXd5l7o%{5or7E*LtGU?9G!ez6%vr;CQoG3<;crS&dy8BO`XioY9N_dmROQl zl%Npi8075X7^GojYO1NDkWi93S(nwf9>~f_3Jj7rxP+X zkrY!k8{^B_#bsp~n+1^r2o^TQLfC?3@&q=$$xm5aCfl>xGAWl$e#tDyC^(serA4Mu zrj%V=Qj)Pr7;KtzeolT-F@)rwypUBG7?cH$&88*n;;O2QZMw)-B1Z|BErQMJB9PP& zix3@BB4lzE>$1&^>_JSEC-4_cmghaYIheDDdGj0I1V&IM5Ea=Zz@osz!heZ@{}caH z{yY4aHVYVR;}-$SaWjGvT`@ZY2Me<}Cy>4Qmc9Cd&5Q;AxA3FoDa3xye-*jA3_BHVd%G#AmnSffrZN@e8Y1!fgSetQOf`^|y^ru_Adc8pvM zrj4workfODn>~vh6XC-{=NoT`N7U+>4AC%=6T*J zzMiHL{)X8po*tgQzRCGn1qLq06=s&@>7l9RdX-g4>F(v3*vvx}i-K5UWME{ZYY0T< z3I--t1_oB926|?uCJNd>rhx%|S&)x7I1Cv0r}2H{wd9$_{e@eIGn~U6vt<D;%1dNN-PJM9rg$8#l|)ci!qyEY`|*dESMO~hM(TG zA(ikZxiyEhK5&RC<zYzxq#G{E3m;nHc88%{=2>@vO_$p?MUiapNqyHfoHa!J{pAUZE_|qOd^W(rx z+fTMt$9eLRHDW1PAaU39)ST{nZdx=g9t{sg-~h1#&CZJ#;XT;;y9m$1kwa*i8z63( zDzAG#oVYh$u{fPh_+WTfPAl29TDDs2G-NBBgZEo6axmU{mV*ORnq1A~4-e@uy2mM0p^^SF2VbWj!Law z+f-}W&1y->_I_IyV!=RMze!r0deUgjx~Z#vI6v_0>&H=;g|kMiS?A;=yf>p?uvnZk zX8Q@inDJ-y>vwxYR8Qoq=8klbI{e;N{&J|FvJ>Ptfc%U6gZzd3?q~>oMUL5sJ}2x{ z*JA7M8@DZ#l+w}9vzMQYl3T!RPl3T72Hm9U_{d?kr;Jq$+U@#Piw&?k!HVK&>x)e| z*1EL`Eo?R)TiZjKbtR**>77!cu(yvn$val;f*TlX}0|4K;WeO$FJrP493 zJ%6G}yD&o`PGD)l%e#5xr)Cfm5W)y!7k!#nmSr87t-zrZ4pE%K=_wjb`Rdw^QrVLB zD@hc`dzo5N+n}W)mkKUK*jzLvB7aidP?Gz(i0sMcRg_e;=4vMp^1Em+h3Ga0&AS<& zw-@77uTBwG;L-_~DAFwBXE;C4&s8e!OzF-EQ^>uNOL9shzom-N?YOAM;*m^tUQ0;w z9=)F1ZTcJKdO3|MbgERZvUIuLP{WnC#k!2V3)2*h1%w5fabt|$U_8yMU+A*}k4|`c z7}-~l%}(X`P{Qxt^#zr9HDAoc)g^gHWYuhaeOruajo`J_6?WH0FC^=9L1x8rpyu0) zO0OVas&y%GXF+)Zc?Hb6S;qGU<=fuoOSe8~vVv)y0HU~`&(`Jrd=b;__hlg^F&|i7 zjVJdqS~#-AG}5t>rsh3GEm~Sw4JSgJSK||F(!3v|lu}ZQ4cb%bCE^4I37BzvjfH-_ z#hNbEMf$JXIC#TgvQxM&k#6m`wmW(dPvBCK!u2}d&J@+_oR;F_p`AOPfRw`7GGE!M zrz_XFIG5W8rHtWM-3Y`j5J0^$)@gvRxsY(6rC9-i6oY9E8cuQ zkYC2djhGVhh&7y(qMF}#t+c#-JDic3f|^XCNFz{4c+wSISlq_%+6c4@aW0ytkWWC2 Vz_4z{&%I9U-2b?Z%*y|q{};ZMucQC~ diff --git a/source/models/User.ts b/source/models/User.ts index 6dfa72c..8fc769b 100644 --- a/source/models/User.ts +++ b/source/models/User.ts @@ -1,5 +1,41 @@ -module.exports = function (sequelize, DataTypes) { - const User = sequelize.define('User', { +import { Sequelize, DataTypes, Optional, Model } from "sequelize" + +interface UserAttributes { + id: number; + username: string; + password: string; + nickname: string; + email: string; + + createdAt?: Date; + updatedAt?: Date; + deletedAt?: Date; +} + +export interface UserInput extends Optional { } +export interface UserOuput extends Required { } +export type TUserModel = ReturnType + +type DT = typeof DataTypes +export default function UserModel(sequelize: Sequelize, DataTypes: DT) { + class User extends Model implements UserAttributes { + public id: number; + public username: string; + public password: string; + public nickname: string; + public email: string; + + // timestamps! + public readonly createdAt!: Date; + public readonly updatedAt!: Date; + public readonly deletedAt!: Date; + } + User.init({ + id: { + type: DataTypes.INTEGER.UNSIGNED, + autoIncrement: true, + primaryKey: true, + }, username: { type: DataTypes.STRING, allowNull: false @@ -15,8 +51,14 @@ module.exports = function (sequelize, DataTypes) { email: { type: DataTypes.STRING, } - }, { - - }); + }, { + sequelize, + timestamps: true, + paranoid: true // 对模型施加了一个软删除 + }) + // 覆盖User的toJSON方法 + interface User{ + toJSON: ()=> UserOuput + } return User }; diff --git a/source/plugins/index.ts b/source/plugins/index.ts index 020741a..4ccd53c 100644 --- a/source/plugins/index.ts +++ b/source/plugins/index.ts @@ -61,10 +61,10 @@ export default [ options: { auth: ['/api'], sourceDir: [ - { - dir: path.resolve(sourceDir, "route/api"), - prefix: "api" - }, + // { + // dir: path.resolve(sourceDir, "route/api"), + // prefix: "api" + // }, { dir: path.resolve(sourceDir, "route/htmx"), prefix: "htmx" diff --git a/source/route/views/index.ts b/source/route/views/index.ts index 1e63b8f..4108291 100644 --- a/source/route/views/index.ts +++ b/source/route/views/index.ts @@ -24,16 +24,13 @@ export default class { payload: LoginUserSchema, $errto: '/login', // failAction: 'log' - failAction: 'function' + failAction: 'function', + failReason: '用户名或密码错误,请重试', }) @method("POST") @route("/login") async login_POST(request: Req, h: Res): ReturnValue { const { username, password, referrer } = request.payload as any; - if(!username || !password ){ - request.yar.flash('error', 'username or password can not be empty.'); - return h.redirect("/login"); - } const User = request.getModel("User"); const account = await User.findOne({ where: { username: username } }); @@ -42,7 +39,6 @@ export default class { return h.redirect("/login"); } request.cookieAuth.set({ id: account.id, nickname: account.nickname }); - console.log(account.nickname); request.yar.flash('success', '用户已登录'); return h.redirect(referrer ? referrer : "/"); } diff --git a/source/route/views/user.ts b/source/route/views/user.ts index 5d162b7..142ffee 100644 --- a/source/route/views/user.ts +++ b/source/route/views/user.ts @@ -12,13 +12,12 @@ export default class { async index(request: Req, h: Res): ReturnValue { const { id } = request.auth.credentials const User = request.getModel("User") - let result = await User.findOne({ where: { id: id } }) + let result = await User.findOne({ where: { id: id } }) if (result == null) { return gFail(null, "不存在该用户") } - result = result.toJSON() - delete result.password - console.log(result); - return h.view("views/user.pug", { userinfo: result }) + const userinfo = result.toJSON() + delete userinfo.password + return h.view("views/user.pug", { userinfo }) } } diff --git a/source/run.ts b/source/run.ts index be5c8d7..b4dc9c0 100644 --- a/source/run.ts +++ b/source/run.ts @@ -31,8 +31,8 @@ const run = async (): Promise => { logging: false, // logging: loggerSQL.debug.bind(loggerSQL) // Alternative way to use custom logger, displays all messages }), // sequelize instance - // sync: true, // sync models - default false - // forceSync: false, // force sync (drops tables) - default false + sync: true, // sync models - default false + forceSync: false, // force sync (drops tables) - default false }, ], }, @@ -139,7 +139,7 @@ const run = async (): Promise => { }; process.on("unhandledRejection", (err) => { - console.log("hh:", err); + console.log("unhandledRejection:", err); process.exit(1); }); diff --git a/template/views/index.pug b/template/views/index.pug index c0d033c..b36661f 100644 --- a/template/views/index.pug +++ b/template/views/index.pug @@ -17,3 +17,8 @@ block content | ! if isLogin button(hx-get="/htmx/clicked" hx-push-url="/about" hx-trigger="click" hx-target="this" hx-swap="outerHTML") Click Me! +
+ + +security + +
diff --git a/template/views/user.pug b/template/views/user.pug index 9a7acf3..c10da32 100644 --- a/template/views/user.pug +++ b/template/views/user.pug @@ -9,5 +9,7 @@ block head block content section.section .container + div nickname: #{user.nickname} + div email: #{user.email} div username: #{user.username} div id: #{user.id} diff --git a/types/global.d.ts b/types/global.d.ts index 8ec5133..f3fbdb2 100644 --- a/types/global.d.ts +++ b/types/global.d.ts @@ -2,6 +2,7 @@ import { Logger } from "log4js"; import { Server } from "@hapi/hapi"; import { Request, ResponseToolkit, Lifecycle } from "@hapi/hapi"; import { Model, ModelCtor } from "Sequelize"; +import { TUserModel } from "@/models/User"; declare global { var server: Server; @@ -10,9 +11,13 @@ declare global { var loggerSQL: Logger; } +interface Models { + "User": TUserModel +} + declare module '@hapi/hapi' { interface Request { - getModel(name: string): ModelCtor> + getModel(name: T): M } interface ResponseToolkit {