1549469775 3 years ago
parent
commit
43d16143eb
  1. 4392
      log/SQL.log
  2. 2
      package.json
  3. 204
      pnpm-lock.yaml
  4. 3
      public/css/common/style.css
  5. 5
      public/css/common/style.scss
  6. 71
      public/css/page/css.css
  7. 0
      public/js/page/css.js
  8. 9
      source/auth/index.ts
  9. 17
      source/db/index.ts
  10. 17
      source/db/init.ts
  11. 27
      source/model/Color.ts
  12. 42
      source/model/User.ts
  13. 23
      source/models/Color.ts
  14. 7
      source/route/api/index.ts
  15. 0
      source/route/api/upload/_upload.ts
  16. 6
      source/route/api/upload/index.ts
  17. 6
      source/route/api/user/index.ts
  18. 46
      source/route/color/index.ts
  19. 9
      source/route/index/index.ts
  20. 10
      source/route/route.txt
  21. 27
      template/views/css.pug
  22. 41
      template/views/index.pug
  23. 41
      template/views/user.pug

4392
log/SQL.log

File diff suppressed because it is too large

2
package.json

@ -36,8 +36,10 @@
"@hapi/vision": "^6.1.0",
"@noderun/hapi-router": "link:packages\\hapi-router",
"@types/hapi__cookie": "^10.1.4",
"@types/node": "^17.0.21",
"dotenv": "^10.0.0",
"ejs": "^3.1.6",
"fast-glob": "^3.2.11",
"file-type": "^16.5.0",
"log4js": "^6.4.1",
"ts-node": "^10.0.0",

204
pnpm-lock.yaml

