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
This commit is contained in:
2026-02-27 21:54:38 +08:00
parent 6124c7abc6
commit c3f7d54fdf
21 changed files with 1407 additions and 63 deletions

View File

@@ -214,6 +214,13 @@ import { ssaRoutes } from './modules/ssa/index.js';
await fastify.register(ssaRoutes, { prefix: '/api/v1/ssa' });
logger.info('✅ SSA智能统计分析路由已注册: /api/v1/ssa');
// ============================================
// 【集成模块】Legacy Bridge - 旧系统集成桥接
// ============================================
import { legacyBridgeRoutes } from './modules/legacy-bridge/routes.js';
await fastify.register(legacyBridgeRoutes, { prefix: '/api/v1/legacy' });
logger.info('✅ Legacy Bridge路由已注册: /api/v1/legacy');
// 启动服务器
const start = async () => {
try {
@@ -340,6 +347,11 @@ const gracefulShutdown = async (signal: string) => {
await prisma.$disconnect();
console.log('✅ 数据库连接已关闭');
// 4. 关闭 Legacy MySQL 连接池
const { closeLegacyMysqlPool } = await import('./modules/legacy-bridge/mysql-pool.js');
await closeLegacyMysqlPool();
console.log('✅ Legacy MySQL连接池已关闭');
console.log('👋 优雅关闭完成,再见!');
process.exit(0);
} catch (error) {