@fgbg/mdocs 0.6.9 → 0.7.0

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.
Files changed (67) hide show
  1. package/dist/server/db/repositories/visitor.repo.js +27 -2
  2. package/dist/server/db/repositories/visitor.repo.js.map +1 -1
  3. package/dist/server/db/schema.js +41 -0
  4. package/dist/server/db/schema.js.map +1 -1
  5. package/dist/server/identity/token.js +35 -1
  6. package/dist/server/identity/token.js.map +1 -1
  7. package/dist/server/identity/visitor.service.js +142 -12
  8. package/dist/server/identity/visitor.service.js.map +1 -1
  9. package/dist/server/routes/visitors.routes.js +66 -2
  10. package/dist/server/routes/visitors.routes.js.map +1 -1
  11. package/dist/web/assets/{_baseUniq-yckB-ViZ.js → _baseUniq-BZQDllec.js} +1 -1
  12. package/dist/web/assets/{arc-CJwjVGoV.js → arc-Cb69uDK1.js} +1 -1
  13. package/dist/web/assets/{architectureDiagram-Q4EWVU46-DlMBMvAp.js → architectureDiagram-Q4EWVU46-B4QPjlfl.js} +1 -1
  14. package/dist/web/assets/{blockDiagram-DXYQGD6D-DVth0PQT.js → blockDiagram-DXYQGD6D-DVphvRlV.js} +1 -1
  15. package/dist/web/assets/{c4Diagram-AHTNJAMY-BdAFJmuu.js → c4Diagram-AHTNJAMY-Cwlrn4tO.js} +1 -1
  16. package/dist/web/assets/channel-8-u9LChi.js +1 -0
  17. package/dist/web/assets/{chunk-4BX2VUAB-D2WGPo8y.js → chunk-4BX2VUAB-CUSc3ljZ.js} +1 -1
  18. package/dist/web/assets/{chunk-4TB4RGXK-Dkm9SzW7.js → chunk-4TB4RGXK-B9ynmkmz.js} +1 -1
  19. package/dist/web/assets/{chunk-55IACEB6-CWRBXcO3.js → chunk-55IACEB6-Cf_JSRxt.js} +1 -1
  20. package/dist/web/assets/{chunk-EDXVE4YY-BeEIhuUz.js → chunk-EDXVE4YY-YsSIMNW8.js} +1 -1
  21. package/dist/web/assets/{chunk-FMBD7UC4-XjAYeYWx.js → chunk-FMBD7UC4-CujGcG-3.js} +1 -1
  22. package/dist/web/assets/{chunk-OYMX7WX6-wo32eaJZ.js → chunk-OYMX7WX6-Bi5NfGux.js} +1 -1
  23. package/dist/web/assets/{chunk-QZHKN3VN-DV3RIS0h.js → chunk-QZHKN3VN-Nyt4EJI9.js} +1 -1
  24. package/dist/web/assets/{chunk-YZCP3GAM-CAEsOeC5.js → chunk-YZCP3GAM-B9o9RZrm.js} +1 -1
  25. package/dist/web/assets/classDiagram-6PBFFD2Q-DDyL10hW.js +1 -0
  26. package/dist/web/assets/classDiagram-v2-HSJHXN6E-DDyL10hW.js +1 -0
  27. package/dist/web/assets/clone-D3pxX9P9.js +1 -0
  28. package/dist/web/assets/{cose-bilkent-S5V4N54A-BEnyUbob.js → cose-bilkent-S5V4N54A-DttL4aNQ.js} +1 -1
  29. package/dist/web/assets/{dagre-KV5264BT-CGLj5knE.js → dagre-KV5264BT-BWYitZN5.js} +1 -1
  30. package/dist/web/assets/{diagram-5BDNPKRD-DtEoi6Lq.js → diagram-5BDNPKRD-CahquxPs.js} +1 -1
  31. package/dist/web/assets/{diagram-G4DWMVQ6-CSFCJ5Ck.js → diagram-G4DWMVQ6-B9KPD5SO.js} +1 -1
  32. package/dist/web/assets/{diagram-MMDJMWI5-DyrHWWHa.js → diagram-MMDJMWI5-CkcyKpqM.js} +1 -1
  33. package/dist/web/assets/{diagram-TYMM5635-gXsHWhnh.js → diagram-TYMM5635-C8o8Veq7.js} +1 -1
  34. package/dist/web/assets/{erDiagram-SMLLAGMA-Duh2wkjY.js → erDiagram-SMLLAGMA-CajMg_FK.js} +1 -1
  35. package/dist/web/assets/{flowDiagram-DWJPFMVM-BpghiWrT.js → flowDiagram-DWJPFMVM-mZwzFrXQ.js} +1 -1
  36. package/dist/web/assets/{ganttDiagram-T4ZO3ILL-xFaumTzU.js → ganttDiagram-T4ZO3ILL-BMELKTGk.js} +1 -1
  37. package/dist/web/assets/{gitGraphDiagram-UUTBAWPF-DH9vrbnF.js → gitGraphDiagram-UUTBAWPF-DHU6t5jv.js} +1 -1
  38. package/dist/web/assets/{graph-BsXke1vy.js → graph-D5BLcSs1.js} +1 -1
  39. package/dist/web/assets/{index-B7iWkIDo.js → index-DHy98Bfe.js} +26 -26
  40. package/dist/web/assets/{infoDiagram-42DDH7IO-gti5sPUy.js → infoDiagram-42DDH7IO-DQRI0VEQ.js} +1 -1
  41. package/dist/web/assets/{ishikawaDiagram-UXIWVN3A-Byy0uqCU.js → ishikawaDiagram-UXIWVN3A-WCMNWmcy.js} +1 -1
  42. package/dist/web/assets/{journeyDiagram-VCZTEJTY-CDG9dpf7.js → journeyDiagram-VCZTEJTY-DX__y_WK.js} +1 -1
  43. package/dist/web/assets/{kanban-definition-6JOO6SKY-i6VYcLX1.js → kanban-definition-6JOO6SKY-BU6AzWp5.js} +1 -1
  44. package/dist/web/assets/{layout-CTRuaRi5.js → layout-Bpj9IvYV.js} +1 -1
  45. package/dist/web/assets/{linear-CMNKgdX1.js → linear-CNt_cMab.js} +1 -1
  46. package/dist/web/assets/{min-C8iLS74o.js → min-DGPRYtJA.js} +1 -1
  47. package/dist/web/assets/{mindmap-definition-QFDTVHPH-CQNffGM_.js → mindmap-definition-QFDTVHPH-U7lp8ucC.js} +1 -1
  48. package/dist/web/assets/{pieDiagram-DEJITSTG-a4Agzb4W.js → pieDiagram-DEJITSTG-CAWH8R5H.js} +1 -1
  49. package/dist/web/assets/{quadrantDiagram-34T5L4WZ-Dnq4Jgik.js → quadrantDiagram-34T5L4WZ-B85fptrq.js} +1 -1
  50. package/dist/web/assets/{requirementDiagram-MS252O5E-D9QGhQ6Y.js → requirementDiagram-MS252O5E-C8knABGA.js} +1 -1
  51. package/dist/web/assets/{sankeyDiagram-XADWPNL6-Bzjp01vV.js → sankeyDiagram-XADWPNL6-DHsF-NRn.js} +1 -1
  52. package/dist/web/assets/{sequenceDiagram-FGHM5R23-BBYpSBxH.js → sequenceDiagram-FGHM5R23-GwCwkHcC.js} +1 -1
  53. package/dist/web/assets/{stateDiagram-FHFEXIEX-DjA-cvxv.js → stateDiagram-FHFEXIEX-Dtk4nfpI.js} +1 -1
  54. package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-CQ-e8psG.js +1 -0
  55. package/dist/web/assets/{timeline-definition-GMOUNBTQ-jnGXLdiw.js → timeline-definition-GMOUNBTQ-D5VcNnfb.js} +1 -1
  56. package/dist/web/assets/{vennDiagram-DHZGUBPP-BsgnNZ25.js → vennDiagram-DHZGUBPP-BggCNJJw.js} +1 -1
  57. package/dist/web/assets/wardley-RL74JXVD-DQ91D9QE.js +162 -0
  58. package/dist/web/assets/{wardleyDiagram-NUSXRM2D-B-3XLKsQ.js → wardleyDiagram-NUSXRM2D-Cn9jHzah.js} +1 -1
  59. package/dist/web/assets/{xychartDiagram-5P7HB3ND-B2rsZh2u.js → xychartDiagram-5P7HB3ND-Cbj6xy-p.js} +1 -1
  60. package/dist/web/index.html +1 -1
  61. package/package.json +1 -1
  62. package/dist/web/assets/channel-CwgGjhIw.js +0 -1
  63. package/dist/web/assets/classDiagram-6PBFFD2Q-CPcT8Wwv.js +0 -1
  64. package/dist/web/assets/classDiagram-v2-HSJHXN6E-CPcT8Wwv.js +0 -1
  65. package/dist/web/assets/clone-B_WisCme.js +0 -1
  66. package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-DLOvogHK.js +0 -1
  67. package/dist/web/assets/wardley-RL74JXVD-Dpdecs9N.js +0 -162
