npmrun 4 years ago
parent
commit
ec85a67ff6
  1. 3
      package.json
  2. 24
      packages/hapi-router/dist/hapi-router.cjs.js
  3. 2
      packages/hapi-router/dist/hapi-router.cjs.js.map
  4. 3
      packages/hapi-router/package.json
  5. 301
      packages/hapi-router/pnpm-lock.yaml
  6. 24
      packages/hapi-router/src/index.ts
  7. 517
      pnpm-lock.yaml
  8. 57
      public/css/common/reset.css
  9. 89
      public/css/common/style.css
  10. 9
      public/css/common/style.css.map
  11. 75
      public/css/common/style.scss
  12. 36
      public/css/tool/_tool.scss
  13. 320
      public/css/views/404.css
  14. 95
      public/css/views/color.css
  15. 10
      public/css/views/color.css.map
  16. 75
      public/css/views/color.scss
  17. 60
      public/css/views/index.css
  18. 10
      public/css/views/index.css.map
  19. 43
      public/css/views/index.scss
  20. BIN
      public/image/add.png
  21. 3
      public/style.css
  22. 5
      readme.md
  23. BIN
      source/db/data.db
  24. 16
      source/db/init.ts
  25. 27
      source/model/Color.ts
  26. 1
      source/plugins/index.ts
  27. 6
      source/route/api/user/index.ts
  28. 7
      source/route/api/wx/index.ts
  29. 46
      source/route/color/index.ts
  30. 3
      source/route/demo/_upload.ts
  31. 35
      source/route/demo/index.ts
  32. 7
      source/route/index/color.ts
  33. 72
      source/route/index/index.ts
  34. 14
      source/route/route.txt
  35. 61
      source/run.ts
  36. 2
      source/util/index.ts
  37. 16
      source/validate.ts
  38. 1
      template/404.ejs
  39. 35
      template/404.pug
  40. 2
      template/includes/foot.ejs
  41. 22
      template/includes/head.ejs
  42. 4
      template/layout.ejs
  43. 1
      template/layout/layout.ejs
  44. 19
      template/layout/layout.pug
  45. 52
      template/views/color.pug
  46. 58
      template/views/demo.ejs
  47. 59
      template/views/index.ejs
  48. 41
      template/views/index.pug
  49. 6
      template/views/login.ejs

3
package.json

@ -13,15 +13,18 @@
"author": "",
"license": "ISC",
"dependencies": {
"@hapi/cookie": "^11.0.2",
"@hapi/hapi": "^20.1.2",
"@hapi/inert": "^6.0.3",
"bcrypt": "^5.0.1",
"hapi-auth-jwt2": "^10.2.0",
"hapi-swagger": "^14.2.0",
"joi": "^17.4.0",
"json-merge-patch": "^1.0.1",
"jsonwebtoken": "^8.5.1",
"multiparty": "^4.2.2",
"nodemon": "^2.0.7",
"pug": "^3.0.2",
"sequelize": "^6.6.2",
"sqlite3": "^5.0.2"
},

24
packages/hapi-router/dist/hapi-router.cjs.js

@ -174,6 +174,7 @@ var routePlugin = (function () {
}
routePlugin.prototype.register = function (server, options) {
var sourceDir = options.sourceDir;
var type = options.type || "jwt";
var files = walkDir(sourceDir);
files.forEach(function (file) {
var e_1, _a;
@ -214,14 +215,14 @@ var routePlugin = (function () {
if (!options_1.auth) {
if (ff.$auth == undefined) {
if (route.startsWith("/api")) {
options_1.auth = "jwt";
options_1.auth = type;
}
else {
options_1.auth = false;
}
}
else if (ff.$auth) {
options_1.auth = "jwt";
options_1.auth = type;
}
else {
options_1.auth = false;
@ -229,18 +230,25 @@ var routePlugin = (function () {
}
if (!options_1.validate) {
var validateObj = ff.$validate || {};
if (options_1.auth) {
validateObj = Object.assign(validateObj, {
headers: Joi__namespace.object({
if (options_1.auth && type === "jwt") {
if (validateObj.headers) {
validateObj.headers = validateObj.headers.keys({
Authorization: Joi__namespace.string(),
}).unknown(),
});
});
}
else {
validateObj.headers = Joi__namespace.object({
headers: Joi__namespace.object({
Authorization: Joi__namespace.string(),
}).unknown(),
});
}
}
if (validateObj) {
options_1.validate = validateObj;
}
}
if (ff.$swagger && route.startsWith("/api")) {
if (ff.$swagger) {
options_1.description = ff.$swagger[0];
options_1.notes = ff.$swagger[1];
options_1.tags = ff.$swagger[2];

2
packages/hapi-router/dist/hapi-router.cjs.js.map

File diff suppressed because one or more lines are too long

3
packages/hapi-router/package.json

@ -36,6 +36,7 @@
"typescript": "^3.9.7"
},
"dependencies": {
"joi": "^17.4.0"
"joi": "^17.4.0",
"json-merge-patch": "^1.0.1"
}
}

301
packages/hapi-router/pnpm-lock.yaml

@ -11,6 +11,7 @@ specifiers:
fs-extra: ^9.0.1
ftp-deploy: ^2.3.6
joi: ^17.4.0
json-merge-patch: ^1.0.1
lodash: ^4.17.20
rollup: ^2.26.3
rollup-plugin-sourcemaps: ^0.6.2
@ -20,6 +21,7 @@ specifiers:
dependencies:
joi: 17.4.0
json-merge-patch: 1.0.1
devDependencies:
'@rollup/plugin-alias': 3.1.2_rollup@2.51.2
@ -179,6 +181,11 @@ packages:
hasBin: true
dev: true
/available-typed-arrays/1.0.4:
resolution: {integrity: sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==}
engines: {node: '>= 0.4'}
dev: false
/balanced-match/1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
dev: true
@ -208,6 +215,13 @@ packages:
resolution: {integrity: sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==}
dev: true
/call-bind/1.0.2:
resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
dependencies:
function-bind: 1.1.1
get-intrinsic: 1.1.1
dev: false
/chalk/4.1.1:
resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==}
engines: {node: '>=10'}
@ -267,6 +281,33 @@ packages:
engines: {node: '>=0.10'}
dev: true
/deep-equal/2.0.5:
resolution: {integrity: sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==}
dependencies:
call-bind: 1.0.2
es-get-iterator: 1.1.2
get-intrinsic: 1.1.1
is-arguments: 1.1.0
is-date-object: 1.0.4
is-regex: 1.1.3
isarray: 2.0.5
object-is: 1.1.5
object-keys: 1.1.1
object.assign: 4.1.2
regexp.prototype.flags: 1.3.1
side-channel: 1.0.4
which-boxed-primitive: 1.0.2
which-collection: 1.0.1
which-typed-array: 1.1.4
dev: false
/define-properties/1.1.3:
resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==}
engines: {node: '>= 0.4'}
dependencies:
object-keys: 1.1.1
dev: false
/detect-indent/0.2.0:
resolution: {integrity: sha1-BCkUSYl5rC2fPHPk/z5od9O8krY=}
engines: {node: '>=0.10.0'}
@ -297,6 +338,50 @@ packages:
once: 1.4.0
dev: true
/es-abstract/1.18.3:
resolution: {integrity: sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
es-to-primitive: 1.2.1
function-bind: 1.1.1
get-intrinsic: 1.1.1
has: 1.0.3
has-symbols: 1.0.2
is-callable: 1.2.3
is-negative-zero: 2.0.1
is-regex: 1.1.3
is-string: 1.0.6
object-inspect: 1.10.3
object-keys: 1.1.1
object.assign: 4.1.2
string.prototype.trimend: 1.0.4
string.prototype.trimstart: 1.0.4
unbox-primitive: 1.0.1
dev: false
/es-get-iterator/1.1.2:
resolution: {integrity: sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==}
dependencies:
call-bind: 1.0.2
get-intrinsic: 1.1.1
has-symbols: 1.0.2
is-arguments: 1.1.0
is-map: 2.0.2
is-set: 2.0.2
is-string: 1.0.6
isarray: 2.0.5
dev: false
/es-to-primitive/1.2.1:
resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
engines: {node: '>= 0.4'}
dependencies:
is-callable: 1.2.3
is-date-object: 1.0.4
is-symbol: 1.0.4
dev: false
/estree-walker/1.0.1:
resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==}
dev: true
@ -337,6 +422,10 @@ packages:
path-exists: 4.0.0
dev: true
/foreach/2.0.5:
resolution: {integrity: sha1-C+4AUBiusmDQo6865ljdATbsG5k=}
dev: false
/fs-extra/8.1.0:
resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
engines: {node: '>=6 <7 || >=8'}
@ -381,7 +470,14 @@ packages:
/function-bind/1.1.1:
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
dev: true
/get-intrinsic/1.1.1:
resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==}
dependencies:
function-bind: 1.1.1
has: 1.0.3
has-symbols: 1.0.2
dev: false
/get-stdin/0.1.0:
resolution: {integrity: sha1-WZivJKr8gC0VyCxoVlfuuLENSpE=}
@ -420,17 +516,25 @@ packages:
resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==}
dev: true
/has-bigints/1.0.1:
resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==}
dev: false
/has-flag/4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
dev: true
/has-symbols/1.0.2:
resolution: {integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==}
engines: {node: '>= 0.4'}
dev: false
/has/1.0.3:
resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
engines: {node: '>= 0.4.0'}
dependencies:
function-bind: 1.1.1
dev: true
/human-signals/1.1.1:
resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==}
@ -448,27 +552,116 @@ packages:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
dev: true
/is-arguments/1.1.0:
resolution: {integrity: sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
dev: false
/is-bigint/1.0.2:
resolution: {integrity: sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==}
dev: false
/is-boolean-object/1.1.1:
resolution: {integrity: sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
dev: false
/is-callable/1.2.3:
resolution: {integrity: sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==}
engines: {node: '>= 0.4'}
dev: false
/is-core-module/2.4.0:
resolution: {integrity: sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==}
dependencies:
has: 1.0.3
dev: true
/is-date-object/1.0.4:
resolution: {integrity: sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==}
engines: {node: '>= 0.4'}
dev: false
/is-map/2.0.2:
resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
dev: false
/is-negative-zero/2.0.1:
resolution: {integrity: sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==}
engines: {node: '>= 0.4'}
dev: false
/is-number-object/1.0.5:
resolution: {integrity: sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==}
engines: {node: '>= 0.4'}
dev: false
/is-reference/1.2.1:
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
dependencies:
'@types/estree': 0.0.48
dev: true
/is-regex/1.1.3:
resolution: {integrity: sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
has-symbols: 1.0.2
dev: false
/is-set/2.0.2:
resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==}
dev: false
/is-stream/2.0.0:
resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==}
engines: {node: '>=8'}
dev: true
/is-string/1.0.6:
resolution: {integrity: sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==}
engines: {node: '>= 0.4'}
dev: false
/is-symbol/1.0.4:
resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
engines: {node: '>= 0.4'}
dependencies:
has-symbols: 1.0.2
dev: false
/is-typed-array/1.1.5:
resolution: {integrity: sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==}
engines: {node: '>= 0.4'}
dependencies:
available-typed-arrays: 1.0.4
call-bind: 1.0.2
es-abstract: 1.18.3
foreach: 2.0.5
has-symbols: 1.0.2
dev: false
/is-weakmap/2.0.1:
resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==}
dev: false
/is-weakset/2.0.1:
resolution: {integrity: sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==}
dev: false
/isarray/0.0.1:
resolution: {integrity: sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=}
dev: true
/isarray/2.0.5:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
dev: false
/isexe/2.0.0:
resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=}
dev: true
@ -483,6 +676,12 @@ packages:
'@sideway/pinpoint': 2.0.0
dev: false
/json-merge-patch/1.0.1:
resolution: {integrity: sha512-yvT2j/jJZ2S53t+WLt1/y2pvyR1UKPl1d/tJUjwnbtwdQQcloPhGS0bkEq/L6I32l1nhleU57GTkbv64t8eHQA==}
dependencies:
deep-equal: 2.0.5
dev: false
/jsonfile/4.0.0:
resolution: {integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=}
optionalDependencies:
@ -562,6 +761,33 @@ packages:
path-key: 3.1.1
dev: true
/object-inspect/1.10.3:
resolution: {integrity: sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==}
dev: false
/object-is/1.1.5:
resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
define-properties: 1.1.3
dev: false
/object-keys/1.1.1:
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
engines: {node: '>= 0.4'}
dev: false
/object.assign/4.1.2:
resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
define-properties: 1.1.3
has-symbols: 1.0.2
object-keys: 1.1.1
dev: false
/once/1.4.0:
resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=}
dependencies:
@ -670,6 +896,14 @@ packages:
util-deprecate: 1.0.2
dev: true
/regexp.prototype.flags/1.3.1:
resolution: {integrity: sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
define-properties: 1.1.3
dev: false
/resolve/1.17.0:
resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==}
dependencies:
@ -752,6 +986,14 @@ packages:
engines: {node: '>=8'}
dev: true
/side-channel/1.0.4:
resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
dependencies:
call-bind: 1.0.2
get-intrinsic: 1.1.1
object-inspect: 1.10.3
dev: false
/signal-exit/3.0.3:
resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==}
dev: true
@ -801,6 +1043,20 @@ packages:
engines: {node: '>=0.8.0'}
dev: true
/string.prototype.trimend/1.0.4:
resolution: {integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==}
dependencies:
call-bind: 1.0.2
define-properties: 1.1.3
dev: false
/string.prototype.trimstart/1.0.4:
resolution: {integrity: sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==}
dependencies:
call-bind: 1.0.2
define-properties: 1.1.3
dev: false
/string_decoder/0.10.31:
resolution: {integrity: sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=}
dev: true
@ -845,6 +1101,15 @@ packages:
hasBin: true
dev: true
/unbox-primitive/1.0.1:
resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==}
dependencies:
function-bind: 1.1.1
has-bigints: 1.0.1
has-symbols: 1.0.2
which-boxed-primitive: 1.0.2
dev: false
/universalify/0.1.2:
resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
engines: {node: '>= 4.0.0'}
@ -864,6 +1129,38 @@ packages:
resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=}
dev: true
/which-boxed-primitive/1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
dependencies:
is-bigint: 1.0.2
is-boolean-object: 1.1.1
is-number-object: 1.0.5
is-string: 1.0.6
is-symbol: 1.0.4
dev: false
/which-collection/1.0.1:
resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==}
dependencies:
is-map: 2.0.2
is-set: 2.0.2
is-weakmap: 2.0.1
is-weakset: 2.0.1
dev: false
/which-typed-array/1.1.4:
resolution: {integrity: sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==}
engines: {node: '>= 0.4'}
dependencies:
available-typed-arrays: 1.0.4
call-bind: 1.0.2
es-abstract: 1.18.3
foreach: 2.0.5
function-bind: 1.1.1
has-symbols: 1.0.2
is-typed-array: 1.1.5
dev: false
/which/2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}

