Complete integration of the old clinical research platform (www.xunzhengyixue.com) into the new AI platform via Token injection + iframe embedding: Backend: - Add legacy-bridge module (MySQL pool, auth service, routes) - POST /api/v1/legacy/auth: JWT -> phone lookup -> Token injection into old MySQL - Auto-create user in old system if not found (matched by phone number) Frontend: - LegacySystemPage: iframe container with Bridge URL construction - ResearchManagement + StatisticalTools entry components - Module registry updated from external links to iframe embed mode ECS (token-bridge.html deployed to www.xunzhengyixue.com): - Wrapper Bridge: sets cookies within same-origin context - Storage Access API for cross-site dev environments - CSS injection: hide old system nav/footer, remove padding gaps - Inner iframe loads target page with full DOM access (same-origin) Key technical decisions: - Token injection (direct MySQL write) instead of calling login API - Wrapper Bridge instead of parent-page cookie setting (cross-origin fix) - Storage Access API + SameSite=None;Secure for third-party cookie handling - User isolation guaranteed by phone number matching Documentation: - Integration plan v4.0 with full implementation record - Implementation summary with 6 pitfalls documented - System status guide updated (ST module now integrated) Tested: Local E2E verified - auto login, research management, 126 statistical tools, report generation, download, UI layout all working correctly Made-with: Cursor
83 lines
2.1 KiB
JSON
83 lines
2.1 KiB
JSON
{
|
|
"name": "ai-clinical-backend",
|
|
"version": "1.0.0",
|
|
"description": "AI Clinical Research Platform - Backend API",
|
|
"main": "dist/index.js",
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "tsx watch src/index.ts",
|
|
"build": "tsc",
|
|
"start": "node dist/index.js",
|
|
"prisma:generate": "prisma generate",
|
|
"prisma:migrate": "prisma migrate dev",
|
|
"prisma:studio": "prisma studio",
|
|
"prisma:seed": "tsx prisma/seed.ts",
|
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
},
|
|
"prisma": {
|
|
"seed": "tsx prisma/seed.ts"
|
|
},
|
|
"keywords": [
|
|
"ai",
|
|
"clinical",
|
|
"research",
|
|
"medical"
|
|
],
|
|
"author": "AI Clinical Dev Team",
|
|
"license": "ISC",
|
|
"dependencies": {
|
|
"@fastify/cors": "^11.1.0",
|
|
"@fastify/jwt": "^10.0.0",
|
|
"@fastify/multipart": "^9.2.1",
|
|
"@prisma/client": "^6.17.0",
|
|
"@types/form-data": "^2.2.1",
|
|
"@wecom/crypto": "^1.0.1",
|
|
"adm-zip": "^0.5.16",
|
|
"ajv": "^8.17.1",
|
|
"ali-oss": "^6.23.0",
|
|
"axios": "^1.12.2",
|
|
"bcryptjs": "^2.4.3",
|
|
"bullmq": "^5.65.0",
|
|
"diff-match-patch": "^1.0.5",
|
|
"dotenv": "^17.2.3",
|
|
"exceljs": "^4.4.0",
|
|
"fastify": "^5.6.1",
|
|
"form-data": "^4.0.4",
|
|
"handlebars": "^4.7.8",
|
|
"html2canvas": "^1.4.1",
|
|
"js-yaml": "^4.1.0",
|
|
"json-logic-js": "^2.0.5",
|
|
"jsonrepair": "^3.13.1",
|
|
"jsonwebtoken": "^9.0.2",
|
|
"jspdf": "^3.0.3",
|
|
"mysql2": "^3.18.2",
|
|
"openai": "^6.16.0",
|
|
"p-queue": "^9.0.1",
|
|
"pg-boss": "^12.5.2",
|
|
"prisma": "^6.17.0",
|
|
"tiktoken": "^1.0.22",
|
|
"winston": "^3.18.3",
|
|
"xlsx": "^0.18.5",
|
|
"xml2js": "^0.6.2",
|
|
"zod": "^4.1.12"
|
|
},
|
|
"devDependencies": {
|
|
"@types/adm-zip": "^0.5.7",
|
|
"@types/ali-oss": "^6.23.1",
|
|
"@types/bcryptjs": "^2.4.6",
|
|
"@types/js-yaml": "^4.0.9",
|
|
"@types/json-logic-js": "^2.0.8",
|
|
"@types/jsonwebtoken": "^9.0.7",
|
|
"@types/node": "^24.7.1",
|
|
"@types/uuid": "^10.0.0",
|
|
"@types/winston": "^2.4.4",
|
|
"@types/xml2js": "^0.4.14",
|
|
"better-sqlite3": "^12.4.6",
|
|
"nodemon": "^3.1.10",
|
|
"pino-pretty": "^13.1.1",
|
|
"ts-node": "^10.9.2",
|
|
"tsx": "^4.20.6",
|
|
"typescript": "^5.9.3"
|
|
}
|
|
}
|