personalac 1.3.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.
- package/README.md +249 -0
- package/bin/personalac.js +215 -0
- package/dist/agent/context.d.ts +39 -0
- package/dist/agent/context.d.ts.map +1 -0
- package/dist/agent/context.js +163 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/executors.d.ts +40 -0
- package/dist/agent/executors.d.ts.map +1 -0
- package/dist/agent/executors.js +177 -0
- package/dist/agent/executors.js.map +1 -0
- package/dist/agent/index.d.ts +61 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +907 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/planner.d.ts +15 -0
- package/dist/agent/planner.d.ts.map +1 -0
- package/dist/agent/planner.js +81 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/agent/scheduler.d.ts +22 -0
- package/dist/agent/scheduler.d.ts.map +1 -0
- package/dist/agent/scheduler.js +178 -0
- package/dist/agent/scheduler.js.map +1 -0
- package/dist/database/index.d.ts +5 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +283 -0
- package/dist/database/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +141 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.middleware.d.ts +6 -0
- package/dist/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/middleware/auth.middleware.js +19 -0
- package/dist/middleware/auth.middleware.js.map +1 -0
- package/dist/routes/agent.routes.d.ts +3 -0
- package/dist/routes/agent.routes.d.ts.map +1 -0
- package/dist/routes/agent.routes.js +101 -0
- package/dist/routes/agent.routes.js.map +1 -0
- package/dist/routes/auth.routes.d.ts +3 -0
- package/dist/routes/auth.routes.d.ts.map +1 -0
- package/dist/routes/auth.routes.js +66 -0
- package/dist/routes/auth.routes.js.map +1 -0
- package/dist/routes/chat.routes.d.ts +3 -0
- package/dist/routes/chat.routes.d.ts.map +1 -0
- package/dist/routes/chat.routes.js +80 -0
- package/dist/routes/chat.routes.js.map +1 -0
- package/dist/routes/data.routes.d.ts +3 -0
- package/dist/routes/data.routes.d.ts.map +1 -0
- package/dist/routes/data.routes.js +16 -0
- package/dist/routes/data.routes.js.map +1 -0
- package/dist/routes/email.routes.d.ts +3 -0
- package/dist/routes/email.routes.d.ts.map +1 -0
- package/dist/routes/email.routes.js +18 -0
- package/dist/routes/email.routes.js.map +1 -0
- package/dist/routes/goals.routes.d.ts +3 -0
- package/dist/routes/goals.routes.d.ts.map +1 -0
- package/dist/routes/goals.routes.js +45 -0
- package/dist/routes/goals.routes.js.map +1 -0
- package/dist/routes/plans.routes.d.ts +3 -0
- package/dist/routes/plans.routes.d.ts.map +1 -0
- package/dist/routes/plans.routes.js +19 -0
- package/dist/routes/plans.routes.js.map +1 -0
- package/dist/routes/settings.routes.d.ts +3 -0
- package/dist/routes/settings.routes.d.ts.map +1 -0
- package/dist/routes/settings.routes.js +29 -0
- package/dist/routes/settings.routes.js.map +1 -0
- package/dist/routes/workspace.routes.d.ts +3 -0
- package/dist/routes/workspace.routes.d.ts.map +1 -0
- package/dist/routes/workspace.routes.js +28 -0
- package/dist/routes/workspace.routes.js.map +1 -0
- package/dist/services/auth.service.d.ts +32 -0
- package/dist/services/auth.service.d.ts.map +1 -0
- package/dist/services/auth.service.js +110 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/data.service.d.ts +47 -0
- package/dist/services/data.service.d.ts.map +1 -0
- package/dist/services/data.service.js +139 -0
- package/dist/services/data.service.js.map +1 -0
- package/dist/services/email.service.d.ts +23 -0
- package/dist/services/email.service.d.ts.map +1 -0
- package/dist/services/email.service.js +316 -0
- package/dist/services/email.service.js.map +1 -0
- package/dist/services/notify.service.d.ts +2 -0
- package/dist/services/notify.service.d.ts.map +1 -0
- package/dist/services/notify.service.js +21 -0
- package/dist/services/notify.service.js.map +1 -0
- package/dist/services/plan.service.d.ts +21 -0
- package/dist/services/plan.service.d.ts.map +1 -0
- package/dist/services/plan.service.js +96 -0
- package/dist/services/plan.service.js.map +1 -0
- package/dist/services/resource.service.d.ts +27 -0
- package/dist/services/resource.service.d.ts.map +1 -0
- package/dist/services/resource.service.js +150 -0
- package/dist/services/resource.service.js.map +1 -0
- package/dist/services/settings.service.d.ts +41 -0
- package/dist/services/settings.service.d.ts.map +1 -0
- package/dist/services/settings.service.js +254 -0
- package/dist/services/settings.service.js.map +1 -0
- package/dist/services/sobriety.service.d.ts +41 -0
- package/dist/services/sobriety.service.d.ts.map +1 -0
- package/dist/services/sobriety.service.js +243 -0
- package/dist/services/sobriety.service.js.map +1 -0
- package/dist/services/workspace.service.d.ts +71 -0
- package/dist/services/workspace.service.d.ts.map +1 -0
- package/dist/services/workspace.service.js +265 -0
- package/dist/services/workspace.service.js.map +1 -0
- package/dist/tools/chat-tools.d.ts +2 -0
- package/dist/tools/chat-tools.d.ts.map +1 -0
- package/dist/tools/chat-tools.js +419 -0
- package/dist/tools/chat-tools.js.map +1 -0
- package/dist/tools/index.d.ts +19 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/package.json +38 -0
- package/public/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/public/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/public/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/public/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/public/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/public/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/public/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/public/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/public/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/public/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/public/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/public/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/public/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/public/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/public/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/public/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/public/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/public/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/public/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/public/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/public/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/public/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/public/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/public/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/public/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/public/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/public/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/public/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/public/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/public/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/public/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/public/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/public/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/public/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/public/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/public/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/public/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/public/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/public/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/public/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/public/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/public/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/public/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/public/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/public/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/public/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/public/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/public/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/public/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/public/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/public/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/public/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/public/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/public/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/public/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/public/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/public/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/public/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/public/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/public/assets/_baseUniq-DiHtXYsr.js +1 -0
- package/public/assets/arc-Bv1zbXf7.js +1 -0
- package/public/assets/architectureDiagram-Q4EWVU46-EbiUvXBr.js +36 -0
- package/public/assets/blockDiagram-DXYQGD6D-B-4wwQNT.js +132 -0
- package/public/assets/c4Diagram-AHTNJAMY-brLyKMPJ.js +10 -0
- package/public/assets/channel-Me4d6Y1x.js +1 -0
- package/public/assets/chunk-4BX2VUAB-DMh-4Nye.js +1 -0
- package/public/assets/chunk-4TB4RGXK-CSr1z2CQ.js +206 -0
- package/public/assets/chunk-55IACEB6-xN0xmcvD.js +1 -0
- package/public/assets/chunk-EDXVE4YY-CkCM3j5E.js +1 -0
- package/public/assets/chunk-FMBD7UC4-B-mDgsjM.js +15 -0
- package/public/assets/chunk-OYMX7WX6-DK8dg9K4.js +231 -0
- package/public/assets/chunk-QZHKN3VN-BZGbFOdK.js +1 -0
- package/public/assets/chunk-YZCP3GAM-BTmFmMer.js +1 -0
- package/public/assets/classDiagram-6PBFFD2Q-BXgAb5m4.js +1 -0
- package/public/assets/classDiagram-v2-HSJHXN6E-BXgAb5m4.js +1 -0
- package/public/assets/clone-rnECnpTI.js +1 -0
- package/public/assets/cose-bilkent-S5V4N54A-BBqCwo63.js +1 -0
- package/public/assets/cytoscape.esm-BQk4lpUV.js +331 -0
- package/public/assets/dagre-KV5264BT-DLeQYvAA.js +4 -0
- package/public/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/public/assets/diagram-5BDNPKRD-D85z2LaM.js +10 -0
- package/public/assets/diagram-G4DWMVQ6-4AvBmvcP.js +24 -0
- package/public/assets/diagram-MMDJMWI5-DRNEGNZA.js +43 -0
- package/public/assets/diagram-TYMM5635-C_oGwrmX.js +24 -0
- package/public/assets/erDiagram-SMLLAGMA-DDSp8ANa.js +85 -0
- package/public/assets/flowDiagram-DWJPFMVM-B1Wy36da.js +162 -0
- package/public/assets/ganttDiagram-T4ZO3ILL-CQ7VWheo.js +292 -0
- package/public/assets/gitGraphDiagram-UUTBAWPF-BhvM7s41.js +106 -0
- package/public/assets/graph-fatjTp1h.js +1 -0
- package/public/assets/index-1PrEnCZL.js +677 -0
- package/public/assets/index-DcsnItNp.css +1 -0
- package/public/assets/infoDiagram-42DDH7IO-4eawOC2G.js +2 -0
- package/public/assets/init-Gi6I4Gst.js +1 -0
- package/public/assets/ishikawaDiagram-UXIWVN3A-CJWfG1fv.js +70 -0
- package/public/assets/journeyDiagram-VCZTEJTY-C4Zx3dpF.js +139 -0
- package/public/assets/kanban-definition-6JOO6SKY-CV1vDcC8.js +89 -0
- package/public/assets/layout-CX0IDv3q.js +1 -0
- package/public/assets/linear-C8hMcu9f.js +1 -0
- package/public/assets/min-BaxMGW9J.js +1 -0
- package/public/assets/mindmap-definition-QFDTVHPH-KzGyX4Em.js +96 -0
- package/public/assets/ordinal-Cboi1Yqb.js +1 -0
- package/public/assets/pieDiagram-DEJITSTG-Dp2x5kvP.js +30 -0
- package/public/assets/quadrantDiagram-34T5L4WZ-B4yqA6XF.js +7 -0
- package/public/assets/requirementDiagram-MS252O5E-DEjN_2tG.js +84 -0
- package/public/assets/sankeyDiagram-XADWPNL6-BKm_F5FA.js +10 -0
- package/public/assets/sequenceDiagram-FGHM5R23-07BCMKjW.js +157 -0
- package/public/assets/stateDiagram-FHFEXIEX-DVz6GtR8.js +1 -0
- package/public/assets/stateDiagram-v2-QKLJ7IA2-DYiYr0PB.js +1 -0
- package/public/assets/timeline-definition-GMOUNBTQ-C0u67FqY.js +120 -0
- package/public/assets/vennDiagram-DHZGUBPP-BiAlMVLe.js +34 -0
- package/public/assets/wardley-RL74JXVD-BnWyuHzf.js +162 -0
- package/public/assets/wardleyDiagram-NUSXRM2D-DEL2Lx6S.js +20 -0
- package/public/assets/xychartDiagram-5P7HB3ND-ILdmj7ok.js +7 -0
- package/public/index.html +17 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const express_1 = require("express");
|
|
4
|
+
const uuid_1 = require("uuid");
|
|
5
|
+
const auth_service_1 = require("../services/auth.service");
|
|
6
|
+
const auth_middleware_1 = require("../middleware/auth.middleware");
|
|
7
|
+
const database_1 = require("../database");
|
|
8
|
+
const router = (0, express_1.Router)();
|
|
9
|
+
// POST /api/auth/login
|
|
10
|
+
router.post('/login', (req, res) => {
|
|
11
|
+
const { syncToken } = req.body;
|
|
12
|
+
if (!syncToken?.trim()) {
|
|
13
|
+
res.status(400).json({ success: false, error: '请输入访问码' });
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
res.json((0, auth_service_1.loginByToken)(syncToken.trim()));
|
|
17
|
+
});
|
|
18
|
+
// GET /api/auth/me
|
|
19
|
+
router.get('/me', auth_middleware_1.requireAuth, (req, res) => {
|
|
20
|
+
const user = (0, auth_service_1.getUserBySyncToken)(req.headers['x-sync-token'] || '');
|
|
21
|
+
res.json({ success: true, data: user });
|
|
22
|
+
});
|
|
23
|
+
// POST /api/auth/setup — 监护人初始配置(设置名字)
|
|
24
|
+
router.post('/setup', auth_middleware_1.requireAuth, (req, res) => {
|
|
25
|
+
const { guardianName } = req.body;
|
|
26
|
+
if (!guardianName?.trim()) {
|
|
27
|
+
res.status(400).json({ success: false, error: '请填写称呼' });
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
(0, auth_service_1.setupGuardian)(req.userId, guardianName);
|
|
31
|
+
res.json({ success: true });
|
|
32
|
+
});
|
|
33
|
+
// GET /api/auth/students — 列出名下学生
|
|
34
|
+
router.get('/students', auth_middleware_1.requireAuth, (req, res) => {
|
|
35
|
+
const students = (0, auth_service_1.listStudents)(req.userId);
|
|
36
|
+
res.json({ success: true, data: students });
|
|
37
|
+
});
|
|
38
|
+
// POST /api/auth/students — 创建学生账户
|
|
39
|
+
router.post('/students', auth_middleware_1.requireAuth, (req, res) => {
|
|
40
|
+
const { name, grade, subjects } = req.body;
|
|
41
|
+
if (!name?.trim()) {
|
|
42
|
+
res.status(400).json({ success: false, error: '请填写学生姓名' });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const student = (0, auth_service_1.createStudent)(req.userId, name, grade);
|
|
46
|
+
if (Array.isArray(subjects) && subjects.length > 0) {
|
|
47
|
+
const db = (0, database_1.getDB)();
|
|
48
|
+
const now = Date.now();
|
|
49
|
+
db.prepare(`
|
|
50
|
+
INSERT INTO Plan (id, student_id, title, description, subjects, status, create_time, update_time, delete_flag)
|
|
51
|
+
VALUES (?, ?, ?, '', ?, 'active', ?, ?, 0)
|
|
52
|
+
`).run((0, uuid_1.v4)(), student.id, `${student.name}的学习计划`, JSON.stringify(subjects), now, now);
|
|
53
|
+
}
|
|
54
|
+
res.json({ success: true, data: student });
|
|
55
|
+
});
|
|
56
|
+
// DELETE /api/auth/students/:id
|
|
57
|
+
router.delete('/students/:id', auth_middleware_1.requireAuth, (req, res) => {
|
|
58
|
+
const ok = (0, auth_service_1.deleteStudent)(req.params.id, req.userId);
|
|
59
|
+
res.json({ success: ok, error: ok ? undefined : '操作失败或无权限' });
|
|
60
|
+
});
|
|
61
|
+
// POST /api/auth/reset-token
|
|
62
|
+
router.post('/reset-token', auth_middleware_1.requireAuth, (req, res) => {
|
|
63
|
+
res.json((0, auth_service_1.resetSyncToken)(req.userId));
|
|
64
|
+
});
|
|
65
|
+
exports.default = router;
|
|
66
|
+
//# sourceMappingURL=auth.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.routes.js","sourceRoot":"","sources":["../../src/routes/auth.routes.ts"],"names":[],"mappings":";;AAAA,qCAAgC;AAChC,+BAAmC;AACnC,2DAGiC;AACjC,mEAAwE;AACxE,0CAAmC;AAEnC,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;AAEvB,uBAAuB;AACvB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACjC,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,IAA6B,CAAA;IACvD,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IAC7F,GAAG,CAAC,IAAI,CAAC,IAAA,2BAAY,EAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;AAC1C,CAAC,CAAC,CAAA;AAEF,mBAAmB;AACnB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,6BAAW,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IACvD,MAAM,IAAI,GAAG,IAAA,iCAAkB,EAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAW,IAAI,EAAE,CAAC,CAAA;IAC5E,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;AACzC,CAAC,CAAC,CAAA;AAEF,uCAAuC;AACvC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,6BAAW,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IAC3D,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,IAAgC,CAAA;IAC7D,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IAC/F,IAAA,4BAAa,EAAC,GAAG,CAAC,MAAO,EAAE,YAAY,CAAC,CAAA;IACxC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AAC7B,CAAC,CAAC,CAAA;AAEF,kCAAkC;AAClC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,6BAAW,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IAC7D,MAAM,QAAQ,GAAG,IAAA,2BAAY,EAAC,GAAG,CAAC,MAAO,CAAC,CAAA;IAC1C,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA;AAEF,mCAAmC;AACnC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,6BAAW,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IAC9D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAA6D,CAAA;IACnG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IAEzF,MAAM,OAAO,GAAG,IAAA,4BAAa,EAAC,GAAG,CAAC,MAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IAEvD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CAAC,IAAA,SAAM,GAAE,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IAC1F,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;AAC5C,CAAC,CAAC,CAAA;AAEF,gCAAgC;AAChC,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,6BAAW,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IACpE,MAAM,EAAE,GAAG,IAAA,4BAAa,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,MAAO,CAAC,CAAA;IACpD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;AAC/D,CAAC,CAAC,CAAA;AAEF,6BAA6B;AAC7B,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,6BAAW,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IACjE,GAAG,CAAC,IAAI,CAAC,IAAA,6BAAc,EAAC,GAAG,CAAC,MAAO,CAAC,CAAC,CAAA;AACvC,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.routes.d.ts","sourceRoot":"","sources":["../../src/routes/chat.routes.ts"],"names":[],"mappings":"AAWA,QAAA,MAAM,MAAM,4CAAW,CAAA;AAwDvB,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const express_1 = require("express");
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const agent_1 = require("../agent");
|
|
9
|
+
const auth_middleware_1 = require("../middleware/auth.middleware");
|
|
10
|
+
function touchActivity() {
|
|
11
|
+
const f = process.env.NOTIFY_FILE;
|
|
12
|
+
if (!f)
|
|
13
|
+
return;
|
|
14
|
+
try {
|
|
15
|
+
fs_1.default.writeFileSync(f, JSON.stringify({ lastActivity: Date.now() }));
|
|
16
|
+
}
|
|
17
|
+
catch { /* ignore */ }
|
|
18
|
+
}
|
|
19
|
+
const router = (0, express_1.Router)();
|
|
20
|
+
router.use(auth_middleware_1.requireAuth);
|
|
21
|
+
router.post('/send', async (req, res) => {
|
|
22
|
+
const { message } = req.body;
|
|
23
|
+
if (!message?.trim()) {
|
|
24
|
+
res.status(400).json({ success: false, error: '消息不能为空' });
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const engine = (0, agent_1.getAgentEngine)();
|
|
28
|
+
if (!engine) {
|
|
29
|
+
res.json({ success: false, error: 'AI 引擎未初始化' });
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const response = await engine.generateBotResponse(req.userId, message.trim());
|
|
34
|
+
res.json({ success: true, data: response || '(AI 暂无回复)' });
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
res.json({ success: false, error: err instanceof Error ? err.message : String(err) });
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
router.post('/stream', async (req, res) => {
|
|
41
|
+
const { messages } = req.body;
|
|
42
|
+
if (!Array.isArray(messages) || messages.length === 0) {
|
|
43
|
+
res.status(400).json({ success: false, error: '消息不能为空' });
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const engine = (0, agent_1.getAgentEngine)();
|
|
47
|
+
if (!engine) {
|
|
48
|
+
res.status(503).json({ success: false, error: 'AI 引擎未初始化' });
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
touchActivity();
|
|
52
|
+
res.setHeader('Content-Type', 'text/event-stream; charset=utf-8');
|
|
53
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
54
|
+
res.setHeader('Connection', 'keep-alive');
|
|
55
|
+
res.setHeader('X-Accel-Buffering', 'no');
|
|
56
|
+
res.flushHeaders();
|
|
57
|
+
const send = (obj) => {
|
|
58
|
+
if (!res.writableEnded)
|
|
59
|
+
res.write(`data: ${JSON.stringify(obj)}\n\n`);
|
|
60
|
+
};
|
|
61
|
+
try {
|
|
62
|
+
await engine.streamChatResponse(req.userId, messages, (token) => send({ token }), () => { if (!res.writableEnded) {
|
|
63
|
+
res.write('data: [DONE]\n\n');
|
|
64
|
+
res.end();
|
|
65
|
+
} }, (err) => { send({ error: err }); if (!res.writableEnded)
|
|
66
|
+
res.end(); }, (toolName, display) => {
|
|
67
|
+
if (toolName === 'thinking')
|
|
68
|
+
send({ thinking: display }); // reasoning model token
|
|
69
|
+
else
|
|
70
|
+
send({ tool: toolName, display }); // tool call indicator
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
send({ error: err instanceof Error ? err.message : String(err) });
|
|
75
|
+
if (!res.writableEnded)
|
|
76
|
+
res.end();
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
exports.default = router;
|
|
80
|
+
//# sourceMappingURL=chat.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.routes.js","sourceRoot":"","sources":["../../src/routes/chat.routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.routes.d.ts","sourceRoot":"","sources":["../../src/routes/data.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAA;AAYvB,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const express_1 = require("express");
|
|
4
|
+
const data_service_1 = require("../services/data.service");
|
|
5
|
+
const auth_middleware_1 = require("../middleware/auth.middleware");
|
|
6
|
+
const router = (0, express_1.Router)();
|
|
7
|
+
router.use(auth_middleware_1.requireAuth);
|
|
8
|
+
router.post('/learning', async (req, res) => {
|
|
9
|
+
res.json(await (0, data_service_1.recordLearning)({ ...req.body, studentId: req.userId }));
|
|
10
|
+
});
|
|
11
|
+
router.get('/summary', (req, res) => {
|
|
12
|
+
const { dateFrom, dateTo, subject } = req.query;
|
|
13
|
+
res.json((0, data_service_1.getSummary)(req.userId, Number(dateFrom), Number(dateTo), subject));
|
|
14
|
+
});
|
|
15
|
+
exports.default = router;
|
|
16
|
+
//# sourceMappingURL=data.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.routes.js","sourceRoot":"","sources":["../../src/routes/data.routes.ts"],"names":[],"mappings":";;AAAA,qCAAgC;AAChC,2DAAwF;AACxF,mEAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;AACvB,MAAM,CAAC,GAAG,CAAC,6BAAW,CAAC,CAAA;AAEvB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAgB,EAAE,GAAG,EAAE,EAAE;IACvD,GAAG,CAAC,IAAI,CAAC,MAAM,IAAA,6BAAc,EAAC,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AACxE,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IAC/C,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,KAA+B,CAAA;IACzE,GAAG,CAAC,IAAI,CAAC,IAAA,yBAAe,EAAC,GAAG,CAAC,MAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AACnF,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.routes.d.ts","sourceRoot":"","sources":["../../src/routes/email.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAA;AAevB,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const express_1 = require("express");
|
|
4
|
+
const email_service_1 = require("../services/email.service");
|
|
5
|
+
const auth_middleware_1 = require("../middleware/auth.middleware");
|
|
6
|
+
const router = (0, express_1.Router)();
|
|
7
|
+
router.use(auth_middleware_1.requireAuth);
|
|
8
|
+
router.get('/status', (_req, res) => {
|
|
9
|
+
res.json(email_service_1.emailService.getStatus());
|
|
10
|
+
});
|
|
11
|
+
router.post('/start', async (_req, res) => {
|
|
12
|
+
res.json(await email_service_1.emailService.startPolling());
|
|
13
|
+
});
|
|
14
|
+
router.post('/stop', (_req, res) => {
|
|
15
|
+
res.json(email_service_1.emailService.stopPolling());
|
|
16
|
+
});
|
|
17
|
+
exports.default = router;
|
|
18
|
+
//# sourceMappingURL=email.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.routes.js","sourceRoot":"","sources":["../../src/routes/email.routes.ts"],"names":[],"mappings":";;AAAA,qCAAgC;AAChC,6DAAwD;AACxD,mEAA2D;AAE3D,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;AACvB,MAAM,CAAC,GAAG,CAAC,6BAAW,CAAC,CAAA;AAEvB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IAClC,GAAG,CAAC,IAAI,CAAC,4BAAY,CAAC,SAAS,EAAE,CAAC,CAAA;AACpC,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACxC,GAAG,CAAC,IAAI,CAAC,MAAM,4BAAY,CAAC,YAAY,EAAE,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACjC,GAAG,CAAC,IAAI,CAAC,4BAAY,CAAC,WAAW,EAAE,CAAC,CAAA;AACtC,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goals.routes.d.ts","sourceRoot":"","sources":["../../src/routes/goals.routes.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,MAAM,4CAAW,CAAA;AA+CvB,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const express_1 = require("express");
|
|
4
|
+
const uuid_1 = require("uuid");
|
|
5
|
+
const database_1 = require("../database");
|
|
6
|
+
const auth_middleware_1 = require("../middleware/auth.middleware");
|
|
7
|
+
const auth_service_1 = require("../services/auth.service");
|
|
8
|
+
const router = (0, express_1.Router)();
|
|
9
|
+
router.use(auth_middleware_1.requireAuth);
|
|
10
|
+
function resolveStudentId(userId) {
|
|
11
|
+
const db = (0, database_1.getDB)();
|
|
12
|
+
const user = db.prepare('SELECT role FROM User WHERE id=? AND delete_flag=0').get(userId);
|
|
13
|
+
if (user?.role === 'guardian')
|
|
14
|
+
return (0, auth_service_1.getPrimaryStudentId)(userId) ?? userId;
|
|
15
|
+
return userId;
|
|
16
|
+
}
|
|
17
|
+
// GET /api/goals — 获取当前学生目标
|
|
18
|
+
router.get('/', (req, res) => {
|
|
19
|
+
const studentId = resolveStudentId(req.userId);
|
|
20
|
+
const db = (0, database_1.getDB)();
|
|
21
|
+
const goal = db.prepare(`SELECT * FROM StudentGoal WHERE student_id=? AND delete_flag=0 ORDER BY update_time DESC LIMIT 1`).get(studentId);
|
|
22
|
+
res.json({ success: true, data: goal ?? null });
|
|
23
|
+
});
|
|
24
|
+
// POST /api/goals — 创建或更新目标
|
|
25
|
+
router.post('/', (req, res) => {
|
|
26
|
+
const { examType, examDate, schoolProgress, guardianNotes } = req.body;
|
|
27
|
+
const studentId = resolveStudentId(req.userId);
|
|
28
|
+
const db = (0, database_1.getDB)();
|
|
29
|
+
const now = Date.now();
|
|
30
|
+
const existing = db.prepare(`SELECT id FROM StudentGoal WHERE student_id=? AND delete_flag=0 ORDER BY update_time DESC LIMIT 1`).get(studentId);
|
|
31
|
+
if (existing) {
|
|
32
|
+
db.prepare(`
|
|
33
|
+
UPDATE StudentGoal SET exam_type=?, exam_date=?, school_progress=?, guardian_notes=?, update_time=? WHERE id=?
|
|
34
|
+
`).run(examType ?? null, examDate ?? null, schoolProgress ?? null, guardianNotes ?? null, now, existing.id);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
db.prepare(`
|
|
38
|
+
INSERT INTO StudentGoal (id, student_id, exam_type, exam_date, school_progress, guardian_notes, create_time, update_time, delete_flag)
|
|
39
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 0)
|
|
40
|
+
`).run((0, uuid_1.v4)(), studentId, examType ?? null, examDate ?? null, schoolProgress ?? null, guardianNotes ?? null, now, now);
|
|
41
|
+
}
|
|
42
|
+
res.json({ success: true });
|
|
43
|
+
});
|
|
44
|
+
exports.default = router;
|
|
45
|
+
//# sourceMappingURL=goals.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goals.routes.js","sourceRoot":"","sources":["../../src/routes/goals.routes.ts"],"names":[],"mappings":";;AAAA,qCAAgC;AAChC,+BAAmC;AACnC,0CAAmC;AACnC,mEAAwE;AACxE,2DAA8D;AAE9D,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;AACvB,MAAM,CAAC,GAAG,CAAC,6BAAW,CAAC,CAAA;AAEvB,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAiC,CAAA;IACzH,IAAI,IAAI,EAAE,IAAI,KAAK,UAAU;QAAE,OAAO,IAAA,kCAAmB,EAAC,MAAM,CAAC,IAAI,MAAM,CAAA;IAC3E,OAAO,MAAM,CAAA;AACf,CAAC;AAED,4BAA4B;AAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IACxC,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAO,CAAC,CAAA;IAC/C,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,kGAAkG,CACnG,CAAC,GAAG,CAAC,SAAS,CAAwC,CAAA;IACvD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,CAAA;AACjD,CAAC,CAAC,CAAA;AAEF,4BAA4B;AAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IACzC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC,IAEjE,CAAA;IACD,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAO,CAAC,CAAA;IAC/C,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAEtB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,mGAAmG,CACpG,CAAC,GAAG,CAAC,SAAS,CAA+B,CAAA;IAE9C,IAAI,QAAQ,EAAE,CAAC;QACb,EAAE,CAAC,OAAO,CAAC;;KAEV,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,cAAc,IAAI,IAAI,EAAE,aAAa,IAAI,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC7G,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CAAC,IAAA,SAAM,GAAE,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,cAAc,IAAI,IAAI,EAAE,aAAa,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IAC1H,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AAC7B,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plans.routes.d.ts","sourceRoot":"","sources":["../../src/routes/plans.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAA;AAgBvB,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const express_1 = require("express");
|
|
4
|
+
const plan_service_1 = require("../services/plan.service");
|
|
5
|
+
const auth_middleware_1 = require("../middleware/auth.middleware");
|
|
6
|
+
const router = (0, express_1.Router)();
|
|
7
|
+
router.use(auth_middleware_1.requireAuth);
|
|
8
|
+
router.post('/', async (req, res) => {
|
|
9
|
+
const { title, description, subjects } = req.body;
|
|
10
|
+
res.json(await (0, plan_service_1.create)(req.userId, title, description, subjects));
|
|
11
|
+
});
|
|
12
|
+
router.get('/active', (req, res) => {
|
|
13
|
+
res.json((0, plan_service_1.getActive)(req.userId));
|
|
14
|
+
});
|
|
15
|
+
router.get('/', (req, res) => {
|
|
16
|
+
res.json((0, plan_service_1.listPlans)(req.userId));
|
|
17
|
+
});
|
|
18
|
+
exports.default = router;
|
|
19
|
+
//# sourceMappingURL=plans.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plans.routes.js","sourceRoot":"","sources":["../../src/routes/plans.routes.ts"],"names":[],"mappings":";;AAAA,qCAAgC;AAChC,2DAAsG;AACtG,mEAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;AACvB,MAAM,CAAC,GAAG,CAAC,6BAAW,CAAC,CAAA;AAEvB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAgB,EAAE,GAAG,EAAE,EAAE;IAC/C,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IACjD,GAAG,CAAC,IAAI,CAAC,MAAM,IAAA,qBAAU,EAAC,GAAG,CAAC,MAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAA;AACvE,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IAC9C,GAAG,CAAC,IAAI,CAAC,IAAA,wBAAa,EAAC,GAAG,CAAC,MAAO,CAAC,CAAC,CAAA;AACtC,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IACxC,GAAG,CAAC,IAAI,CAAC,IAAA,wBAAS,EAAC,GAAG,CAAC,MAAO,CAAC,CAAC,CAAA;AAClC,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.routes.d.ts","sourceRoot":"","sources":["../../src/routes/settings.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAA;AA6BvB,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const express_1 = require("express");
|
|
4
|
+
const settings_service_1 = require("../services/settings.service");
|
|
5
|
+
const auth_middleware_1 = require("../middleware/auth.middleware");
|
|
6
|
+
const router = (0, express_1.Router)();
|
|
7
|
+
router.use(auth_middleware_1.requireAuth);
|
|
8
|
+
router.get('/models', async (_req, res) => {
|
|
9
|
+
res.json(await (0, settings_service_1.getModels)());
|
|
10
|
+
});
|
|
11
|
+
router.post('/ai', async (req, res) => {
|
|
12
|
+
const { provider, modelId, modelName, apiKey, baseUrl } = req.body;
|
|
13
|
+
res.json((0, settings_service_1.saveAIConfig)(provider, modelId, modelName, apiKey, baseUrl));
|
|
14
|
+
});
|
|
15
|
+
router.get('/ai', (_req, res) => {
|
|
16
|
+
res.json((0, settings_service_1.getAIConfig)());
|
|
17
|
+
});
|
|
18
|
+
router.post('/email', async (req, res) => {
|
|
19
|
+
const { email, authCode, imapHost, imapPort } = req.body;
|
|
20
|
+
res.json(await (0, settings_service_1.saveEmailConfig)(email, authCode, imapHost, Number(imapPort)));
|
|
21
|
+
});
|
|
22
|
+
router.get('/email', (_req, res) => {
|
|
23
|
+
res.json((0, settings_service_1.getEmailConfig)());
|
|
24
|
+
});
|
|
25
|
+
router.post('/email/test', async (_req, res) => {
|
|
26
|
+
res.json(await (0, settings_service_1.testEmailConnection)());
|
|
27
|
+
});
|
|
28
|
+
exports.default = router;
|
|
29
|
+
//# sourceMappingURL=settings.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.routes.js","sourceRoot":"","sources":["../../src/routes/settings.routes.ts"],"names":[],"mappings":";;AAAA,qCAAgC;AAChC,mEAAyI;AACzI,mEAA2D;AAE3D,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;AACvB,MAAM,CAAC,GAAG,CAAC,6BAAW,CAAC,CAAA;AAEvB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACxC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAA,4BAAS,GAAE,CAAC,CAAA;AAC7B,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACpC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IAClE,GAAG,CAAC,IAAI,CAAC,IAAA,+BAAY,EAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AACvE,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IAC9B,GAAG,CAAC,IAAI,CAAC,IAAA,8BAAW,GAAE,CAAC,CAAA;AACzB,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACvC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IACxD,GAAG,CAAC,IAAI,CAAC,MAAM,IAAA,kCAAe,EAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AAC9E,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACjC,GAAG,CAAC,IAAI,CAAC,IAAA,iCAAc,GAAE,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC7C,GAAG,CAAC,IAAI,CAAC,MAAM,IAAA,sCAAmB,GAAE,CAAC,CAAA;AACvC,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.routes.d.ts","sourceRoot":"","sources":["../../src/routes/workspace.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAA;AA4BvB,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const express_1 = require("express");
|
|
4
|
+
const workspace_service_1 = require("../services/workspace.service");
|
|
5
|
+
const auth_middleware_1 = require("../middleware/auth.middleware");
|
|
6
|
+
const router = (0, express_1.Router)();
|
|
7
|
+
router.use(auth_middleware_1.requireAuth);
|
|
8
|
+
router.post('/write', async (req, res) => {
|
|
9
|
+
const { relativePath, content } = req.body;
|
|
10
|
+
res.json(await workspace_service_1.workspaceService.write(relativePath, content));
|
|
11
|
+
});
|
|
12
|
+
router.get('/read', async (req, res) => {
|
|
13
|
+
res.json(await workspace_service_1.workspaceService.read(req.query.path));
|
|
14
|
+
});
|
|
15
|
+
router.get('/list', async (req, res) => {
|
|
16
|
+
res.json(await workspace_service_1.workspaceService.list(req.query.path || ''));
|
|
17
|
+
});
|
|
18
|
+
router.delete('/delete', async (req, res) => {
|
|
19
|
+
res.json(await workspace_service_1.workspaceService.delete(req.query.path));
|
|
20
|
+
});
|
|
21
|
+
router.get('/stats', async (_req, res) => {
|
|
22
|
+
res.json(await workspace_service_1.workspaceService.getStats());
|
|
23
|
+
});
|
|
24
|
+
router.post('/cleanup-temp', async (_req, res) => {
|
|
25
|
+
res.json(await workspace_service_1.workspaceService.cleanupTemp());
|
|
26
|
+
});
|
|
27
|
+
exports.default = router;
|
|
28
|
+
//# sourceMappingURL=workspace.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.routes.js","sourceRoot":"","sources":["../../src/routes/workspace.routes.ts"],"names":[],"mappings":";;AAAA,qCAAgC;AAChC,qEAAgE;AAChE,mEAA2D;AAE3D,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;AACvB,MAAM,CAAC,GAAG,CAAC,6BAAW,CAAC,CAAA;AAEvB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACvC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IAC1C,GAAG,CAAC,IAAI,CAAC,MAAM,oCAAgB,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAA;AAC/D,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACrC,GAAG,CAAC,IAAI,CAAC,MAAM,oCAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAc,CAAC,CAAC,CAAA;AACjE,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACrC,GAAG,CAAC,IAAI,CAAC,MAAM,oCAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAc,IAAI,EAAE,CAAC,CAAC,CAAA;AACvE,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC1C,GAAG,CAAC,IAAI,CAAC,MAAM,oCAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAc,CAAC,CAAC,CAAA;AACnE,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACvC,GAAG,CAAC,IAAI,CAAC,MAAM,oCAAgB,CAAC,QAAQ,EAAE,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC/C,GAAG,CAAC,IAAI,CAAC,MAAM,oCAAgB,CAAC,WAAW,EAAE,CAAC,CAAA;AAChD,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface UserInfo {
|
|
2
|
+
id: string;
|
|
3
|
+
displayName: string | null;
|
|
4
|
+
role: string;
|
|
5
|
+
studentName: string | null;
|
|
6
|
+
studentGrade: string | null;
|
|
7
|
+
guardianId: string | null;
|
|
8
|
+
}
|
|
9
|
+
export interface StudentRecord {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
grade: string | null;
|
|
13
|
+
token: string;
|
|
14
|
+
}
|
|
15
|
+
export interface LoginResult {
|
|
16
|
+
success: boolean;
|
|
17
|
+
user?: UserInfo;
|
|
18
|
+
syncToken?: string;
|
|
19
|
+
error?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function ensureAdminAccount(): {
|
|
22
|
+
syncToken: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function loginByToken(syncToken: string): LoginResult;
|
|
25
|
+
export declare function getUserBySyncToken(syncToken: string): UserInfo | null;
|
|
26
|
+
export declare function setupGuardian(userId: string, guardianName: string): void;
|
|
27
|
+
export declare function createStudent(guardianId: string, name: string, grade?: string): StudentRecord;
|
|
28
|
+
export declare function listStudents(guardianId: string): StudentRecord[];
|
|
29
|
+
export declare function deleteStudent(studentId: string, guardianId: string): boolean;
|
|
30
|
+
export declare function resetSyncToken(userId: string): LoginResult;
|
|
31
|
+
export declare function getPrimaryStudentId(guardianId: string): string | null;
|
|
32
|
+
//# sourceMappingURL=auth.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.service.d.ts","sourceRoot":"","sources":["../../src/services/auth.service.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,kBAAkB,IAAI;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAiB1D;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAuB3D;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAkBrE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAIxE;AAGD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAU7F;AAGD,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE,CAOhE;AAGD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAM5E;AAGD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAO1D;AAGD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMrE"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ensureAdminAccount = ensureAdminAccount;
|
|
4
|
+
exports.loginByToken = loginByToken;
|
|
5
|
+
exports.getUserBySyncToken = getUserBySyncToken;
|
|
6
|
+
exports.setupGuardian = setupGuardian;
|
|
7
|
+
exports.createStudent = createStudent;
|
|
8
|
+
exports.listStudents = listStudents;
|
|
9
|
+
exports.deleteStudent = deleteStudent;
|
|
10
|
+
exports.resetSyncToken = resetSyncToken;
|
|
11
|
+
exports.getPrimaryStudentId = getPrimaryStudentId;
|
|
12
|
+
const uuid_1 = require("uuid");
|
|
13
|
+
const database_1 = require("../database");
|
|
14
|
+
function ensureAdminAccount() {
|
|
15
|
+
const db = (0, database_1.getDB)();
|
|
16
|
+
const existing = db
|
|
17
|
+
.prepare("SELECT id, sync_token FROM User WHERE username = 'admin' AND delete_flag = 0")
|
|
18
|
+
.get();
|
|
19
|
+
if (existing)
|
|
20
|
+
return { syncToken: existing.sync_token };
|
|
21
|
+
const syncToken = (0, uuid_1.v4)();
|
|
22
|
+
const now = Date.now();
|
|
23
|
+
db.prepare(`
|
|
24
|
+
INSERT INTO User (id, username, sync_token, role, create_time, update_time, delete_flag)
|
|
25
|
+
VALUES (?, 'admin', ?, 'guardian', ?, ?, 0)
|
|
26
|
+
`).run((0, uuid_1.v4)(), syncToken, now, now);
|
|
27
|
+
console.log('[Auth] Created admin account');
|
|
28
|
+
return { syncToken };
|
|
29
|
+
}
|
|
30
|
+
function loginByToken(syncToken) {
|
|
31
|
+
const db = (0, database_1.getDB)();
|
|
32
|
+
const user = db
|
|
33
|
+
.prepare('SELECT id, display_name, role, student_name, student_grade, guardian_id FROM User WHERE sync_token = ? AND delete_flag = 0')
|
|
34
|
+
.get(syncToken);
|
|
35
|
+
if (!user)
|
|
36
|
+
return { success: false, error: '访问码错误' };
|
|
37
|
+
return {
|
|
38
|
+
success: true,
|
|
39
|
+
syncToken,
|
|
40
|
+
user: {
|
|
41
|
+
id: user.id,
|
|
42
|
+
displayName: user.display_name ?? null,
|
|
43
|
+
role: user.role ?? 'guardian',
|
|
44
|
+
studentName: user.student_name ?? null,
|
|
45
|
+
studentGrade: user.student_grade ?? null,
|
|
46
|
+
guardianId: user.guardian_id ?? null
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function getUserBySyncToken(syncToken) {
|
|
51
|
+
const db = (0, database_1.getDB)();
|
|
52
|
+
const user = db
|
|
53
|
+
.prepare('SELECT id, display_name, role, student_name, student_grade, guardian_id FROM User WHERE sync_token = ? AND delete_flag = 0')
|
|
54
|
+
.get(syncToken);
|
|
55
|
+
if (!user)
|
|
56
|
+
return null;
|
|
57
|
+
return {
|
|
58
|
+
id: user.id,
|
|
59
|
+
displayName: user.display_name ?? null,
|
|
60
|
+
role: user.role ?? 'guardian',
|
|
61
|
+
studentName: user.student_name ?? null,
|
|
62
|
+
studentGrade: user.student_grade ?? null,
|
|
63
|
+
guardianId: user.guardian_id ?? null
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function setupGuardian(userId, guardianName) {
|
|
67
|
+
const db = (0, database_1.getDB)();
|
|
68
|
+
db.prepare('UPDATE User SET display_name = ?, update_time = ? WHERE id = ?')
|
|
69
|
+
.run(guardianName.trim(), Date.now(), userId);
|
|
70
|
+
}
|
|
71
|
+
// 创建学生账户,绑定到监护人
|
|
72
|
+
function createStudent(guardianId, name, grade) {
|
|
73
|
+
const db = (0, database_1.getDB)();
|
|
74
|
+
const id = (0, uuid_1.v4)();
|
|
75
|
+
const token = (0, uuid_1.v4)();
|
|
76
|
+
const now = Date.now();
|
|
77
|
+
db.prepare(`
|
|
78
|
+
INSERT INTO User (id, username, sync_token, display_name, role, guardian_id, student_grade, create_time, update_time, delete_flag)
|
|
79
|
+
VALUES (?, ?, ?, ?, 'student', ?, ?, ?, ?, 0)
|
|
80
|
+
`).run(id, `student_${id.slice(0, 8)}`, token, name.trim(), guardianId, grade ?? null, now, now);
|
|
81
|
+
return { id, name: name.trim(), grade: grade ?? null, token };
|
|
82
|
+
}
|
|
83
|
+
// 列出监护人名下所有学生
|
|
84
|
+
function listStudents(guardianId) {
|
|
85
|
+
const db = (0, database_1.getDB)();
|
|
86
|
+
return db.prepare('SELECT id, display_name, student_grade, sync_token FROM User WHERE guardian_id = ? AND role = ? AND delete_flag = 0 ORDER BY create_time ASC').all(guardianId, 'student').map(r => ({ id: r.id, name: r.display_name, grade: r.student_grade, token: r.sync_token }));
|
|
87
|
+
}
|
|
88
|
+
// 删除(软删)学生账户
|
|
89
|
+
function deleteStudent(studentId, guardianId) {
|
|
90
|
+
const db = (0, database_1.getDB)();
|
|
91
|
+
const result = db.prepare('UPDATE User SET delete_flag = 1, update_time = ? WHERE id = ? AND guardian_id = ?').run(Date.now(), studentId, guardianId);
|
|
92
|
+
return result.changes > 0;
|
|
93
|
+
}
|
|
94
|
+
// 重置 syncToken
|
|
95
|
+
function resetSyncToken(userId) {
|
|
96
|
+
const db = (0, database_1.getDB)();
|
|
97
|
+
const user = db.prepare('SELECT id FROM User WHERE id = ? AND delete_flag = 0').get(userId);
|
|
98
|
+
if (!user)
|
|
99
|
+
return { success: false, error: '用户不存在' };
|
|
100
|
+
const newToken = (0, uuid_1.v4)();
|
|
101
|
+
db.prepare('UPDATE User SET sync_token = ?, update_time = ? WHERE id = ?').run(newToken, Date.now(), user.id);
|
|
102
|
+
return { success: true, syncToken: newToken };
|
|
103
|
+
}
|
|
104
|
+
// 获取监护人名下第一个学生的 ID(工具调用时用)
|
|
105
|
+
function getPrimaryStudentId(guardianId) {
|
|
106
|
+
const db = (0, database_1.getDB)();
|
|
107
|
+
const row = db.prepare('SELECT id FROM User WHERE guardian_id = ? AND role = ? AND delete_flag = 0 ORDER BY create_time ASC LIMIT 1').get(guardianId, 'student');
|
|
108
|
+
return row?.id ?? null;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=auth.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../src/services/auth.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface LearningRecordInput {
|
|
2
|
+
studentId: string;
|
|
3
|
+
subject: string;
|
|
4
|
+
topic: string;
|
|
5
|
+
score?: number;
|
|
6
|
+
durationMinutes?: number;
|
|
7
|
+
note?: string;
|
|
8
|
+
recordDate?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface LearningRecord {
|
|
11
|
+
id: string;
|
|
12
|
+
student_id: string;
|
|
13
|
+
subject: string;
|
|
14
|
+
topic: string;
|
|
15
|
+
score?: number;
|
|
16
|
+
duration_minutes: number;
|
|
17
|
+
note?: string;
|
|
18
|
+
record_date: number;
|
|
19
|
+
create_time: number;
|
|
20
|
+
}
|
|
21
|
+
export interface SummaryData {
|
|
22
|
+
totalSessions: number;
|
|
23
|
+
totalMinutes: number;
|
|
24
|
+
avgScore: number | null;
|
|
25
|
+
bySubject: Array<{
|
|
26
|
+
subject: string;
|
|
27
|
+
sessions: number;
|
|
28
|
+
totalMinutes: number;
|
|
29
|
+
avgScore: number | null;
|
|
30
|
+
}>;
|
|
31
|
+
weakPoints: Array<{
|
|
32
|
+
subject: string;
|
|
33
|
+
topic: string;
|
|
34
|
+
weakness_score: number;
|
|
35
|
+
attempt_count: number;
|
|
36
|
+
}>;
|
|
37
|
+
}
|
|
38
|
+
export interface DataResult {
|
|
39
|
+
success: boolean;
|
|
40
|
+
data?: LearningRecord | SummaryData | {
|
|
41
|
+
message: string;
|
|
42
|
+
};
|
|
43
|
+
error?: string;
|
|
44
|
+
}
|
|
45
|
+
export declare function recordLearning(data: LearningRecordInput): DataResult;
|
|
46
|
+
export declare function getSummary(studentId: string, dateFrom: number, dateTo: number, subject?: string): DataResult;
|
|
47
|
+
//# sourceMappingURL=data.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.service.d.ts","sourceRoot":"","sources":["../../src/services/data.service.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,MAAM,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,KAAK,CAAC;QACf,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,YAAY,EAAE,MAAM,CAAA;QACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KACxB,CAAC,CAAA;IACF,UAAU,EAAE,KAAK,CAAC;QAChB,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,cAAc,EAAE,MAAM,CAAA;QACtB,aAAa,EAAE,MAAM,CAAA;KACtB,CAAC,CAAA;CACH;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,cAAc,GAAG,WAAW,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IACzD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,mBAAmB,GAAG,UAAU,CAoEpE;AA+CD,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,UAAU,CAqEZ"}
|