@@ -3,8 +3,8 @@
3
3
  */
4
4
  export function insertVisitor(db, input) {
5
5
  db.prepare(`INSERT INTO visitors (
6
- visitor_id, visitor_name, visitor_token_hash, recovery_code_hash, created_at
7
- ) VALUES (?, ?, ?, ?, ?)`).run(input.visitorId, input.visitorName, input.visitorTokenHash, input.recoveryCodeHash ?? null, input.createdAt);
6
+ visitor_id, visitor_name, visitor_token_hash, recovery_code_hash, password_hash, created_at
7
+ ) VALUES (?, ?, ?, ?, ?, ?)`).run(input.visitorId, input.visitorName, input.visitorTokenHash, input.recoveryCodeHash ?? null, input.passwordHash ?? null, input.createdAt);
8
8
  }
9
9
  /**
10
10
  * 根据 token 哈希查找访客。
@@ -81,4 +81,29 @@ export function listActiveVisitorsDirectory(db) {
81
81
  ORDER BY visitor_name COLLATE NOCASE`)
82
82
  .all();
83
83
  }
84
+ export function insertSession(db, input) {
85
+ db.prepare(`INSERT INTO visitor_sessions (
86
+ session_id, visitor_id, token_hash, device_name, created_at, last_seen_at
87
+ ) VALUES (?, ?, ?, ?, ?, ?)`).run(input.sessionId, input.visitorId, input.tokenHash, input.deviceName ?? null, input.createdAt, input.lastSeenAt);
88
+ }
89
+ /**
90
+ * 根据 token 哈希查找会话,并关联访客信息。
91
+ * 只返回未禁用访客的会话。
92
+ */
93
+ export function findSessionByTokenHash(db, tokenHash) {
94
+ return db
95
+ .prepare(`SELECT vs.*, v.*
96
+ FROM visitor_sessions vs
97
+ JOIN visitors v ON vs.visitor_id = v.visitor_id
98
+ WHERE vs.token_hash = ? AND v.disabled_at IS NULL`)
99
+ .get(tokenHash);
100
+ }
101
+ /** 更新指定会话的 last_seen_at 字段。 */
102
+ export function updateSessionLastSeen(db, sessionId, at) {
103
+ db.prepare(`UPDATE visitor_sessions SET last_seen_at = ? WHERE session_id = ?`).run(at, sessionId);
104
+ }
105
+ /** 删除指定会话(退出登录)。 */
106
+ export function deleteSession(db, sessionId) {
107
+ db.prepare(`DELETE FROM visitor_sessions WHERE session_id = ?`).run(sessionId);
108
+ }
84
109
  //# sourceMappingURL=visitor.repo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"visitor.repo.js","sourceRoot":"","sources":["../../../../src/server/db/repositories/visitor.repo.ts"],"names":[],"mappings":"AAuBA;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAqB,EAAE,KAAyB;IAC5E,EAAE,CAAC,OAAO,CACR;;6BAEyB,CAC1B,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;AACrH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,EAAqB,EACrB,SAAiB;IAEjB,OAAO,EAAE;SACN,OAAO,CACN,qDAAqD,CACtD;SACA,GAAG,CAAC,SAAS,CAAC,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAqB,EACrB,SAAiB;IAEjB,OAAO,EAAE;SACN,OAAO,CAAqB,6CAA6C,CAAC;SAC1E,GAAG,CAAC,SAAS,CAAC,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,EAAqB,EACrB,WAAmB;IAEnB,OAAO,EAAE;SACN,OAAO,CAAqB,uEAAuE,CAAC;SACpG,GAAG,CAAC,WAAW,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,EAAqB,EACrB,SAAiB,EACjB,EAAU;IAEV,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,CACzE,EAAE,EACF,SAAS,CACV,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,EAAqB,EACrB,SAAiB,EACjB,UAAkB,EAClB,EAAU;IAEV,EAAE,CAAC,OAAO,CACR;;0BAEsB,CACvB,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,EAAqB,EAAE,SAAwC,KAAK;IAC/F,IAAI,GAAG,GAAG,wBAAwB,CAAC;IACnC,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,GAAG,IAAI,4BAA4B,CAAC;IACtC,CAAC;SAAM,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,GAAG,IAAI,gCAAgC,CAAC;IAC1C,CAAC;IACD,GAAG,IAAI,2BAA2B,CAAC;IACnC,OAAO,EAAE,CAAC,OAAO,CAAiB,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAC3C,EAAqB,EACrB,gBAAwB;IAExB,OAAO,EAAE;SACN,OAAO,CACN,6EAA6E,CAC9E;SACA,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,EAAqB,EACrB,SAAiB,EACjB,IAAmB;IAEnB,EAAE,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC,GAAG,CAC/E,IAAI,EACJ,SAAS,CACV,CAAC;AACJ,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,2BAA2B,CACzC,EAAqB;IAErB,OAAO,EAAE;SACN,OAAO,CACN;;4CAEsC,CACvC;SACA,GAAG,EAAE,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"visitor.repo.js","sourceRoot":"","sources":["../../../../src/server/db/repositories/visitor.repo.ts"],"names":[],"mappings":"AAyBA;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAqB,EAAE,KAAyB;IAC5E,EAAE,CAAC,OAAO,CACR;;gCAE4B,CAC7B,CAAC,GAAG,CACH,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,gBAAgB,IAAI,IAAI,EAC9B,KAAK,CAAC,YAAY,IAAI,IAAI,EAC1B,KAAK,CAAC,SAAS,CAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,EAAqB,EACrB,SAAiB;IAEjB,OAAO,EAAE;SACN,OAAO,CACN,qDAAqD,CACtD;SACA,GAAG,CAAC,SAAS,CAAC,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAqB,EACrB,SAAiB;IAEjB,OAAO,EAAE;SACN,OAAO,CAAqB,6CAA6C,CAAC;SAC1E,GAAG,CAAC,SAAS,CAAC,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,EAAqB,EACrB,WAAmB;IAEnB,OAAO,EAAE;SACN,OAAO,CAAqB,uEAAuE,CAAC;SACpG,GAAG,CAAC,WAAW,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,EAAqB,EACrB,SAAiB,EACjB,EAAU;IAEV,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,CACzE,EAAE,EACF,SAAS,CACV,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,EAAqB,EACrB,SAAiB,EACjB,UAAkB,EAClB,EAAU;IAEV,EAAE,CAAC,OAAO,CACR;;0BAEsB,CACvB,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,EAAqB,EAAE,SAAwC,KAAK;IAC/F,IAAI,GAAG,GAAG,wBAAwB,CAAC;IACnC,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,GAAG,IAAI,4BAA4B,CAAC;IACtC,CAAC;SAAM,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,GAAG,IAAI,gCAAgC,CAAC;IAC1C,CAAC;IACD,GAAG,IAAI,2BAA2B,CAAC;IACnC,OAAO,EAAE,CAAC,OAAO,CAAiB,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAC3C,EAAqB,EACrB,gBAAwB;IAExB,OAAO,EAAE;SACN,OAAO,CACN,6EAA6E,CAC9E;SACA,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,EAAqB,EACrB,SAAiB,EACjB,IAAmB;IAEnB,EAAE,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC,GAAG,CAC/E,IAAI,EACJ,SAAS,CACV,CAAC;AACJ,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,2BAA2B,CACzC,EAAqB;IAErB,OAAO,EAAE;SACN,OAAO,CACN;;4CAEsC,CACvC;SACA,GAAG,EAAE,CAAC;AACX,CAAC;AAwBD,MAAM,UAAU,aAAa,CAAC,EAAqB,EAAE,KAAyB;IAC5E,EAAE,CAAC,OAAO,CACR;;gCAE4B,CAC7B,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;AACxH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,EAAqB,EACrB,SAAiB;IAEjB,OAAO,EAAE;SACN,OAAO,CACN;;;yDAGmD,CACpD;SACA,GAAG,CAAC,SAAS,CAAC,CAAC;AACpB,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,qBAAqB,CACnC,EAAqB,EACrB,SAAiB,EACjB,EAAU;IAEV,EAAE,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;AACrG,CAAC;AAED,oBAAoB;AACpB,MAAM,UAAU,aAAa,CAAC,EAAqB,EAAE,SAAiB;IACpE,EAAE,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACjF,CAAC"}
