Browse Source

fixed bug

dev
npmrun 2 years ago
parent
commit
3953a57fa4
  1. 188
      pnpm-lock.yaml
  2. 5
      route.txt
  3. BIN
      source/db/data.db
  4. 3
      source/plugins/index.ts
  5. 15
      source/route/views/login.ts
  6. 1
      source/run.ts
  7. 5
      template/helper/ui.pug
  8. 2
      template/layout/layout.pug
  9. 4
      template/views/index.pug

188
pnpm-lock.yaml

@ -1,8 +1,8 @@
lockfileVersion: 5.3
lockfileVersion: 5.4
specifiers:
'@hapi/code': ^9.0.1
'@hapi/cookie': ^11.0.2
'@hapi/cookie': 11.0.2
'@hapi/crumb': ^8.0.1
'@hapi/hapi': ^20.1.2
'@hapi/hoek': ^10.0.0
@ -59,8 +59,8 @@ dependencies:
bcrypt: 5.0.1
fs-extra: 10.1.0
hapi-auth-jwt2: 10.2.0
hapi-sequelizejs: 4.5.0_854bf76d9bf23fc83de64ddfc031ac7f
hapi-swagger: 14.2.0_@hapi+hapi@20.1.4+joi@17.4.0
hapi-sequelizejs: 4.5.0_qvf7o3m36i74qppgjxp4amnmp4
hapi-swagger: 14.2.0_7vfmy7cdcj4whrdhceanslo3uq
joi: 17.4.0
json-merge-patch: 1.0.1
jsonwebtoken: 8.5.1
@ -88,7 +88,7 @@ devDependencies:
fast-glob: 3.2.11
file-type: 16.5.0
log4js: 6.4.1
ts-node: 10.0.0_994e9dd6eccb2c889707fc5c400a4503
ts-node: 10.0.0_tfhj3vxmzmwirfyh7roeacsfam
ts-node-dev: 1.1.6_typescript@4.3.2
tsc-alias: 1.7.0
tsconfig-paths: 3.9.0
@ -139,7 +139,7 @@ packages:
- supports-color
dev: true
/@babel/eslint-parser/7.18.9_@babel+core@7.18.9+eslint@8.20.0:
/@babel/eslint-parser/7.18.9_454u7sltq2wfyzqnoclqps3oeu:
resolution: {integrity: sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ==}
engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0}
peerDependencies:
@ -437,7 +437,7 @@ packages:
dependencies:
'@hapi/boom': 9.1.2
/@hapi/eslint-plugin/6.0.0_b4055c31b549a4167e3f98494be7111a:
/@hapi/eslint-plugin/6.0.0_wqcvymnvjgsbm7r7tbeuxzyrdi:
resolution: {integrity: sha512-6eN1fnBO742nTTSpQtYB35aFGAT9I7r4u2v/+R2c9ToYTQp4QBoPOBA5R3+C7+Az3I0ugs+lTIqAsMPDLpsRAg==}
peerDependencies:
'@babel/core': ^7.14.3
@ -449,7 +449,7 @@ packages:
optional: true
dependencies:
'@babel/core': 7.18.9_supports-color@8.1.1
'@babel/eslint-parser': 7.18.9_@babel+core@7.18.9+eslint@8.20.0
'@babel/eslint-parser': 7.18.9_454u7sltq2wfyzqnoclqps3oeu
dev: true
/@hapi/file/2.0.0:
@ -524,9 +524,9 @@ packages:
optional: true
dependencies:
'@babel/core': 7.18.9_supports-color@8.1.1
'@babel/eslint-parser': 7.18.9_@babel+core@7.18.9+eslint@8.20.0
'@babel/eslint-parser': 7.18.9_454u7sltq2wfyzqnoclqps3oeu
'@hapi/bossy': 6.0.0
'@hapi/eslint-plugin': 6.0.0_b4055c31b549a4167e3f98494be7111a
'@hapi/eslint-plugin': 6.0.0_wqcvymnvjgsbm7r7tbeuxzyrdi
'@hapi/hoek': 10.0.0
diff: 5.1.0
eslint: 8.20.0_supports-color@8.1.1
@ -1258,7 +1258,7 @@ packages:
normalize-path: 3.0.0
readdirp: 3.6.0
optionalDependencies:
fsevents: registry.npmmirror.com/fsevents/2.3.2
fsevents: 2.3.2
/chokidar/3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
@ -1272,7 +1272,7 @@ packages:
normalize-path: 3.0.0
readdirp: 3.6.0
optionalDependencies:
fsevents: registry.npmmirror.com/fsevents/2.3.2
fsevents: 2.3.2
dev: true
/chownr/1.1.4:
@ -1331,6 +1331,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
/commander/9.4.0:
resolution: {integrity: sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==}
engines: {node: ^12.20.0 || >=14}
@ -1344,7 +1350,7 @@ packages:
engines: {node: '>=8'}
dependencies:
dot-prop: 5.3.0
graceful-fs: registry.npmmirror.com/graceful-fs/4.2.6
graceful-fs: 4.2.6
make-dir: 3.1.0
unique-string: 2.0.0
write-file-atomic: 3.0.3
@ -1437,16 +1443,39 @@ packages:
meow: 3.7.0
dev: true
/debug/2.6.9:
/debug/2.6.9_supports-color@5.5.0:
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
dependencies:
ms: 2.0.0
supports-color: 5.5.0
dev: false
/debug/3.2.7:
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
dependencies:
ms: 2.1.3
dev: false
/debug/3.2.7_supports-color@5.5.0:
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
dependencies:
ms: 2.1.3
supports-color: 5.5.0
dev: false
/debug/4.3.1:
@ -1995,11 +2024,18 @@ packages:
/fs.realpath/1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
/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: 2.0.4
mkdirp: 0.5.5
rimraf: 2.7.1
@ -2151,7 +2187,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
/hapi-auth-jwt2/10.2.0:
resolution: {integrity: sha512-6Xkt0LHNBglYWOlFulNgf5pUPqRGMKpAHZjwEZqC8/07TVlgxr240pENctrthcLi8k/yCunm7x2xCSLNyTGKmg==}
@ -2162,7 +2198,7 @@ packages:
jsonwebtoken: 8.5.1
dev: false
/hapi-sequelizejs/4.5.0_854bf76d9bf23fc83de64ddfc031ac7f:
/hapi-sequelizejs/4.5.0_qvf7o3m36i74qppgjxp4amnmp4:
resolution: {integrity: sha512-+A2Qgu2lIM8kz7PDxbDtmhGJbnobRPdOEMkmc7NvhElZr5AIkbhoYcV/dmqI70tw671zvRjS9A255igShyigow==}
engines: {node: '>=12.0.0', npm: '>=5.6.0'}
peerDependencies:
@ -2176,7 +2212,7 @@ packages:
sequelize: 6.6.2_sqlite3@5.0.2
dev: false
/hapi-swagger/14.2.0_@hapi+hapi@20.1.4+joi@17.4.0:
/hapi-swagger/14.2.0_7vfmy7cdcj4whrdhceanslo3uq:
resolution: {integrity: sha512-S0XoYfWOsMXA4rk43YCCzNUFW2zNHKfDcagJqrurTMcJgyKK7soHzEbaF34m/kyeT4n4YiKLDdcFhfXzSAMycw==}
engines: {node: '>=12.0.0'}
peerDependencies:
@ -2192,6 +2228,8 @@ packages:
json-schema-ref-parser: 6.1.0
swagger-parser: 4.0.2
swagger-ui-dist: 3.50.0
transitivePeerDependencies:
- supports-color
dev: false
/har-schema/2.0.0:
@ -2642,6 +2680,8 @@ packages:
debug: 3.2.7
js-yaml: 3.14.1
ono: 4.0.11
transitivePeerDependencies:
- supports-color
dev: false
/json-schema-ref-parser/6.1.0:
@ -2687,7 +2727,7 @@ packages:
dependencies:
universalify: 2.0.0
optionalDependencies:
graceful-fs: registry.npmmirror.com/graceful-fs/4.2.6
graceful-fs: 4.2.6
/jsonwebtoken/8.5.1:
resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==}
@ -2776,7 +2816,7 @@ packages:
resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==}
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
@ -3058,6 +3098,8 @@ packages:
debug: 3.2.7
iconv-lite: 0.4.24
sax: 1.2.4
transitivePeerDependencies:
- supports-color
dev: false
/neo-async/2.6.2:
@ -3072,6 +3114,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: 7.1.7
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'
@ -3087,6 +3150,8 @@ packages:
rimraf: 2.7.1
semver: 5.7.1
tar: 4.4.13
transitivePeerDependencies:
- supports-color
dev: false
/node-releases/2.0.6:
@ -3100,14 +3165,14 @@ packages:
requiresBuild: true
dependencies:
chokidar: 3.5.2
debug: 3.2.7
debug: 3.2.7_supports-color@5.5.0
ignore-by-default: 1.0.1
minimatch: 3.0.4
pstree.remy: 1.1.8
semver: 5.7.1
supports-color: 5.5.0
touch: 3.1.0
undefsafe: 2.0.3
undefsafe: 2.0.3_supports-color@5.5.0
update-notifier: 4.1.3
dev: false
@ -3344,7 +3409,7 @@ packages:
resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==}
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
@ -3940,7 +4005,9 @@ 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
transitivePeerDependencies:
- supports-color
dev: false
/sshpk/1.16.1:
@ -4120,6 +4187,8 @@ packages:
swagger-methods: 1.0.8
swagger-schema-official: 2.0.0-bab6bed
z-schema: 3.25.1
transitivePeerDependencies:
- supports-color
dev: false
/swagger-schema-official/2.0.0-bab6bed:
@ -4260,7 +4329,7 @@ packages:
typescript: 4.3.2
dev: true
/ts-node/10.0.0_994e9dd6eccb2c889707fc5c400a4503:
/ts-node/10.0.0_tfhj3vxmzmwirfyh7roeacsfam:
resolution: {integrity: sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg==}
engines: {node: '>=12.0.0'}
hasBin: true
@ -4380,6 +4449,13 @@ packages:
resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==}
dev: false
/uglify-js/3.13.9:
resolution: {integrity: sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g==}
engines: {node: '>=0.8.0'}
hasBin: true
requiresBuild: true
optional: true
/uid-safe/2.1.5:
resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==}
engines: {node: '>= 0.8'}
@ -4396,10 +4472,12 @@ packages:
which-boxed-primitive: 1.0.2
dev: false
/undefsafe/2.0.3:
/undefsafe/2.0.3_supports-color@5.5.0:
resolution: {integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==}
dependencies:
debug: 2.6.9
debug: 2.6.9_supports-color@5.5.0
transitivePeerDependencies:
- supports-color
dev: false
/unique-string/2.0.0:
@ -4634,59 +4712,5 @@ packages:
lodash.isequal: 4.5.0
validator: 10.11.0
optionalDependencies:
commander: registry.npmmirror.com/commander/2.20.3
dev: false
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/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/graceful-fs/4.2.6:
resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.6.tgz}
name: graceful-fs
version: 4.2.6
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: 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
commander: 2.20.3
dev: false
optional: 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
optional: true

