Browse Source

修改实现

theme
npmrun 2 years ago
parent
commit
0ff674e90d
  1. 4
      package.json
  2. 4
      packages/hapi-router/src/index.ts
  3. 282
      pnpm-lock.yaml
  4. BIN
      public/favicon.ico
  5. 1
      public/js/common/htmx.min.js
  6. 1
      public/style/common/bulma.min.css
  7. 7
      route.txt
  8. BIN
      source/db/data.db
  9. 17
      source/route/htmx/index.ts
  10. 18
      source/route/views/index.ts
  11. 23
      source/route/views/index/index.ts
  12. 2
      source/run.ts
  13. 2
      source/schema/index.ts
  14. 2
      template/helper/helper.pug
  15. 1
      template/htmx/a.pug
  16. 15
      template/htmx/path/about.pug
  17. 7
      template/htmx/path/index.pug
  18. 8
      template/layout/layout.pug
  19. 6
      template/layout/single-page.pug
  20. 9
      template/ui/header.pug
  21. 14
      template/views/about.pug
  22. 16
      template/views/index.pug
  23. 2
      template/views/login.pug
  24. 2
      template/views/register.pug
  25. 15
      template/views/user.pug
  26. 5
      types/global.d.ts

4
package.json

@ -9,7 +9,8 @@
"zip": "node script/zip.js",
"build": "tsc && tsc-alias",
"start": "node -r dotenv/config dist/main.js dotenv_config_path=.env.production",
"dev": "ts-node-dev --watch ./source/route --ignore-watch ./source/route/route.txt --respawn --project ./tsconfig.json -r tsconfig-paths/register -r dotenv/config ./source/main.ts dotenv_config_path=.env.development",
"dev": "tsx watch -r tsconfig-paths/register -r dotenv/config ./source/main.ts dotenv_config_path=.env.development",
"devb": "ts-node-dev --watch ./source/route --ignore-watch ./source/route/route.txt --respawn --project ./tsconfig.json -r tsconfig-paths/register -r dotenv/config ./source/main.ts dotenv_config_path=.env.development",
"deva": "nodemon --exec 'ts-node --project ./tsconfig.json -r tsconfig-paths/register ./source/main.ts'",
"test": "lab --require tsconfig-paths/register --typescript -P test -v"
},
@ -66,6 +67,7 @@
"ts-node-dev": "^1.1.6",
"tsc-alias": "^1.7.0",
"tsconfig-paths": "^3.9.0",
"tsx": "^3.12.7",
"typescript": "^4.3.2"
},
"pnpm": {

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

@ -107,7 +107,7 @@ class routePlugin {
const h = argus[1]
if (request.logs && !!request.logs.length && errto) {
// request.yar.flash('error', request.logs.map((v: any)=>v.error.message));
request.yar.flash("error", failReason)
request.yar.flash("error", failReason || request.logs.map((v: any)=>v.error.message))
return h.redirect(errto)
}
return await ff.call(this, ...argus)
@ -126,7 +126,7 @@ class routePlugin {
const h = argus[1]
if (request.$joi_error) {
loggerSite.debug("传输参数错误: ", request.$joi_error)
request.yar.flash("error", failReason)
request.yar.flash("error", failReason || request.$joi_error)
delete request.$joi_error
return h.redirect(errto)
}

282
pnpm-lock.yaml

@ -56,6 +56,7 @@ importers:
ts-node-dev: ^1.1.6
tsc-alias: ^1.7.0
tsconfig-paths: ^3.9.0
tsx: ^3.12.7
typescript: ^4.3.2
dependencies:
'@hapi/cookie': 11.0.2
@ -106,6 +107,7 @@ importers:
ts-node-dev: 1.1.6_typescript@4.3.2
tsc-alias: 1.8.5
tsconfig-paths: 3.9.0
tsx: 3.12.7
typescript: 4.3.2
packages/hapi-router:
@ -362,6 +364,225 @@ packages:
'@babel/helper-validator-identifier': 7.19.1
to-fast-properties: 2.0.0
/@esbuild-kit/cjs-loader/2.4.2:
resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==}
dependencies:
'@esbuild-kit/core-utils': 3.1.0
get-tsconfig: 4.5.0
dev: true
/@esbuild-kit/core-utils/3.1.0:
resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==}
dependencies:
esbuild: 0.17.18
source-map-support: 0.5.21
dev: true
/@esbuild-kit/esm-loader/2.5.5:
resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==}
dependencies:
'@esbuild-kit/core-utils': 3.1.0
get-tsconfig: 4.5.0
dev: true
/@esbuild/android-arm/0.17.18:
resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/android-arm64/0.17.18:
resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/android-x64/0.17.18:
resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/darwin-arm64/0.17.18:
resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@esbuild/darwin-x64/0.17.18:
resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@esbuild/freebsd-arm64/0.17.18:
resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/freebsd-x64/0.17.18:
resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-arm/0.17.18:
resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-arm64/0.17.18:
resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-ia32/0.17.18:
resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-loong64/0.17.18:
resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-mips64el/0.17.18:
resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-ppc64/0.17.18:
resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-riscv64/0.17.18:
resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-s390x/0.17.18:
resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-x64/0.17.18:
resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/netbsd-x64/0.17.18:
resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/openbsd-x64/0.17.18:
resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/sunos-x64/0.17.18:
resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-arm64/0.17.18:
resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-ia32/0.17.18:
resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-x64/0.17.18:
resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@eslint-community/eslint-utils/4.4.0_eslint@8.38.0:
resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -424,7 +645,7 @@ packages:
'@hapi/hoek': 11.0.2
/@hapi/b64/5.0.0:
resolution: {integrity: sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@hapi/b64/-/b64-5.0.0.tgz}
resolution: {integrity: sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==}
dependencies:
'@hapi/hoek': 9.2.0
@ -716,7 +937,7 @@ packages:
resolution: {integrity: sha512-Op/67tr1I+JafN3R3XN5DucVSxKRT/Tc+tUszDwENoNpolxeXkhrJ2Czt6B6AAqrespHoivhgZBWYSuANN9QXg==}
dependencies:
'@hapi/hoek': 9.2.0
mime-db: 1.48.0
mime-db: 1.52.0
dev: false
/@hapi/mimos/7.0.1:
@ -1153,7 +1374,7 @@ packages:
dev: true
/@types/hapi__catbox/10.2.4:
resolution: {integrity: sha512-A6ivRrXD5glmnJna1UAGw87QNZRp/vdFO9U4GS+WhOMWzHnw+oTGkMvg0g6y1930CbeheGOCm7A1qHsqH7AXqg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@types/hapi__catbox/-/hapi__catbox-10.2.4.tgz}
resolution: {integrity: sha512-A6ivRrXD5glmnJna1UAGw87QNZRp/vdFO9U4GS+WhOMWzHnw+oTGkMvg0g6y1930CbeheGOCm7A1qHsqH7AXqg==}
/@types/hapi__cookie/10.1.4:
resolution: {integrity: sha512-CESd2IRnTYAnr+gxHGTXIuLOvi5+M2dw4aG6efP+K6bVTdE385Cu63k/DNLO6iQX0hoXtxCYUKy1QyQEy/Xg5A==}
@ -2273,6 +2494,36 @@ packages:
is-symbol: 1.0.4
dev: false
/esbuild/0.17.18:
resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@esbuild/android-arm': 0.17.18
'@esbuild/android-arm64': 0.17.18
'@esbuild/android-x64': 0.17.18
'@esbuild/darwin-arm64': 0.17.18
'@esbuild/darwin-x64': 0.17.18
'@esbuild/freebsd-arm64': 0.17.18
'@esbuild/freebsd-x64': 0.17.18
'@esbuild/linux-arm': 0.17.18
'@esbuild/linux-arm64': 0.17.18
'@esbuild/linux-ia32': 0.17.18
'@esbuild/linux-loong64': 0.17.18
'@esbuild/linux-mips64el': 0.17.18
'@esbuild/linux-ppc64': 0.17.18
'@esbuild/linux-riscv64': 0.17.18
'@esbuild/linux-s390x': 0.17.18
'@esbuild/linux-x64': 0.17.18
'@esbuild/netbsd-x64': 0.17.18
'@esbuild/openbsd-x64': 0.17.18
'@esbuild/sunos-x64': 0.17.18
'@esbuild/win32-arm64': 0.17.18
'@esbuild/win32-ia32': 0.17.18
'@esbuild/win32-x64': 0.17.18
dev: true
/escalade/3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'}
@ -2737,6 +2988,10 @@ packages:
dependencies:
pump: 3.0.0
/get-tsconfig/4.5.0:
resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==}
dev: true
/getpass/0.1.7:
resolution: {integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=}
dependencies:
@ -3754,6 +4009,7 @@ packages:
resolution: {integrity: sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==}
engines: {node: '>= 0.6'}
dev: false
optional: true
/mime-db/1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
@ -5012,6 +5268,13 @@ packages:
source-map: 0.6.1
dev: true
/source-map-support/0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
dependencies:
buffer-from: 1.1.1
source-map: 0.6.1
dev: true
/source-map/0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
@ -5476,7 +5739,7 @@ packages:
create-require: 1.1.1
diff: 4.0.2
make-error: 1.3.6
source-map-support: 0.5.19
source-map-support: 0.5.21
typescript: 4.3.2
yn: 3.1.1
dev: true
@ -5519,6 +5782,17 @@ packages:
resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
dev: true
/tsx/3.12.7:
resolution: {integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==}
hasBin: true
dependencies:
'@esbuild-kit/cjs-loader': 2.4.2
'@esbuild-kit/core-utils': 3.1.0
'@esbuild-kit/esm-loader': 2.5.5
optionalDependencies:
fsevents: 2.3.2
dev: true
/tunnel-agent/0.6.0:
resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=}
dependencies:

BIN
public/favicon.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

1
public/js/common/htmx.min.js

File diff suppressed because one or more lines are too long

1
public/style/common/bulma.min.css

File diff suppressed because one or more lines are too long

7
route.txt

@ -1,6 +1,6 @@
D:\1XYX\pro\hapi-demo\dist\route\htmx对应路径:
不需权限 : GET /htmx/clicked
D:\1XYX\pro\hapi-demo\dist\route\views对应路径:
D:\1XYX\pro\hapi-demo\source\route\htmx对应路径:
不需权限 : GET /htmx/path/{path*}
D:\1XYX\pro\hapi-demo\source\route\views对应路径:
不需权限(提供无需验证): GET /404
不需权限 : GET /css
不需权限(提供无需验证): GET /
@ -10,6 +10,7 @@ D:\1XYX\pro\hapi-demo\dist\route\views对应路径:
不需权限(提供无需验证): GET /login
不需权限 : POST /login
需要权限 : GET /logout
需要权限 : POST /del
不需权限(提供无需验证): GET /register
不需权限 : POST /register
不需权限 : GET /nav

BIN
source/db/data.db

Binary file not shown.

17
source/route/htmx/index.ts

@ -1,13 +1,20 @@
import { Req, Res, ReturnValue } from "#/global"
import { LoginUserSchema, RegisterUserSchema, UserSchema } from "@/schema"
import { gFail, gSuccess } from "@/util"
import { baseDir, gFail, gSuccess } from "@/util"
import { auth, config, method, route, validate } from "@noderun/hapi-router"
import * as bcrypt from "bcrypt"
import path from "path"
import fs from "fs-extra"
export default class {
@route("/clicked")
async clicked(request: Req, h: Res): ReturnValue {
// return 'aaaaaaaaaaaaaabbbbbbbbbbbbbbbb'
return h.view("htmx/a.pug")
@route("/path/{path*}")
async all(req: Req, h: Res): ReturnValue {
if (req.params && req.params.path) {
const filePath = path.resolve(baseDir, "template/htmx/path", req.params.path+".pug")
if(fs.existsSync(filePath)){
return h.view(`htmx/path/${req.params.path}.pug`)
}
}
return "404"
}
}

18
source/route/views/index.ts

@ -25,7 +25,7 @@ export default class {
$errto: "/login",
// failAction: 'log'
failAction: "function",
failReason: "用户名或密码错误,请重试",
// failReason: "用户名或密码错误,请重试",
})
@method("POST")
@route("/login")
@ -52,6 +52,22 @@ export default class {
return h.redirect("/")
}
@method("POST")
@auth()
async del(request: Req, h: Res): ReturnValue {
const { id } = request.auth.credentials
try {
const User = request.getModel("User")
await User.destroy({ where: { id: id }})
request.yar.flash("success", "用户已删除")
request.cookieAuth.clear()
} catch (error) {
loggerSite.error(`用户删除错误`, error.message)
request.yar.flash("error", "用户删除错误")
}
return h.redirect("/")
}
@route("/register")
@auth("try")
@method("GET")

