# 智慧医院 API 接口文档 基于当前源码整理。前端开发走 Vite 代理;联调可直接请求业务后端。 --- ## 目录 1. [服务地址](#1-服务地址) 2. [通用约定](#2-通用约定) 3. [接口一览](#3-接口一览) 4. [业务后端详解](#4-业务后端详解) 5. [AI 微服务详解](#5-ai-微服务详解) 6. [数据模型](#6-数据模型) 7. [枚举与错误码](#7-枚举与错误码) --- ## 1. 服务地址 | 服务 | 地址 | 说明 | |------|------|------| | 前端 | `http://localhost:5173` | `/api` 代理到后端 | | 业务后端 | `http://localhost:8080` | 前缀 `/api/**`,JWT 鉴权 | | AI 微服务 | `http://127.0.0.1:8001` | 后端内网调用;Swagger:`/docs` | ``` 前端 :5173 → 后端 :8080/api → AI :8001(影像 / 决策 / YOLO) ``` **演示账号** | 用户名 | 密码 | 角色 | |--------|------|------| | admin | admin123 | ADMIN | | doctor1 | pass123 | DOCTOR | | radio1 | radio123 | RADIOLOGIST | --- ## 2. 通用约定 ### 鉴权 | 项 | 说明 | |----|------| | Header | `Authorization: Bearer ` | | 获取 Token | `POST /api/auth/login` | | 有效期 | 24 小时 | | 公开 | `/api/auth/login`、`/api/auth/logout`、`/uploads/**` | | 需登录 | 其余 `/api/**` | | 仅 ADMIN | `/api/users/**`;AI 配置写操作;知识库写操作;YOLO 管理 | ### 统一响应(业务后端) ```json { "code": 0, "message": "OK", "data": {} } ``` ### 分页(业务后端) | 参数 | 默认 | 说明 | |------|------|------| | page | 0 | 页码,从 0 开始 | | size | 10 | 每页条数 | ```json { "content": [], "number": 0, "size": 10, "totalElements": 100, "totalPages": 10 } ``` ### Content-Type | 类型 | 场景 | |------|------| | `application/json` | 普通接口 | | `multipart/form-data` | 文件上传 | --- ## 3. 接口一览 ### 3.1 业务后端 `http://localhost:8080` **认证** | 方法 | 路径 | 权限 | 说明 | |------|------|------|------| | POST | `/api/auth/login` | 公开 | 登录,返回 token | | POST | `/api/auth/logout` | 公开 | 登出 | | GET | `/api/auth/me` | 登录 | 当前用户 | | POST | `/api/auth/change-password` | 登录 | 修改密码 | | POST | `/api/auth/avatar` | 登录 | 上传头像 | **统计** | 方法 | 路径 | 权限 | 说明 | |------|------|------|------| | GET | `/api/stats/overview` | 登录 | 仪表盘总览 | **患者** | 方法 | 路径 | 权限 | 说明 | |------|------|------|------| | GET | `/api/patients` | 登录 | 分页列表 | | GET | `/api/patients/{id}` | 登录 | 详情 | | GET | `/api/patients/{id}/profile` | 登录 | 360° 档案 | | POST | `/api/patients` | 登录 | 新建 | | PUT | `/api/patients/{id}` | 登录 | 更新 | | DELETE | `/api/patients/{id}` | 登录 | 删除 | **影像** | 方法 | 路径 | 权限 | 说明 | |------|------|------|------| | GET | `/api/imaging` | 登录 | 分页列表 | | GET | `/api/imaging/{id}` | 登录 | 详情 | | POST | `/api/imaging` | 登录 | 新建记录 | | PUT | `/api/imaging/{id}` | 登录 | 更新 | | DELETE | `/api/imaging/{id}` | 登录 | 删除 | | POST | `/api/imaging/upload` | 登录 | 上传影像文件 | | POST | `/api/ai-diagnosis/analyze/{recordId}` | 登录 | 提交 AI 诊断 | | GET | `/api/ai-diagnosis/result/{recordId}` | 登录 | 查询诊断结果 | **电子病历** | 方法 | 路径 | 权限 | 说明 | |------|------|------|------| | GET | `/api/emrs` | 登录 | 分页列表 | | GET | `/api/emrs/{id}` | 登录 | 详情 | | POST | `/api/emrs` | 登录 | 新建(含 AI 决策) | | PUT | `/api/emrs/{id}` | 登录 | 更新 | | DELETE | `/api/emrs/{id}` | 登录 | 删除 | | GET | `/api/emrs/{id}/ai-suggestions` | 登录 | AI 辅助决策 | **预约** | 方法 | 路径 | 权限 | 说明 | |------|------|------|------| | GET | `/api/appointments` | 登录 | 分页列表 | | GET | `/api/appointments/stats` | 登录 | 统计 | | GET | `/api/appointments/doctors` | 登录 | 医生列表 | | GET | `/api/appointments/{id}` | 登录 | 详情 | | POST | `/api/appointments` | 登录 | 新建 | | PUT | `/api/appointments/{id}` | 登录 | 更新 | | PATCH | `/api/appointments/{id}/status` | 登录 | 变更状态 | | DELETE | `/api/appointments/{id}` | 登录 | 删除 | **用户管理** | 方法 | 路径 | 权限 | 说明 | |------|------|------|------| | GET | `/api/users` | ADMIN | 分页列表 | | GET | `/api/users/stats` | ADMIN | 统计 | | GET | `/api/users/{id}` | ADMIN | 详情 | | POST | `/api/users` | ADMIN | 新建 | | PUT | `/api/users/{id}` | ADMIN | 更新 | | POST | `/api/users/{id}/avatar` | ADMIN | 上传头像 | | PATCH | `/api/users/{id}/enabled` | ADMIN | 启用/停用 | | DELETE | `/api/users/{id}` | ADMIN | 删除 | **AI 对话** | 方法 | 路径 | 权限 | 说明 | |------|------|------|------| | POST | `/api/ai/chat` | 登录 | 对话(CHAT / RAG) | | GET | `/api/ai/chat/history` | 登录 | 历史记录 | | DELETE | `/api/ai/chat/history` | 登录 | 清空历史 | **AI 管理** | 方法 | 路径 | 权限 | 说明 | |------|------|------|------| | GET | `/api/admin/ai-settings` | ADMIN | 大模型配置 | | PUT | `/api/admin/ai-settings` | ADMIN | 保存配置 | | POST | `/api/admin/ai-settings/test` | ADMIN | 连通测试 | | GET | `/api/admin/ai-service/status` | 登录 | AI 服务状态 | | GET | `/api/admin/ai-knowledge` | 登录 | 知识库列表 | | GET | `/api/admin/ai-knowledge/{id}` | 登录 | 知识库详情 | | POST | `/api/admin/ai-knowledge` | ADMIN | 新建文档 | | PUT | `/api/admin/ai-knowledge/{id}` | ADMIN | 更新文档 | | PATCH | `/api/admin/ai-knowledge/{id}/enabled` | ADMIN | 启用/停用 | | DELETE | `/api/admin/ai-knowledge/{id}` | ADMIN | 删除文档 | **YOLO 管理(代理 AI 服务)** | 方法 | 路径 | 权限 | 说明 | |------|------|------|------| | GET | `/api/admin/yolo/status` | ADMIN | 状态 | | GET | `/api/admin/yolo/weights` | ADMIN | 权重列表 | | POST | `/api/admin/yolo/weights/upload` | ADMIN | 上传权重 | | POST | `/api/admin/yolo/weights/activate` | ADMIN | 激活权重 | | POST | `/api/admin/yolo/weights/deactivate` | ADMIN | 取消激活 | | DELETE | `/api/admin/yolo/weights/{name}` | ADMIN | 逻辑删除 | | POST | `/api/admin/yolo/mode` | ADMIN | 设置模式 | | GET | `/api/admin/yolo/visualization` | ADMIN | 可视化数据 | | POST | `/api/admin/yolo/stats/reset` | ADMIN | 重置统计 | | GET | `/api/admin/yolo/capability` | ADMIN | 能力探测 | --- ### 3.2 AI 微服务 `http://127.0.0.1:8001` 无 JWT,建议仅内网访问。 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/health` | 健康检查 | | POST | `/imaging/analyze` | 影像 YOLO 分析 | | POST | `/report/imaging` | 生成影像报告 | | POST | `/report/decision` | EMR 辅助决策 | | POST | `/rag/query` | 知识库问答 | | POST | `/rag/ingest` | 追加知识文档 | | GET | `/rag/stats` | 知识片段数 | | GET | `/llm/config` | LLM 配置 | | POST | `/llm/config` | 更新 LLM 配置 | | GET | `/llm/status` | LLM 状态 | | GET | `/yolo/status` | YOLO 状态 | | GET | `/yolo/weights` | 权重列表 | | POST | `/yolo/weights/upload` | 上传权重 | | POST | `/yolo/weights/activate` | 激活权重 | | POST | `/yolo/weights/deactivate` | 取消激活 | | DELETE | `/yolo/weights/{name}` | 逻辑删除 | | POST | `/yolo/weights/restore` | 恢复权重 | | POST | `/yolo/mode` | 设置模式 | | GET | `/yolo/visualization` | 可视化 | | POST | `/yolo/stats/reset` | 重置统计 | | GET | `/yolo/capability` | 能力探测 | --- ## 4. 业务后端详解 > 以下仅列查询参数与请求体。响应外层均为 `{ code, message, data }`,`data` 结构见 [数据模型](#6-数据模型)。 ### 4.1 认证 `/api/auth` #### POST `/api/auth/login` | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | username | string | 是 | 用户名 | | password | string | 是 | 密码 | **data:** `{ token, user }` → [User](#user) #### POST `/api/auth/change-password` | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | oldPassword | string | 是 | 旧密码 | | newPassword | string | 是 | 新密码,6–64 位 | #### POST `/api/auth/avatar` | 表单字段 | 类型 | 必填 | |----------|------|------| | file | file | 是 | --- ### 4.2 患者 `/api/patients` #### GET `/api/patients` | 参数 | 类型 | 说明 | |------|------|------| | page | int | 页码 | | size | int | 每页条数 | | keyword | string | 姓名/电话关键字 | #### POST/PUT 请求体 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | name | string | 是 | 姓名 | | gender | string | 是 | MALE / FEMALE / OTHER | | age | int | 是 | 年龄 | | idCard | string | 否 | 身份证 | | phone | string | 否 | 电话 | | address | string | 否 | 地址 | | medicalHistory | string | 否 | 病史 | #### GET `/api/patients/{id}/profile` **data:** 患者 + 关联影像 / 病历 / 预约列表及计数。 --- ### 4.3 影像 `/api/imaging` #### GET `/api/imaging` | 参数 | 类型 | 说明 | |------|------|------| | page / size | int | 分页 | | keyword | string | 关键字 | | status | string | PENDING / ANALYZING / COMPLETED / ERROR | | studyType | string | X_RAY / CT / MRI / ULTRASOUND | #### POST/PUT 请求体 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | patientId | long | 是 | 患者 ID | | doctorId | long | 否 | 空则用当前用户 | | studyType | string | 是 | 检查类型 | | bodyPart | string | 是 | 部位 | | imageUrl | string | 是 | 先调 upload 得到 | #### POST `/api/imaging/upload` | 表单字段 | 类型 | 必填 | |----------|------|------| | file | file | 是 | **data:** 路径字符串,如 `/uploads/images/...` #### AI 诊断流程 ``` 1. POST /api/imaging/upload → imageUrl 2. POST /api/imaging → recordId 3. POST /api/ai-diagnosis/analyze/{id} 4. GET /api/ai-diagnosis/result/{id} (轮询至 COMPLETED / ERROR) ``` #### GET `/api/ai-diagnosis/result/{recordId}` 的 data | 字段 | 说明 | |------|------| | status | 影像状态 | | diagnosisText | 诊断结论 | | confidenceScore | 置信度 | | findings | 所见 | | recommendations | 建议 | | modelVersion | 模型版本 | | processingTimeMs | 耗时 | | detections | 检测框列表 | | annotatedImageUrl | 标注图 | | fullReport | 完整报告 | | engine | 引擎 | | fallback | 是否降级 | --- ### 4.4 电子病历 `/api/emrs` #### GET `/api/emrs` | 参数 | 说明 | |------|------| | page / size | 分页 | | keyword | 关键字 | #### POST/PUT 请求体 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | patientId | long | 是 | 患者 | | doctorId | long | 否 | 空则当前用户 | | visitDate | date | 是 | yyyy-MM-dd | | diagnosis | string | 是 | 诊断 | | chiefComplaint | string | 否 | 主诉 | | presentIllness | string | 否 | 现病史 | | physicalExamination | string | 否 | 体格检查 | | treatmentPlan | string | 否 | 治疗方案 | | medications | string | 否 | 用药 | | followUpNotes | string | 否 | 随访 | #### POST `/api/emrs` 的 data | 字段 | 说明 | |------|------| | emr | 病历对象 | | aiSupport | AI 决策 → [DecisionSupport](#decisionsupport) | --- ### 4.5 预约 `/api/appointments` #### GET `/api/appointments` | 参数 | 说明 | |------|------| | page / size | 分页 | | keyword | 关键字 | | status | 预约状态 | | date | yyyy-MM-dd | #### POST/PUT 请求体 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | patientId | long | 是 | 患者 | | doctorId | long | 否 | 医生 | | department | string | 是 | 科室 | | appointmentDate | date | 是 | 预约日期 | | appointmentTime | time | 否 | 预约时间 | | reason | string | 否 | 事由 | | notes | string | 否 | 备注 | | status | string | 否 | 默认 SCHEDULED | #### PATCH `/api/appointments/{id}/status` ```json { "status": "CONFIRMED" } ``` 状态流转:`SCHEDULED` → `CONFIRMED` → `COMPLETED`,或 `CANCELLED` / `NO_SHOW`。 --- ### 4.6 用户 `/api/users`(ADMIN) #### GET `/api/users` | 参数 | 说明 | |------|------| | page / size | 分页 | | keyword | 关键字 | | role | 角色筛选 | | enabled | true / false | #### POST/PUT 请求体 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | username | string | 是 | 用户名 | | password | string | 新建必填 | 更新可空 | | realName | string | 是 | 真实姓名 | | role | string | 是 | DOCTOR / RADIOLOGIST / ADMIN | | department | string | 否 | 科室 | | phone | string | 否 | 电话 | | email | string | 否 | 邮箱 | | enabled | boolean | 否 | 默认 true | #### PATCH `/api/users/{id}/enabled` ```json { "enabled": false } ``` --- ### 4.7 AI 对话 `/api/ai` #### POST `/api/ai/chat` | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | mode | string | 是 | `CHAT` 或 `RAG` | | question | string | 是 | 问题 | #### GET `/api/ai/chat/history` | 参数 | 默认 | 说明 | |------|------|------| | limit | 30 | 条数上限 | --- ### 4.8 AI 管理 `/api/admin` #### PUT `/api/admin/ai-settings` | 字段 | 类型 | 说明 | |------|------|------| | apiBaseUrl | string | OpenAI 兼容地址 | | apiKey | string | null 表示不改密钥 | | model | string | 模型名 | | enabled | boolean | 是否启用 | | temperature | double | 温度 | | systemPrompt | string | 系统提示词 | #### POST/PUT 知识库请求体 | 字段 | 类型 | 必填 | |------|------|------| | title | string | 是 | | content | string | 是 | | category | string | 否 | | enabled | boolean | 否 | #### PATCH 启用类接口(知识库 / 用户通用形态) ```json { "enabled": true } ``` #### YOLO 激活 / 模式 ```json { "name": "best.pt", "demo_mode": "auto" } ``` ```json { "demo_mode": "real" } ``` `demo_mode`:`demo` | `real` | `auto` --- ## 5. AI 微服务详解 响应**不**包 `{code, message, data}`,直接返回业务 JSON。 ### 5.1 GET `/health` | 字段 | 说明 | |------|------| | status | 固定 ok | | yolo_available | YOLO 是否可用 | | monai_available | MONAI 是否可用 | | langchain_available | LangChain 是否可用 | | llm_configured | 是否配置 LLM | | demo_mode | 当前模式 | | knowledge_docs | 知识片段数 | ### 5.2 POST `/imaging/analyze` `multipart/form-data` | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | file | file | 二选一 | 上传文件 | | image_path | string | 二选一 | 服务端路径 | | study_type | string | 否 | 默认 CT | | body_part | string | 否 | 部位 | | patient_summary | string | 否 | 摘要 | **响应字段:** detections、annotated_image_base64、preliminary_diagnosis、findings、recommendations、confidence、model_version、mode、full_report、disclaimer ### 5.3 POST `/report/decision` | 字段 | 类型 | 说明 | |------|------|------| | chief_complaint | string | 主诉 | | history | string | 病史 | | exam_findings | string | 检查 | | diagnosis | string | 诊断 | | medications | string | 用药 | | imaging_summary | string | 影像摘要 | | patient | object | `{ age, gender, name }` | ### 5.4 POST `/rag/query` | 字段 | 类型 | 默认 | 说明 | |------|------|------|------| | query | string | — | 问题 | | top_k | int | 4 | 返回条数 | | context | string | "" | 附加上下文 | > 实现为文档切分 + 内存关键词检索,**未使用向量数据库**。 ### 5.5 POST `/rag/ingest` | 字段 | 类型 | 必填 | |------|------|------| | title | string | 是 | | content | string | 是 | | category | string | 否,默认「自定义」 | ### 5.6 POST `/llm/config` 兼容 `api_base_url` / `apiBaseUrl`、`api_key` / `apiKey`。 | 字段 | 说明 | |------|------| | enabled | 是否启用 | | api_base_url | 接口地址 | | api_key | null 不改;"" 清空 | | model | 模型名 | | temperature | 温度 | --- ## 6. 数据模型 ### User | 字段 | 类型 | 说明 | |------|------|------| | id | long | ID | | username | string | 用户名 | | realName | string | 真实姓名 | | role | string | 角色 | | department | string | 科室 | | phone | string | 电话 | | email | string | 邮箱 | | avatar | string | 头像 URL | | enabled | boolean | 是否启用 | ### Patient | 字段 | 类型 | 说明 | |------|------|------| | id | long | ID | | name | string | 姓名 | | gender | string | 性别 | | age | int | 年龄 | | idCard | string | 身份证 | | phone | string | 电话 | | address | string | 地址 | | medicalHistory | string | 病史 | | createdAt | datetime | 创建时间 | ### ImagingRecord | 字段 | 类型 | 说明 | |------|------|------| | id | long | ID | | patientId | long | 患者 | | patientName | string | 患者姓名 | | doctorId | long | 医生 | | doctorRealName | string | 医生姓名 | | studyType | string | 检查类型 | | bodyPart | string | 部位 | | imageUrl | string | 影像路径 | | status | string | 状态 | | aiDiagnosis | string | AI 诊断 | | aiConfidence | double | 置信度 | | createdAt | datetime | 创建时间 | ### Emr | 字段 | 类型 | 说明 | |------|------|------| | id | long | ID | | patientId / patientName | — | 患者 | | doctorId / doctorRealName | — | 医生 | | visitDate | date | 就诊日 | | chiefComplaint | string | 主诉 | | presentIllness | string | 现病史 | | physicalExamination | string | 体格检查 | | diagnosis | string | 诊断 | | treatmentPlan | string | 治疗 | | medications | string | 用药 | | followUpNotes | string | 随访 | | aiSuggestions | string | AI 建议文本 | | createdAt | datetime | 创建时间 | ### Appointment | 字段 | 类型 | 说明 | |------|------|------| | id | long | ID | | patientId / patientName / patientPhone | — | 患者 | | doctorId / doctorName | — | 医生 | | department | string | 科室 | | appointmentDate | date | 日期 | | appointmentTime | time | 时间 | | reason / notes | string | 事由 / 备注 | | status | string | 状态 | | createdAt | datetime | 创建时间 | ### DecisionSupport | 字段 | 说明 | |------|------| | suggestions | 治疗建议 | | medicationSuggestions | 用药建议 | | riskAssessments | 风险评估 | | nursingAdvice | 护理建议 | | followUpPlan | 随访计划 | | conflicts | 冲突提示 | | sources | RAG 来源 | | fullText | 全文 | | engine | 引擎标识 | | fallback | 是否降级 | | disclaimer | 免责声明 | ### AiChatResponse | 字段 | 说明 | |------|------| | mode | CHAT / RAG | | question | 问题 | | answer | 回答 | | usedLlm | 是否调用大模型 | | fallback | 是否降级 | | sources | 引用来源列表 | ### Detection(AI 检测框) | 字段 | 说明 | |------|------| | label | 标签 | | label_zh | 中文标签 | | confidence | 置信度 | | bbox | `[x1, y1, x2, y2]` | --- ## 7. 枚举与错误码 ### 枚举 | 名称 | 取值 | |------|------| | 角色 | ADMIN, DOCTOR, RADIOLOGIST | | 性别 | MALE, FEMALE, OTHER | | 检查类型 | X_RAY, CT, MRI, ULTRASOUND | | 影像状态 | PENDING, ANALYZING, COMPLETED, ERROR | | 预约状态 | SCHEDULED, CONFIRMED, COMPLETED, CANCELLED, NO_SHOW | | 对话模式 | CHAT, RAG | | YOLO 模式 | demo, real, auto | ### 业务后端 code | code | 含义 | |------|------| | 0 | 成功 | | 400 | 参数错误 | | 401 | 未登录 / token 过期 | | 403 | 无权限 | | 404 | 不存在 | | 409 | 冲突 | | 1000 | 业务异常 | | 500 | 服务器错误 | ### 降级说明 | 场景 | 行为 | |------|------| | AI 服务离线 | 影像诊断、病历决策走本地规则,`fallback=true` | | 未配置 LLM Key | 返回检索摘要或模板文本 | | YOLO 不可用 | 进入 demo 模式 | --- ## 附录:curl 示例 ```bash # 登录 curl -X POST http://localhost:8080/api/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"doctor1","password":"pass123"}' # 带 Token 请求 curl http://localhost:8080/api/patients?page=0&size=10 \ -H "Authorization: Bearer " # AI 健康检查 curl http://127.0.0.1:8001/health ``` --- *输出仅供教学实训,不能替代执业医师诊断。* )