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

@@ -0,0 +1,215 @@
# 旧版本系统 - 服务器与数据库配置说明
> 最后更新2026-02-15
---
## 1. 服务器信息
| 项目 | 值 |
|------|-----|
| 服务器地址 | `8.154.22.149` |
| 操作系统 | Linux (Ubuntu) |
| 数据库类型 | MariaDB |
| 数据库端口 | 3306 |
---
## 2. 数据库连接信息
| 项目 | 值 |
|------|-----|
| 连接地址 | `jdbc:mysql://127.0.0.1:3306/xzyx_online?characterEncoding=utf8` |
| 数据库名 | `xzyx_online` |
| 用户名 | `xzyx_rw` |
| 密码 | `SKJfdwalkd` |
### 命令行连接方式
```bash
# SSH 登录服务器
ssh root@8.154.22.149
# 连接数据库
mysql -u xzyx_rw -p'SKJfdwalkd' -h 127.0.0.1 xzyx_online
```
---
## 3. 用户表结构 (u_user_info)
### 核心字段
| 字段 | 类型 | 说明 | 后台显示名 |
|------|------|------|-----------|
| `id` | int(11) | 主键,自增 | - |
| `phone` | varchar(20) | 手机号(登录账号)**必填** | 账号 |
| `nickname` | varchar(40) | 昵称 | 昵称 |
| `real_name` | varchar(45) | 真实姓名 | - |
| `hospital` | varchar(255) | 固定值 "本地" | - |
| `company` | varchar(200) | **实际的机构/医院名称** | 医院 |
| `academy` | varchar(200) | **部门** | 部门 |
| `user_role` | varchar(20) | 用户角色,默认 "NORMAL" | 用户角色 |
| `user_status` | varchar(45) | 用户状态,默认 "NORMAL" | - |
| `password` | varchar(45) | 密码MD5加密 | - |
| `hosptial_id` | int(11) | 医院ID默认 0 | - |
| `email_validate_status` | tinyint(4) | 邮箱验证状态,默认 0 | - |
| `register_time` | int(11) | 注册时间Unix时间戳 | - |
### 字段对应关系
| 后台显示 | 数据库字段 |
|----------|-----------|
| 账号 | `phone` |
| 昵称 | `nickname` + `real_name` |
| 用户角色:普通 | `user_role = 'NORMAL'` |
| 医院 | `company`(注意:不是 hospital 字段) |
| 部门 | `academy` |
### 默认密码
- 明文:`123456`
- MD5`E10ADC3949BA59ABBE56E057F20F883E`
---
## 4. 批量导入用户操作指南
### 步骤1准备 CSV 文件
格式要求:
```csv
手机号,姓名,医院,部门
13800000001,张三,北京大学第三医院,骨科
13800000002,李四,医朵云,医学部
```
### 步骤2检查重复手机号
```bash
# 导出现有手机号
mysql -u xzyx_rw -p'SKJfdwalkd' -h 127.0.0.1 xzyx_online -N -e "SELECT phone FROM u_user_info;" > /tmp/existing_phones.txt
# 查看现有用户数量
mysql -u xzyx_rw -p'SKJfdwalkd' -h 127.0.0.1 xzyx_online -e "SELECT COUNT(*) FROM u_user_info;"
```
### 步骤3生成 SQL 插入语句
单条插入模板:
```sql
INSERT INTO u_user_info (
phone,
nickname,
real_name,
hospital,
company,
academy,
user_role,
user_status,
password,
hosptial_id,
email_validate_status,
register_time
) VALUES (
'手机号',
'姓名',
'姓名',
'本地',
'机构名称',
'部门',
'NORMAL',
'NORMAL',
'E10ADC3949BA59ABBE56E057F20F883E',
0,
0,
UNIX_TIMESTAMP()
);
```
批量插入模板(使用 INSERT IGNORE 避免重复报错):
```sql
INSERT IGNORE INTO u_user_info (phone, nickname, real_name, hospital, company, academy, user_role, user_status, password, hosptial_id, email_validate_status, register_time) VALUES
('13800000001', '张三', '张三', '本地', '北京大学第三医院', '骨科', 'NORMAL', 'NORMAL', 'E10ADC3949BA59ABBE56E057F20F883E', 0, 0, UNIX_TIMESTAMP()),
('13800000002', '李四', '李四', '本地', '医朵云', '医学部', 'NORMAL', 'NORMAL', 'E10ADC3949BA59ABBE56E057F20F883E', 0, 0, UNIX_TIMESTAMP());
```
### 步骤4上传并执行 SQL
```bash
# 上传 SQL 文件到服务器(或使用 nano 创建)
nano /tmp/batch_insert_users.sql
# 执行 SQL 文件
mysql -u xzyx_rw -p'SKJfdwalkd' -h 127.0.0.1 xzyx_online < /tmp/batch_insert_users.sql
```
### 步骤5验证导入结果
```bash
# 查询指定机构的用户数量
mysql -u xzyx_rw -p'SKJfdwalkd' -h 127.0.0.1 xzyx_online -e "SELECT COUNT(*) as '用户数' FROM u_user_info WHERE company = '北京大学第三医院';"
# 抽查用户数据
mysql -u xzyx_rw -p'SKJfdwalkd' -h 127.0.0.1 xzyx_online -e "SELECT id, phone, nickname, company, academy FROM u_user_info WHERE company = '北京大学第三医院' LIMIT 10;"
```
---
## 5. 常用查询命令
### 查看所有表
```bash
mysql -u xzyx_rw -p'SKJfdwalkd' -h 127.0.0.1 xzyx_online -e "SHOW TABLES;"
```
### 查看表结构
```bash
mysql -u xzyx_rw -p'SKJfdwalkd' -h 127.0.0.1 xzyx_online -e "DESC u_user_info;"
```
### 根据手机号查询用户
```bash
mysql -u xzyx_rw -p'SKJfdwalkd' -h 127.0.0.1 xzyx_online -e "SELECT * FROM u_user_info WHERE phone = '18611348738'\G"
```
### 修改用户信息
```bash
# 修改手机号
mysql -u xzyx_rw -p'SKJfdwalkd' -h 127.0.0.1 xzyx_online -e "UPDATE u_user_info SET phone = '新手机号' WHERE phone = '旧手机号';"
# 重置密码为 123456
mysql -u xzyx_rw -p'SKJfdwalkd' -h 127.0.0.1 xzyx_online -e "UPDATE u_user_info SET password = 'E10ADC3949BA59ABBE56E057F20F883E' WHERE phone = '手机号';"
```
### 删除用户
```bash
mysql -u xzyx_rw -p'SKJfdwalkd' -h 127.0.0.1 xzyx_online -e "DELETE FROM u_user_info WHERE phone = '手机号';"
```
---
## 6. 已导入批次记录
| 批次 | 日期 | 机构 | 数量 | SQL文件 |
|------|------|------|------|---------|
| 第1批 | 2026-02-15 | 北京大学第三医院 | 225 | `docs/06-测试文档/batch_insert_users.sql` |
| 第2批 | 2026-02-15 | 北京大学第三医院 | 35 | `docs/06-测试文档/batch_insert_users_2.sql` |
---
## 7. 注意事项
1. **手机号唯一性**:手机号是用户的唯一登录凭证,不能重复
2. **密码存储**:使用 MD5 加密,默认密码 123456 对应 `E10ADC3949BA59ABBE56E057F20F883E`
3. **hospital 字段**:固定填写 "本地",实际医院名称存储在 `company` 字段
4. **部门字段**:使用 `academy` 字段存储
5. **使用 INSERT IGNORE**:批量导入时使用此语法,遇到重复手机号自动跳过不报错