@ -9,9 +9,11 @@ specifiers:
'@types/hapi__cookie': ^10.1.4
'@types/hapi__hapi': ^20.0.10
'@types/hapi__vision': ^5.5.3
'@types/node': ^17.0.21
bcrypt: ^5.0.1
dotenv: ^10.0.0
ejs: ^3.1.6
fast-glob: ^3.2.11
file-type: ^16.5.0
hapi-auth-jwt2: ^10.2.0
hapi-sequelizejs: ^4.5.0
@ -53,11 +55,13 @@ devDependencies:
'@hapi/vision': 6.1.0
'@noderun/hapi-router': link:packages/hapi-router
'@types/hapi__cookie': registry.npmmirror.com/@types/hapi__cookie/10.1.4
'@types/node': 17.0.21
dotenv: 10.0.0
ejs: 3.1.6
fast-glob: 3.2.11
file-type: 16.5.0
log4js: registry.npmmirror.com/log4js/6.4.1
ts-node: 10.0.0_typescript@4.3.2
ts-node: 10.0.0_994e9dd6eccb2c889707fc5c400a4503
ts-node-dev: 1.1.6_typescript@4.3.2
tsconfig-paths: 3.9.0
typescript: 4.3.2
@ -343,6 +347,27 @@ packages:
- supports-color
dev: false
/@nodelib/fs.scandir/2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
dependencies:
'@nodelib/fs.stat': 2.0.5
run-parallel: 1.2.0
dev: true
/@nodelib/fs.stat/2.0.5:
resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
engines: {node: '>= 8'}
dev: true
/@nodelib/fs.walk/1.2.8:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
dependencies:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.13.0
dev: true
/@sideway/address/4.1.2:
resolution: {integrity: sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==}
dependencies:
@ -397,10 +422,13 @@ packages:
resolution: {integrity: sha1-7ihweulOEdK4J7y+UnC86n8+ce4=}
dev: true
/@types/node/17.0.21:
resolution: {integrity: sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==}
/@types/readable-stream/2.3.10:
resolution: {integrity: sha512-xwSXvAv9x4B9Vj88AMZnFyEVLilz1EBxKvRUhGqIF4nJpRQBSTm7jS236X4Y9Y2qPsVvaMxwrGJlNhLHEahlFQ==}
dependencies:
'@types/node': registry.npmmirror.com/@types/node/15.12.2
'@types/node': 17.0.21
safe-buffer: 5.2.1
dev: true
@ -705,7 +733,7 @@ packages:
normalize-path: 3.0.0
readdirp: 3.6.0
optionalDependencies:
fsevents: registry.npmmirror.com/fsevents/2.3.2
fsevents: 2.3.2
/chownr/1.1.4:
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
@ -765,6 +793,12 @@ packages:
dev: false
optional: true
/commander/2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
requiresBuild: true
dev: false
optional: true
/concat-map/0.0.1:
resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=, tarball: concat-map/download/concat-map-0.0.1.tgz}
@ -1078,11 +1112,28 @@ packages:
dev: false
optional: true
/fast-glob/3.2.11:
resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==}
engines: {node: '>=8.6.0'}
dependencies:
'@nodelib/fs.stat': 2.0.5
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
micromatch: 4.0.4
dev: true
/fast-json-stable-stringify/2.1.0:
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
dev: false
optional: true
/fastq/1.13.0:
resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
dependencies:
reusify: 1.0.4
dev: true
/file-type/16.5.0:
resolution: {integrity: sha512-OxgWA9tbL8N/WP00GD1z8O0MiwQKFyWRs1q+3FhjdvcGgKqwxcejyGWso3n4/IMU6DdwV+ARZ4A7TTnPkDcSiw==}
engines: {node: '>=8'}
@ -1148,11 +1199,18 @@ packages:
minipass: 3.1.3
dev: false
/fsevents/2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
requiresBuild: true
optional: true
/fstream/1.0.12:
resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==}
engines: {node: '>=0.6'}
dependencies:
graceful-fs: registry.npmmirror.com/graceful-fs/4.2.6
graceful-fs: 4.2.6
inherits: registry.npmmirror.com/inherits/2.0.4
mkdirp: 0.5.5
rimraf: 2.7.1
@ -1239,6 +1297,9 @@ packages:
url-parse-lax: 3.0.0
dev: false
/graceful-fs/4.2.6:
resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==}
/handlebars/4.7.7:
resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==}
engines: {node: '>=0.4.7'}
@ -1249,7 +1310,7 @@ packages:
source-map: 0.6.1
wordwrap: 1.0.0
optionalDependencies:
uglify-js: registry.npmmirror.com/uglify-js/3.13.9
uglify-js: 3.13.9
dev: false
/hapi-auth-jwt2/10.2.0:
@ -1782,7 +1843,7 @@ packages:
resolution: {integrity: sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=}
engines: {node: '>=0.10.0'}
dependencies:
graceful-fs: registry.npmmirror.com/graceful-fs/4.2.6
graceful-fs: 4.2.6
parse-json: 2.2.0
pify: 2.3.0
pinkie-promise: 2.0.1
@ -1886,6 +1947,19 @@ packages:
trim-newlines: 1.0.0
dev: true
/merge2/1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
dev: true
/micromatch/4.0.4:
resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==}
engines: {node: '>=8.6'}
dependencies:
braces: 3.0.2
picomatch: 2.3.0
dev: true
/mime-db/1.48.0:
resolution: {integrity: sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==}
engines: {node: '>= 0.6'}
@ -1998,6 +2072,27 @@ packages:
engines: {node: 4.x || >=6.0.0}
dev: false
/node-gyp/3.8.0:
resolution: {integrity: sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==}
engines: {node: '>= 0.8.0'}
hasBin: true
requiresBuild: true
dependencies:
fstream: 1.0.12
glob: registry.npmmirror.com/glob/7.1.7
graceful-fs: registry.npmmirror.com/graceful-fs/4.2.6
mkdirp: 0.5.5
nopt: 3.0.6
npmlog: 4.1.2
osenv: 0.1.5
request: 2.88.2
rimraf: 2.7.1
semver: 5.3.0
tar: 2.2.2
which: 1.3.1
dev: false
optional: true
/node-pre-gyp/0.11.0:
resolution: {integrity: sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==}
deprecated: 'Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future'
@ -2209,7 +2304,7 @@ packages:
resolution: {integrity: sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=}
engines: {node: '>=0.10.0'}
dependencies:
graceful-fs: registry.npmmirror.com/graceful-fs/4.2.6
graceful-fs: 4.2.6
pify: 2.3.0
pinkie-promise: 2.0.1
dev: true
@ -2386,6 +2481,10 @@ packages:
dev: false
optional: true
/queue-microtask/1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
dev: true
/random-bytes/1.0.0:
resolution: {integrity: sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=}
engines: {node: '>= 0.8'}
@ -2536,6 +2635,11 @@ packages:
any-promise: 1.3.0
dev: false
/reusify/1.0.4:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
dev: true
/rimraf/2.7.1:
resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
hasBin: true
@ -2549,6 +2653,12 @@ packages:
glob: registry.npmmirror.com/glob/7.1.7
dev: false
/run-parallel/1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies:
queue-microtask: 1.2.3
dev: true
/safe-buffer/5.1.2:
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
dev: false
@ -2707,7 +2817,7 @@ packages:
node-addon-api: 3.2.1
node-pre-gyp: 0.11.0
optionalDependencies:
node-gyp: registry.npmmirror.com/node-gyp/3.8.0
node-gyp: 3.8.0
dev: false
/sshpk/1.16.1:
@ -3003,7 +3113,7 @@ packages:
typescript: 4.3.2
dev: true
/ts-node/10.0.0_typescript@4.3.2:
/ts-node/10.0.0_994e9dd6eccb2c889707fc5c400a4503:
resolution: {integrity: sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg==}
engines: {node: '>=12.0.0'}
hasBin: true
@ -3022,6 +3132,7 @@ packages:
'@tsconfig/node12': 1.0.8
'@tsconfig/node14': 1.0.1
'@tsconfig/node16': 1.0.1
'@types/node': 17.0.21
arg: 4.1.3
create-require: 1.1.1
diff: 4.0.2
@ -3094,6 +3205,14 @@ packages:
hasBin: true
dev: true
/uglify-js/3.13.9:
resolution: {integrity: sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g==}
engines: {node: '>=0.8.0'}
hasBin: true
requiresBuild: true
dev: false
optional: true
/uid-safe/2.1.5:
resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==}
engines: {node: '>= 0.8'}
@ -3264,7 +3383,7 @@ packages:
/wkx/0.5.0:
resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==}
dependencies:
'@types/node': registry.npmmirror.com/@types/node/15.12.2
'@types/node': 17.0.21
dev: false
/wordwrap/1.0.0:
@ -3312,7 +3431,7 @@ packages:
lodash.isequal: 4.5.0
validator: 10.11.0
optionalDependencies:
commander: registry.npmmirror.com/commander/2.20.3
commander: 2.20.3
dev: false
registry.npmmirror.com/@hapi/b64/5.0.0:
@ -3430,7 +3549,7 @@ packages:
'@types/hapi__catbox': registry.npmmirror.com/@types/hapi__catbox/10.2.4
'@types/hapi__mimos': registry.npmmirror.com/@types/hapi__mimos/4.1.4
'@types/hapi__shot': registry.npmmirror.com/@types/hapi__shot/4.1.2
'@types/node': registry.npmmirror.com/@types/node/15.12.2
'@types/node': 17.0.21
joi: registry.npmmirror.com/joi/17.4.0
registry.npmmirror.com/@types/hapi__mimos/4.1.4:
@ -3445,7 +3564,7 @@ packages:
name: '@types/hapi__shot'
version: 4.1.2
dependencies:
'@types/node': registry.npmmirror.com/@types/node/15.12.2
'@types/node': 17.0.21
registry.npmmirror.com/@types/hapi__vision/5.5.3:
resolution: {integrity: sha512-R4+r9345+5LCM8/0OQ1J8UVVPwnOwMdUVtPrtJE4oNbZ31+rLSy/bLoGpuZJwjROeC006YXbibnRF1hcVQFjGA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/hapi__vision/-/hapi__vision-5.5.3.tgz}
@ -3461,11 +3580,6 @@ packages:
name: '@types/mime-db'
version: 1.43.1
registry.npmmirror.com/@types/node/15.12.2:
resolution: {integrity: sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-15.12.2.tgz}
name: '@types/node'
version: 15.12.2
registry.npmmirror.com/balanced-match/1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz}
name: balanced-match
@ -3479,14 +3593,6 @@ packages:
balanced-match: registry.npmmirror.com/balanced-match/1.0.2
concat-map: 0.0.1
registry.npmmirror.com/commander/2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz}
name: commander
version: 2.20.3
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/date-format/4.0.3:
resolution: {integrity: sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/date-format/-/date-format-4.0.3.tgz}
name: date-format
@ -3545,15 +3651,6 @@ packages:
name: fs.realpath
version: 1.0.0
registry.npmmirror.com/fsevents/2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz}
name: fsevents
version: 2.3.2
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
requiresBuild: true
optional: true
registry.npmmirror.com/glob/7.1.7:
resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/glob/-/glob-7.1.7.tgz}
name: glob
@ -3583,7 +3680,7 @@ packages:
source-map: registry.npmmirror.com/source-map/0.6.1
wordwrap: registry.npmmirror.com/wordwrap/1.0.0
optionalDependencies:
uglify-js: registry.npmmirror.com/uglify-js/3.13.9
uglify-js: 3.13.9
dev: false
registry.npmmirror.com/hapi-sequelizejs/4.5.0_854bf76d9bf23fc83de64ddfc031ac7f:
@ -3645,7 +3742,7 @@ packages:
dependencies:
universalify: registry.npmmirror.com/universalify/2.0.0
optionalDependencies:
graceful-fs: registry.npmmirror.com/graceful-fs/4.2.6
graceful-fs: 4.2.6
dev: true
registry.npmmirror.com/log4js/6.4.1:
@ -3699,29 +3796,6 @@ packages:
version: 2.6.2
dev: false
registry.npmmirror.com/node-gyp/3.8.0:
resolution: {integrity: sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-gyp/-/node-gyp-3.8.0.tgz}
name: node-gyp
version: 3.8.0
engines: {node: '>= 0.8.0'}
hasBin: true
requiresBuild: true
dependencies:
fstream: 1.0.12
glob: registry.npmmirror.com/glob/7.1.7
graceful-fs: registry.npmmirror.com/graceful-fs/4.2.6
mkdirp: 0.5.5
nopt: 3.0.6
npmlog: 4.1.2
osenv: 0.1.5
request: 2.88.2
rimraf: 2.7.1
semver: 5.3.0
tar: 2.2.2
which: 1.3.1
dev: false
optional: true
registry.npmmirror.com/once/1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/once/-/once-1.4.0.tgz}
name: once
@ -3761,16 +3835,6 @@ packages:
- supports-color
dev: true
registry.npmmirror.com/uglify-js/3.13.9:
resolution: {integrity: sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/uglify-js/-/uglify-js-3.13.9.tgz}
name: uglify-js
version: 3.13.9
engines: {node: '>=0.8.0'}
hasBin: true
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/universalify/2.0.0:
resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz}
name: universalify