24
packages/hapi-router/src/index.ts

@ -12,6 +12,7 @@ class routePlugin {
public version: string = "0.0.1";
public register(server: any, options: any) {
const sourceDir = options.sourceDir;
const type = options.type || "jwt";
const files = walkDir(sourceDir);
files.forEach((file) => {
@ -50,30 +51,37 @@ class routePlugin {
if (!options.auth) {
if (ff.$auth == undefined) {
if (route.startsWith("/api")) {
options.auth = "jwt";
options.auth = type;
} else {
options.auth = false;
}
} else if (ff.$auth) {
options.auth = "jwt";
options.auth = type;
} else {
options.auth = false;
}
}
if (!options.validate) {
let validateObj = ff.$validate || {};
if(options.auth){
validateObj = Object.assign(validateObj,{
headers: Joi.object({
if(options.auth&&type === "jwt"){
if (validateObj.headers) {
validateObj.headers = validateObj.headers.keys({
Authorization: Joi.string(),
}).unknown(), // 注意加上这个
})
})
}else{
validateObj.headers = Joi.object({
headers: Joi.object({
Authorization: Joi.string(),
}).unknown(), // 注意加上这个
})
}
}
if (validateObj) {
options.validate = validateObj;
}
}
if (ff.$swagger && route.startsWith("/api")) {
// && route.startsWith("/api")
if (ff.$swagger) {
options.description = ff.$swagger[0];
options.notes = ff.$swagger[1];
options.tags = ff.$swagger[2];

517
pnpm-lock.yaml

@ -1,6 +1,7 @@
lockfileVersion: 5.3
specifiers:
'@hapi/cookie': ^11.0.2
'@hapi/hapi': ^20.1.2
'@hapi/inert': ^6.0.3
'@hapi/vision': ^6.1.0
@ -12,9 +13,11 @@ specifiers:
hapi-auth-jwt2: ^10.2.0
hapi-swagger: ^14.2.0
joi: ^17.4.0
json-merge-patch: ^1.0.1
jsonwebtoken: ^8.5.1
multiparty: ^4.2.2
nodemon: ^2.0.7
pug: ^3.0.2
sequelize: ^6.6.2
sqlite3: ^5.0.2
ts-node: ^10.0.0
@ -23,15 +26,18 @@ specifiers:
typescript: ^4.3.2
dependencies:
'@hapi/cookie': 11.0.2
'@hapi/hapi': 20.1.4
'@hapi/inert': 6.0.3
bcrypt: 5.0.1
hapi-auth-jwt2: 10.2.0
hapi-swagger: 14.2.0_@hapi+hapi@20.1.4+joi@17.4.0
joi: 17.4.0
json-merge-patch: 1.0.1
jsonwebtoken: 8.5.1
multiparty: 4.2.2
nodemon: 2.0.7
pug: 3.0.2
sequelize: 6.6.2_sqlite3@5.0.2
sqlite3: 5.0.2
@ -48,6 +54,25 @@ devDependencies:
packages:
/@babel/helper-validator-identifier/7.14.5:
resolution: {integrity: sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==}
engines: {node: '>=6.9.0'}
dev: false
/@babel/parser/7.14.6:
resolution: {integrity: sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==}
engines: {node: '>=6.0.0'}
hasBin: true
dev: false
/@babel/types/7.14.5:
resolution: {integrity: sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/helper-validator-identifier': 7.14.5
to-fast-properties: 2.0.0
dev: false
/@hapi/accept/5.0.2:
resolution: {integrity: sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw==}
dependencies:
@ -111,6 +136,15 @@ packages:
'@hapi/boom': 9.1.2
dev: false
/@hapi/cookie/11.0.2:
resolution: {integrity: sha512-LRpSuHC53urzml83c5eUHSPPt7YtK1CaaPZU9KmnhZlacVVojrWJzOUIcwOADDvCZjDxowCO3zPMaOqzEm9kgg==}
dependencies:
'@hapi/boom': 9.1.2
'@hapi/bounce': 2.0.0
'@hapi/hoek': 9.2.0
'@hapi/validate': 1.1.3
dev: false
/@hapi/cryptiles/5.1.0:
resolution: {integrity: sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA==}
engines: {node: '>=12.0.0'}
@ -381,6 +415,12 @@ packages:
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
dev: false
/acorn/7.4.1:
resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
engines: {node: '>=0.4.0'}
hasBin: true
dev: false
/agent-base/6.0.2:
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
engines: {node: '>= 6.0.0'}
@ -472,6 +512,10 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/asap/2.0.6:
resolution: {integrity: sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=}
dev: false
/asn1/0.2.4:
resolution: {integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==}
dependencies:
@ -479,6 +523,10 @@ packages:
dev: false
optional: true
/assert-never/1.2.1:
resolution: {integrity: sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==}
dev: false
/assert-plus/1.0.0:
resolution: {integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=}
engines: {node: '>=0.8'}
@ -494,6 +542,11 @@ packages:
dev: false
optional: true
/available-typed-arrays/1.0.4:
resolution: {integrity: sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==}
engines: {node: '>= 0.4'}
dev: false
/aws-sign2/0.7.0:
resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=}
dev: false
@ -504,6 +557,13 @@ packages:
dev: false
optional: true
/babel-walk/3.0.0-canary-5:
resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==}
engines: {node: '>= 10.0.0'}
dependencies:
'@babel/types': 7.14.5
dev: false
/balanced-match/1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@ -584,6 +644,13 @@ packages:
responselike: 1.0.2
dev: false
/call-bind/1.0.2:
resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
dependencies:
function-bind: 1.1.1
get-intrinsic: 1.1.1
dev: false
/call-me-maybe/1.0.1:
resolution: {integrity: sha1-JtII6onje1y95gJQoV8DHBak1ms=}
dev: false
@ -628,6 +695,12 @@ packages:
supports-color: 7.2.0
dev: false
/character-parser/2.2.0:
resolution: {integrity: sha1-x84o821LzZdE5f/CxfzeHHMmH8A=}
dependencies:
is-regex: 1.1.3
dev: false
/chokidar/3.5.2:
resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==}
engines: {node: '>= 8.10.0'}
@ -724,6 +797,13 @@ packages:
resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=}
dev: false
/constantinople/4.0.1:
resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==}
dependencies:
'@babel/parser': 7.14.6
'@babel/types': 7.14.5
dev: false
/cookie/0.4.1:
resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==}
engines: {node: '>= 0.6'}
@ -807,6 +887,26 @@ packages:
mimic-response: 1.0.1
dev: false
/deep-equal/2.0.5:
resolution: {integrity: sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==}
dependencies:
call-bind: 1.0.2
es-get-iterator: 1.1.2
get-intrinsic: 1.1.1
is-arguments: 1.1.0
is-date-object: 1.0.4
is-regex: 1.1.3
isarray: 2.0.5
object-is: 1.1.5
object-keys: 1.1.1
object.assign: 4.1.2
regexp.prototype.flags: 1.3.1
side-channel: 1.0.4
which-boxed-primitive: 1.0.2
which-collection: 1.0.1
which-typed-array: 1.1.4
dev: false
/deep-extend/0.6.0:
resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
engines: {node: '>=4.0.0'}
@ -816,6 +916,13 @@ packages:
resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==}
dev: false
/define-properties/1.1.3:
resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==}
engines: {node: '>= 0.4'}
dependencies:
object-keys: 1.1.1
dev: false
/delayed-stream/1.0.0:
resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=}
engines: {node: '>=0.4.0'}
@ -842,6 +949,10 @@ packages:
engines: {node: '>=0.3.1'}
dev: true
/doctypes/1.1.0:
resolution: {integrity: sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=}
dev: false
/dot-prop/5.3.0:
resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
engines: {node: '>=8'}
@ -910,6 +1021,50 @@ packages:
is-arrayish: 0.2.1
dev: true
/es-abstract/1.18.3:
resolution: {integrity: sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
es-to-primitive: 1.2.1
function-bind: 1.1.1
get-intrinsic: 1.1.1
has: 1.0.3
has-symbols: 1.0.2
is-callable: 1.2.3
is-negative-zero: 2.0.1
is-regex: 1.1.3
is-string: 1.0.6
object-inspect: 1.10.3
object-keys: 1.1.1
object.assign: 4.1.2
string.prototype.trimend: 1.0.4
string.prototype.trimstart: 1.0.4
unbox-primitive: 1.0.1
dev: false
/es-get-iterator/1.1.2:
resolution: {integrity: sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==}
dependencies:
call-bind: 1.0.2
get-intrinsic: 1.1.1
has-symbols: 1.0.2
is-arguments: 1.1.0
is-map: 2.0.2
is-set: 2.0.2
is-string: 1.0.6
isarray: 2.0.5
dev: false
/es-to-primitive/1.2.1:
resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
engines: {node: '>= 0.4'}
dependencies:
is-callable: 1.2.3
is-date-object: 1.0.4
is-symbol: 1.0.4
dev: false
/escape-goat/2.1.1:
resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==}
engines: {node: '>=8'}
@ -976,6 +1131,10 @@ packages:
pinkie-promise: 2.0.1
dev: true
/foreach/2.0.5:
resolution: {integrity: sha1-C+4AUBiusmDQo6865ljdATbsG5k=}
dev: false
/forever-agent/0.6.1:
resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=}
dev: false
@ -1030,7 +1189,6 @@ packages:
/function-bind/1.1.1:
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
dev: true
/gauge/2.7.4:
resolution: {integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=}
@ -1045,6 +1203,14 @@ packages:
wide-align: 1.1.3
dev: false
/get-intrinsic/1.1.1:
resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==}
dependencies:
function-bind: 1.1.1
has: 1.0.3
has-symbols: 1.0.2
dev: false
/get-stdin/4.0.1:
resolution: {integrity: sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=}
engines: {node: '>=0.10.0'}
@ -1170,6 +1336,10 @@ packages:
dev: false
optional: true
/has-bigints/1.0.1:
resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==}
dev: false
/has-flag/3.0.0:
resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=}
engines: {node: '>=4'}
@ -1179,6 +1349,11 @@ packages:
engines: {node: '>=8'}
dev: false
/has-symbols/1.0.2:
resolution: {integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==}
engines: {node: '>= 0.4'}
dev: false
/has-unicode/2.0.1:
resolution: {integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=}
dev: false
@ -1193,7 +1368,6 @@ packages:
engines: {node: '>= 0.4.0'}
dependencies:
function-bind: 1.1.1
dev: true
/hosted-git-info/2.8.9:
resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
@ -1299,16 +1473,39 @@ packages:
resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
dev: false
/is-arguments/1.1.0:
resolution: {integrity: sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
dev: false
/is-arrayish/0.2.1:
resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=}
dev: true
/is-bigint/1.0.2:
resolution: {integrity: sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==}
dev: false
/is-binary-path/2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
dependencies:
binary-extensions: 2.2.0
/is-boolean-object/1.1.1:
resolution: {integrity: sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
dev: false
/is-callable/1.2.3:
resolution: {integrity: sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==}
engines: {node: '>= 0.4'}
dev: false
/is-ci/2.0.0:
resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==}
hasBin: true
@ -1320,7 +1517,18 @@ packages:
resolution: {integrity: sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==}
dependencies:
has: 1.0.3
dev: true
/is-date-object/1.0.4:
resolution: {integrity: sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==}
engines: {node: '>= 0.4'}
dev: false
/is-expression/4.0.0:
resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==}
dependencies:
acorn: 7.4.1
object-assign: 4.1.1
dev: false
/is-extglob/2.1.1:
resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=}
@ -1362,11 +1570,25 @@ packages:
is-path-inside: 3.0.3
dev: false
/is-map/2.0.2:
resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
dev: false
/is-negative-zero/2.0.1:
resolution: {integrity: sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==}
engines: {node: '>= 0.4'}
dev: false
/is-npm/4.0.0:
resolution: {integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==}
engines: {node: '>=8'}
dev: false
/is-number-object/1.0.5:
resolution: {integrity: sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==}
engines: {node: '>= 0.4'}
dev: false
/is-number/7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
@ -1381,6 +1603,45 @@ packages:
engines: {node: '>=8'}
dev: false
/is-promise/2.2.2:
resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==}
dev: false
/is-regex/1.1.3:
resolution: {integrity: sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
has-symbols: 1.0.2
dev: false
/is-set/2.0.2:
resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==}
dev: false
/is-string/1.0.6:
resolution: {integrity: sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==}
engines: {node: '>= 0.4'}
dev: false
/is-symbol/1.0.4:
resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
engines: {node: '>= 0.4'}
dependencies:
has-symbols: 1.0.2
dev: false
/is-typed-array/1.1.5:
resolution: {integrity: sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==}
engines: {node: '>= 0.4'}
dependencies:
available-typed-arrays: 1.0.4
call-bind: 1.0.2
es-abstract: 1.18.3
foreach: 2.0.5
has-symbols: 1.0.2
dev: false
/is-typedarray/1.0.0:
resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=}
dev: false
@ -1389,6 +1650,14 @@ packages:
resolution: {integrity: sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=}
dev: true
/is-weakmap/2.0.1:
resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==}
dev: false
/is-weakset/2.0.1:
resolution: {integrity: sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==}
dev: false
/is-yarn-global/0.3.0:
resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==}
dev: false
@ -1397,6 +1666,10 @@ packages:
resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=}
dev: false
/isarray/2.0.5:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
dev: false
/isexe/2.0.0:
resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=}
dev: false
@ -1427,6 +1700,10 @@ packages:
'@sideway/pinpoint': 2.0.0
dev: false
/js-stringify/1.0.2:
resolution: {integrity: sha1-Fzb939lyTyijaCrcYjCufk6Weds=}
dev: false
/js-yaml/3.14.1:
resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
hasBin: true
@ -1444,6 +1721,12 @@ packages:
resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=}
dev: false
/json-merge-patch/1.0.1:
resolution: {integrity: sha512-yvT2j/jJZ2S53t+WLt1/y2pvyR1UKPl1d/tJUjwnbtwdQQcloPhGS0bkEq/L6I32l1nhleU57GTkbv64t8eHQA==}
dependencies:
deep-equal: 2.0.5
dev: false
/json-schema-ref-parser/4.1.1:
resolution: {integrity: sha512-lByoCHZ6H2zgb6NtsXIqtzQ+6Ji7iVqnrhWxsXLhF+gXmgu6E8+ErpDxCMR439MUG1nfMjWI2HAoM8l0XgSNhw==}
dependencies:
@ -1510,6 +1793,13 @@ packages:
dev: false
optional: true
/jstransformer/1.0.0:
resolution: {integrity: sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=}
dependencies:
is-promise: 2.2.2
promise: 7.3.1
dev: false
/jwa/1.4.1:
resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==}
dependencies:
@ -1911,6 +2201,33 @@ packages:
resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=}
engines: {node: '>=0.10.0'}
/object-inspect/1.10.3:
resolution: {integrity: sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==}
dev: false
/object-is/1.1.5:
resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
define-properties: 1.1.3
dev: false
/object-keys/1.1.1:
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
engines: {node: '>= 0.4'}
dev: false
/object.assign/4.1.2:
resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
define-properties: 1.1.3
has-symbols: 1.0.2
object-keys: 1.1.1
dev: false
/once/1.4.0:
resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=}
dependencies:
@ -1974,7 +2291,6 @@ packages:
/path-parse/1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
dev: true
/path-type/1.1.0:
resolution: {integrity: sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=}
@ -2025,6 +2341,12 @@ packages:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
dev: false
/promise/7.3.1:
resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==}
dependencies:
asap: 2.0.6
dev: false
/psl/1.8.0:
resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==}
dev: false
@ -2034,6 +2356,97 @@ packages:
resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==}
dev: false
/pug-attrs/3.0.0:
resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==}
dependencies:
constantinople: 4.0.1
js-stringify: 1.0.2
pug-runtime: 3.0.1
dev: false
/pug-code-gen/3.0.2:
resolution: {integrity: sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==}
dependencies:
constantinople: 4.0.1
doctypes: 1.1.0
js-stringify: 1.0.2
pug-attrs: 3.0.0
pug-error: 2.0.0
pug-runtime: 3.0.1
void-elements: 3.1.0
with: 7.0.2
dev: false
/pug-error/2.0.0:
resolution: {integrity: sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==}
dev: false
/pug-filters/4.0.0:
resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==}
dependencies:
constantinople: 4.0.1
jstransformer: 1.0.0
pug-error: 2.0.0
pug-walk: 2.0.0
resolve: 1.20.0
dev: false
/pug-lexer/5.0.1:
resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==}
dependencies:
character-parser: 2.2.0
is-expression: 4.0.0
pug-error: 2.0.0
dev: false
/pug-linker/4.0.0:
resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==}
dependencies:
pug-error: 2.0.0
pug-walk: 2.0.0
dev: false
/pug-load/3.0.0:
resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==}
dependencies:
object-assign: 4.1.1
pug-walk: 2.0.0
dev: false
/pug-parser/6.0.0:
resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==}
dependencies:
pug-error: 2.0.0
token-stream: 1.0.0
dev: false
/pug-runtime/3.0.1:
resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==}
dev: false
/pug-strip-comments/2.0.0:
resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==}
dependencies:
pug-error: 2.0.0
dev: false
/pug-walk/2.0.0:
resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==}
dev: false
/pug/3.0.2:
resolution: {integrity: sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==}
dependencies:
pug-code-gen: 3.0.2
pug-filters: 4.0.0
pug-lexer: 5.0.1
pug-linker: 4.0.0
pug-load: 3.0.0
pug-parser: 6.0.0
pug-runtime: 3.0.1
pug-strip-comments: 2.0.0
dev: false
/pump/3.0.0:
resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
dependencies:
@ -2135,6 +2548,14 @@ packages:
strip-indent: 1.0.1
dev: true
/regexp.prototype.flags/1.3.1:
resolution: {integrity: sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
define-properties: 1.1.3
dev: false
/registry-auth-token/4.2.1:
resolution: {integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==}
engines: {node: '>=6.0.0'}
@ -2189,7 +2610,6 @@ packages:
dependencies:
is-core-module: 2.4.0
path-parse: 1.0.7
dev: true
/responselike/1.0.2:
resolution: {integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=}
@ -2316,6 +2736,14 @@ packages:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
dev: false
/side-channel/1.0.4:
resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
dependencies:
call-bind: 1.0.2
get-intrinsic: 1.1.1
object-inspect: 1.10.3
dev: false
/signal-exit/3.0.3:
resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==}
@ -2418,6 +2846,20 @@ packages:
strip-ansi: 6.0.0
dev: false
/string.prototype.trimend/1.0.4:
resolution: {integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==}
dependencies:
call-bind: 1.0.2
define-properties: 1.1.3
dev: false
/string.prototype.trimstart/1.0.4:
resolution: {integrity: sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==}
dependencies:
call-bind: 1.0.2
define-properties: 1.1.3
dev: false
/string_decoder/1.1.1:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
dependencies:
@ -2560,6 +3002,11 @@ packages:
engines: {node: '>=8'}
dev: false
/to-fast-properties/2.0.0:
resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=}
engines: {node: '>=4'}
dev: false
/to-readable-stream/1.0.0:
resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==}
engines: {node: '>=6'}
@ -2576,6 +3023,10 @@ packages:
engines: {node: '>=0.6'}
dev: false
/token-stream/1.0.0:
resolution: {integrity: sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=}
dev: false
/token-types/2.1.1:
resolution: {integrity: sha512-wnQcqlreS6VjthyHO3Y/kpK/emflxDBNhlNUPfh7wE39KnuDdOituXomIbyI79vBtF0Ninpkh72mcuRHo+RG3Q==}
engines: {node: '>=0.1.98'}
@ -2744,6 +3195,15 @@ packages:
random-bytes: 1.0.0
dev: false
/unbox-primitive/1.0.1:
resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==}
dependencies:
function-bind: 1.1.1
has-bigints: 1.0.1
has-symbols: 1.0.2
which-boxed-primitive: 1.0.2
dev: false
/undefsafe/2.0.3:
resolution: {integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==}
dependencies:
@ -2827,6 +3287,43 @@ packages:
dev: false
optional: true
/void-elements/3.1.0:
resolution: {integrity: sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=}
engines: {node: '>=0.10.0'}
dev: false
/which-boxed-primitive/1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
dependencies:
is-bigint: 1.0.2
is-boolean-object: 1.1.1
is-number-object: 1.0.5
is-string: 1.0.6
is-symbol: 1.0.4
dev: false
/which-collection/1.0.1:
resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==}
dependencies:
is-map: 2.0.2
is-set: 2.0.2
is-weakmap: 2.0.1
is-weakset: 2.0.1
dev: false
/which-typed-array/1.1.4:
resolution: {integrity: sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==}
engines: {node: '>= 0.4'}
dependencies:
available-typed-arrays: 1.0.4
call-bind: 1.0.2
es-abstract: 1.18.3
foreach: 2.0.5
function-bind: 1.1.1
has-symbols: 1.0.2
is-typed-array: 1.1.5
dev: false
/which/1.3.1:
resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
hasBin: true
@ -2848,6 +3345,16 @@ packages:
string-width: 4.2.2
dev: false
/with/7.0.2:
resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==}
engines: {node: '>= 10.0.0'}
dependencies:
'@babel/parser': 7.14.6
'@babel/types': 7.14.5
assert-never: 1.2.1
babel-walk: 3.0.0-canary-5
dev: false
/wkx/0.5.0:
resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==}
dependencies:

57
public/css/common/reset.css

@ -0,0 +1,57 @@
/* http://meyerweb.com/eric/tools/css/reset/
v2.0 | 20110126
License: none (public domain)
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
blockquote, body, button, dd, dl, dt, fieldset, form, h1, h2, h3, h4, h5, h6, hr, input, legend, li, ol, p, pre, td, textarea, th, ul {
margin: 0;
padding: 0;
}
body, button, input, select, textarea {
font: 12px/1.5 tahoma,arial,"Hiragino Sans GB",宋体,sans-serif;
}

89
public/css/common/style.css

@ -0,0 +1,89 @@
@charset "UTF-8";
html,
body {
background-color: #f5f5f5;
height: 100%;
overflow: hidden;
}
.left-list {
position: absolute;
right: calc(100% + 10px);
top: 8%;
min-width: 50px;
padding: 0 10px;
line-height: 3;
text-align: center;
border-right: 1px solid rgba(0, 0, 0, 0.6);
}
.left-list .item {
white-space: nowrap;
}
.left-list .item a {
display: inline-block;
text-decoration: none;
font-size: 1.2em;
}
.container {
width: 1100px;
margin: 0 auto;
}
.a-flex {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
/*
图片类样式
*/
.img-wrapper {
width: 100px;
height: 100px;
overflow: hidden;
-webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
border-radius: 50%;
display: inline-block;
-webkit-box-sizing: border-box;
box-sizing: border-box;
border: 3px solid #000;
/* ============== * 深褐色过滤* ==============*/
}
.img-wrapper img {
width: 100%;
height: 100px;
-webkit-transition: 0.3s linear;
transition: 0.3s linear;
}
.img-wrapper img:hover {
-webkit-transform: scale(1.1);
transform: scale(1.1);
}
.img-wrapper .grayscale-img {
-webkit-filter: grayscale(100%);
filter: grayscale(100%);
}
.img-wrapper .grayscale-img:hover {
-webkit-filter: grayscale(0);
filter: grayscale(0);
}
.img-wrapper .sepia-img {
-webkit-filter: sepia(100%);
filter: sepia(100%);
}
.img-wrapper .sepia-img:hover {
-webkit-filter: sepia(0);
filter: sepia(0);
}
/*# sourceMappingURL=style.css.map */

9
public/css/common/style.css.map

