--- name: session-20260628-1 description: 2026-06-28 第1次会话 — 登录后头像下载接口重复调用三轮排查修复 metadata: type: session date: 2026-06-28 sessionNumber: 1 startTime: 2026-06-28T05:00:00+08:00 endTime: 2026-06-28T05:30:00+08:00 --- # 2026-06-28 会话 ## 会话摘要 用户反馈登录成功后 `/open/token` 和 `https://file.wg.zgitm.com/api/download` 接口被重复调用。经过三轮排查,发现根因是 `login()` + `fetchUserInfo()`(SystemSelectView/AdminLayout)重复刷新头像 Token。最终方案:`login()` 刷新头像(确保 `` 加载时 URL 已有 Token),`fetchUserInfo()` 增加去重逻辑(同一文件复用已有 URL),共 3 次部署到生产环境。 ## 关键操作 ### 一、第一轮修复 — 删除 login() 中的头像刷新 - **做了什么**: 删除 `auth.ts` login() 中的 `refreshFileServiceUrl()` 调用 - **原因**: login() 和 fetchUserInfo() 各刷新一次,导致 2 次 /open/token + 2 次 download - **结果**: ❌ 引入新问题——login() 不刷新后,`` 先用无 Token 的 URL 发起失败请求,fetchUserInfo() 再发一次成功请求 ### 二、第二轮修复 — fetchUserInfo() 增加去重 + 恢复 login() 刷新 - **做了什么**: 1. `fetchUserInfo()` 中比较当前 store 中的 avatar(去 Token)和新获取的 avatar(去 Token),相同文件则复用已有 URL 2. 恢复 `login()` 中的头像刷新 - **原因**: 用户发现 admin 登录后 download 接口仍被调用 2 次:SystemSelectView 一次 → AdminLayout 又一次 - **结果**: ✅ 达到 1 次 /open/token + 1 次 download ### 三、最终代码改动 **文件**: `mokee-gateway-web/src/stores/auth.ts` **login() 最终版** — 保留头像刷新: ```typescript // 立即刷新头像 Token — 否则跳转后 先用无 Token 的 URL // 发起一次失败请求,等 fetchUserInfo() 拿到 Token 后又发起第二次 // fetchUserInfo() 中有去重逻辑,不会重复刷新同一文件 let userInfoData = data.userInfo if (userInfoData?.avatar && isFileServiceUrl(userInfoData.avatar)) { userInfoData = { ...userInfoData, avatar: await refreshFileServiceUrl(userInfoData.avatar) } } userInfo.value = userInfoData ``` **fetchUserInfo() 最终版** — 增加去重: ```typescript const prevBase = stripToken(userInfo.value?.avatar || '') const newBase = stripToken(data?.avatar || '') if (data?.avatar && isFileServiceUrl(data.avatar) && prevBase !== newBase) { data = { ...data, avatar: await refreshFileServiceUrl(data.avatar) } } else if (data?.avatar && isFileServiceUrl(data.avatar) && prevBase === newBase) { // 同一文件,复用已有的带 Token 的 URL data = { ...data, avatar: userInfo.value?.avatar || data.avatar } } ``` ## 部署记录 - **服务器**: 10.1.1.170(内网) - **前端容器**: `mokeegateway-web-mokee-gateway-web`(nginx:stable-alpine,端口 80→5001) - **部署方式**: `npm run build:prod` → SFTP 上传 dist → `docker cp` 替换容器内 `/usr/share/nginx/html/` → `docker exec nginx -s reload` - **共部署 3 次**,最终版本已验证 HTTP 200 ## 重要信息 - 生产 Docker 容器列表(10.1.1.170): - `mokeegateway-web-mokee-gateway-web` — 前端 - `mokeegateway-mokee-gateway-gateway` — 网关 - `mokeegateway-mokee-gateway-auth` — 认证 - `mokeegateway-mokee-gateway-admin` — 管理 - 文件服务域名: `file.wg.zgitm.com`,下载 Token 一次性消费 - 头像存储在文件服务中,DB 只存基础路径,每次加载页面需获取 Token 并拼接完整 URL ## 待处理 - [ ] 生产环境验证:用 admin 用户登录,确认只调用 1 次 /open/token 和 1 次 download - [ ] 容器内旧 JS chunk 文件会累积(docker cp 不删除旧文件),长期需增加清理步骤