@@ -10,6 +10,17 @@ const SCHEMA_STATEMENTS = [
10
10
  merged_into_visitor_id TEXT
11
11
  )`,
12
12
  `CREATE INDEX IF NOT EXISTS idx_visitors_token_hash ON visitors (visitor_token_hash)`,
13
+ `CREATE TABLE IF NOT EXISTS visitor_sessions (
14
+ session_id TEXT PRIMARY KEY,
15
+ visitor_id TEXT NOT NULL,
16
+ token_hash TEXT NOT NULL UNIQUE,
17
+ device_name TEXT,
18
+ created_at TEXT NOT NULL,
19
+ last_seen_at TEXT NOT NULL,
20
+ FOREIGN KEY (visitor_id) REFERENCES visitors(visitor_id) ON DELETE CASCADE
21
+ )`,
22
+ `CREATE INDEX IF NOT EXISTS idx_visitor_sessions_visitor ON visitor_sessions (visitor_id)`,
23
+ `CREATE INDEX IF NOT EXISTS idx_visitor_sessions_token_hash ON visitor_sessions (token_hash)`,
13
24
  `CREATE TABLE IF NOT EXISTS domains (
14
25
  domain_id TEXT PRIMARY KEY,
15
26
  domain_name TEXT NOT NULL UNIQUE,
@@ -151,6 +162,8 @@ export function applySchema(db) {
151
162
  migrateDocumentsTable(db);
152
163
  migrateDocumentsDirty(db);
153
164
  migrateVisitorsRecoveryCode(db);
165
+ migrateVisitorsPasswordHash(db);
166
+ migrateVisitorSessions(db);
154
167
  ensureDefaultDomain(db);
155
168
  });