@ -0,0 +1,9 @@
{
"version": 3,
"mappings": ";AAAA,AAAA,IAAI;AACJ,IAAI,CAAC;EACH,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,QAAQ,EAAE,MAAM;CACjB;;AAED,AAAA,UAAU,CAAC;EACT,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,iBAAiB;EACxB,GAAG,EAAE,EAAE;EACP,SAAS,EAAE,IAAI;EACf,OAAO,EAAE,MAAM;EACf,WAAW,EAAE,CAAC;EACd,UAAU,EAAE,MAAM;EAClB,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,kBAAkB;CAS3C;;AAjBD,AASE,UATQ,CASR,KAAK,CAAC;EACJ,WAAW,EAAE,MAAM;CAMpB;;AAhBH,AAWI,UAXM,CASR,KAAK,CAEH,CAAC,CAAA;EACC,OAAO,EAAE,YAAY;EACrB,eAAe,EAAE,IAAI;EACrB,SAAS,EAAE,KAAK;CACjB;;AAIL,AAAA,UAAU,CAAC;EACT,KAAK,EAAE,MAAM;EACb,MAAM,EAAE,MAAM;CACf;;AAED,AAAA,OAAO,CAAC;EACN,OAAO,EAAE,IAAI;CACd;;AAED;;EAEE;AACF,AAAA,YAAY,CAAC;EACX,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,KAAK;EACb,QAAQ,EAAE,MAAM;EAChB,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB;EACxC,aAAa,EAAE,GAAG;EAElB,OAAO,EAAE,YAAY;EACrB,UAAU,EAAE,UAAU;EACtB,MAAM,EAAE,cAAc;EAkBpB,gDAAgD;CASnD;;AApCD,AAUE,YAVU,CAUV,GAAG,CAAC;EACF,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,KAAK;EACb,kBAAkB,EAAE,WAAW;EAC/B,UAAU,EAAE,WAAW;CAIxB;;AAlBH,AAeI,YAfQ,CAUV,GAAG,AAKA,MAAM,CAAC;EACN,SAAS,EAAE,UAAU;CACtB;;AAjBL,AAoBE,YApBU,CAoBV,cAAc,CAAC;EACb,cAAc,EAAE,eAAe;EAC/B,MAAM,EAAE,eAAe;CACxB;;AAvBH,AAwBE,YAxBU,CAwBV,cAAc,AAAA,MAAM,CAAC;EACnB,cAAc,EAAE,YAAY;EAC5B,MAAM,EAAE,YAAY;CACrB;;AA3BH,AA4BE,YA5BU,CA4BV,UAAU,CAAC;EACT,cAAc,EAAE,WAAW;EAC3B,MAAM,EAAE,WAAW;CACpB;;AA/BH,AAgCE,YAhCU,CAgCV,UAAU,AAAA,MAAM,CAAC;EACf,cAAc,EAAE,QAAQ;EACxB,MAAM,EAAE,QAAQ;CACjB",
"sources": [
"style.scss"
],
"names": [],
"file": "style.css"
}

75
public/css/common/style.scss

@ -0,0 +1,75 @@
html,
body {
background-color: #f5f5f5;
height: 100%;
overflow: hidden;
}
.left-list {
position: absolute;
right: calc(100% + 10px);
top: 8%;
min-width: 50px;
padding: 0 10px;
line-height: 3; // 12*3=36px
text-align: center;
border-right: 1px solid rgba(0, 0, 0, 0.6);
.item {
white-space: nowrap;
a{
display: inline-block;
text-decoration: none;
font-size: 1.2em;
}
}
}
.container {
width: 1100px;
margin: 0 auto;
}
.a-flex {
display: flex;
}
/*
图片类样式
*/
.img-wrapper {
width: 100px;
height: 100px;
overflow: hidden;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
border-radius: 50%;
display: inline-block;
box-sizing: border-box;
border: 3px solid #000;
img {
width: 100%;
height: 100px;
-webkit-transition: 0.3s linear;
transition: 0.3s linear;
&:hover {
transform: scale(1.1);
}
}
.grayscale-img {
-webkit-filter: grayscale(100%);
filter: grayscale(100%);
}
.grayscale-img:hover {
-webkit-filter: grayscale(0);
filter: grayscale(0);
} /* ============== * 深褐色过滤* ==============*/
.sepia-img {
-webkit-filter: sepia(100%);
filter: sepia(100%);
}
.sepia-img:hover {
-webkit-filter: sepia(0);
filter: sepia(0);
}
}

36
public/css/tool/_tool.scss

@ -0,0 +1,36 @@
@mixin media($type...) {
@each $screen in $type {
@if $screen == xs {
@media (max-width: 768px) {
@content;
}
} @else if $screen == sm {
@media (max-width: 920px) {
@content;
}
} @else if $screen == md {
@media (max-width: 1200px) {
@content;
}
} @else if $screen == lg {
@media (max-width: 1366px) {
@content;
}
}
}
}
@mixin ellipsis($lines: 1) {
@if ($lines==1) {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
} @else {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: $lines;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
}
}

320
public/css/views/404.css

