Files
AIclinicalresearch/backend/package.json
HaHafeng c3f7d54fdf feat(platform): Implement legacy system integration with Wrapper Bridge architecture
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
2026-02-27 21:54:38 +08:00

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"
}
}