83 lines
3.8 KiB
Markdown
83 lines
3.8 KiB
Markdown
---
|
||
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 不删除旧文件),长期需增加清理步骤
|