@ -0,0 +1,320 @@
body{
margin: 0;
padding: 0;
}
#app {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
perspective: 1400px;
background: #fff;
font-family: 'Helvetica';
}
#app #outer {
width: 100vw;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
perspective: 1400px;
background: #fff;
transform: scale(0.75);
}
#app .wrap {
position: absolute;
width: 750px;
height: 400px;
-webkit-animation: squiggly-anim 0.3s infinite;
animation: squiggly-anim 0.3s infinite;
}
@-webkit-keyframes squiggly-anim {
0% {
filter: url("#squiggly-0");
}
25% {
filter: url("#squiggly-1");
}
50% {
-webkit-filter: url("#squiggly-2");
}
75% {
filter: url("#squiggly-3");
}
100% {
filter: url("#squiggly-4");
}
}
@keyframes squiggly-anim {
0% {
filter: url("#squiggly-0");
}
25% {
filter: url("#squiggly-1");
}
50% {
-webkit-filter: url("#squiggly-2");
}
75% {
filter: url("#squiggly-3");
}
100% {
filter: url("#squiggly-4");
}
}
#app .wrap .ghost {
position: absolute;
width: 50px;
height: 100px;
display: none;
overflow: hidden;
}
#app .wrap .ghost:nth-of-type(3) {
width: 200px;
height: 200px;
display: block;
left: 240px;
-webkit-clip-path: polygon(100% 0, 100% 67%, 82% 100%, 0 100%, 0 0);
clip-path: polygon(100% 0, 100% 67%, 82% 100%, 0 100%, 0 0);
}
#app .wrap .ghost:nth-of-type(3) .inner {
width: 50px;
height: 75px;
left: 100px;
transform-origin: 200% 100%;
box-shadow: inset 0 0 0 2px #ccc;
-webkit-animation: swing 10s ease-in-out infinite alternate;
animation: swing 10s ease-in-out infinite alternate;
transform: rotate(-90deg) translateY(75px);
}
#app .wrap .ghost:nth-of-type(3) .inner:before {
content: '';
position: absolute;
width: 4px;
height: 4px;
background: #ccc;
border-radius: 100%;
top: 10px;
right: 10px;
box-shadow: -15px 5px 0 0 #ccc;
-webkit-animation: blink2 2s ease-in-out infinite alternate;
animation: blink2 2s ease-in-out infinite alternate;
}
@-webkit-keyframes blink2 {
to {
transform: translateX(-10px) translateY(5px);
box-shadow: -15px -5px 0 0 #ccc;
}
}
@keyframes blink2 {
to {
transform: translateX(-10px) translateY(5px);
box-shadow: -15px -5px 0 0 #ccc;
}
}
@-webkit-keyframes swing {
68% {
transform: rotate(-90deg) translateY(75px);
}
70% {
transform: rotate(0deg) translateY(0px);
}
100% {
transform: rotate(0deg) translateY(0px);
}
}
@keyframes swing {
68% {
transform: rotate(-90deg) translateY(75px);
}
70% {
transform: rotate(0deg) translateY(0px);
}
100% {
transform: rotate(0deg) translateY(0px);
}
}
#app .wrap .ghost:nth-of-type(3) .inner:after {
content: '';
position: absolute;
width: 200px;
height: 125px;
bottom: -120px;
left: 0;
background: radial-gradient(circle at top, rgba(0, 0, 0, 0) 50px, #cccccc 50px, #cccccc 52px, #ffffff 52px, #ffffff 98px, #cccccc 98px, #cccccc 100px, rgba(0, 0, 0, 0) 100px);
}
#app .wrap .ghost:nth-of-type(2) {
display: block;
top: 80px;
right: 150px;
}
#app .wrap .ghost:nth-of-type(2) .inner {
-webkit-animation: peek1 10s ease-in-out infinite alternate;
animation: peek1 10s ease-in-out infinite alternate;
-webkit-animation-delay: 0.5s;
animation-delay: 0.5s;
transform: translateY(100%);
}
#app .wrap .ghost:nth-of-type(2) .inner:before {
content: '';
position: absolute;
width: 4px;
height: 4px;
background: #ccc;
border-radius: 100%;
top: 10px;
right: 10px;
box-shadow: -15px 5px 0 0 #ccc;
-webkit-animation: blink 4s linear infinite;
animation: blink 4s linear infinite;
-webkit-animation-delay: 5s;
animation-delay: 5s;
}
#app .wrap .ghost:first-of-type {
top: 65px;
left: 50px;
transform: rotate(-35deg);
display: block;
}
#app .wrap .ghost:first-of-type .inner {
-webkit-animation: peek1 10s ease-in-out infinite alternate;
animation: peek1 10s ease-in-out infinite alternate;
transform: translateY(100%);
}
#app .wrap .ghost:first-of-type .inner:before {
content: '';
position: absolute;
width: 4px;
height: 4px;
background: #ccc;
border-radius: 100%;
top: 10px;
left: 10px;
box-shadow: 15px 5px 0 0 #ccc;
-webkit-animation: blink 4s linear infinite;
animation: blink 4s linear infinite;
-webkit-animation-delay: 3s;
animation-delay: 3s;
}
@-webkit-keyframes blink {
90% {
transform: scaleY(1);
}
92% {
transform: scaleY(0);
}
94% {
transform: scaleY(1);
}
96% {
transform: scaleY(0);
}
98% {
transform: scaleY(1);
}
}
@keyframes blink {
90% {
transform: scaleY(1);
}
92% {
transform: scaleY(0);
}
94% {
transform: scaleY(1);
}
96% {
transform: scaleY(0);
}
98% {
transform: scaleY(1);
}
}
@-webkit-keyframes peek1 {
78% {
transform: translateY(100%);
}
80% {
transform: translateY(0%);
}
100% {
transform: translateY(0%);
}
}
@keyframes peek1 {
78% {
transform: translateY(100%);
}
80% {
transform: translateY(0%);
}
100% {
transform: translateY(0%);
}
}
#app .wrap .ghost .inner {
position: absolute;
width: 100%;
height: 100%;
box-shadow: inset 0 0 0 2px #ccc, inset 0 -10px 20px rgba(0, 0, 0, 0.05);
border-radius: 100px 100px 0 0;
top: 3px;
transform-style: preserve-3d;
background: #fff;
}
#app h1 {
z-index: -1;
font-size: 500px;
margin: 0px;
color: #fff;
transform-style: preserve-3d;
transform: rotateY(-30deg) rotateX(50deg);
text-shadow: 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fafafa, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fbfbfb, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fcfcfc, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fdfdfd, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 #fefefe, 0px 0px 0 white, 0px 0px 0 white, 0px 0px 0 white, 0px 0px 0 white, 0px 0px 0 white, 0px 0px 0 white, 0px 0px 0 white, 0px 0px 0 white, 0px 0px 0 white;
transition: 0.2s ease-in-out;
-webkit-animation: shadow 10s ease-in-out infinite alternate;
animation: shadow 10s ease-in-out infinite alternate;
margin-right: -50px;
will-change: text-shadow;
}
#app h1:nth-of-type(1) {
-webkit-animation-delay: 0.33333s;
animation-delay: 0.33333s;
}
#app h1:nth-of-type(2) {
-webkit-animation-delay: 0.66667s;
animation-delay: 0.66667s;
}
#app h1:nth-of-type(3) {
-webkit-animation-delay: 1s;
animation-delay: 1s;
}
@-webkit-keyframes shadow {
15% {
transform: rotateY(-30deg) rotateX(50deg) translateY(0px) translateX(0px);
text-shadow: 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9;
}
25% {
transform: rotateY(-30deg) rotateX(50deg) translateY(-75px) translateX(-50px);
text-shadow: 0.52992px 0.84805px 0 #ececec, 1.05984px 1.6961px 0 #ececec, 1.58976px 2.54414px 0 #ebebeb, 2.11968px 3.39219px 0 #ebebeb, 2.6496px 4.24024px 0 #ebebeb, 3.17952px 5.08829px 0 #ebebeb, 3.70943px 5.93634px 0 #eaeaea, 4.23935px 6.78438px 0 #eaeaea, 4.76927px 7.63243px 0 #eaeaea, 5.29919px 8.48048px 0 #eaeaea, 5.82911px 9.32853px 0 #e9e9e9, 6.35903px 10.17658px 0 #e9e9e9, 6.88895px 11.02463px 0 #e9e9e9, 7.41887px 11.87267px 0 #e9e9e9, 7.94879px 12.72072px 0 #e8e8e8, 8.47871px 13.56877px 0 #e8e8e8, 9.00863px 14.41682px 0 #e8e8e8, 9.53855px 15.26487px 0 #e8e8e8, 10.06847px 16.11291px 0 #e7e7e7, 10.59839px 16.96096px 0 #e7e7e7, 11.1283px 17.80901px 0 #e7e7e7, 11.65822px 18.65706px 0 #e7e7e7, 12.18814px 19.50511px 0 #e6e6e6, 12.71806px 20.35315px 0 #e6e6e6, 13.24798px 21.2012px 0 #e6e6e6, 13.7779px 22.04925px 0 #e6e6e6, 14.30782px 22.8973px 0 #e5e5e5, 14.83774px 23.74535px 0 #e5e5e5, 15.36766px 24.59339px 0 #e5e5e5, 15.89758px 25.44144px 0 #e5e5e5, 16.4275px 26.28949px 0 #e4e4e4, 16.95742px 27.13754px 0 #e4e4e4, 17.48734px 27.98559px 0 #e4e4e4, 18.01725px 28.83364px 0 #e4e4e4, 18.54717px 29.68168px 0 #e3e3e3, 19.07709px 30.52973px 0 #e3e3e3, 19.60701px 31.37778px 0 #e3e3e3, 20.13693px 32.22583px 0 #e3e3e3, 20.66685px 33.07388px 0 #e2e2e2, 21.19677px 33.92192px 0 #e2e2e2, 21.72669px 34.76997px 0 #e2e2e2, 22.25661px 35.61802px 0 #e2e2e2, 22.78653px 36.46607px 0 #e1e1e1, 23.31645px 37.31412px 0 #e1e1e1, 23.84637px 38.16216px 0 #e1e1e1, 24.37629px 39.01021px 0 #e1e1e1, 24.90621px 39.85826px 0 #e0e0e0, 25.43612px 40.70631px 0 #e0e0e0, 25.96604px 41.55436px 0 #e0e0e0, 26.49596px 42.4024px 0 #e0e0e0, 27.02588px 43.25045px 0 #dfdfdf, 27.5558px 44.0985px 0 #dfdfdf, 28.08572px 44.94655px 0 #dfdfdf, 28.61564px 45.7946px 0 #dfdfdf, 29.14556px 46.64265px 0 #dedede, 29.67548px 47.49069px 0 #dedede, 30.2054px 48.33874px 0 #dedede, 30.73532px 49.18679px 0 #dedede, 31.26524px 50.03484px 0 #dddddd, 31.79516px 50.88289px 0 #dddddd, 32.32508px 51.73093px 0 #dddddd, 32.85499px 52.57898px 0 #dddddd, 33.38491px 53.42703px 0 gainsboro, 33.91483px 54.27508px 0 gainsboro, 34.44475px 55.12313px 0 gainsboro, 34.97467px 55.97117px 0 gainsboro, 35.50459px 56.81922px 0 #dbdbdb, 36.03451px 57.66727px 0 #dbdbdb, 36.56443px 58.51532px 0 #dbdbdb, 37.09435px 59.36337px 0 #dbdbdb, 37.62427px 60.21141px 0 #dadada, 38.15419px 61.05946px 0 #dadada, 38.68411px 61.90751px 0 #dadada, 39.21403px 62.75556px 0 #dadada, 39.74394px 63.60361px 0 #d9d9d9, 40.27386px 64.45166px 0 #d9d9d9, 40.80378px 65.2997px 0 #d9d9d9, 41.3337px 66.14775px 0 #d9d9d9, 41.86362px 66.9958px 0 #d8d8d8, 42.39354px 67.84385px 0 #d8d8d8, 42.92346px 68.6919px 0 #d8d8d8, 43.45338px 69.53994px 0 #d8d8d8, 43.9833px 70.38799px 0 #d7d7d7, 44.51322px 71.23604px 0 #d7d7d7, 45.04314px 72.08409px 0 #d7d7d7, 45.57306px 72.93214px 0 #d7d7d7, 46.10298px 73.78018px 0 #d6d6d6, 46.6329px 74.62823px 0 #d6d6d6, 47.16281px 75.47628px 0 #d6d6d6, 47.69273px 76.32433px 0 #d6d6d6, 48.22265px 77.17238px 0 #d5d5d5, 48.75257px 78.02042px 0 #d5d5d5, 49.28249px 78.86847px 0 #d5d5d5, 49.81241px 79.71652px 0 #d5d5d5, 50.34233px 80.56457px 0 #d4d4d4, 50.87225px 81.41262px 0 #d4d4d4, 51.40217px 82.26067px 0 #d4d4d4, 51.93209px 83.10871px 0 #d4d4d4, 52.46201px 83.95676px 0 lightgray, 52.99193px 84.80481px 0 lightgray;
}
100% {
transform: rotateY(-30deg) rotateX(50deg) translateY(-75px) translateX(-50px);
text-shadow: 0.52992px 0.84805px 0 #ececec, 1.05984px 1.6961px 0 #ececec, 1.58976px 2.54414px 0 #ebebeb, 2.11968px 3.39219px 0 #ebebeb, 2.6496px 4.24024px 0 #ebebeb, 3.17952px 5.08829px 0 #ebebeb, 3.70943px 5.93634px 0 #eaeaea, 4.23935px 6.78438px 0 #eaeaea, 4.76927px 7.63243px 0 #eaeaea, 5.29919px 8.48048px 0 #eaeaea, 5.82911px 9.32853px 0 #e9e9e9, 6.35903px 10.17658px 0 #e9e9e9, 6.88895px 11.02463px 0 #e9e9e9, 7.41887px 11.87267px 0 #e9e9e9, 7.94879px 12.72072px 0 #e8e8e8, 8.47871px 13.56877px 0 #e8e8e8, 9.00863px 14.41682px 0 #e8e8e8, 9.53855px 15.26487px 0 #e8e8e8, 10.06847px 16.11291px 0 #e7e7e7, 10.59839px 16.96096px 0 #e7e7e7, 11.1283px 17.80901px 0 #e7e7e7, 11.65822px 18.65706px 0 #e7e7e7, 12.18814px 19.50511px 0 #e6e6e6, 12.71806px 20.35315px 0 #e6e6e6, 13.24798px 21.2012px 0 #e6e6e6, 13.7779px 22.04925px 0 #e6e6e6, 14.30782px 22.8973px 0 #e5e5e5, 14.83774px 23.74535px 0 #e5e5e5, 15.36766px 24.59339px 0 #e5e5e5, 15.89758px 25.44144px 0 #e5e5e5, 16.4275px 26.28949px 0 #e4e4e4, 16.95742px 27.13754px 0 #e4e4e4, 17.48734px 27.98559px 0 #e4e4e4, 18.01725px 28.83364px 0 #e4e4e4, 18.54717px 29.68168px 0 #e3e3e3, 19.07709px 30.52973px 0 #e3e3e3, 19.60701px 31.37778px 0 #e3e3e3, 20.13693px 32.22583px 0 #e3e3e3, 20.66685px 33.07388px 0 #e2e2e2, 21.19677px 33.92192px 0 #e2e2e2, 21.72669px 34.76997px 0 #e2e2e2, 22.25661px 35.61802px 0 #e2e2e2, 22.78653px 36.46607px 0 #e1e1e1, 23.31645px 37.31412px 0 #e1e1e1, 23.84637px 38.16216px 0 #e1e1e1, 24.37629px 39.01021px 0 #e1e1e1, 24.90621px 39.85826px 0 #e0e0e0, 25.43612px 40.70631px 0 #e0e0e0, 25.96604px 41.55436px 0 #e0e0e0, 26.49596px 42.4024px 0 #e0e0e0, 27.02588px 43.25045px 0 #dfdfdf, 27.5558px 44.0985px 0 #dfdfdf, 28.08572px 44.94655px 0 #dfdfdf, 28.61564px 45.7946px 0 #dfdfdf, 29.14556px 46.64265px 0 #dedede, 29.67548px 47.49069px 0 #dedede, 30.2054px 48.33874px 0 #dedede, 30.73532px 49.18679px 0 #dedede, 31.26524px 50.03484px 0 #dddddd, 31.79516px 50.88289px 0 #dddddd, 32.32508px 51.73093px 0 #dddddd, 32.85499px 52.57898px 0 #dddddd, 33.38491px 53.42703px 0 gainsboro, 33.91483px 54.27508px 0 gainsboro, 34.44475px 55.12313px 0 gainsboro, 34.97467px 55.97117px 0 gainsboro, 35.50459px 56.81922px 0 #dbdbdb, 36.03451px 57.66727px 0 #dbdbdb, 36.56443px 58.51532px 0 #dbdbdb, 37.09435px 59.36337px 0 #dbdbdb, 37.62427px 60.21141px 0 #dadada, 38.15419px 61.05946px 0 #dadada, 38.68411px 61.90751px 0 #dadada, 39.21403px 62.75556px 0 #dadada, 39.74394px 63.60361px 0 #d9d9d9, 40.27386px 64.45166px 0 #d9d9d9, 40.80378px 65.2997px 0 #d9d9d9, 41.3337px 66.14775px 0 #d9d9d9, 41.86362px 66.9958px 0 #d8d8d8, 42.39354px 67.84385px 0 #d8d8d8, 42.92346px 68.6919px 0 #d8d8d8, 43.45338px 69.53994px 0 #d8d8d8, 43.9833px 70.38799px 0 #d7d7d7, 44.51322px 71.23604px 0 #d7d7d7, 45.04314px 72.08409px 0 #d7d7d7, 45.57306px 72.93214px 0 #d7d7d7, 46.10298px 73.78018px 0 #d6d6d6, 46.6329px 74.62823px 0 #d6d6d6, 47.16281px 75.47628px 0 #d6d6d6, 47.69273px 76.32433px 0 #d6d6d6, 48.22265px 77.17238px 0 #d5d5d5, 48.75257px 78.02042px 0 #d5d5d5, 49.28249px 78.86847px 0 #d5d5d5, 49.81241px 79.71652px 0 #d5d5d5, 50.34233px 80.56457px 0 #d4d4d4, 50.87225px 81.41262px 0 #d4d4d4, 51.40217px 82.26067px 0 #d4d4d4, 51.93209px 83.10871px 0 #d4d4d4, 52.46201px 83.95676px 0 lightgray, 52.99193px 84.80481px 0 lightgray;
}
}
@keyframes shadow {
15% {
transform: rotateY(-30deg) rotateX(50deg) translateY(0px) translateX(0px);
text-shadow: 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9, 0px 0px 0 #f9f9f9;
}
25% {
transform: rotateY(-30deg) rotateX(50deg) translateY(-75px) translateX(-50px);
text-shadow: 0.52992px 0.84805px 0 #ececec, 1.05984px 1.6961px 0 #ececec, 1.58976px 2.54414px 0 #ebebeb, 2.11968px 3.39219px 0 #ebebeb, 2.6496px 4.24024px 0 #ebebeb, 3.17952px 5.08829px 0 #ebebeb, 3.70943px 5.93634px 0 #eaeaea, 4.23935px 6.78438px 0 #eaeaea, 4.76927px 7.63243px 0 #eaeaea, 5.29919px 8.48048px 0 #eaeaea, 5.82911px 9.32853px 0 #e9e9e9, 6.35903px 10.17658px 0 #e9e9e9, 6.88895px 11.02463px 0 #e9e9e9, 7.41887px 11.87267px 0 #e9e9e9, 7.94879px 12.72072px 0 #e8e8e8, 8.47871px 13.56877px 0 #e8e8e8, 9.00863px 14.41682px 0 #e8e8e8, 9.53855px 15.26487px 0 #e8e8e8, 10.06847px 16.11291px 0 #e7e7e7, 10.59839px 16.96096px 0 #e7e7e7, 11.1283px 17.80901px 0 #e7e7e7, 11.65822px 18.65706px 0 #e7e7e7, 12.18814px 19.50511px 0 #e6e6e6, 12.71806px 20.35315px 0 #e6e6e6, 13.24798px 21.2012px 0 #e6e6e6, 13.7779px 22.04925px 0 #e6e6e6, 14.30782px 22.8973px 0 #e5e5e5, 14.83774px 23.74535px 0 #e5e5e5, 15.36766px 24.59339px 0 #e5e5e5, 15.89758px 25.44144px 0 #e5e5e5, 16.4275px 26.28949px 0 #e4e4e4, 16.95742px 27.13754px 0 #e4e4e4, 17.48734px 27.98559px 0 #e4e4e4, 18.01725px 28.83364px 0 #e4e4e4, 18.54717px 29.68168px 0 #e3e3e3, 19.07709px 30.52973px 0 #e3e3e3, 19.60701px 31.37778px 0 #e3e3e3, 20.13693px 32.22583px 0 #e3e3e3, 20.66685px 33.07388px 0 #e2e2e2, 21.19677px 33.92192px 0 #e2e2e2, 21.72669px 34.76997px 0 #e2e2e2, 22.25661px 35.61802px 0 #e2e2e2, 22.78653px 36.46607px 0 #e1e1e1, 23.31645px 37.31412px 0 #e1e1e1, 23.84637px 38.16216px 0 #e1e1e1, 24.37629px 39.01021px 0 #e1e1e1, 24.90621px 39.85826px 0 #e0e0e0, 25.43612px 40.70631px 0 #e0e0e0, 25.96604px 41.55436px 0 #e0e0e0, 26.49596px 42.4024px 0 #e0e0e0, 27.02588px 43.25045px 0 #dfdfdf, 27.5558px 44.0985px 0 #dfdfdf, 28.08572px 44.94655px 0 #dfdfdf, 28.61564px 45.7946px 0 #dfdfdf, 29.14556px 46.64265px 0 #dedede, 29.67548px 47.49069px 0 #dedede, 30.2054px 48.33874px 0 #dedede, 30.73532px 49.18679px 0 #dedede, 31.26524px 50.03484px 0 #dddddd, 31.79516px 50.88289px 0 #dddddd, 32.32508px 51.73093px 0 #dddddd, 32.85499px 52.57898px 0 #dddddd, 33.38491px 53.42703px 0 gainsboro, 33.91483px 54.27508px 0 gainsboro, 34.44475px 55.12313px 0 gainsboro, 34.97467px 55.97117px 0 gainsboro, 35.50459px 56.81922px 0 #dbdbdb, 36.03451px 57.66727px 0 #dbdbdb, 36.56443px 58.51532px 0 #dbdbdb, 37.09435px 59.36337px 0 #dbdbdb, 37.62427px 60.21141px 0 #dadada, 38.15419px 61.05946px 0 #dadada, 38.68411px 61.90751px 0 #dadada, 39.21403px 62.75556px 0 #dadada, 39.74394px 63.60361px 0 #d9d9d9, 40.27386px 64.45166px 0 #d9d9d9, 40.80378px 65.2997px 0 #d9d9d9, 41.3337px 66.14775px 0 #d9d9d9, 41.86362px 66.9958px 0 #d8d8d8, 42.39354px 67.84385px 0 #d8d8d8, 42.92346px 68.6919px 0 #d8d8d8, 43.45338px 69.53994px 0 #d8d8d8, 43.9833px 70.38799px 0 #d7d7d7, 44.51322px 71.23604px 0 #d7d7d7, 45.04314px 72.08409px 0 #d7d7d7, 45.57306px 72.93214px 0 #d7d7d7, 46.10298px 73.78018px 0 #d6d6d6, 46.6329px 74.62823px 0 #d6d6d6, 47.16281px 75.47628px 0 #d6d6d6, 47.69273px 76.32433px 0 #d6d6d6, 48.22265px 77.17238px 0 #d5d5d5, 48.75257px 78.02042px 0 #d5d5d5, 49.28249px 78.86847px 0 #d5d5d5, 49.81241px 79.71652px 0 #d5d5d5, 50.34233px 80.56457px 0 #d4d4d4, 50.87225px 81.41262px 0 #d4d4d4, 51.40217px 82.26067px 0 #d4d4d4, 51.93209px 83.10871px 0 #d4d4d4, 52.46201px 83.95676px 0 lightgray, 52.99193px 84.80481px 0 lightgray;
}
100% {
transform: rotateY(-30deg) rotateX(50deg) translateY(-75px) translateX(-50px);
text-shadow: 0.52992px 0.84805px 0 #ececec, 1.05984px 1.6961px 0 #ececec, 1.58976px 2.54414px 0 #ebebeb, 2.11968px 3.39219px 0 #ebebeb, 2.6496px 4.24024px 0 #ebebeb, 3.17952px 5.08829px 0 #ebebeb, 3.70943px 5.93634px 0 #eaeaea, 4.23935px 6.78438px 0 #eaeaea, 4.76927px 7.63243px 0 #eaeaea, 5.29919px 8.48048px 0 #eaeaea, 5.82911px 9.32853px 0 #e9e9e9, 6.35903px 10.17658px 0 #e9e9e9, 6.88895px 11.02463px 0 #e9e9e9, 7.41887px 11.87267px 0 #e9e9e9, 7.94879px 12.72072px 0 #e8e8e8, 8.47871px 13.56877px 0 #e8e8e8, 9.00863px 14.41682px 0 #e8e8e8, 9.53855px 15.26487px 0 #e8e8e8, 10.06847px 16.11291px 0 #e7e7e7, 10.59839px 16.96096px 0 #e7e7e7, 11.1283px 17.80901px 0 #e7e7e7, 11.65822px 18.65706px 0 #e7e7e7, 12.18814px 19.50511px 0 #e6e6e6, 12.71806px 20.35315px 0 #e6e6e6, 13.24798px 21.2012px 0 #e6e6e6, 13.7779px 22.04925px 0 #e6e6e6, 14.30782px 22.8973px 0 #e5e5e5, 14.83774px 23.74535px 0 #e5e5e5, 15.36766px 24.59339px 0 #e5e5e5, 15.89758px 25.44144px 0 #e5e5e5, 16.4275px 26.28949px 0 #e4e4e4, 16.95742px 27.13754px 0 #e4e4e4, 17.48734px 27.98559px 0 #e4e4e4, 18.01725px 28.83364px 0 #e4e4e4, 18.54717px 29.68168px 0 #e3e3e3, 19.07709px 30.52973px 0 #e3e3e3, 19.60701px 31.37778px 0 #e3e3e3, 20.13693px 32.22583px 0 #e3e3e3, 20.66685px 33.07388px 0 #e2e2e2, 21.19677px 33.92192px 0 #e2e2e2, 21.72669px 34.76997px 0 #e2e2e2, 22.25661px 35.61802px 0 #e2e2e2, 22.78653px 36.46607px 0 #e1e1e1, 23.31645px 37.31412px 0 #e1e1e1, 23.84637px 38.16216px 0 #e1e1e1, 24.37629px 39.01021px 0 #e1e1e1, 24.90621px 39.85826px 0 #e0e0e0, 25.43612px 40.70631px 0 #e0e0e0, 25.96604px 41.55436px 0 #e0e0e0, 26.49596px 42.4024px 0 #e0e0e0, 27.02588px 43.25045px 0 #dfdfdf, 27.5558px 44.0985px 0 #dfdfdf, 28.08572px 44.94655px 0 #dfdfdf, 28.61564px 45.7946px 0 #dfdfdf, 29.14556px 46.64265px 0 #dedede, 29.67548px 47.49069px 0 #dedede, 30.2054px 48.33874px 0 #dedede, 30.73532px 49.18679px 0 #dedede, 31.26524px 50.03484px 0 #dddddd, 31.79516px 50.88289px 0 #dddddd, 32.32508px 51.73093px 0 #dddddd, 32.85499px 52.57898px 0 #dddddd, 33.38491px 53.42703px 0 gainsboro, 33.91483px 54.27508px 0 gainsboro, 34.44475px 55.12313px 0 gainsboro, 34.97467px 55.97117px 0 gainsboro, 35.50459px 56.81922px 0 #dbdbdb, 36.03451px 57.66727px 0 #dbdbdb, 36.56443px 58.51532px 0 #dbdbdb, 37.09435px 59.36337px 0 #dbdbdb, 37.62427px 60.21141px 0 #dadada, 38.15419px 61.05946px 0 #dadada, 38.68411px 61.90751px 0 #dadada, 39.21403px 62.75556px 0 #dadada, 39.74394px 63.60361px 0 #d9d9d9, 40.27386px 64.45166px 0 #d9d9d9, 40.80378px 65.2997px 0 #d9d9d9, 41.3337px 66.14775px 0 #d9d9d9, 41.86362px 66.9958px 0 #d8d8d8, 42.39354px 67.84385px 0 #d8d8d8, 42.92346px 68.6919px 0 #d8d8d8, 43.45338px 69.53994px 0 #d8d8d8, 43.9833px 70.38799px 0 #d7d7d7, 44.51322px 71.23604px 0 #d7d7d7, 45.04314px 72.08409px 0 #d7d7d7, 45.57306px 72.93214px 0 #d7d7d7, 46.10298px 73.78018px 0 #d6d6d6, 46.6329px 74.62823px 0 #d6d6d6, 47.16281px 75.47628px 0 #d6d6d6, 47.69273px 76.32433px 0 #d6d6d6, 48.22265px 77.17238px 0 #d5d5d5, 48.75257px 78.02042px 0 #d5d5d5, 49.28249px 78.86847px 0 #d5d5d5, 49.81241px 79.71652px 0 #d5d5d5, 50.34233px 80.56457px 0 #d4d4d4, 50.87225px 81.41262px 0 #d4d4d4, 51.40217px 82.26067px 0 #d4d4d4, 51.93209px 83.10871px 0 #d4d4d4, 52.46201px 83.95676px 0 lightgray, 52.99193px 84.80481px 0 lightgray;
}
}