3
public/css/common/style.css

@ -2,8 +2,7 @@
html,
body {
background-color: #f5f5f5;
height: 100%;
overflow: hidden;
min-height: 100%;
}
.left-list {

5
public/css/common/style.scss

@ -1,8 +1,7 @@
html,
body {
background-color: #f5f5f5;
height: 100%;
overflow: hidden;
background-color: #f5f5d5;
min-height: 100%;
}
.left-list {

71
public/css/page/css.css

@ -0,0 +1,71 @@
html, body{
padding: 0;
margin: 0;
}
*{
cursor: pointer;
position: relative;
}
.container {
width: 900px;
margin: 0 auto;
}
.title{
padding-left: 20px;
position: sticky;
top: 0;
background-color: white;
z-index: 10;
}
.author:hover::before{
content: attr(title);
position: absolute;
top: 0;
left: 0;
background-color: yellow;
text-indent: 0;
font-size: 12px;
opacity: .4;
padding: 1px 8px;
pointer-events: none;
}
.author:hover::after{
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
border: 1px solid yellow;
pointer-events: none;
}
.word{
text-indent: 30px;
padding: 5px 10px;
}
.word .comment{
display: none;
position: relative;
}
.word:hover .comment{
display: block;
position: absolute;
left: 100%;
top: 0;
font-size: 14px;
padding: 6px;
box-sizing: border-box;
text-indent: 0;
background-color: rgb(177, 177, 177);
max-width: 180px;
width: 100%;
max-height: 100%;
overflow-y: auto;
}

0
public/js/page/css.js

9
source/auth/index.ts

@ -1,7 +1,8 @@
import User from "@/model/User";
import { Req } from "#/global";
export async function validateJwt(decoded, request, h) {
export async function validateJwt(decoded, request: Req, h) {
if (decoded.id) {
const User = request.getModel("User")
const result = await User.findOne({ where: { id: decoded.id } });
if (result == null) {
return { isValid: false };
@ -12,9 +13,9 @@ export async function validateJwt(decoded, request, h) {
}
}
export async function validateSession(request, session) {
export async function validateSession(request: Req, session) {
console.log(`session id: ${session.id}`);
const User = request.getModel("User")
if (session.id) {
const result = await User.findOne({ where: { id: session.id } });
if (result == null) {

17
source/db/index.ts

@ -1,17 +0,0 @@
import { Sequelize, DataTypes } from "sequelize";
import path from "path";
export const sequelize = new Sequelize({
dialect: "sqlite",
storage: path.resolve(__dirname, "./data.db"),
logging: loggerSQL.debug.bind(loggerSQL) // Alternative way to use custom logger, displays all messages
});
export async function connect(){
try {
await sequelize.authenticate();
console.log('Connection has been established successfully.');
} catch (error) {
console.error('Unable to connect to the database:', error);
}
}

17
source/db/init.ts

@ -1,17 +0,0 @@
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 isAlter = !!(argv._.indexOf("alter")!=-1) || false
connect().then(()=>{
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

@ -1,27 +0,0 @@
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 };

42
source/model/User.ts

@ -1,42 +0,0 @@
import {sequelize, connect} from "@/db/index"
import {DataTypes} from "sequelize";
// 全自定义写法
// const User = sequelize.define('User', {
// id: {
// type: DataTypes.STRING(50),
// primaryKey: true
// },
// username: {
// type: DataTypes.STRING,
// allowNull: false
// },
// password: {
// type: DataTypes.STRING,
// allowNull: false
// },
// createdAt: DataTypes.BIGINT,
// updatedAt: DataTypes.BIGINT,
// version: DataTypes.BIGINT
// }, {
// timestamps: false
// });
/**
*
* ----
*/
const User = sequelize.define('User', {
username: {
type: DataTypes.STRING,
allowNull: false
},
password: {
type: DataTypes.STRING,
allowNull: false
},
email: {
type: DataTypes.STRING,
}
}, {
});
export default User;

23
source/models/Color.ts

@ -0,0 +1,23 @@
module.exports = function (sequelize, DataTypes) {
const Color = sequelize.define(
"Color",
{
// 图片地址
color: {
type: DataTypes.STRING
},
title: {
type: DataTypes.STRING,
allowNull: true
},
describe: {
type: DataTypes.STRING,
allowNull: true
},
},
{
timestamps: false,
}
);
return Color
};

7
source/route/api/index.ts

@ -1,7 +0,0 @@
export default class{
index(request, h) {
return "asdasd";
}
}

0
source/route/demo/_upload.ts → source/route/api/upload/_upload.ts

6
source/route/demo/index.ts → source/route/api/upload/index.ts

@ -26,10 +26,4 @@ export default class {
);
return res;
}
@route("/{path*}")
async 404(req, h) {
// 404页面
return h.view("404.ejs");
}
}

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

@ -7,7 +7,6 @@ import {
config,
} from "@noderun/hapi-router";
import { gSuccess, gFail } from "@/util";
import User from "@/model/User";
import * as bcrypt from "bcrypt";
import * as jwt from "jsonwebtoken";
import * as Joi from "joi";
@ -24,6 +23,7 @@ export default class {
async register(request: Req, h: Res): ReturnValue {
let { username, password, email } = request.payload as any;
if (!username) username = email;
const User = request.getModel("User")
logger.trace(username, email);
try {
const result = await User.findOne({ where: { username: username } });
@ -56,6 +56,7 @@ export default class {
@swagger("用户登录", "返回注册用户的信息", ["api"])
async login(request: Req, h: Res): ReturnValue {
let { username, password } = request.payload as any;
const User = request.getModel("User")
const result = <any>await User.findOne({ where: { username: username } });
if (result == null) {
return gFail(null, "不存在该用户");
@ -79,6 +80,7 @@ export default class {
@swagger("删除用户", "删除用户账号", ["sum"])
async del(request: Req, h: Res): ReturnValue {
const { id } = request.auth.credentials;
const User = request.getModel("User")
let result = await User.findOne({ where: { id: id } });
if (result == null) {
return gFail(null, "不存在该用户");
@ -97,7 +99,7 @@ export default class {
async userinfo(request: Req, h: Res): ReturnValue {
console.log(request);
const { id } = request.auth.credentials;
const User = request.getModel("User")
let result = <any>await User.findOne({ where: { id: id } });
if (result == null) {
return gFail(null, "不存在该用户");

46
source/route/color/index.ts

@ -1,46 +0,0 @@
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, "获取颜色失败");
}
}
}

9
source/route/index/index.ts

@ -7,12 +7,16 @@ import {
validate,
} from "@noderun/hapi-router";
import { Req, Res, ReturnValue } from "#/global";
import UploadFunc from "../demo/_upload";
import Joi from "joi";
import User from "@/model/User";
import * as bcrypt from "bcrypt";
export default class Index {
async css(request: Req, h:Res): ReturnValue{
return h.view("views/css.pug")
}
@auth()
@config({
auth: {
@ -38,6 +42,7 @@ export default class Index {
@route("/login")
async login(request: Req, h: Res): ReturnValue {
const { username, password } = request.payload as any;
const User = request.getModel("User")
const account = <any>await User.findOne({ where: { username: username } });
if (!account || !(await bcrypt.compare(password, account.password))) {

10
source/route/route.txt

@ -1,18 +1,14 @@
所有路由路径:
需要权限: GET /api
需要权限: GET /api/upload
需要权限: POST /api/upload/upload
不需权限: POST /api/user/register
需要权限: POST /api/user/logout
不需权限: POST /api/user/login
需要权限: DELETE /api/user/del
需要权限: GET /api/user/userinfo
不需权限: GET /color
不需权限: POST /color/add
不需权限: GET /color/all_color
不需权限: GET /demo/{path*}
不需权限: GET /demo
不需权限: POST /demo/upload
不需权限: GET /index/color
不需权限: GET /{path*}
不需权限: GET /css
需要权限: GET /
不需权限: GET /login
不需权限: POST /login

27
template/views/css.pug

@ -0,0 +1,27 @@
extends /layout/layout
block var
-title="终是无缘一别两欢" // 网页标题
block head
//- link(rel="stylesheet", href="/public/css/common/reset.css")
link(rel="stylesheet", href="/public/css/page/css.css")
block content
.container
h1.title.author.word(title="xyx") 终是无缘一别两欢
.comment 为啥要写这个文章
div.author.word(title="xyx") 昨天看了我初中喜欢的人在空间发的一篇关于怀念初中的短篇小说吧,记录了他对一些记忆深刻的人的评价,而我也看到了我明明一直清楚,却不肯打心底接受的真相,他喜欢另外一个人,过往那么多的蛛丝马迹,那么多明明一件事就能看出他喜欢的人是她的真相,可我却是宁愿找借口自欺欺人,而今他给出坦白答案,他是放下了,才说出来,我是不是也该放下了,直到今日才明白我一个人自以为刻骨铭心的回忆,他也许早就忘怀,他的短篇小说故事中我没有丝言片语,也许若干年后他回想起来的只是我的名字,我只是个戏子,在他的故事中流着自己的泪,一个于他青春年华中不曾使他掀起过一丝波澜的模糊影子,而他不知道也永远不会知道,我的故事里他出现的很多,占了很多篇幅,我把他写进我的故事,因为他路过我心上,他踏着万千星河而来,又乘舟奔赴远方,我与春风皆过客,你携秋水揽星河。如今看来万般故事不过情伤,易水人去,明月如霜。
.comment 我记得我无数次点开对话框,却只好失望的再关掉。我好多时候都想着万一他真的喜欢是她,我应该狠下心割舍这份感情,毕竟我不想太黯然神伤,我总是假装不在意远离他,不是因为讨厌陌生,而是太喜欢,又怕表现的明显,明知道没有什么可能不想陷入的更深。有那么一些瞬间,我假装不在意的擦肩而过,恰好离他很近,几分毫之差,却像是我们之间隔了银河的距离。走不进他的世界,却不想退出,现在想想初中三年除了开始在一个小组过,就没有再怎么交集过多少,毕业后反倒可以频繁的交集,我很珍惜,也行对他而言不过尔尔,充其量我只能算是他一个普通朋友。
div.author.word(title="xyx") 他是无意穿堂风,却偏偏孤据引山洪。我是垂眉摆渡翁,却独独偏爱哝。
.comment sada
div.author.word(title="xyx") 忽然想起那年夏日毕业之际,我送他的藏头巧妙情诗,还有在QQ的匿名坦白说,还有我第一次鼓起勇气隐晦的告白,毕业后我想着也许在我们笑着说再见时候深知再见遥遥无期,我想过叫他一起来学习预习新课,如今想想对我而言珍贵如斯,因为整整初中三年我都喜欢他,从始至终,从一开始和他一个组,就喜欢他。可是我也心里早已隐隐知道他喜欢的是另外一个人,我怕喜欢被他知道,也怕他不知道,又怕他装作不知道,总是假装不在意他,却总是留意他的消息,其实也是只要他没有说出来证实那个我知道他喜欢另外一个人的猜想,我就还抱着一丝期待,才没办法停止喜欢。这世上最安慰人的童话是,你挖空心思暗恋的人,他也挖空心思暗恋你,可惜这只是童话。
div.author.word(title="xyx") 我记得我无数次点开对话框,却只好失望的再关掉。我好多时候都想着万一他真的喜欢是她,我应该狠下心割舍这份感情,毕竟我不想太黯然神伤,我总是假装不在意远离他,不是因为讨厌陌生,而是太喜欢,又怕表现的明显,明知道没有什么可能不想陷入的更深。有那么一些瞬间,我假装不在意的擦肩而过,恰好离他很近,几分毫之差,却像是我们之间隔了银河的距离。走不进他的世界,却不想退出,现在想想初中三年除了开始在一个小组过,就没有再怎么交集过多少,毕业后反倒可以频繁的交集,我很珍惜,也行对他而言不过尔尔,充其量我只能算是他一个普通朋友。
div.author.word(title="xyx") 犹记得那次初三模考后不好,本来就难受从未那么差过,可是他在安慰另外一个人,我就更难过。多少次狠下心不想喜欢,却是告终。
div.author.word(title="xyx") 比如毕业后,我开着玩笑跟他要生日礼物,终究是一纸空话,而我也知道也许他是不想给也就罢了,毕竟我什么都算不上吧,还有我那次想叫他去看电影,看最好的我们,我是有目的,听说电影的最后彩蛋是告白带来这里一起看电影的人是为了对他告白,可惜他没去,我和我一个很好的闺蜜去了电影院。
div.author.word(title="xyx") 其实毕业后,我有过暗示,他懂了,懂了后是沉默,我早该明白的,沉默就是答案,躲闪就是答案,不过是留一个情面给我,互相都不要太过难堪,他也不知道,我很多说说日志写着是希望他能看到的,虽然有些不是我的原创,却带着我的心声,他不曾懂过。也不需要去懂了,从始至终感动的只有我自己。海底月捞不起,心上人不可及,向来心是看客心,奈何人是局中人。
div.author.word(title="xyx") 这世间最难不过徒手摘月,喜欢而不得。
div.author.word(title="xyx") 但我也想明白了,当我不能将一个人彻底忘却,就好好珍藏,封存在某个不易察觉的角落,午夜阑珊的时候悄悄想去。生不逢时,喜欢不逢人,所得之处皆是命数。白茶清欢无别事,我在等风也等你,苦酒折留今相离,无风无月也无你。
div.author.word(title="xyx") 当年我说的凤囚凰那首诗也许他早已忘记,有美人兮,见之不忘,一日不见兮,思之如狂。凤飞遨翔兮,四海求凰,无奈佳人兮,不在东墙。将琴代语兮,聊写衷肠,愿言配德兮,携手相将。何时见许兮,慰我旁徨,不得于飞兮,使我沦亡,使我沦亡。本想暗示他我喜欢过他,终是没有说出口下阙。
div.author.word(title="xyx") 蝴蝶很美,终究飞不过沧海,某些性质上我和他一样,都是内心远没有看起来的风平浪静,实则是波涛起伏,曾想过愿我如星君如月,夜夜流光相皎洁。
div.author.word(title="xyx") 所谓执念,不过求而不得,不过难以割舍,不想错过,可终究情深是我,缘浅是我们,落花有意,流水无情,竟是付诸东流,若是如此,就这样吧,从此山水不相逢,愿若干年后的我们是最好的我们,蝴蝶很美,终究飞不过沧海,生生的两端,我们彼此站成岸。何来人间一惊鸿,不过人间一俗人。从此相忘江湖,若许不相识,也愿我遇到比你更好的人,说了那么多轻松多了,写下这些也是为了忘记放下他,虽然以前想过有时候放不下是最好的放下,无论他是否看得到,就这样吧,至此纪念我初中的喜欢,你是年少的欢喜,但也是过去时。我也要努力学习,考的比他更好。

41
template/views/index.pug

@ -1,41 +1,14 @@
extends /layout/layout
block var
-title="时间就是金钱" // 网页标题
-title="CSS选择器" // 网页标题
block head
link(rel="stylesheet", href="/public/css/common/reset.css")
link(rel="stylesheet", href="/public/css/views/index.css")
//- link(rel="stylesheet", href="/public/css/common/reset.css")
link(rel="stylesheet", href="/public/css/page/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);
.container
h1.title 终是无缘一别两欢
div.word 昨天看了我初中喜欢的人在空间发的一篇关于怀念初中的短篇小说吧,记录了他对一些记忆深刻的人的评价,而我也看到了我明明一直清楚,却不肯打心底接受的真相,他喜欢另外一个人,过往那么多的蛛丝马迹,那么多明明一件事就能看出他喜欢的人是她的真相,可我却是宁愿找借口自欺欺人,而今他给出坦白答案,他是放下了,才说出来,我是不是也该放下了,直到今日才明白我一个人自以为刻骨铭心的回忆,他也许早就忘怀,他的短篇小说故事中我没有丝言片语,也许若干年后他回想起来的只是我的名字,我只是个戏子,在他的故事中流着自己的泪,一个于他青春年华中不曾使他掀起过一丝波澜的模糊影子,而他不知道也永远不会知道,我的故事里他出现的很多,占了很多篇幅,我把他写进我的故事,因为他路过我心上,他踏着万千星河而来,又乘舟奔赴远方,我与春风皆过客,你携秋水揽星河。如今看来万般故事不过情伤,易水人去,明月如霜。
div.word(href="232") 他是无意穿堂风,却偏偏孤据引山洪。我是垂眉摆渡翁,却独独偏爱哝。

41
template/views/user.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);
Loading…
Cancel
Save