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

83 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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()` 刷新头像(确保 `<el-avatar>` 加载时 URL 已有 Token`fetchUserInfo()` 增加去重逻辑(同一文件复用已有 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() 最终版** — 保留头像刷新:
```typescript
// 立即刷新头像 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() 最终版** — 增加去重:
```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 不删除旧文件),长期需增加清理步骤