Files
Shixun/README.md
T
2026-08-19 19:27:11 +08:00

152 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 智慧医院 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. 右上角用户菜单 → 修改密码 → 成功后需重新登录