diff --git a/src/api/request.js b/src/api/request.js index b6e4b52..d7237d2 100644 --- a/src/api/request.js +++ b/src/api/request.js @@ -148,6 +148,21 @@ export function initProactiveTokenRefresh() { } } +// ==================== 错误提示口径(R64/R65 收敛 · 全站唯一权威) ==================== +// 🔴 本拦截器已覆盖**全部**失败路径,且每种失败**只弹一次**: +// 业务码 ≠0/≠200 → `res.message`;403/404/500 → 固定文案;其它 HTTP 码 → +// `data.message`;超时(ECONNABORTED);无 response 的网络层错误。 +// ⇒ **调用方 catch 内不要再 `ElMessage.error(...)`**,否则用户同时看到两条 = 同族双弹。 +// ⇒ 已按此口径收敛:Admin.vue、Login.vue、Activate.vue、ForgotPassword.vue、 +// Competition.vue、Dashboard.vue。 +// 例外(**必须**由调用方负责提示,出现时须显式注明原因): +// ① 请求带 `silent: true` ⇒ 拦截器不说话,调用方是唯一提示方 +// (登录 / 交卷 / 逐题保存 / 大题加载与保存 / 两个 Excel 导入 / resetTestData); +// ② 客户端校验失败(**根本没发请求**); +// ③ 非 axios 路径:`utils/download.js`(独立实例、不挂本拦截器)、原生 `fetch`、 +// el-upload 的 on-success 手工判响应; +// ④ 401 由 `forceLogout()` 提示,**不受 `silent` 影响**(token 真失效必须让用户看到)。 + // ==================== 响应拦截器 ==================== request.interceptors.response.use( diff --git a/src/views/Activate.vue b/src/views/Activate.vue index 283c9a0..0fff4b8 100644 --- a/src/views/Activate.vue +++ b/src/views/Activate.vue @@ -199,6 +199,10 @@