5
route.txt

@ -1,4 +1,4 @@
D:\1XYX\demo\hapi-demo\source\route\api对应路径:
D:\@code\project\hapi-demo\source\route\api对应路径:
不需权限 : GET /api/{path*}
需要权限 : GET /api/v1/upload
需要权限 : POST /api/v1/upload/upload
@ -7,7 +7,7 @@ D:\1XYX\demo\hapi-demo\source\route\api对应路径:
不需权限 : POST /api/v1/user/login
需要权限 : DELETE /api/v1/user/del
需要权限 : GET /api/v1/user/userinfo
D:\1XYX\demo\hapi-demo\source\route\views对应路径:
D:\@code\project\hapi-demo\source\route\views对应路径:
不需权限(提供无需验证): GET /404
不需权限 : GET /css
不需权限(提供无需验证): GET /
@ -16,5 +16,6 @@ D:\1XYX\demo\hapi-demo\source\route\views对应路径:
不需权限 : GET /{path*}
不需权限(提供无需验证): GET /login
不需权限 : POST /login
需要权限 : GET /login/logout
不需权限 : POST /login/register
不需权限 : GET /nav

BIN
source/db/data.db

Binary file not shown.

3
source/plugins/index.ts

@ -37,6 +37,8 @@ export default [
server.ext('onPreResponse', async function(request: Request, h) {
// 需要设置auth是try或者true才行
const isLogin = request.auth.isAuthenticated;
console.log("是否登录:",isLogin, request.path);
// @ts-ignore
// console.log(isLogin, request.path, request.response.variety);
let user;
@ -71,6 +73,7 @@ export default [
{
plugin: HapiYar,
options: {
name: "yar",
storeBlank: false,
cookieOptions: {
password: "dsRhw1Y5UZqB8SjfClbkrX9PF7yuDMV3JItcW0G4vgpaxONo6mzenHLQET2AiKyPUjjdgjo10amjfghy",

15
source/route/views/login.ts

@ -17,12 +17,11 @@ export default class {
} else {
logger.debug("未登录");
}
return h.view("views/login.pug");
return h.view("views/login.pug");
}
@method("POST")
@route("/index")
@auth(false)
async loginRes(request: Req, h: Res): ReturnValue {
const { username, password } = request.payload as any;
if(!username || !password ){
@ -41,9 +40,19 @@ export default class {
return h.redirect("/");
}
@method("GET")
@auth()
@route("/logout")
async logout(request: Req, h: Res): ReturnValue {
request.yar.flash('error', '用户已退出');
console.log(111,request.auth.artifacts);
request.cookieAuth.clear();
return h.redirect("/");
}
@method("POST")
@route("/register")
@auth(false)
async register(request: Req, h: Res): ReturnValue {
let { username, password, email } = request.payload as any;
if (!username) username = email;

1
source/run.ts

@ -51,6 +51,7 @@ const run = async (): Promise<Server> => {
server.auth.strategy("session", "cookie", {
cookie: {
ttl: 1000 * 60 * 60 * 24,
path: '/', // 测试退出时set-cookie失效,加上这个好了
name: "sid", //cookie的名字
password: process.env.KEY,
isSecure: false, // false: 允许 Cookie 通过不安全的连接传输,这会使其受到攻击

5
template/helper/ui.pug

@ -17,3 +17,8 @@ mixin header()
.btn.btn-sm.btn-outline-secondary 登陆/注册
else
div #{user.username}
a(href="/login/logout")
.btn.btn-sm.btn-outline-secondary 退出
//- form(action="/login/logout", method="post")
//- include @/helper/form_security.pug
//- button.btn.btn-sm.btn-outline-secondary(type="submit") 退出

2
template/layout/layout.pug

@ -8,10 +8,10 @@ html(lang="zh-cn")
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")
//- device-width 宽度低于1100像素的设备直接缩小
meta(name="viewport", content="width=device-width, initial-scale=1.0")
title #{title || 'WEB'}
link(rel="stylesheet", href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css", integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx", crossorigin="anonymous")
link(rel="stylesheet", href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css")
+css("style/common/style.css")
block head
body

4
template/views/index.pug

@ -1,4 +1,4 @@
extends /layout/layout
extends @/layout/layout
block var
-title="首页" // 网页标题
@ -9,4 +9,4 @@ block head
block content
.container
div sda
div(class="animated bounce") asda

Loading…
Cancel
Save