From 7dc54278ed4374569df43f693076cc128d65a7e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=8E=E4=BD=97?= Date: Sat, 13 Jun 2026 01:24:08 +0800 Subject: [PATCH] =?UTF-8?q?docs(bug):=20=E8=AF=B8=E8=91=9B=E4=BA=AE?= =?UTF-8?q?=E5=88=86=E6=9E=90=E6=8A=A5=E5=91=8A=20Bug=20#724?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MD/bugs/BUG_724_ANALYSIS.md | 178 ++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 MD/bugs/BUG_724_ANALYSIS.md diff --git a/MD/bugs/BUG_724_ANALYSIS.md b/MD/bugs/BUG_724_ANALYSIS.md new file mode 100644 index 000000000..16bc48b80 --- /dev/null +++ b/MD/bugs/BUG_724_ANALYSIS.md @@ -0,0 +1,178 @@ +# Bug #724 诸葛亮分析报告 + +> **文档类型**: Bug分析 +> **分析时间**: 2026-06-13 01:24:08 +> **分析模型**: mimo-v2.5 (LLM深度分析) + +--- + +## 基本信息 +- **Bug #**: 724 +- **标题**: 【合理用药】模块下的功能卡片打开都会出现报错 +- **模块**: 手术麻醉管理 +- **提出人**: 王栩坤 + +--- + +Now I have a clear picture. Let me trace the full request flow and output my analysis. + +--- + +## 一、Bug 理解 + +### 禅道原文引用 + +**Bug 标题**: 【合理用药】模块下的功能卡片打开都会出现报错 + +**重现步骤**: 登录内科医生1的账号 doctor1 / 123456 → 打开合理用药 → 点击合理用药下面的模块 + +**期望结果**: 不会出现报错,能够正常进入该模块下的页面 + +### 附图关键信息 + +截图中红色错误横幅: +``` +No static resource healthlink-his/api/v1/antibiotic/statistics for request '/healthlink-his/healthlink-his/api/v1/antibiotic/statistics'. +``` + +左侧导航栏"合理用药"展开,包含四个子模块:抗菌药物规则、药物相互作用、审核日志、合理用药统计。四个统计卡片全部为 0,表格显示"暂无数据"。所有模块页面都会出现相同报错。 + +### 综合总结 + +用户登录医生账号后,打开"合理用药"模块下的所有子页面(抗菌药物规则、药物相互作用、审核日志、合理用药统计),页面顶部均出现红色错误提示。错误信息显示请求路径中 `/healthlink-his` 出现了两次,导致 Spring Boot 无法匹配到任何 Controller 端点,所有合理用药相关 API 请求全部失败。 + +--- + +## 二、根因分析 + +### 错误路径解剖 + +``` +浏览器请求: /healthlink-his/healthlink-his/api/v1/antibiotic/statistics + ↑ 第一次 ↑ Spring Boot context-path +``` + +Spring Boot 收到请求后: +1. 去除 context-path `/healthlink-his` → 剩余路径:`/healthlink-his/api/v1/antibiotic/statistics` +2. 匹配 Controller:`AntibioticController` 的 `@RequestMapping("/api/v1/antibiotic")` → **无法匹配**(路径多了一层 `/healthlink-his`) +3. Spring Boot 退化为静态资源查找 → 找不到 → 返回 404 错误 + +### 请求链路追踪 + +``` +前端 API 调用: + request.js → baseURL = import.meta.env.VITE_APP_BASE_API + api/antibiotic/index.js → url = '/api/v1/antibiotic/statistics' + 最终 URL = ${VITE_APP_BASE_API}/api/v1/antibiotic/statistics + +错误路径 = /healthlink-his/healthlink-his/api/v1/antibiotic/statistics +``` + +**反推得出**:`VITE_APP_BASE_API` 在实际部署环境中被设置为 `/healthlink-his`(或类似的包含 context-path 的值),而非代码仓库中定义的 `/prd-api` 或 `/dev-api`。 + +### 根因结论 + +**上下文路径 `/healthlink-his` 被重复叠加了两次。** 可能的触发场景: + +| 层 | 配置 | 效果 | +|---|---|---| +| `VITE_APP_BASE_API`(实际部署值) | `/healthlink-his`(异常值,代码仓库中为 `/prd-api`) | 前端发送 `/healthlink-his/api/v1/...` | +| Nginx 代理 | `location /healthlink-his/ { proxy_pass http://backend/healthlink-his/; }` | 转发后路径变为 `/healthlink-his/api/v1/...` | +| Spring Boot context-path | `context-path: /healthlink-his` | 去除一次后剩余 `/healthlink-his/api/v1/...` → 无法匹配 | + +**核心矛盾**:前端 API 路径 `/api/v1/...` 是正确的相对路径,但 `VITE_APP_BASE_API` 环境变量在部署时被设置为了 `/healthlink-his`,与 Spring Boot 的 `context-path` 冲突,导致路径叠加。 + +### 涉及文件 + +| 文件 | 作用 | 是否需要修改 | +|---|---|---| +| `healthlink-his-ui/src/utils/request.js:56` | `baseURL: import.meta.env.VITE_APP_BASE_API` | ✅ 需确认部署时的值 | +| `healthlink-his-ui/src/api/antibiotic/index.js` | 抗菌药物 API 定义(`/api/v1/antibiotic/...`) | ❌ 路径正确 | +| `healthlink-his-ui/src/api/rationaldrug.js` | 合理用药 API 定义(`/api/v1/rational-drug/...`) | ❌ 路径正确 | +| `healthlink-his-server/.../application.yml:20` | `context-path: /healthlink-his` | ❌ 后端正确 | +| `deploy/nginx-healthlink-his.conf` | Nginx 代理配置 | ✅ 需确认实际部署版本 | + +--- + +## 三、修复方案 + +### 方案 1:修复部署环境的 `VITE_APP_BASE_API`(推荐,最小改动) + +**问题本质**:部署环境使用了错误的 `VITE_APP_BASE_API` 值。 + +**修复**:确保部署时使用正确的环境文件: + +```bash +# 生产环境部署命令 +cd healthlink-his-ui +npm run build -- --mode prod +``` + +确保 `.env.prod` 中的值为: +``` +VITE_APP_BASE_API = '/prd-api' +``` + +对应的 Nginx 配置(`deploy/nginx-healthlink-his.conf`): +```nginx +location /prd-api/ { + proxy_pass http://127.0.0.1:18082/healthlink-his/; + ... +} +``` + +### 方案 2:如果部署环境必须使用 `/healthlink-his` 作为前端路径 + +如果实际部署环境中前端通过 `http://server/healthlink-his/` 访问,Nginx 也需要相应调整: + +```nginx +# 方案 A:Nginx 不在 proxy_pass 中添加 context-path(让 Spring Boot 处理) +location /healthlink-his/api/ { + proxy_pass http://127.0.0.1:18082; # 注意:无尾部路径 + ... +} + +# 方案 B:前端 API 路径不包含 context-path +# VITE_APP_BASE_API = ''(空字符串),前端请求 /api/v1/... +location /api/ { + proxy_pass http://127.0.0.1:18082/healthlink-his; + ... +} +``` + +### 方案 3:代码层面的防御性修复(可选) + +在 `request.js` 中添加 URL 校验,防止 context-path 重复: + +```javascript +// request.js 中 axios 实例创建后 +service.interceptors.request.use(config => { + // 防止 baseURL 包含后端 context-path 导致重复 + if (config.baseURL && config.baseURL.includes('/healthlink-his')) { + console.warn('[WARN] VITE_APP_BASE_API 包含 /healthlink-his,可能导致路径重复!') + } + // ...existing code +}) +``` + +--- + +## 四、路由决策 + +**FIXER: guanyu(后端)+ zhaoyun(前端)联合排查,优先 zhaoyun** + +**REASON**: 本 Bug 的根因是**部署配置问题**而非代码缺陷。需要: +1. **zhaoyun** 确认实际部署环境的 `VITE_APP_BASE_API` 值,检查前端 `.env` 文件和构建命令是否正确 +2. **guanyu** 确认后端 Spring Boot `context-path` 与 Nginx 代理规则的匹配关系 +3. 修复的核心是**对齐前端 baseURL 与 Nginx 代理规则**,确保 `/healthlink-his` 不被叠加两次 + +**优先级**:zhaoyun 先检查 `.env.prod` 和实际构建配置 → guanyu 验证 Nginx 配置 → 联合确认修复 + +--- + +## 路由决策 +- **FIXER_ID**: guanyu +- **修复 Agent**: guanyu(后端) +- **原因**: LLM 分析决策 + +> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。