95
public/css/views/color.css

@ -0,0 +1,95 @@
.page {
min-height: 100%;
padding-top: 20px;
position: relative;
}
.color_list {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
}
.color_list .color_item {
position: relative;
display: inline-block;
border-radius: 5px;
overflow: hidden;
padding: 5px 10px;
cursor: pointer;
width: 100px;
height: 125px;
}
.color_list .color_item:hover .color_add {
-webkit-transform: translate(-50%, -50%) scale(1.3);
transform: translate(-50%, -50%) scale(1.3);
}
.color_list .color_item .color_add {
width: 50px;
height: 50px;
position: absolute;
top: 50%;
left: 50%;
-webkit-transition: -webkit-transform .3s linear;
transition: -webkit-transform .3s linear;
transition: transform .3s linear;
transition: transform .3s linear, -webkit-transform .3s linear;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
.color_list .color_item:hover {
background-color: rgba(0, 0, 0, 0.041);
}
.color_list .color_item:hover .color_toggle_list {
max-height: 99px;
}
.color_list .color_item .color_toggle_list {
overflow: hidden;
position: absolute;
bottom: 0;
left: 0;
right: 0;
width: 100%;
max-height: 0;
-webkit-transition: max-height .5s linear;
transition: max-height .5s linear;
background-color: rgba(180, 180, 180, 0.274);
}
.color_list .color_item .color_toggle_list .color_toggle_item {
display: inline-block;
padding: 2px 6px;
}
.color_list .color_item .color_toggle_list .color_toggle_item:hover {
background-color: rgba(0, 0, 0, 0.185);
}
.color_list .color_item .color_item_bg {
height: 50px;
background-color: red;
position: relative;
}
.color_list .color_item .color_item_content .color_item_title {
font-size: 1.2em;
font-weight: bold;
}
.color_list .color_item .color_item_content .color_item_desc {
color: #a7a6a6;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
}
/*# sourceMappingURL=color.css.map */

10
public/css/views/color.css.map

@ -0,0 +1,10 @@
{
"version": 3,
"mappings": "AAEA,AAAA,KAAK,CAAC;EACJ,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,IAAI;EACjB,QAAQ,EAAE,QAAQ;CACnB;;AAED,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,IAAI;EACb,SAAS,EAAE,IAAI;CAgEhB;;AAlED,AAGE,WAHS,CAGT,WAAW,CAAC;EACV,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;EACrB,aAAa,EAAE,GAAG;EAClB,QAAQ,EAAE,MAAM;EAChB,OAAO,EAAE,QAAQ;EACjB,MAAM,EAAE,OAAO;EACf,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,KAAK;CAsDd;;AAjEH,AAaM,WAbK,CAGT,WAAW,AASR,MAAM,CACL,UAAU,CAAA;EACR,SAAS,EAAE,qBAAoB,CAAC,UAAU;CAC3C;;AAfP,AAiBI,WAjBO,CAGT,WAAW,CAcT,UAAU,CAAA;EACR,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,GAAG;EACT,UAAU,EAAE,oBAAoB;EAChC,SAAS,EAAE,qBAAoB;CAChC;;AAzBL,AA0BI,WA1BO,CAGT,WAAW,AAuBR,MAAM,CAAC;EACN,gBAAgB,EAAE,oBAAoB;CAIvC;;AA/BL,AA4BM,WA5BK,CAGT,WAAW,AAuBR,MAAM,CAEL,kBAAkB,CAAC;EACjB,UAAU,EAAE,IAAI;CACjB;;AA9BP,AAgCI,WAhCO,CAGT,WAAW,CA6BT,kBAAkB,CAAC;EACjB,QAAQ,EAAE,MAAM;EAChB,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,CAAC;EACb,UAAU,EAAE,qBAAqB;EACjC,gBAAgB,EAAE,0BAA0B;CAQ7C;;AAjDL,AA0CM,WA1CK,CAGT,WAAW,CA6BT,kBAAkB,CAUhB,kBAAkB,CAAC;EACjB,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,OAAO;CAIjB;;AAhDP,AA6CQ,WA7CG,CAGT,WAAW,CA6BT,kBAAkB,CAUhB,kBAAkB,AAGf,MAAM,CAAC;EACN,gBAAgB,EAAE,oBAAoB;CACvC;;AA/CT,AAkDI,WAlDO,CAGT,WAAW,CA+CT,cAAc,CAAC;EACb,MAAM,EAAE,IAAI;EACZ,gBAAgB,EAAE,GAAG;EACrB,QAAQ,EAAE,QAAQ;CACnB;;AAtDL,AAwDM,WAxDK,CAGT,WAAW,CAoDT,mBAAmB,CACjB,iBAAiB,CAAC;EAChB,SAAS,EAAE,KAAK;EAChB,WAAW,EAAE,IAAI;CAClB;;AA3DP,AA4DM,WA5DK,CAGT,WAAW,CAoDT,mBAAmB,CAKjB,gBAAgB,CAAC;EACf,KAAK,EAAE,OAAkB;ECzC7B,OAAO,EAAE,WAAW;EACpB,kBAAkB,EAAE,QAAQ;EAC5B,kBAAkB,EDwCI,CAAC;ECvCvB,QAAQ,EAAE,MAAM;EAChB,aAAa,EAAE,QAAQ;EACvB,UAAU,EAAE,SAAS;CDsClB",
"sources": [
"color.scss",
"../tool/_tool.scss"
],
"names": [],
"file": "color.css"
}

75
public/css/views/color.scss

@ -0,0 +1,75 @@
@import "../tool/tool";
.page {
min-height: 100%;
padding-top: 20px;
position: relative;
}
.color_list {
display: flex;
flex-wrap: wrap;
.color_item {
position: relative;
display: inline-block;
border-radius: 5px;
overflow: hidden;
padding: 5px 10px;
cursor: pointer;
width: 100px;
height: 125px;
&:hover{
.color_add{
transform: translate(-50%,-50%) scale(1.3);
}
}
.color_add{
width: 50px;
height: 50px;
position: absolute;
top: 50%;
left: 50%;
transition: transform .3s linear;
transform: translate(-50%,-50%);
}
&:hover {
background-color: rgba(0, 0, 0, 0.041);
.color_toggle_list {
max-height: 99px;
}
}
.color_toggle_list {
overflow: hidden;
position: absolute;
bottom: 0;
left: 0;
right: 0;
width: 100%;
max-height: 0;
transition: max-height .5s linear;
background-color: rgba(180, 180, 180, 0.274);
.color_toggle_item {
display: inline-block;
padding: 2px 6px;
&:hover {
background-color: rgba(0, 0, 0, 0.185);
}
}
}
.color_item_bg {
height: 50px;
background-color: red;
position: relative;
}
.color_item_content {
.color_item_title {
font-size: 1.2em;
font-weight: bold;
}
.color_item_desc {
color: rgb(167, 166, 166);
@include ellipsis(2);
}
}
}
}

60
public/css/views/index.css

@ -0,0 +1,60 @@
@charset "UTF-8";
.avatar {
width: 100px;
height: 100px;
border-radius: 50%;
}
.page {
min-height: 100%;
padding-top: 20px;
position: relative;
}
/*
用户信息样式
*/
.userinfo {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
width: 500px;
}
@media (max-width: 768px) {
.userinfo {
width: 100%;
}
}
@media (max-width: 920px) {
.userinfo {
width: 100%;
}
}
.userinfo .user_detail {
-webkit-box-flex: 1;
-ms-flex: 1;
flex: 1;
margin-left: 10px;
}
.userinfo .user_detail .user_name {
font-size: 1.67em;
}
.userinfo .user_detail .user_desc {
text-indent: 10px;
padding-top: 5px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
}
/*# sourceMappingURL=index.css.map */

10
public/css/views/index.css.map

@ -0,0 +1,10 @@
{
"version": 3,
"mappings": ";AAOA,AAAA,OAAO,CAAA;EACL,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,KAAK;EACb,aAAa,EAAE,GAAG;CACnB;;AAED,AAAA,KAAK,CAAA;EACH,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,IAAI;EACjB,QAAQ,EAAE,QAAQ;CACnB;;AAED;;EAEE;AACF,AAAA,SAAS,CAAA;EACP,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,KAAK,EAAE,KAAK;CAgBb;;ACtCK,MAAM,EAAE,SAAS,EAAE,KAAK;EDmB9B,AAAA,SAAS,CAAA;IAKL,KAAK,EAAE,IAAI;GAcd;;;AClCK,MAAM,EAAE,SAAS,EAAE,KAAK;EDe9B,AAAA,SAAS,CAAA;IAKL,KAAK,EAAE,IAAI;GAcd;;;AAnBD,AAOE,SAPO,CAOP,YAAY,CAAA;EACV,IAAI,EAAE,CAAC;EACP,WAAW,EAAE,IAAI;CASlB;;AAlBH,AAUI,SAVK,CAOP,YAAY,CAGV,UAAU,CAAA;EACR,SAAS,EAAE,MAAM;CAClB;;AAZL,AAaI,SAbK,CAOP,YAAY,CAMV,UAAU,CAAA;EACR,WAAW,EAAE,IAAI;EACjB,WAAW,EAAE,GAAG;ECTlB,OAAO,EAAE,WAAW;EACpB,kBAAkB,EAAE,QAAQ;EAC5B,kBAAkB,EDQE,CAAC;ECPrB,QAAQ,EAAE,MAAM;EAChB,aAAa,EAAE,QAAQ;EACvB,UAAU,EAAE,SAAS;CDMpB",
"sources": [
"index.scss",
"../tool/_tool.scss"
],
"names": [],
"file": "index.css"
}

43
public/css/views/index.scss

@ -0,0 +1,43 @@
@import "../tool/tool";
// body{
// background-image: url(/public/image/gezi.png);
// background-size: 20px 20px;
// }
.avatar{
width: 100px;
height: 100px;
border-radius: 50%;
}
.page{
min-height: 100%;
padding-top: 20px;
position: relative;
}
/*
用户信息样式
*/
.userinfo{
display: flex;
align-items: center;
width: 500px;
@include media(xs,sm) {
width: 100%;
}
.user_detail{
flex: 1;
margin-left: 10px;
.user_name{
font-size: 1.67em; // 20px/12
}
.user_desc{
text-indent: 10px; //
padding-top: 5px;
@include ellipsis(3)
}
}
}

BIN
public/image/add.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

3
public/style.css

@ -1,3 +0,0 @@
*{
color: red;
}

5
readme.md

@ -0,0 +1,5 @@
* http://html2jade.org/
* https://darkmodejs.learn.uno/
* https://blog.csdn.net/weixin_39923599/article/details/111214071
* https://pugjs.org/language/attributes.html
* https://blog.meathill.com/tech/fe/interpolation-in-pug-with-extends.html

BIN
source/db/data.db

Binary file not shown.

16
source/db/init.ts

@ -1,11 +1,17 @@
import {connect} from "@/db/index"
import User from "@/model/User"
import {connect, sequelize} from "@/db/index"
import "@/model/User"
import "@/model/Color"
const argv = require('minimist')(process.argv.slice(2));
const isForce = !!(argv._.indexOf("force")!=-1) || false
const isForce = !!(argv._.indexOf("force")!=-1) || false // 会把之前的表删除,慎用
const isAlter = !!(argv._.indexOf("alter")!=-1) || false
connect().then(()=>{
User.sync({force: isForce,alter: isAlter})
})
sequelize.sync({force: isForce,alter: isAlter});
// User.sync({force: isForce,alter: isAlter})
// Color.sync({force: isForce,alter: isAlter})
// ColorChunk.sync({force: isForce,alter: isAlter})
})