23
source/route/views/index/index.ts

@ -2,7 +2,7 @@ import { auth, config, method, route, swagger, validate } from "@noderun/hapi-ro
import { Req, Res, ReturnValue } from "#/global"
import path from "path"
import fs from "fs-extra"
import { baseDir } from "@/util"
import { baseDir, gFail } from "@/util"
import MarkdownIt from "markdown-it"
export default class Index {
@ -34,11 +34,28 @@ export default class Index {
// console.log(error);
// }
// console.log(2);
const { id } = request.auth.credentials
const isRenderHtmx = Reflect.has(request.query, "htmx")
console.log(Reflect.has(request.query, "htmx"))
const User = request.getModel("User")
let res = await User.findOne({ where: { id: id } })
if (res == null) {
return gFail(null, "不存在该用户")
}
const userinfo = res.toJSON()
delete userinfo.password
const md = new MarkdownIt()
var result = md.render("# markdown-it rulezz!")
return h.view("views/about.pug", {
const data = {
md: result,
})
user: userinfo,
}
if (isRenderHtmx) {
return h.view("htmx/path/about.pug", data)
}
return h.view("views/about.pug", data)
}
@route("/docs/{path*}")

2
source/run.ts

@ -96,6 +96,8 @@ const run = async (): Promise<Server> => {
pugPluginAlias({
// as Function
"@": fn => fn.replace(/^@/, "template"),
"@hxpath": fn => fn.replace(/^@hxpath/, "template/htmx/path"),
"@views": fn => fn.replace(/^@views/, "template/views"),
}),
],
},

