Files
mokeegateway/memory/session-20260628-1.md
2026-07-15 16:13:27 +08:00

3.8 KiB
Raw Blame History

name, description, metadata
name description metadata
session-20260628-1 2026-06-28 第1次会话 — 登录后头像下载接口重复调用三轮排查修复
type date sessionNumber startTime endTime
session 2026-06-28 1 2026-06-28T05:00:00+08:00 2026-06-28T05:30:00+08:00

2026-06-28 会话

会话摘要

用户反馈登录成功后 /open/tokenhttps://file.wg.zgitm.com/api/download 接口被重复调用。经过三轮排查,发现根因是 login() + fetchUserInfo()SystemSelectView/AdminLayout重复刷新头像 Token。最终方案login() 刷新头像(确保 <el-avatar> 加载时 URL 已有 TokenfetchUserInfo() 增加去重逻辑(同一文件复用已有 URL共 3 次部署到生产环境。

关键操作

一、第一轮修复 — 删除 login() 中的头像刷新

  • 做了什么: 删除 auth.ts login() 中的 refreshFileServiceUrl() 调用
  • 原因: login() 和 fetchUserInfo() 各刷新一次,导致 2 次 /open/token + 2 次 download
  • 结果: 引入新问题——login() 不刷新后,<el-avatar> 先用无 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() 最终版 — 保留头像刷新:

// 立即刷新头像 Token — 否则跳转后 <el-avatar> 先用无 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() 最终版 — 增加去重:

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-webnginx: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 不删除旧文件),长期需增加清理步骤