27
source/model/Color.ts

@ -0,0 +1,27 @@
import { sequelize, connect } from "@/db/index";
import { DataTypes } from "sequelize";
/**
*
*/
const Color = sequelize.define(
"Color",
{
// 图片地址
color: {
type: DataTypes.STRING
},
title: {
type: DataTypes.STRING,
allowNull: true
},
describe: {
type: DataTypes.STRING,
allowNull: true
},
},
{
timestamps: false,
}
);
export { Color };

1
source/plugins/index.ts

@ -11,6 +11,7 @@ export default [
plugin: routePlugin,
options: {
sourceDir: path.resolve(sourceDir, "route"),
type: "session"
},
},
];

6
source/route/api/user/index.ts

@ -63,7 +63,7 @@ export default class {
@method("DELETE")
@auth()
@route("/del")
@swagger("删除用户", "删除用户账号", ["api"])
@swagger("删除用户", "删除用户账号", ["sum"])
async del(request, h) {
const { id } = request.auth.credentials;
let result = await User.findOne({ where: { id: id } });
@ -78,10 +78,10 @@ export default class {
@route("/userinfo")
@validate({
headers: Joi.object({
Authorization: Joi.string(),
test: Joi.number(),
}).unknown(), // 注意加上这个
})
@swagger("获取用户信息", "返回注册用户的信息", ["api"])
@swagger("获取用户信息", "返回注册用户的信息", ["用户操作","api"])
async userinfo(request, h) {
console.log(request);
const { id } = request.auth.credentials;

7
source/route/api/wx/index.ts

@ -0,0 +1,7 @@
export default class {
wxinit(req,h){
// const {subgbat÷}÷
}
}

46
source/route/color/index.ts

@ -0,0 +1,46 @@
import { Color } from "@/model/Color";
import { gFail, gSuccess } from "@/util";
import Joi from "joi";
import { auth, method, route, validate } from "@noderun/hapi-router";
export default class {
index(request,h){
return h.view('views/color.pug')
}
@method("POST")
@route("/add")
@validate({
payload: Joi.object({
color: Joi.string().required(),
title: Joi.string(),
describe: Joi.string(),
}),
})
async add(request, h) {
let { color, title, describe } = request.payload || {};
try {
await Color.create({ color, title, describe });
return gSuccess("success");
} catch (error) {
request.log("error", error);
return gFail(null, "添加颜色失败");
}
}
@method("GET")
@route("/all_color")
async getAll(request, h) {
try {
let allColors = <any>await Color.findAll();
if (allColors == null) {
return gFail(null, "不存在颜色");
}
return gSuccess(allColors, "success");
} catch (error) {
request.log("error", error);
return gFail(null, "获取颜色失败");
}
}
}

3
source/route/index/_upload.ts → source/route/demo/_upload.ts

@ -53,8 +53,7 @@ export default function (req, h) {
"the form is " + Math.floor(percentComplete) + "%" + " complete"
);
});
form.parse(req.payload, async function (err, fields, files) {
form.parse(req.payload.file, async function (err, fields, files) {
// console.log(err, fields, files);
if (err) {

35
source/route/demo/index.ts

@ -0,0 +1,35 @@
import { config, method, route, swagger, validate } from "@noderun/hapi-router";
import UploadFunc from "./_upload";
import Joi from "joi";
export default class {
index(request, h) {
return h.view("views/demo.ejs");
}
@config({
payload: {
maxBytes: 20000 * 1024 * 1024,
output: "stream",
parse: false,
// multipart: true,
allow: "multipart/form-data",
}
})
@method("POST")
@swagger("文件上传", "文件上传a ", ["sum", "api"])
async upload(req, h) {
const startTime = new Date().getTime();
const res = await UploadFunc(req, h);
const endTime = new Date().getTime();
console.log(
`该请求处理时间为:${Number(endTime - startTime).toFixed(2)}ms`
);
return res;
}
@route("/{path*}")
async 404(req, h) {
// 404页面
return h.view("404.ejs");
}
}

7
source/route/index/color.ts

@ -0,0 +1,7 @@
export default class {
index(req, h){
}
}

72
source/route/index/index.ts

@ -1,33 +1,63 @@
import { config, method, route } from "@noderun/hapi-router";
import UploadFunc from "./_upload";
import {
auth,
config,
method,
route,
swagger,
validate,
} from "@noderun/hapi-router";
import UploadFunc from "../demo/_upload";
import Joi from "joi";
import User from "@/model/User";
import * as bcrypt from "bcrypt";
export default class {
@auth()
@config({
auth: {
mode: "try"
}
})
index(request, h) {
return h.view("views/index.ejs");
// console.log(request.auth);
if(request.isAuthenticated){
// 登录了
}else{
// 未登录
}
return h.view("views/index.pug");
}
@method("GET")
@route("/login")
loginView(request, h) {
return h.view("views/login.ejs");
}
@config({
payload: {
maxBytes: 20000 * 1024 * 1024,
output: "stream",
parse: false,
allow: "multipart/form-data",
},
})
@method("POST")
async upload(req, h) {
const startTime = new Date().getTime();
const res = await UploadFunc(req, h);
const endTime = new Date().getTime();
console.log(
`该请求处理时间为:${Number(endTime - startTime).toFixed(2)}ms`
);
return res;
@auth(false)
@route("/login")
async login(request, h) {
const { username, password } = request.payload;
const account = <any>await User.findOne({ where: { username: username } });
if (!account || !(await bcrypt.compare(password, account.password))) {
return h.view("/login");
}
request.cookieAuth.set({ id: account.id });
return h.redirect("/");
}
@route("/about")
@auth()
about(request, h) {
console.log(request.auth);
return h.view("views/about.ejs");
}
@route("/{path*}")
async 404(req, h) {
// 404页面
return h.view("404.ejs");
return h.view("404.pug");
}
}

14
source/route/route.txt

@ -4,6 +4,16 @@
/api/user/login 该路由不需要权限
/api/user/del 该路由需要权限
/api/user/userinfo 该路由需要权限
/api/wx/wxinit 该路由需要权限
/color 该路由不需要权限
/color/add 该路由不需要权限
/color/all_color 该路由不需要权限
/demo/{path*} 该路由不需要权限
/demo 该路由不需要权限
/demo/upload 该路由不需要权限
/index/color 该路由不需要权限
/{path*} 该路由不需要权限
/ 该路由不需要权限
/upload 该路由不需要权限
/ 该路由需要权限
/login 该路由不需要权限
/login 该路由不需要权限
/about 该路由需要权限

61
source/run.ts

@ -1,7 +1,8 @@
"use strict";
import plugins from "@/plugins";
import { baseDir } from "@/util";
import validate from "./validate";
import path from "path";
import { baseDir,templateDir } from "@/util";
import { validateJwt, validateSession } from "./validate";
const Hapi = require("@hapi/hapi");
// const HapiSwagger = require("hapi-swagger");
// const HapiSwagger = require("hapi-swaggered-ui"); // swagger v2版本
@ -15,13 +16,26 @@ const run = async () => {
/**
* jwt
*/
await server.register(require("hapi-auth-jwt2"));
server.auth.strategy("jwt", "jwt", {
key: process.env.KEY, // Never Share your secret key
validate, // validate function defined above
verifyOptions: { algorithms: ["HS256"] },
// await server.register(require("hapi-auth-jwt2"));
// server.auth.strategy("jwt", "jwt", {
// key: process.env.KEY, // Never Share your secret key
// validate: validateJwt, // validate function defined above
// verifyOptions: { algorithms: ["HS256"] },
// });
/**
* cookie
*/
await server.register(require("@hapi/cookie"));
server.auth.strategy("session", "cookie", {
cookie: {
name: "sid", //cookie的名字
password: process.env.KEY,
isSecure: false,
},
redirectTo: "/login",
validateFunc: validateSession,
});
server.auth.default("jwt");
server.auth.default("session");
await server.register(plugins, {
routes: {
@ -37,12 +51,20 @@ const run = async () => {
server.views({
engines: {
ejs: require("ejs"),
pug: require("pug")
},
isCached: process.env.NODE_ENV === "development" ? false : true,
compileMode: "sync",
compileMode: "sync", // ejs
relativeTo: baseDir,
layout: true,
layout: false, // ejs
layoutPath: path.resolve(templateDir,"layout"), // ejs
path: "template",
// pug
compileOptions: {
// By default Pug uses relative paths (e.g. ../root.pug), when using absolute paths (e.g. include /root.pug), basedir is prepended.
// https://pugjs.org/language/includes.html
basedir: templateDir,
},
});
// http://localhost:3000/documentation
@ -55,6 +77,25 @@ const run = async () => {
title: "Dream 文档",
version: "1.0.0",
},
grouping: "tags",
tags: [
{
name: "sum",
description: "working with maths",
externalDocs: {
description: "Find out more",
url: "http://example.org",
},
},
{
name: "store",
description: "storing data",
externalDocs: {
description: "Find out more",
url: "http://example.org",
},
},
],
},
},
]);

2
source/util/index.ts

@ -6,4 +6,4 @@ export const baseDir = path.resolve(__dirname, "../../");
export const sourceDir = path.resolve(__dirname, "../../source");
export const publicDir = path.resolve(__dirname, "../../public");
export const uploadDir = path.resolve(publicDir, "upload");
export const templateDir = path.resolve(publicDir, "template");
export const templateDir = path.resolve(baseDir, "template");

16
source/validate.ts

@ -1,6 +1,6 @@
import User from "@/model/User";
export default async function validate(decoded, request, h) {
export async function validateJwt(decoded, request, h) {
if (decoded.id) {
const result = await User.findOne({ where: { id: decoded.id } });
if (result == null) {
@ -11,3 +11,17 @@ export default async function validate(decoded, request, h) {
return { isValid: false };
}
}
export async function validateSession(request, session) {
console.log(`session id: ${session.id}`);
if (session.id) {
const result = await User.findOne({ where: { id: session.id } });
if (result == null) {
return { valid: false };
}
return { valid: true, credentials: result };
} else {
return { valid: false };
}
}

1
template/404.ejs

@ -1 +0,0 @@
404

35
template/404.pug

@ -0,0 +1,35 @@
extends layout/layout
block head
link(rel="stylesheet", href="/public/css/views/404.css")
block content
#app
#outer
h1 4
h1 0
h1 4
.wrap
.ghost
.inner
.ghost
.inner
.ghost
.inner
svg(xmlns='http://www.w3.org/2000/svg' version='1.1' style='display: none')
defs
filter#squiggly-0
feturbulence#turbulence(baseFrequency='0.03' numOctaves='3' result='noise' seed='0')
fedisplacementmap#displacement(in='SourceGraphic' in2='noise' scale='2')
filter#squiggly-1
feturbulence#turbulence(baseFrequency='0.02' numOctaves='3' result='noise' seed='1')
fedisplacementmap(in='SourceGraphic' in2='noise' scale='3')
filter#squiggly-2
feturbulence#turbulence(baseFrequency='0.02' numOctaves='3' result='noise' seed='2')
fedisplacementmap(in='SourceGraphic' in2='noise' scale='0.5')
filter#squiggly-3
feturbulence#turbulence(baseFrequency='0.02' numOctaves='3' result='noise' seed='3')
fedisplacementmap(in='SourceGraphic' in2='noise' scale='3')
filter#squiggly-4
feturbulence#turbulence(baseFrequency='0.05' numOctaves='2' result='noise' seed='4')
fedisplacementmap(in='SourceGraphic' in2='noise' scale='1')

2
template/includes/foot.ejs

@ -1,2 +0,0 @@
</body>
</html>

22
template/includes/head.ejs

@ -1,22 +0,0 @@
<!--
* @Author: your name
* @Date: 2021-06-16 02:56:55
* @LastEditTime: 2021-06-16 17:21:34
* @LastEditors: your name
* @Description: In User Settings Edit
* @FilePath: /hapi-demo/template/includes/head.ejs
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"
/>
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<link rel="stylesheet" href="/public/style.css" />
</head>
<body></body>
</html>

4
template/layout.ejs

@ -1,4 +0,0 @@
<%- include("./includes/head")%>
<%- content %>
<%- include("./includes/foot")%>

1
template/layout/layout.ejs

@ -0,0 +1 @@
<%- content %>

19
template/layout/layout.pug

@ -0,0 +1,19 @@
doctype html
html(lang="en")
block var
i
head
meta(charset="UTF-8")
meta(http-equiv="X-UA-Compatible", content="IE=edge")
//- device-width 宽度低于1100像素的设备直接缩小
meta(name="viewport", content="width=1100, initial-scale=1.0")
title #{title || 'WEB'}
link(rel="stylesheet", href="/public/css/common/style.css")
block head
i
body
block content
div no content
block script
i

52
template/views/color.pug

@ -0,0 +1,52 @@
extends /layout/layout
block var
-title="颜色表" // 网页标题
block head
link(rel="stylesheet", href="/public/css/common/reset.css")
link(rel="stylesheet", href="/public/css/views/color.css")
block content
div(class="container page")
div(class="color_list")
-
var list=[
{ color:"#999999",title: "辅助色",describe:"灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色"},
{ color:"#999999",title: "辅助色",describe:"灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色"},
{ color:"#999999",title: "辅助色",describe:"灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色灰色"},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
{ color:"#999999",title: "辅助色",describe:""},
]
each item in list
div(class="color_item")
div(class="color_item_bg")
div(class="color_toggle_list")
div(class="color_toggle_item") hex
div(class="color_toggle_item") rgba
div(class="color_item_name") #{item.color}
div(class="color_item_content")
div(class="color_item_title") #{item.title}
div(class="color_item_desc") #{item.describe || "暂无描述"}
div(class="color_item")
img(src="/public/image/add.png", alt="添加" title="添加" class="color_add")
div
form(action="POST" method="post")
div(class=".wrapper_input"): input(type="text" tabindex="1" value="sadsa" name="a")
div(class=".wrapper_input"): input(type="text" tabindex="3" value="sadsa" name="b")
button(type="submit" tabindex="2") 提交

58
template/views/demo.ejs

@ -0,0 +1,58 @@
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" id="file" multiple />
<button type="submit" id="upload">上传</button>
</form>
<div id="filelist"></div>
<script>
function $(selector) {
return document.querySelector(selector);
}
var uploadEl = $("#upload");
var filelistEl = $("#filelist");
var fileEl = $("#file");
uploadEl.addEventListener("click", function (e) {
e.preventDefault();
var xmlhttp;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {
// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("POST", "/upload", true);
// 这里不需要自己加,会自己处理
// xmlhttp.setRequestHeader("Content-Type", "multipart/form-data");
if (xmlhttp.upload) {
//监听上传属性的上传事件,每次上传事件都会执行 progressHandlingFunction
xmlhttp.upload.addEventListener(
"progress",
function (evt) {
var loaded = evt.loaded;
var tot = evt.total;
var per = Math.floor((100 * loaded) / tot); //已经上传的百分比
},
false
);
//xmlhttp.upload.progress = function(){} 也可以
}
var formData = new FormData();
for (let i = 0; i < fileEl.files.length; i++) {
const file = fileEl.files[i];
formData.append("file", file);
}
xmlhttp.send(formData);
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
// console.log(xmlhttp.responseText);
alert("success");
}
};
});
</script>

59
template/views/index.ejs

@ -1,58 +1,3 @@
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" id="file" multiple />
<button type="submit" id="upload">上传</button>
</form>
<div id="filelist"></div>
index
<script>
function $(selector) {
return document.querySelector(selector);
}
var uploadEl = $("#upload");
var filelistEl = $("#filelist");
var fileEl = $("#file");
uploadEl.addEventListener("click", function (e) {
e.preventDefault();
var xmlhttp;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {
// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("POST", "/upload", true);
// 这里不需要自己加,会自己处理
// xmlhttp.setRequestHeader("Content-Type", "multipart/form-data");
if (xmlhttp.upload) {
//监听上传属性的上传事件,每次上传事件都会执行 progressHandlingFunction
xmlhttp.upload.addEventListener(
"progress",
function (evt) {
var loaded = evt.loaded;
var tot = evt.total;
var per = Math.floor((100 * loaded) / tot); //已经上传的百分比
},
false
);
//xmlhttp.upload.progress = function(){} 也可以
}
var formData = new FormData();
for (let i = 0; i < fileEl.files.length; i++) {
const file = fileEl.files[i];
formData.append("file", file);
}
xmlhttp.send(formData);
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
// console.log(xmlhttp.responseText);
alert("success");
}
};
});
</script>
<a href="/login">login</a>

41
template/views/index.pug

@ -0,0 +1,41 @@
extends /layout/layout
block var
-title="时间就是金钱" // 网页标题
block head
link(rel="stylesheet", href="/public/css/common/reset.css")
link(rel="stylesheet", href="/public/css/views/index.css")
block content
div(class="container page")
ul(class="left-list")
li(class="item"): a(href="/login" ) 登录/注册
div(class="userinfo")
div(class="img-wrapper user_avatar"): img(object-fit="scale-down" src="https://scpic.chinaz.net/files/pic/pic9/202106/apic33329.jpg")
div(class="user_detail")
-username = "谢亚昕"
-
describe = `
来自南方的小城,喜爱悠闲
来自南方的小城,喜爱悠闲
来自南方的小城,喜爱悠闲
来自南方的小城,喜爱悠闲
来自南方的小城,喜爱悠闲
来自南方的小城,喜爱悠闲
来自南方的小城,喜爱悠闲
来自南方的小城,喜爱悠闲
来自南方的小城,喜爱悠闲
来自南方的小城,喜爱悠闲
来自南方的小城,喜爱悠闲
`
.user_name #{username}
div(class="user_desc" title=describe )
|#{describe}
//- script(src='https://cdn.jsdelivr.net/npm/darkmode-js@1.5.7/lib/darkmode-js.min.js')
//- script.
//- function addDarkmodeWidget() {
//- new Darkmode().showWidget();
//- }
//- window.addEventListener('load', addDarkmodeWidget);

6
template/views/login.ejs

@ -0,0 +1,6 @@
<h3>Please Log In</h3>
<form method="post" action="/login">
Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" value="Login" />
</form>
Loading…
Cancel
Save