guanwei 1.2.5 → 1.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{index-CjLUvkh9.js → index-O2O9peYE.js} +21 -21
- package/dist/assets/index-O2O9peYE.js.map +1 -0
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/server/src/data/db.json +90 -192
- package/server/src/data/guanwei.db +0 -0
- package/server/src/index.ts +31 -15
- package/server/src/routes/ai.ts +19 -5
- package/server/src/routes/divine.ts +58 -23
- package/server/src/routes/users.ts +12 -3
- package/server/src/services/promptBuilder.ts +5 -0
- package/src/services/api.ts +19 -6
- package/dist/assets/index-CjLUvkh9.js.map +0 -1
package/dist/index.html
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>观微 · 玄学问道 —— 九术参详,观微知著</title>
|
|
8
8
|
<meta name="description" content="以纸墨留白为骨,融四柱八字、紫微斗数、奇门遁甲、梅花易数、六爻、大六壬、小六壬、星盘、塔罗九术于一体。观微知著,以术问道。" />
|
|
9
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
+
<script type="module" crossorigin src="/assets/index-O2O9peYE.js"></script>
|
|
10
10
|
<link rel="stylesheet" crossorigin href="/assets/index-hLV3S-Cj.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
package/package.json
CHANGED
package/server/src/data/db.json
CHANGED
|
@@ -6278,9 +6278,9 @@
|
|
|
6278
6278
|
"records": []
|
|
6279
6279
|
},
|
|
6280
6280
|
{
|
|
6281
|
-
"username": "联调
|
|
6282
|
-
"passHash": "scrypt$
|
|
6283
|
-
"createdAt":
|
|
6281
|
+
"username": "联调7754",
|
|
6282
|
+
"passHash": "scrypt$ed8423b10c4ba0b503c4603d9e587f07$ce6d083e8c98f079e7a9070ce4ab32db901a7e9eea277504716bfa63851da17ed55180d2fae2fb4441965135ae2e3e30e356e2fe7ab9fe6b141f3b819dffa80a",
|
|
6283
|
+
"createdAt": 1788614637809,
|
|
6284
6284
|
"profile": {
|
|
6285
6285
|
"birthDate": "1996-09-09",
|
|
6286
6286
|
"birthHourIndex": 5,
|
|
@@ -6297,146 +6297,95 @@
|
|
|
6297
6297
|
}
|
|
6298
6298
|
}
|
|
6299
6299
|
],
|
|
6300
|
-
"token": "
|
|
6300
|
+
"token": "f9a48b552d6187d72f1417821c94d7446cdf1160cc75b419db533be065cfe682",
|
|
6301
|
+
"tokenExpires": 1791206637867
|
|
6301
6302
|
},
|
|
6302
6303
|
{
|
|
6303
|
-
"username": "鉴权
|
|
6304
|
-
"passHash": "scrypt$
|
|
6305
|
-
"createdAt":
|
|
6304
|
+
"username": "鉴权7969",
|
|
6305
|
+
"passHash": "scrypt$a7726dd9df24bb3c73b8219911323a55$098463367b1f5afc51a410f5624094420e1e7da6b40d1d1e088b9ccc2a4212916471db032a5d4c0a531e72580470d142252536784254934de2a006f6062df571",
|
|
6306
|
+
"createdAt": 1788614638000,
|
|
6306
6307
|
"profile": {
|
|
6307
6308
|
"birthDate": "1999-01-01"
|
|
6308
6309
|
},
|
|
6309
6310
|
"samples": [],
|
|
6310
6311
|
"records": [],
|
|
6311
|
-
"token": "
|
|
6312
|
+
"token": "cde6e4e6573cbdaba56974a8906f7c9a764216c9320fd28135143c25e0973d68",
|
|
6313
|
+
"tokenExpires": 1791206638000
|
|
6312
6314
|
},
|
|
6313
6315
|
{
|
|
6314
|
-
"username": "他人
|
|
6315
|
-
"passHash": "scrypt$
|
|
6316
|
-
"createdAt":
|
|
6316
|
+
"username": "他人8027",
|
|
6317
|
+
"passHash": "scrypt$4552edb5957aae12ccb6fd6bf1144f18$dd4dd1e750e861ac8fd1f9f090c3298fcedd13781aa7fe45efa93f9acc69eb84dc3c28884f5fc5bfede8ccdb2fa882aa71e557abfaedebaef4631ec56ae1a6ea",
|
|
6318
|
+
"createdAt": 1788614638059,
|
|
6317
6319
|
"profile": {},
|
|
6318
6320
|
"samples": [],
|
|
6319
6321
|
"records": [],
|
|
6320
|
-
"token": "
|
|
6322
|
+
"token": "4d4e82e60b1bdb5b5d60fcdfedab050e3ec03ec11a6e7b9998cb98531dbd33b7",
|
|
6323
|
+
"tokenExpires": 1791206638059
|
|
6321
6324
|
},
|
|
6322
6325
|
{
|
|
6323
|
-
"username": "
|
|
6324
|
-
"passHash": "scrypt$
|
|
6325
|
-
"createdAt":
|
|
6326
|
+
"username": "轮换8066",
|
|
6327
|
+
"passHash": "scrypt$3dc3a1e312fb61407c8f52d45a2a66d4$786369c0c664776519c40050fcbee763e081ff129d9105473367a78f544e680cb1873db86f96651608451d28e60631c70915b581e466803410bedc64c055f40a",
|
|
6328
|
+
"createdAt": 1788614638097,
|
|
6326
6329
|
"profile": {},
|
|
6327
6330
|
"samples": [],
|
|
6328
6331
|
"records": [],
|
|
6329
|
-
"token": "
|
|
6332
|
+
"token": "c65837f97cb3d9a1ec4c3b5f4c294842afce4c1d331acbe83c16fabffdff4ed2",
|
|
6333
|
+
"tokenExpires": 1791206638136
|
|
6330
6334
|
},
|
|
6331
6335
|
{
|
|
6332
|
-
"username": "占位
|
|
6333
|
-
"passHash": "scrypt$
|
|
6334
|
-
"createdAt":
|
|
6336
|
+
"username": "占位8150",
|
|
6337
|
+
"passHash": "scrypt$7a9c083543645f030f3e5e7184ae9359$d66022734ece177b03c3727222653c97b94b3b58993345476987f5deed02748790b6582637f23e06b9b832c40762f0bd8b0739d14004aa235eca989e992907f1",
|
|
6338
|
+
"createdAt": 1788614638154,
|
|
6335
6339
|
"profile": {},
|
|
6336
6340
|
"samples": [],
|
|
6337
6341
|
"records": [],
|
|
6338
|
-
"token": "
|
|
6342
|
+
"token": "fbc6b8b91580245167f8fc3a32d00eab3c2b356949a3faf6da105b23aa8c588d",
|
|
6343
|
+
"tokenExpires": 1791206638241
|
|
6339
6344
|
},
|
|
6340
6345
|
{
|
|
6341
|
-
"username": "甲
|
|
6342
|
-
"passHash": "scrypt$
|
|
6343
|
-
"createdAt":
|
|
6346
|
+
"username": "甲8243",
|
|
6347
|
+
"passHash": "scrypt$2eecd489b7ee51b51ca11a6bbd303bbe$26b975e88d907dbf5c6023c8f46c239a3b26ea127c12e77cbc85c5905a571eeadd79e4eb74c08c5c18b857872428ac0fcad558b9b76b3d2d21daef79f24bb86a",
|
|
6348
|
+
"createdAt": 1788614638284,
|
|
6344
6349
|
"profile": {},
|
|
6345
6350
|
"samples": [],
|
|
6346
6351
|
"records": [],
|
|
6347
|
-
"token": "
|
|
6352
|
+
"token": "1910fb13df4f15b166598b35ed033ad06f5c3bf13b6e925e82a7d12d11493a20",
|
|
6353
|
+
"tokenExpires": 1791206638284
|
|
6348
6354
|
},
|
|
6349
6355
|
{
|
|
6350
|
-
"username": "乙
|
|
6351
|
-
"passHash": "scrypt$
|
|
6352
|
-
"createdAt":
|
|
6356
|
+
"username": "乙8243",
|
|
6357
|
+
"passHash": "scrypt$a8a89e9a08fa8715963f3c9aae9d847a$d7192563877537ce9c7ab6c08cf186c4e7a69d36820e436d29b32423316a1e1ff737cdfb0fc7a10f0df5d9e916b3a616f55082c9f3675be0421f476b6406da92",
|
|
6358
|
+
"createdAt": 1788614638319,
|
|
6353
6359
|
"profile": {},
|
|
6354
6360
|
"samples": [],
|
|
6355
6361
|
"records": [],
|
|
6356
|
-
"token": "
|
|
6362
|
+
"token": "3271392e2b971af8d8ecd782f864f3cd95fa54f6acbd25062833ed0a82b5b506",
|
|
6363
|
+
"tokenExpires": 1791206638319
|
|
6357
6364
|
},
|
|
6358
6365
|
{
|
|
6359
|
-
"username": "
|
|
6360
|
-
"passHash": "scrypt$
|
|
6361
|
-
"createdAt":
|
|
6362
|
-
"profile": {
|
|
6363
|
-
"birthDate": "1996-09-09",
|
|
6364
|
-
"birthHourIndex": 5,
|
|
6365
|
-
"gender": "男",
|
|
6366
|
-
"location": null
|
|
6367
|
-
},
|
|
6368
|
-
"samples": [],
|
|
6369
|
-
"records": [
|
|
6370
|
-
{
|
|
6371
|
-
"artId": "bazi",
|
|
6372
|
-
"createdAt": 1,
|
|
6373
|
-
"result": {
|
|
6374
|
-
"dayGZ": "壬申"
|
|
6375
|
-
}
|
|
6376
|
-
}
|
|
6377
|
-
],
|
|
6378
|
-
"token": "873d8e6fb689c0a759eb24489302d902d9c582cf63b6eed253efcb7dd289c7eb"
|
|
6379
|
-
},
|
|
6380
|
-
{
|
|
6381
|
-
"username": "鉴权2044",
|
|
6382
|
-
"passHash": "scrypt$a7d28897ecebf00429e38530a1be3ddb$1d05f31b71b52ed3233ebbb1d9c17ea189faf66cdcbed57969a79131efe75f744fd48dde8c807740e200e7f6738aacd0fc142c3377de02cafde91381b6c99a2a",
|
|
6383
|
-
"createdAt": 1787974792091,
|
|
6384
|
-
"profile": {
|
|
6385
|
-
"birthDate": "1999-01-01"
|
|
6386
|
-
},
|
|
6387
|
-
"samples": [],
|
|
6388
|
-
"records": [],
|
|
6389
|
-
"token": "2d9fe3339c4a239c03ec747c5b6a2eb526bec03d4204c692421ede018dc92757"
|
|
6390
|
-
},
|
|
6391
|
-
{
|
|
6392
|
-
"username": "他人2114",
|
|
6393
|
-
"passHash": "scrypt$ab67c3c80a2c62c559cbe399d0643c63$fa0f39676d8e12ac0e613c00b100564c55b3153bc074cef3e665773b62f23bc6d6d67873543563fac68d59b490055b309e1d371a33c74e52ea13a0d150928b84",
|
|
6394
|
-
"createdAt": 1787974792156,
|
|
6395
|
-
"profile": {},
|
|
6396
|
-
"samples": [],
|
|
6397
|
-
"records": [],
|
|
6398
|
-
"token": "cd08fe94f891fe49b43106684b342cfba169ffd920bf9f72558842a91bb86b67"
|
|
6399
|
-
},
|
|
6400
|
-
{
|
|
6401
|
-
"username": "登鉴2165",
|
|
6402
|
-
"passHash": "scrypt$8fd7b88e6f63f16bd355a799c1fdb507$4d82632c56bf3657bfb1395726d3014272a8dbd61206010f809533b4561a9727e5e4041b6a076c7ae0f70eda21ff4b63bc415a92bbad29538a974e0dc9aa029d",
|
|
6403
|
-
"createdAt": 1787974792209,
|
|
6404
|
-
"profile": {},
|
|
6405
|
-
"samples": [],
|
|
6406
|
-
"records": [],
|
|
6407
|
-
"token": "4e69bfef54a7c816bf22357687720d112062d7cda9e0a3e483668a5d0ffae04b"
|
|
6408
|
-
},
|
|
6409
|
-
{
|
|
6410
|
-
"username": "占位2262",
|
|
6411
|
-
"passHash": "scrypt$9b030e5b8d1c475f3700534c0cea8bcc$5dcff5dd3abe675650bc5c8d7a0bb7402893cb6a7b20582a399dbbb39b5afea61c12525ce6beb080acf26dccb801f707d6c48434689cad680fcc2c37932cecfc",
|
|
6412
|
-
"createdAt": 1787974792265,
|
|
6413
|
-
"profile": {},
|
|
6414
|
-
"samples": [],
|
|
6415
|
-
"records": [],
|
|
6416
|
-
"token": "06b5d6f063dc265a4ab0181dbeeabfaedd815bcf44a481c5817a84e3403162bd"
|
|
6417
|
-
},
|
|
6418
|
-
{
|
|
6419
|
-
"username": "甲2362",
|
|
6420
|
-
"passHash": "scrypt$e0a1334c2e39079fe996d50550b296ac$22b689d05605618743ed4de49781e4920c813fe9773c66b1ffcfd841202e5eea8654bca1cb0722fdd4121abe997fe0d3b2ce6ea52b1b72f616ae4373ca92be42",
|
|
6421
|
-
"createdAt": 1787974792397,
|
|
6366
|
+
"username": "列删8349",
|
|
6367
|
+
"passHash": "scrypt$06995fe5edd7133d9650f6914faae958$aad505b6d3efde72709c7080ff29bc00e78851ad31630e376d57ab81501b1be489592340f412fab243fd01b5d6a3d698c1cbe0a70a813f3e766d555f69c73c69",
|
|
6368
|
+
"createdAt": 1788614638388,
|
|
6422
6369
|
"profile": {},
|
|
6423
6370
|
"samples": [],
|
|
6424
6371
|
"records": [],
|
|
6425
|
-
"token": "
|
|
6372
|
+
"token": "4dbe05c16dd5b7eed5553e1464dd6a2439c44fe32b1b0f477341857dce48c4c1",
|
|
6373
|
+
"tokenExpires": 1791206638388
|
|
6426
6374
|
},
|
|
6427
6375
|
{
|
|
6428
|
-
"username": "
|
|
6429
|
-
"passHash": "scrypt$
|
|
6430
|
-
"createdAt":
|
|
6376
|
+
"username": "删乙8349",
|
|
6377
|
+
"passHash": "scrypt$99bb3a60ac73b17954c81313913f3e98$2b5f0bfe2477b5b009378e3a2843950cd5b0d421ecc849232c3a8bfbe86d525f2e7a5d0d386b990c503a75af6fef640d46a34b464d12ca825a6b6f298d062699",
|
|
6378
|
+
"createdAt": 1788614638423,
|
|
6431
6379
|
"profile": {},
|
|
6432
6380
|
"samples": [],
|
|
6433
6381
|
"records": [],
|
|
6434
|
-
"token": "
|
|
6382
|
+
"token": "ddaf3cf93ef84d7bfdf61ee9296c98fef51f67f728d93c5db721f5f65e761c45",
|
|
6383
|
+
"tokenExpires": 1791206638423
|
|
6435
6384
|
},
|
|
6436
6385
|
{
|
|
6437
|
-
"username": "联调
|
|
6438
|
-
"passHash": "scrypt$
|
|
6439
|
-
"createdAt":
|
|
6386
|
+
"username": "联调7895",
|
|
6387
|
+
"passHash": "scrypt$7640ba9283ac00bc8867d8d6d649a82b$b1d3ddc7a6f3be15f5738ab89a27c41e94f397bc32ad84f01e718d10626a2091efb48469b938c5e4fd0aacbf7bc0626658491450202739265c6680e6ff9a1f42",
|
|
6388
|
+
"createdAt": 1788614667970,
|
|
6440
6389
|
"profile": {
|
|
6441
6390
|
"birthDate": "1996-09-09",
|
|
6442
6391
|
"birthHourIndex": 5,
|
|
@@ -6453,141 +6402,90 @@
|
|
|
6453
6402
|
}
|
|
6454
6403
|
}
|
|
6455
6404
|
],
|
|
6456
|
-
"token": "
|
|
6405
|
+
"token": "93e3194d137d1099512ecb958f9be8a8b6ce73991025865c0d482b4385ee0673",
|
|
6406
|
+
"tokenExpires": 1791206668033
|
|
6457
6407
|
},
|
|
6458
6408
|
{
|
|
6459
|
-
"username": "鉴权
|
|
6460
|
-
"passHash": "scrypt$
|
|
6461
|
-
"createdAt":
|
|
6409
|
+
"username": "鉴权8118",
|
|
6410
|
+
"passHash": "scrypt$05f3be2246b4f1db1b0486e9021c65b5$d70fbc06f6ae9950ea355ec09c3618783f7bf057ddfc23b0760b453ebd284e005d3519d59a8848582405de12e84587ae94620ef164bebe94b26724785aa13c3c",
|
|
6411
|
+
"createdAt": 1788614668154,
|
|
6462
6412
|
"profile": {
|
|
6463
6413
|
"birthDate": "1999-01-01"
|
|
6464
6414
|
},
|
|
6465
6415
|
"samples": [],
|
|
6466
6416
|
"records": [],
|
|
6467
|
-
"token": "
|
|
6417
|
+
"token": "a74f08dc94bca01f02547f68206b666a927dd2fe176a524fd050a1a212ab60a2",
|
|
6418
|
+
"tokenExpires": 1791206668154
|
|
6468
6419
|
},
|
|
6469
6420
|
{
|
|
6470
|
-
"username": "他人
|
|
6471
|
-
"passHash": "scrypt$
|
|
6472
|
-
"createdAt":
|
|
6421
|
+
"username": "他人8180",
|
|
6422
|
+
"passHash": "scrypt$4956d4dd093994f5f7a14893a3a6e2c2$4fe63b500fbf5a75087cb2b66e14349db16b9bc2b821290477c0b4158fe3c2518905c7e40786a89431dcdb3ca96467f071d26870c816e756814df61f8c1aeedb",
|
|
6423
|
+
"createdAt": 1788614668219,
|
|
6473
6424
|
"profile": {},
|
|
6474
6425
|
"samples": [],
|
|
6475
6426
|
"records": [],
|
|
6476
|
-
"token": "
|
|
6427
|
+
"token": "eee7aa4ad7323d65931b647c7b09707b27cb122b9b9648405938cc249d63946f",
|
|
6428
|
+
"tokenExpires": 1791206668219
|
|
6477
6429
|
},
|
|
6478
6430
|
{
|
|
6479
|
-
"username": "
|
|
6480
|
-
"passHash": "scrypt$
|
|
6481
|
-
"createdAt":
|
|
6431
|
+
"username": "轮换8224",
|
|
6432
|
+
"passHash": "scrypt$ef3e785238565addd1caa5c5d9d3f3b9$7f716295518764448f54d9ce664e1234bb00639953ce161ad45fb5bd5e411d377738907a2a7cb95a85b8b865baf64167d29c9391fed67efd117611aa87d320ed",
|
|
6433
|
+
"createdAt": 1788614668262,
|
|
6482
6434
|
"profile": {},
|
|
6483
6435
|
"samples": [],
|
|
6484
6436
|
"records": [],
|
|
6485
|
-
"token": "
|
|
6486
|
-
|
|
6487
|
-
{
|
|
6488
|
-
"username": "占位5233",
|
|
6489
|
-
"passHash": "scrypt$86ce84ec1222fe4888a75d2b19324c83$0316d5c423c34fa2bcf1088670bbbe35617ee2f501451af7ec8e3bad915eda8ed49cadf9836f2127b0b72f043a0d24ba9bad598b79d3ff19f451e89a7e8b33d2",
|
|
6490
|
-
"createdAt": 1787978015236,
|
|
6491
|
-
"profile": {},
|
|
6492
|
-
"samples": [],
|
|
6493
|
-
"records": [],
|
|
6494
|
-
"token": "267fd8173c3e0536a66bf6432ca5b07ed8e87e044be6c33edf41b3d55abb0748"
|
|
6495
|
-
},
|
|
6496
|
-
{
|
|
6497
|
-
"username": "甲5347",
|
|
6498
|
-
"passHash": "scrypt$bb2c32b24b75e33435eb8c6910f5ab2f$20a91be38796f811012fb1879a4ffb9da462049340994af0df150206388879c1d34e76ca7b9b9024870b42311062b2c3915c7102e55e74a31a819892f268f0f0",
|
|
6499
|
-
"createdAt": 1787978015397,
|
|
6500
|
-
"profile": {},
|
|
6501
|
-
"samples": [],
|
|
6502
|
-
"records": [],
|
|
6503
|
-
"token": "ba249a40c22dbc4c5a6b9068d3ebc3e1d1afe5212821dbffd0d2b192abf543be"
|
|
6504
|
-
},
|
|
6505
|
-
{
|
|
6506
|
-
"username": "乙5347",
|
|
6507
|
-
"passHash": "scrypt$cfe4fd0384b866b77abed2746d6c882d$c275b3373db1986865e430a392f771e29ed776006d4a7e1a9cef7afe583d81158b0dcb2b86361e863b2fae7273da61d86bbad0c8cadf06eba268b22c14f667b1",
|
|
6508
|
-
"createdAt": 1787978015472,
|
|
6509
|
-
"profile": {},
|
|
6510
|
-
"samples": [],
|
|
6511
|
-
"records": [],
|
|
6512
|
-
"token": "e12f06635335a7d365dca3dc5f4d3c87f0c0c0989199100e3cd40fb1f51b563b"
|
|
6513
|
-
},
|
|
6514
|
-
{
|
|
6515
|
-
"username": "联调1046",
|
|
6516
|
-
"passHash": "scrypt$9212a84cc0e275b12e32aba82966195f$943a2029711318c91a68ca0e9f3393a128d753b6ad00936ad9f08d14ae0abf033b6b0b808f2defecc2f284bccdbe7da6e4624ce15e75c7eb670d6d8486380dd1",
|
|
6517
|
-
"createdAt": 1787978041147,
|
|
6518
|
-
"profile": {
|
|
6519
|
-
"birthDate": "1996-09-09",
|
|
6520
|
-
"birthHourIndex": 5,
|
|
6521
|
-
"gender": "男",
|
|
6522
|
-
"location": null
|
|
6523
|
-
},
|
|
6524
|
-
"samples": [],
|
|
6525
|
-
"records": [
|
|
6526
|
-
{
|
|
6527
|
-
"artId": "bazi",
|
|
6528
|
-
"createdAt": 1,
|
|
6529
|
-
"result": {
|
|
6530
|
-
"dayGZ": "壬申"
|
|
6531
|
-
}
|
|
6532
|
-
}
|
|
6533
|
-
],
|
|
6534
|
-
"token": "2b8f9cdcbeae6f368028bbdac2171f56975d41542f440b98faea51ea24348eb0"
|
|
6535
|
-
},
|
|
6536
|
-
{
|
|
6537
|
-
"username": "鉴权1356",
|
|
6538
|
-
"passHash": "scrypt$d1c69b653d8c59bac97a60cc564a2812$85b38421cc4a8449957a390bea3fafedbec2f1426a3c59a17fd60045a67ea25840da9c03e49159012a18bae42ea997ad98b585a504cfaf1dba41d159c91a6a88",
|
|
6539
|
-
"createdAt": 1787978041401,
|
|
6540
|
-
"profile": {
|
|
6541
|
-
"birthDate": "1999-01-01"
|
|
6542
|
-
},
|
|
6543
|
-
"samples": [],
|
|
6544
|
-
"records": [],
|
|
6545
|
-
"token": "03ae064372554daa1be328b5f435b7a9aa9f5eb5f57d3fdf0e1775de05a42c8f"
|
|
6437
|
+
"token": "2bb1d6f637ba7cf40f12e6da31bd6a5e03b840a04ca0bd10a7e2abb1e99789af",
|
|
6438
|
+
"tokenExpires": 1791206668309
|
|
6546
6439
|
},
|
|
6547
6440
|
{
|
|
6548
|
-
"username": "
|
|
6549
|
-
"passHash": "scrypt$
|
|
6550
|
-
"createdAt":
|
|
6441
|
+
"username": "占位8317",
|
|
6442
|
+
"passHash": "scrypt$600c2361de0d350eca1fe0c27b55ec66$dcdd20c8d655bd23e3de2fefab1dcbae4e7aa5fe7b9d40fdaee1be089cc0bbd32e7692e5d2088b46792d0d150cfa85004563de1ae58240c11bb0314a35ec697a",
|
|
6443
|
+
"createdAt": 1788614668322,
|
|
6551
6444
|
"profile": {},
|
|
6552
6445
|
"samples": [],
|
|
6553
6446
|
"records": [],
|
|
6554
|
-
"token": "
|
|
6447
|
+
"token": "39e3d4ef68e7aa6bedd21d9792c79f74a6ac5fc40b4453faca25f2dfe3ce9467",
|
|
6448
|
+
"tokenExpires": 1791206668405
|
|
6555
6449
|
},
|
|
6556
6450
|
{
|
|
6557
|
-
"username": "
|
|
6558
|
-
"passHash": "scrypt$
|
|
6559
|
-
"createdAt":
|
|
6451
|
+
"username": "甲8408",
|
|
6452
|
+
"passHash": "scrypt$9bb1c3c868b3795437b26546be8a4fd2$094d476f40b17e6e7d0ece5357c16e83a715621a502ac5862dcccbcd4cfef91832d884a91f03df6e81c46eaf6b91a9015c0fc4d745b61f8ebe56d67430cdde37",
|
|
6453
|
+
"createdAt": 1788614668448,
|
|
6560
6454
|
"profile": {},
|
|
6561
6455
|
"samples": [],
|
|
6562
6456
|
"records": [],
|
|
6563
|
-
"token": "
|
|
6457
|
+
"token": "71a0d09279d8e82ec8770f202249f29862a551e15f0d9995763eb3a16f8740a7",
|
|
6458
|
+
"tokenExpires": 1791206668448
|
|
6564
6459
|
},
|
|
6565
6460
|
{
|
|
6566
|
-
"username": "
|
|
6567
|
-
"passHash": "scrypt$
|
|
6568
|
-
"createdAt":
|
|
6461
|
+
"username": "乙8408",
|
|
6462
|
+
"passHash": "scrypt$d0ec773bf18ac60e0ab6d5179e605173$758b65cd16d53df50ff97964f975f7522c9b73b0ed23726d5bce738a35452e0cd1d97d79a58dd28860b8752cbc4954d0e8ad7608501b017f52e23f2ad624de9a",
|
|
6463
|
+
"createdAt": 1788614668492,
|
|
6569
6464
|
"profile": {},
|
|
6570
6465
|
"samples": [],
|
|
6571
6466
|
"records": [],
|
|
6572
|
-
"token": "
|
|
6467
|
+
"token": "e206da173678d1667f114b3c96f87b3347e5bec9cffd716fd954e7bacb2b7f71",
|
|
6468
|
+
"tokenExpires": 1791206668492
|
|
6573
6469
|
},
|
|
6574
6470
|
{
|
|
6575
|
-
"username": "
|
|
6576
|
-
"passHash": "scrypt$
|
|
6577
|
-
"createdAt":
|
|
6471
|
+
"username": "列删8526",
|
|
6472
|
+
"passHash": "scrypt$cc8e6121c7dfb1ac88e2a2b13b776ef3$ae7120938d48f82db11aca7319ff63c1820de06516b76a4f099e7dca208fb7c7aa3b3f0814be50994be092abbf4250c226a81402f2fe4b00a4c8ec866f3cc59b",
|
|
6473
|
+
"createdAt": 1788614668565,
|
|
6578
6474
|
"profile": {},
|
|
6579
6475
|
"samples": [],
|
|
6580
6476
|
"records": [],
|
|
6581
|
-
"token": "
|
|
6477
|
+
"token": "e314804d9681b15b4fe304268da90a454f3c7af066c48d592235641afa953f14",
|
|
6478
|
+
"tokenExpires": 1791206668565
|
|
6582
6479
|
},
|
|
6583
6480
|
{
|
|
6584
|
-
"username": "
|
|
6585
|
-
"passHash": "scrypt$
|
|
6586
|
-
"createdAt":
|
|
6481
|
+
"username": "删乙8526",
|
|
6482
|
+
"passHash": "scrypt$6de77518ade7fb7afd8c0b0aba9d258b$12a6656fb9c176baaad51f6096151728e4ef82a680846b3a88840e4755503c84e243e019c9ec936941f2bf0cbe989278fdfeac97a385fb63b11280737821a8d6",
|
|
6483
|
+
"createdAt": 1788614668608,
|
|
6587
6484
|
"profile": {},
|
|
6588
6485
|
"samples": [],
|
|
6589
6486
|
"records": [],
|
|
6590
|
-
"token": "
|
|
6487
|
+
"token": "b949c6fcac9b821cc74e1afb5a50acfacebafa21c79d13c61ae892998f33bbe9",
|
|
6488
|
+
"tokenExpires": 1791206668608
|
|
6591
6489
|
}
|
|
6592
6490
|
]
|
|
6593
6491
|
}
|
|
Binary file
|
package/server/src/index.ts
CHANGED
|
@@ -53,22 +53,38 @@ const PORT = process.env.PORT || 3018;
|
|
|
53
53
|
app.use(cors());
|
|
54
54
|
app.use(express.json());
|
|
55
55
|
|
|
56
|
-
// ───
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
// ─── 限流(防 BYOK Key 被刷爆 / 无限建占刷库):per-IP 令牌桶 ───
|
|
57
|
+
// /api/ai:每分钟 30 次(AI 烧 token,重点防护)
|
|
58
|
+
// /api/divine 写:每分钟 60 次(防无限建占刷 SQLite)
|
|
59
|
+
const AI_RATE_LIMIT = { windowMs: 60_000, max: 30 };
|
|
60
|
+
const DIVINE_RATE_LIMIT = { windowMs: 60_000, max: 60 };
|
|
61
|
+
const hits = new Map<string, { count: number; resetAt: number }>();
|
|
62
|
+
// 定期清理过期桶(防内存泄漏,M-NEW3)
|
|
63
|
+
setInterval(() => {
|
|
61
64
|
const now = Date.now();
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
65
|
+
for (const [k, v] of hits) if (now > v.resetAt) hits.delete(k);
|
|
66
|
+
}, 10 * 60 * 1000).unref();
|
|
67
|
+
|
|
68
|
+
function rateLimit(limit: { windowMs: number; max: number }) {
|
|
69
|
+
return (req: any, res: any, next: any) => {
|
|
70
|
+
const ip = req.ip || req.socket.remoteAddress || 'unknown';
|
|
71
|
+
const now = Date.now();
|
|
72
|
+
const rec = hits.get(ip);
|
|
73
|
+
if (!rec || now > rec.resetAt) {
|
|
74
|
+
hits.set(ip, { count: 1, resetAt: now + limit.windowMs });
|
|
75
|
+
return next();
|
|
76
|
+
}
|
|
77
|
+
rec.count++;
|
|
78
|
+
if (rec.count > limit.max) {
|
|
79
|
+
return res.status(429).json({ error: 'RATE_LIMITED', message: '请求过于频繁,请稍后再试' });
|
|
80
|
+
}
|
|
81
|
+
next();
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
app.use('/api/ai', rateLimit(AI_RATE_LIMIT));
|
|
85
|
+
app.use('/api/divine', (req, res, next) => {
|
|
86
|
+
if (req.method === 'GET') return next(); // 读操作不限制
|
|
87
|
+
return rateLimit(DIVINE_RATE_LIMIT)(req, res, next);
|
|
72
88
|
});
|
|
73
89
|
|
|
74
90
|
// 请求日志(联调排查用)
|
package/server/src/routes/ai.ts
CHANGED
|
@@ -22,6 +22,20 @@ function authedUsername(req: any): string | null {
|
|
|
22
22
|
} catch { return null; }
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
|
|
26
|
+
// 解读归属校验(与 divine.resolveOwner 同策略):正式账号须本人 token,占位账号兼容无 token
|
|
27
|
+
function canReadChart(req: any, recUsername: string, fallbackUsername: string): boolean {
|
|
28
|
+
const authed = authedUsername(req);
|
|
29
|
+
if (authed) return authed === recUsername;
|
|
30
|
+
// 无 token:仅当目标是占位账号(未正式注册)时允许 fallback username
|
|
31
|
+
if (fallbackUsername && fallbackUsername !== recUsername) return false;
|
|
32
|
+
try {
|
|
33
|
+
const db = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'data', 'db.json'), 'utf-8'));
|
|
34
|
+
const user = db.users.find((u: any) => u.username === recUsername);
|
|
35
|
+
return !user || !user.passHash; // 占位账号放行
|
|
36
|
+
} catch { return true; }
|
|
37
|
+
}
|
|
38
|
+
|
|
25
39
|
// 非流式:token 优先归属
|
|
26
40
|
const router = Router();
|
|
27
41
|
|
|
@@ -41,8 +55,7 @@ router.post('/interpret', async (req, res) => {
|
|
|
41
55
|
if (divineId) {
|
|
42
56
|
const rec = getDivination(divineId);
|
|
43
57
|
if (!rec) return res.status(400).json({ error: 'DIVINE_NOT_FOUND', message: '起占记录不存在,请重新起占' });
|
|
44
|
-
|
|
45
|
-
if (authed ? authed !== rec.username : (username && rec.username !== username)) return res.status(403).json({ error: 'FORBIDDEN' });
|
|
58
|
+
if (!canReadChart(req, rec.username, String(username || ''))) return res.status(403).json({ error: 'FORBIDDEN' });
|
|
46
59
|
resultRaw = rec.resultRaw;
|
|
47
60
|
recProfile = rec.profile;
|
|
48
61
|
} else {
|
|
@@ -106,8 +119,7 @@ router.post('/interpret/stream', async (req, res) => {
|
|
|
106
119
|
res.status(400).json({ error: 'DIVINE_NOT_FOUND', message: '起占记录不存在,请重新起占' });
|
|
107
120
|
return;
|
|
108
121
|
}
|
|
109
|
-
|
|
110
|
-
if (authed ? authed !== rec.username : (username && rec.username !== username)) {
|
|
122
|
+
if (!canReadChart(req, rec.username, String(username || ''))) {
|
|
111
123
|
res.status(403).json({ error: 'FORBIDDEN' });
|
|
112
124
|
return;
|
|
113
125
|
}
|
|
@@ -196,10 +208,12 @@ interface RawReading { summary: string; keyPoints: string[] }
|
|
|
196
208
|
// ─── Step1 盘面解析缓存 ───
|
|
197
209
|
// 同一 divineId + 同一问题复用同一份盘面解析:多次解读的输入一致 → 输出不再互相矛盾
|
|
198
210
|
// (Step1 每次调用结果都不同是「一会严格一会宽松」的主因之一)
|
|
211
|
+
// 键含日期:prompt 注入了【当前时间 · 事实】,跨日/跨年复用会给出过期的"现在"——按天隔离
|
|
199
212
|
const step1Cache = new Map<string, string>();
|
|
200
213
|
const STEP1_CACHE_MAX = 300;
|
|
201
214
|
async function getStep1(divineId: string, artId: string, question: string, resultRaw: unknown, profile: unknown): Promise<string> {
|
|
202
|
-
const
|
|
215
|
+
const day = new Date().toISOString().slice(0, 10);
|
|
216
|
+
const key = divineId + '|' + day + '|' + (question || '');
|
|
203
217
|
const hit = step1Cache.get(key);
|
|
204
218
|
if (hit) return hit;
|
|
205
219
|
try {
|