# 智慧医院 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 # 早期探索汇报 ``` ## 〇、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` + `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. 右上角用户菜单 → 修改密码 → 成功后需重新登录