152 lines
7.1 KiB
Markdown
152 lines
7.1 KiB
Markdown
# 智慧医院 AI 影像诊断与电子病历辅助决策系统
|
||
|
||
混合架构:**Spring Boot 3**(业务 / JWT)+ **FastAPI AI 微服务**(YOLO / MONAI / LangChain RAG / DeepSeek)+ **Vue 3**(Element Plus + ECharts)。
|
||
|
||
## 目录结构
|
||
|
||
```
|
||
smart-hospital/
|
||
├── smart-hospital/ # 业务后端 Maven 项目(Spring Boot 3.3)
|
||
├── ai-service/ # AI 微服务(FastAPI + YOLO + LangChain RAG)
|
||
├── frontend/ # 前端 Vue 3 项目
|
||
├── smart-hospital.sql # 数据库初始化脚本
|
||
└── PROJECT_REPORT.md # 早期探索汇报
|
||
```
|
||
|
||
## 0、AI 微服务启动(推荐先启)
|
||
|
||
先决条件:Python 3.10+。
|
||
|
||
```bash
|
||
cd ai-service
|
||
python -m venv .venv
|
||
.venv\Scripts\activate # Windows
|
||
# source .venv/bin/activate # macOS/Linux
|
||
# 建议先装 CPU 版 torch(避免 CUDA 包体积过大)
|
||
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
|
||
pip install -r requirements.txt
|
||
copy .env.example .env # 可填 DeepSeek/Qwen 的 LLM_API_KEY
|
||
uvicorn app.main:app --host 0.0.0.0 --port 8001
|
||
```
|
||
|
||
> 说明:`.venv`、`frontend/node_modules`、`smart-hospital/target` 为可重建依赖,不入库;
|
||
> 删掉后按上列命令重新安装即可。源码 + 医学权重精简后约数十 MB。
|
||
|
||
- 健康检查:http://127.0.0.1:8001/health
|
||
- Swagger:http://127.0.0.1:8001/docs
|
||
- 未启动 AI 服务时,Spring Boot 会**自动降级**为本地规则模拟,业务仍可用。
|
||
- 详见 `ai-service/README.md`。
|
||
|
||
## 一、业务后端启动
|
||
|
||
先决条件:JDK 17+(默认 **H2 内存库**,无需安装 MySQL)。
|
||
|
||
1. 启动(默认 H2):
|
||
```bash
|
||
cd smart-hospital
|
||
./mvnw spring-boot:run # macOS/Linux
|
||
mvnw.cmd spring-boot:run # Windows
|
||
```
|
||
2. 可选 H2 控制台:`http://localhost:8080/h2-console`
|
||
JDBC URL:`jdbc:h2:mem:smart_hospital`,用户 `sa`,密码留空。
|
||
3. 若要用本地 MySQL:
|
||
```bash
|
||
# 先建库 smart_hospital,改 application-mysql.yml 账号密码后:
|
||
mvnw.cmd spring-boot:run -Dspring-boot.run.profiles=mysql
|
||
```
|
||
4. 启动后 `DataInitializer` 会自动写入测试账号:
|
||
- `admin / admin123`(角色 ADMIN,可管理用户)
|
||
- `doctor1 / pass123`(角色 DOCTOR)
|
||
- `radio1 / radio123`(角色 RADIOLOGIST)
|
||
|
||
后端监听 `http://localhost:8080`,业务前缀 `/api/**`。
|
||
AI 服务地址配置:`ai.service.base-url`(默认 `http://127.0.0.1:8001`)。
|
||
> H2 为内存库,进程退出后数据清空;每次启动会重新初始化演示数据。
|
||
|
||
## 二、前端启动
|
||
|
||
先决条件:Node.js 18+。
|
||
|
||
```bash
|
||
cd frontend
|
||
npm install
|
||
npm run dev
|
||
```
|
||
|
||
打开 `http://localhost:5173`,Vite 会把 `/api` 代理到 `http://localhost:8080`。
|
||
|
||
生产构建:
|
||
```bash
|
||
npm run build
|
||
```
|
||
产物在 `frontend/dist/`,可交给 Nginx 或后端静态资源目录托管。
|
||
|
||
## 三、主要功能
|
||
|
||
- 登录(JWT,token 存 localStorage,24h 过期)+ **修改密码**
|
||
- 仪表盘:患者/影像/病历/预约等多项 KPI + 近 7 天趋势 + 检查类型/诊断状态饼图 + 快捷入口与待办
|
||
- 患者管理:分页 + 关键字搜索 + 增删改 + **360° 档案**(关联影像 / 病历 / 预约)
|
||
- 影像管理:CRUD + 上传 + **AI 诊断**(FastAPI YOLO 检测框/标注图 + 标准报告,不可用时本地降级)
|
||
- 电子病历:CRUD + **AI 辅助决策**(治疗/护理/随访 + LangChain RAG 知识库引用)
|
||
- AI 对话与知识库管理(管理端可配置 DeepSeek 等 OpenAI 兼容接口)
|
||
- **预约挂号**:新建/编辑/删 + 状态流转(预约→确认→完成/取消/未到诊)+ 按日期筛选
|
||
- 用户管理:仅 ADMIN 角色可访问;前端路由守卫 + 后端 `@PreAuthorize` 双重校验
|
||
|
||
### 推荐演示路径
|
||
|
||
1. 依次启动:`ai-service:8001` → `smart-hospital:8080` → `frontend:5173`
|
||
2. 使用 `doctor1 / pass123` 登录
|
||
3. **影像诊断**:上传图片 → AI 诊断 → 查看标注图与报告
|
||
4. **电子病历**:诊断填写「高血压/肺炎」等 → 查看护理/治疗/随访与 RAG 来源
|
||
|
||
## 四、REST 接口一览
|
||
|
||
| 方法 | 路径 | 说明 | 权限 |
|
||
|---|---|---|---|
|
||
| POST | `/api/auth/login` | 登录,返回 `{token, user}` | 公开 |
|
||
| GET | `/api/auth/me` | 当前用户信息 | 已登录 |
|
||
| POST | `/api/auth/change-password` | 修改密码 | 已登录 |
|
||
| GET | `/api/stats/overview` | 统计概览(KPI + 趋势 + 分布) | 已登录 |
|
||
| GET/POST/PUT/DELETE | `/api/patients` 及 `/api/patients/{id}` | 患者 CRUD | 已登录 |
|
||
| GET | `/api/patients/{id}/profile` | 患者 360° 档案 | 已登录 |
|
||
| GET/POST/PUT/DELETE | `/api/imaging` 及 `/api/imaging/{id}` | 影像 CRUD(支持 keyword/status/studyType) | 已登录 |
|
||
| POST | `/api/imaging/upload` | 影像文件上传 | 已登录 |
|
||
| POST | `/api/ai-diagnosis/analyze/{recordId}` | 触发 AI 诊断 | 已登录 |
|
||
| GET | `/api/ai-diagnosis/result/{recordId}` | 查询 AI 诊断结果 | 已登录 |
|
||
| GET/POST/PUT/DELETE | `/api/emrs` 及 `/api/emrs/{id}` | 病历 CRUD(支持 keyword) | 已登录 |
|
||
| GET | `/api/emrs/{id}/ai-suggestions` | 获取 AI 辅助决策 | 已登录 |
|
||
| GET/POST/PUT/DELETE | `/api/appointments` 及 `/api/appointments/{id}` | 预约挂号 CRUD | 已登录 |
|
||
| PATCH | `/api/appointments/{id}/status` | 更新预约状态 | 已登录 |
|
||
| GET/POST/PUT/DELETE | `/api/users` 及 `/api/users/{id}` | 用户管理 | ADMIN |
|
||
|
||
所有响应格式:
|
||
```json
|
||
{ "code": 0, "message": "OK", "data": { ... } }
|
||
```
|
||
`code != 0` 由前端 axios 拦截器统一弹 `ElMessage`。
|
||
|
||
## 五、关键改造点
|
||
|
||
相较于原始 Thymeleaf 单体版本:
|
||
|
||
- Spring Boot 从 2.7 升级到 3.3.4,`javax.*` → `jakarta.*`,MySQL 驱动坐标改为 `com.mysql:mysql-connector-j`
|
||
- 引入 Spring Security + JWT(`jjwt` 0.12),无状态会话;密码 BCrypt 存储
|
||
- 引入统一 `Result<T>` + `GlobalExceptionHandler`,Controller 不再直接抛 `RuntimeException`
|
||
- `AsyncConfig` 声明 `ThreadPoolTaskExecutor` Bean,替换 `AIDiagnosisService` 里手动 `Executors.newFixedThreadPool(5)`
|
||
- `AiProperties` / `StorageProperties` 落地 `application.yml` 里原本"悬空"的配置
|
||
- `UserRepository.findByUsername` / `existsByUsername` 替换原 `findAll().stream()` 全表登录
|
||
- 删除 `templates/` 与 `PageController`,Thymeleaf 服务端渲染完全被 Vue SPA 替换
|
||
- 前端影像轮询增加 30 次上限 + `onBeforeUnmount` 清理,修复原页面死循环风险
|
||
|
||
## 六、验证清单
|
||
|
||
1. 后端 `mvnw package` 通过(当前工程已验证 BUILD SUCCESS)
|
||
2. 前端 `npm run dev` 启动成功后访问 5173
|
||
3. 用 `admin/admin123` 登录 → 能看到「用户管理」菜单
|
||
4. 用 `doctor1/pass123` 登录 → 访问 `/users` 显示 403
|
||
5. 患者页新增-编辑-删除全流程可用;点「档案」可查看 360° 关联数据
|
||
6. 影像页上传图片 → 新建记录 → 点「AI 诊断」→ 状态从 PENDING → ANALYZING → COMPLETED;筛选状态/类型可用
|
||
7. 病历页新建后弹出 AI 辅助决策 dialog,显示治疗/用药/风险/冲突四类内容
|
||
8. 预约挂号页可新建预约并切换状态(确认/完成/取消)
|
||
9. 右上角用户菜单 → 修改密码 → 成功后需重新登录
|