2
source/schema/index.ts

@ -1,7 +1,7 @@
import * as Joi from "joi"
export const UserSchema = Joi.object({
username: Joi.string().alphanum().min(6).max(35),
username: Joi.string().alphanum().min(6).max(35).error(new Error('用户名格式错误')),
password: Joi.string().pattern(new RegExp("^[a-zA-Z0-9]{3,30}$")).required(),
email: Joi.string().email({
minDomainSegments: 2,

2
template/helper/helper.pug

@ -6,3 +6,5 @@ mixin script(src)
mixin security
include ./form_security.pug
mixin security
include ./form_security.pug

1
template/htmx/a.pug

@ -1 +0,0 @@
div aaaaaaasdaasdasdada

15
template/htmx/path/about.pug

@ -0,0 +1,15 @@
include @/helper/helper.pug
block var
-title="关于" // 网页标题
title 关于
div about
section.section
.container
if user
div nickname: #{user.nickname || "None"}
div email: #{user.email || "None"}
div username: #{user.username || "None"}
div id: #{user.id || "None"}
.content!=md

7
template/htmx/path/index.pug

@ -0,0 +1,7 @@
block var
-title="首页" // 网页标题
title 首页
div sad
if isLogin
button(hx-target="#single-page" hx-get="/about?htmx" hx-push-url="/about" hx-trigger="click" hx-swap="innerHTML") Click Me!

8
template/layout/layout.pug

@ -6,10 +6,11 @@ html(lang="zh-cn" class=hideHeader?"":"has-navbar-fixed-top")
head
meta(charset="UTF-8")
meta(http-equiv="X-UA-Compatible", content="IE=edge")
link(rel="shortcut icon" href="/public/favicon.ico" type="image/x-icon")
link(rel="shortcut icon" href="/public/favicon.ico" type="image/x-icon")
meta(name="viewport", content="width=device-width, initial-scale=1.0")
title #{title || 'WEB'}
link(rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css")
//- link(rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css")
+css("style/common/bulma.min.css")
+css("style/common/style.css")
block head
body
@ -17,6 +18,7 @@ html(lang="zh-cn" class=hideHeader?"":"has-navbar-fixed-top")
if !hideHeader
include @/ui/header.pug
block content
script(src="https://unpkg.com/htmx.org@1.8.4" integrity="sha384-wg5Y/JwF7VxGk4zLsJEcAojRtlVp1FKKdGy1qN+OMtdq72WRvX/EdRdqg/LOhYeV" crossorigin="anonymous")
//- script(src="https://unpkg.com/htmx.org@1.8.4" integrity="sha384-wg5Y/JwF7VxGk4zLsJEcAojRtlVp1FKKdGy1qN+OMtdq72WRvX/EdRdqg/LOhYeV" crossorigin="anonymous")
+script("js/common/htmx.min.js")
+script("js/common/main.js")
block script

6
template/layout/single-page.pug

@ -0,0 +1,6 @@
extends @/layout/layout
block content
section.section
.container(id="single-page")
block page

9
template/ui/header.pug

@ -2,7 +2,8 @@ nav.is-fixed-top.navbar(role='navigation', aria-label='main navigation', style="
.container
.navbar-brand
a.navbar-item(href='/')
img(src='https://bulma.io/images/bulma-logo.png', width='112', height='28')
.title YSir
//- img(src='https://bulma.io/images/bulma-logo.png', width='112', height='28')
a.navbar-burger(role='button', aria-label='menu', aria-expanded='false', data-target='navbarBasicExample')
span(aria-hidden='true')
span(aria-hidden='true')
@ -15,7 +16,7 @@ nav.is-fixed-top.navbar(role='navigation', aria-label='main navigation', style="
a.navbar-link
| 更多
.navbar-dropdown
a.navbar-item(href="/about")
a.navbar-item(hx-get="/about?htmx" hx-push-url="/about" hx-trigger="click" hx-target="#single-page" hx-swap="innerHTML")
| 关于本站
a.navbar-item
| 关于作者
@ -40,3 +41,7 @@ nav.is-fixed-top.navbar(role='navigation', aria-label='main navigation', style="
hr.navbar-divider
a.navbar-item(href="/logout")
| 退出
form(action="/del" method="post")
+security
a.navbar-item
button(type="submit") 删除

14
template/views/about.pug

@ -1,12 +1,4 @@
extends /layout/layout
extends @/layout/single-page
block var
-title="关于"
block head
block content
section.section
.container.content!= md
block script
block page
include @hxpath/about.pug

16
template/views/index.pug

@ -1,14 +1,4 @@
extends @/layout/layout
extends @/layout/single-page
block var
-title="首页" // 网页标题
//- -hideHeader=true
block head
block content
section.section
.container
div sda
if isLogin
button(hx-get="/htmx/clicked" hx-push-url="/about" hx-trigger="click" hx-target="this" hx-swap="outerHTML") Click Me!
block page
include @hxpath/index.pug

2
template/views/login.pug

@ -1,4 +1,4 @@
extends /layout/layout
extends @/layout/layout
block var
-title="登陆" // 网页标题

2
template/views/register.pug

@ -1,4 +1,4 @@
extends /layout/layout
extends @/layout/layout
block var
-title="注册" // 网页标题

15
template/views/user.pug

@ -1,15 +0,0 @@
extends @/layout/layout
block var
-title="用户信息" // 网页标题
//- -hideHeader=true
block head
block content
section.section
.container
div nickname: #{user.nickname}
div email: #{user.email}
div username: #{user.username}
div id: #{user.id}

5
types/global.d.ts

@ -2,6 +2,7 @@ import { Logger } from "log4js"
import { Server } from "@hapi/hapi"
import { Request, ResponseToolkit, Lifecycle } from "@hapi/hapi"
import { TUserModel } from "@/models/User"
import yar from "@hapi/yar"
declare global {
var server: Server
@ -17,6 +18,10 @@ interface Models {
declare module "@hapi/hapi" {
interface Request {
getModel<T extends keyof Models, M extends Models[T]>(name: T): M
yar: yar.Yar;
}
interface Server {
yar: yar.ServerYar;
}
interface ResponseToolkit {}
}

Loading…
Cancel
Save