156
169
  tx();
@@ -283,4 +296,32 @@ function visitorColumnNames(db) {
283
296
  const rows = db.prepare(`PRAGMA table_info(visitors)`).all();
284
297
  return new Set(rows.map((r) => r.name));
285
298
  }
299
+ /** 为 visitors 表添加 password_hash 列(若不存在)。 */
300
+ function migrateVisitorsPasswordHash(db) {
301
+ const names = visitorColumnNames(db);
302
+ if (names.has("password_hash"))
303
+ return;
304
+ db.exec(`ALTER TABLE visitors ADD COLUMN password_hash TEXT`);
305
+ }
306
+ /** 将 visitors 表的 token 迁移到 visitor_sessions 表(向后兼容)。 */
307
+ function migrateVisitorSessions(db) {
308
+ // 检查是否已经迁移过(有 session 记录说明迁过了)
309
+ const hasSessions = db.prepare(`SELECT 1 AS c FROM visitor_sessions LIMIT 1`).get();
310
+ if (hasSessions)
311
+ return;
312
+ // 把所有现有 visitor 的 token 迁移到 visitor_sessions 表(作为初始 session)
313
+ const stmt = db.prepare(`
314
+ INSERT INTO visitor_sessions (session_id, visitor_id, token_hash, device_name, created_at, last_seen_at)
315
+ SELECT
316
+ 'legacy_' || visitor_id,
317
+ visitor_id,
318
+ visitor_token_hash,
319
+ 'Legacy Device',
320
+ created_at,
321
+ COALESCE(last_seen_at, created_at)
322
+ FROM visitors
323
+ WHERE visitor_token_hash IS NOT NULL
324
+ `);
325
+ stmt.run();
326
+ }
286
327
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/server/db/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/server/db/schema.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { createHash, randomBytes, randomUUID } from "node:crypto";
1
+ import { createHash, randomBytes, randomUUID, scryptSync, timingSafeEqual } from "node:crypto";
2
2
  /**
3
3
  * 生成一个新的访客唯一标识符(UUID v4)。
4
4
  *
@@ -7,6 +7,14 @@ import { createHash, randomBytes, randomUUID } from "node:crypto";
7
7
  export function newVisitorId() {
8
8
  return randomUUID();
9
9
  }
10
+ /**
11
+ * 生成一个新的会话唯一标识符(UUID v4)。
12
+ *
13
+ * @returns 会话 ID 字符串
14
+ */
15
+ export function newSessionId() {
16
+ return randomUUID();
17
+ }
10
18
  /**
11
19
  * 生成一个新的访客原始令牌。
12
20
  * 使用 32 字节随机数并通过 base64url 编码,保证 URL 安全且长度适中。
@@ -55,4 +63,30 @@ export function newRecoveryCode() {
55
63
  export function hashRecoveryCode(code) {
56
64
  return createHash("sha256").update(code.toUpperCase(), "utf8").digest("hex");
57
65
  }
66
+ const PASSWORD_SALT = "mdocs-password-salt-v1";
67
+ const PASSWORD_KEYLEN = 32;
68
+ /**
69
+ * 对密码进行 scrypt 哈希,用于安全存储。
70
+ *
71
+ * @param password - 明文密码
72
+ * @returns scrypt 哈希的十六进制字符串
73
+ */
74
+ export function hashPassword(password) {
75
+ return scryptSync(password, PASSWORD_SALT, PASSWORD_KEYLEN).toString("hex");
76
+ }
77
+ /**
78
+ * 验证密码是否匹配哈希值。
79
+ * 使用 timingSafeEqual 防止计时攻击。
80
+ *
81
+ * @param password - 明文密码
82
+ * @param hash - 存储的哈希值
83
+ * @returns 匹配返回 true,否则返回 false
84
+ */
85
+ export function verifyPassword(password, hash) {
86
+ const derivedKey = scryptSync(password, PASSWORD_SALT, PASSWORD_KEYLEN);
87
+ const storedKey = Buffer.from(hash, "hex");
88
+ if (derivedKey.length !== storedKey.length)
89
+ return false;
90
+ return timingSafeEqual(derivedKey, storedKey);
91
+ }
58
92
  //# sourceMappingURL=token.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/server/identity/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAElE;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,kCAAkC,CAAC,CAAC,iBAAiB;IACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/E,CAAC"}
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/server/identity/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE/F;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,kCAAkC,CAAC,CAAC,iBAAiB;IACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAC/C,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,IAAY;IAC3D,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACzD,OAAO,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import { getDb } from "../db/connection.js";
2
- import { findVisitorById, findVisitorByRecoveryCodeHash, findVisitorByTokenHash, insertVisitor, listVisitors, updateRecoveryCodeHash, updateVisitorLastSeen, } from "../db/repositories/visitor.repo.js";
2
+ import { findVisitorById, findVisitorByName, findVisitorByRecoveryCodeHash, findVisitorByTokenHash, findSessionByTokenHash, insertVisitor, insertSession, listVisitors, updateRecoveryCodeHash, updateSessionLastSeen, updateVisitorLastSeen, } from "../db/repositories/visitor.repo.js";
3
3
  import { insertAuditLog } from "../db/repositories/audit.repo.js";
4
4
  import { ensurePersonalDomain } from "../domains/personal-domain.service.js";
5
- import { hashRecoveryCode, hashVisitorToken, newRecoveryCode, newVisitorId, newVisitorToken, } from "./token.js";
5
+ import { hashPassword, hashRecoveryCode, hashVisitorToken, newRecoveryCode, newSessionId, newVisitorId, newVisitorToken, verifyPassword, } from "./token.js";
6
6
  import { useLogger } from "../logger/logger.js";
7
7
  const log = useLogger("identity");
8
8
  /**
@@ -10,9 +10,10 @@ const log = useLogger("identity");
10
10
  * 校验名称合法性后,生成访客 ID 与令牌,在数据库中创建记录并为其建立个人域。
11
11
  *
12
12
  * @param visitorName - 访客名称
13
+ * @param password - 可选密码(留空则不设置密码保护)
13
14
  * @returns 包含访客公开信息与原始令牌的注册结果
14
15
  */
15
- export function registerVisitor(visitorName) {
16
+ export function registerVisitor(visitorName, password) {
16
17
  const trimmed = visitorName.trim();
17
18
  // 校验名称非空
18
19
  if (!trimmed) {
@@ -22,6 +23,9 @@ export function registerVisitor(visitorName) {
22
23
  if (trimmed.length > 60) {
23
24
  throw new VisitorValidationError("visitor name is too long");
24
25
  }
26
+ if (password && password.length < 4) {
27
+ throw new VisitorValidationError("password must be at least 4 characters");
28
+ }
25
29
  const db = getDb();
26
30
  // 检查名称是否已被占用(仅检查未被禁用的访客)
27
31
  const existingByName = db
@@ -36,15 +40,26 @@ export function registerVisitor(visitorName) {
36
40
  const tokenHash = hashVisitorToken(rawToken);
37
41
  const recoveryCode = newRecoveryCode();
38
42
  const recoveryCodeHash = hashRecoveryCode(recoveryCode);
43
+ const passwordHash = password ? hashPassword(password) : undefined;
39
44
  const createdAt = new Date().toISOString();
40
- // 在事务中插入访客记录(含恢复码哈希)、创建个人域并记录审计日志
45
+ // 在事务中插入访客记录(含恢复码哈希和密码哈希)、创建会话、创建个人域并记录审计日志
41
46
  const tx = db.transaction(() => {
42
47
  insertVisitor(db, {
43
48
  visitorId,
44
49
  visitorName: trimmed,
45
50
  visitorTokenHash: tokenHash,
46
51
  recoveryCodeHash,
52
+ passwordHash,
53
+ createdAt,
54
+ });
55
+ // 同时创建会话记录(新架构)
56
+ insertSession(db, {
57
+ sessionId: newSessionId(),
58
+ visitorId,
59
+ tokenHash,
60
+ deviceName: "New Device",
47
61
  createdAt,
62
+ lastSeenAt: createdAt,
48
63
  });
49
64
  ensurePersonalDomain(db, visitorId, trimmed);
50
65
  insertAuditLog(db, {
@@ -64,6 +79,7 @@ export function registerVisitor(visitorName) {
64
79
  visitor_name: trimmed,
65
80
  visitor_token_hash: tokenHash,
66
81
  recovery_code_hash: recoveryCodeHash,
82
+ password_hash: passwordHash ?? null,
67
83
  created_at: createdAt,
68
84
  last_seen_at: null,
69
85
  disabled_at: null,
@@ -75,7 +91,7 @@ export function registerVisitor(visitorName) {
75
91
  }
76
92
  /**
77
93
  * 根据原始访客令牌解析对应的访客记录,并更新最后访问时间。
78
- * 若令牌无效或对应访客已被禁用,则返回 null。
94
+ * 优先查 session 表(新架构),找不到再查 visitors 表的旧 token(向后兼容)。
79
95
  *
80
96
  * @param rawToken - 原始访客令牌
81
97
  * @returns 访客数据库记录,解析失败时返回 null
@@ -83,14 +99,41 @@ export function registerVisitor(visitorName) {
83
99
  export function resolveVisitorByToken(rawToken) {
84
100
  const tokenHash = hashVisitorToken(rawToken);
85
101
  const db = getDb();
102
+ // 优先查 session 表
103
+ const session = findSessionByTokenHash(db, tokenHash);
104
+ if (session) {
105
+ // 更新 session 最后活跃时间
106
+ updateSessionLastSeen(db, session.session_id, new Date().toISOString());
107
+ return {
108
+ visitor_id: session.visitor_id,
109
+ visitor_name: session.visitor_name,
110
+ visitor_token_hash: session.visitor_token_hash,
111
+ recovery_code_hash: session.recovery_code_hash,
112
+ password_hash: session.password_hash,
113
+ created_at: session.created_at,
114
+ last_seen_at: session.last_seen_at,
115
+ disabled_at: session.disabled_at,
116
+ merged_into_visitor_id: session.merged_into_visitor_id,
117
+ };
118
+ }
119
+ // 向后兼容:查旧的 visitors.visitor_token_hash
86
120
  const row = findVisitorByTokenHash(db, tokenHash);
87
- // 未找到记录或访客已禁用均视为无效
88
121
  if (!row)
89
122
  return null;
90
123
  if (row.disabled_at)
91
124
  return null;
92
- // 更新最后访问时间戳
93
- updateVisitorLastSeen(db, row.visitor_id, new Date().toISOString());
125
+ // 找到旧 token → 迁移到 session 表
126
+ const now = new Date().toISOString();
127
+ insertSession(db, {
128
+ sessionId: newSessionId(),
129
+ visitorId: row.visitor_id,
130
+ tokenHash: tokenHash,
131
+ deviceName: "Migrated Device",
132
+ createdAt: now,
133
+ lastSeenAt: now,
134
+ });
135
+ // 更新 visitor 最后活跃时间
136
+ updateVisitorLastSeen(db, row.visitor_id, now);
94
137
  return row;
95
138
  }
96
139
  /**
@@ -114,7 +157,7 @@ export function listAllVisitors(filter = "all") {
114
157
  }
115
158
  /**
116
159
  * 使用恢复码找回访客身份。
117
- * 验证恢复码 → 生成新 Token 清除恢复码(一次性使用)→ 返回新的身份。
160
+ * 验证恢复码 → 生成新 Token + 新会话(旧会话仍然有效)→ 清除恢复码(一次性使用)→ 返回新的身份。
118
161
  *
119
162
  * @param recoveryCode - 用户输入的恢复码
120
163
  * @returns 新的身份信息(访客 + 新 Token),若恢复码无效则返回 null
@@ -125,13 +168,22 @@ export function recoverVisitor(recoveryCode) {
125
168
  const row = findVisitorByRecoveryCodeHash(db, codeHash);
126
169
  if (!row)
127
170
  return null;
128
- // 生成新 Token,更新数据库
171
+ // 生成新 Token,创建新会话(不影响旧会话)
129
172
  const rawToken = newVisitorToken();
130
173
  const tokenHash = hashVisitorToken(rawToken);
131
174
  const now = new Date().toISOString();
132
175
  const tx = db.transaction(() => {
133
- // 更新 Token 并清除恢复码(一次性使用)
134
- db.prepare(`UPDATE visitors SET visitor_token_hash = ?, last_seen_at = ?, recovery_code_hash = NULL WHERE visitor_id = ?`).run(tokenHash, now, row.visitor_id);
176
+ // 清除恢复码(一次性使用)
177
+ db.prepare(`UPDATE visitors SET last_seen_at = ?, recovery_code_hash = NULL WHERE visitor_id = ?`).run(now, row.visitor_id);
178
+ // 创建新会话(多设备同时在线)
179
+ insertSession(db, {
180
+ sessionId: newSessionId(),
181
+ visitorId: row.visitor_id,
182
+ tokenHash,
183
+ deviceName: "Recovered Device",
184
+ createdAt: now,
185
+ lastSeenAt: now,
186
+ });
135
187
  // 审计日志
136
188
  insertAuditLog(db, {
137
189
  actorVisitorId: row.visitor_id,
@@ -203,4 +255,82 @@ export class VisitorValidationError extends Error {
203
255
  this.name = "VisitorValidationError";
204
256
  }
205
257
  }
258
+ /**
259
+ * 使用用户名+密码登录。
260
+ * 验证成功则生成新会话(不影响其他设备),返回访客信息 + 新 token。
261
+ *
262
+ * @param visitorName - 访客名称
263
+ * @param password - 密码
264
+ * @returns 登录结果,失败或未设置密码时返回 null
265
+ */
266
+ export function loginWithPassword(visitorName, password) {
267
+ const trimmed = visitorName.trim();
268
+ if (!trimmed || !password)
269
+ return null;
270
+ const db = getDb();
271
+ const row = findVisitorByName(db, trimmed);
272
+ if (!row)
273
+ return null;
274
+ // 该访客未设置密码,不能使用密码登录
275
+ if (!row.password_hash)
276
+ return null;
277
+ // 密码验证
278
+ if (!verifyPassword(password, row.password_hash))
279
+ return null;
280
+ // 生成新 token 和新会话
281
+ const rawToken = newVisitorToken();
282
+ const tokenHash = hashVisitorToken(rawToken);
283
+ const now = new Date().toISOString();
284
+ const tx = db.transaction(() => {
285
+ insertSession(db, {
286
+ sessionId: newSessionId(),
287
+ visitorId: row.visitor_id,
288
+ tokenHash,
289
+ deviceName: "Password Login",
290
+ createdAt: now,
291
+ lastSeenAt: now,
292
+ });
293
+ updateVisitorLastSeen(db, row.visitor_id, now);
294
+ insertAuditLog(db, {
295
+ actorVisitorId: row.visitor_id,
296
+ action: "visitor.login-password",
297
+ targetType: "visitor",
298
+ targetId: row.visitor_id,
299
+ metadata: {},
300
+ createdAt: now,
301
+ });
302
+ });
303
+ tx();
304
+ log.info("visitor %s logged in with password", row.visitor_id);
305
+ return {
306
+ visitor: toPublic(row),
307
+ visitorToken: rawToken,
308
+ recoveryCode: "",
309
+ };
310
+ }
311
+ /**
312
+ * 为当前访客设置密码。
313
+ * 空字符串表示清除密码(但前端可能不暴露这个功能)。
314
+ *
315
+ * @param visitorId - 访客 ID
316
+ * @param password - 新密码
317
+ */
318
+ export function setVisitorPassword(visitorId, password) {
319
+ const db = getDb();
320
+ const passwordHash = password ? hashPassword(password) : undefined;
321
+ const now = new Date().toISOString();
322
+ const tx = db.transaction(() => {
323
+ db.prepare(`UPDATE visitors SET password_hash = ?, last_seen_at = ? WHERE visitor_id = ?`).run(passwordHash, now, visitorId);
324
+ insertAuditLog(db, {
325
+ actorVisitorId: visitorId,
326
+ action: "visitor.set-password",
327
+ targetType: "visitor",
328
+ targetId: visitorId,
329
+ metadata: {},
330
+ createdAt: now,
331
+ });
332
+ });
333
+ tx();
334
+ log.info("visitor %s set password", visitorId);
335
+ }
206
336
  //# sourceMappingURL=visitor.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"visitor.service.js","sourceRoot":"","sources":["../../../src/server/identity/visitor.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"visitor.service.js","sourceRoot":"","sources":["../../../src/server/identity/visitor.service.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Router } from "express";
2
- import { generateRecoveryCode, recoverVisitor, registerVisitor, toPublic, VisitorValidationError, } from "../identity/visitor.service.js";
2
+ import { generateRecoveryCode, loginWithPassword, recoverVisitor, registerVisitor, setVisitorPassword, toPublic, VisitorValidationError, } from "../identity/visitor.service.js";
3
3
  import { getDb } from "../db/connection.js";
4
4
  import { listActiveVisitorsDirectory } from "../db/repositories/visitor.repo.js";
5
5
  import { listDocumentsByVisitor } from "../db/repositories/document.repo.js";
@@ -16,6 +16,7 @@ export function buildVisitorsRouter() {
16
16
  /**
17
17
  * POST /register
18
18
  * 注册新访客。
19
+ * 请求体: { visitorName: string, password?: string }
19
20
  * 返回 { visitor, visitorToken, recoveryCode }
20
21
  */
21
22
  router.post("/register", (req, res) => {
@@ -25,8 +26,9 @@ export function buildVisitorsRouter() {
25
26
  res.status(400).json({ error: { code: "BAD_REQUEST", message: "visitorName is required" } });
26
27
  return;
27
28
  }
29
+ const password = typeof body.password === "string" ? body.password.trim() : "";
28
30
  try {
29
- const result = registerVisitor(body.visitorName);
31
+ const result = registerVisitor(body.visitorName, password || undefined);
30
32
  // 设置 HttpOnly Cookie(10 年有效期,约等于永久)
31
33
  res.cookie("visitor_token", result.visitorToken, {
32
34
  httpOnly: true,
@@ -51,6 +53,52 @@ export function buildVisitorsRouter() {
51
53
  res.status(500).json({ error: { code: "INTERNAL", message: "failed to register visitor" } });
52
54
  }
53
55
  });
56
+ /**
57
+ * POST /login
58
+ * 使用用户名+密码登录。
59
+ * 请求体: { visitorName: string, password: string }
60
+ * 返回: { visitor } + Cookie
61
+ * 错误码: NO_PASSWORD_SET(该用户未设置密码)、INVALID_CREDENTIALS(用户名或密码错误)
62
+ */
63
+ router.post("/login", (req, res) => {
64
+ const body = (req.body ?? {});
65
+ if (typeof body.visitorName !== "string" || !body.visitorName.trim()) {
66
+ res.status(400).json({ error: { code: "BAD_REQUEST", message: "visitorName is required" } });
67
+ return;
68
+ }
69
+ if (typeof body.password !== "string" || !body.password.trim()) {
70
+ res.status(400).json({ error: { code: "BAD_REQUEST", message: "password is required" } });
71
+ return;
72
+ }
73
+ const db = getDb();
74
+ // 先查用户是否存在
75
+ const row = db
76
+ .prepare(`SELECT password_hash FROM visitors WHERE visitor_name = ? AND disabled_at IS NULL`)
77
+ .get(body.visitorName.trim());
78
+ if (!row) {
79
+ res.status(401).json({ error: { code: "INVALID_CREDENTIALS", message: "用户名或密码错误" } });
80
+ return;
81
+ }
82
+ // 该用户未设置密码
83
+ if (!row.password_hash) {
84
+ res.status(400).json({ error: { code: "NO_PASSWORD_SET", message: "该账号未设置密码,无法远程登录" } });
85
+ return;
86
+ }
87
+ // 验证密码
88
+ const result = loginWithPassword(body.visitorName.trim(), body.password.trim());
89
+ if (!result) {
90
+ res.status(401).json({ error: { code: "INVALID_CREDENTIALS", message: "用户名或密码错误" } });
91
+ return;
92
+ }
93
+ // 登录成功,设置 Cookie
94
+ res.cookie("visitor_token", result.visitorToken, {
95
+ httpOnly: true,
96
+ sameSite: "lax",
97
+ path: "/",
98
+ maxAge: 10 * 365 * 24 * 60 * 60 * 1000,
99
+ });
100
+ res.json({ data: { visitor: result.visitor } });
101
+ });
54
102
  /**
55
103
  * POST /recover
56
104
  * 使用恢复码找回访客身份。
@@ -94,6 +142,22 @@ export function buildVisitorsRouter() {
94
142
  const code = generateRecoveryCode(req.visitor.visitor_id);
95
143
  res.json({ data: { recoveryCode: code } });
96
144
  });
145
+ /**
146
+ * POST /set-password
147
+ * 为当前已登录的访客设置密码。
148
+ * 请求体: { password: string }
149
+ * 空字符串表示清除密码。
150
+ */
151
+ router.post("/set-password", (req, res) => {
152
+ if (!req.visitor) {
153
+ res.status(401).json({ error: { code: "UNAUTHENTICATED", message: "no visitor" } });
154
+ return;
155
+ }
156
+ const body = (req.body ?? {});
157
+ const password = typeof body.password === "string" ? body.password.trim() : "";
158
+ setVisitorPassword(req.visitor.visitor_id, password);
159
+ res.json({ data: { ok: true } });
160
+ });
97
161
  /**
98
162
  * GET /
99
163
  * 获取活跃访客目录(不含已停用/已删除的访客)。
@@ -1 +1 @@
1
- {"version":3,"file":"visitors.routes.js","sourceRoot":"","sources":["../../../src/server/routes/visitors.routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"visitors.routes.js","sourceRoot":"","sources":["../../../src/server/routes/visitors.routes.ts"],"names":[],"mappings":"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"}