From f77330ad273a056a75882795e604da30a4f31157 Mon Sep 17 00:00:00 2001 From: qubiaobiao <3294694717@qq.com> Date: Wed, 30 Sep 2026 10:27:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(frontend):=20=E9=87=8D=E7=BD=AE=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=95=B0=E6=8D=AE=E6=96=87=E6=A1=88=E5=AF=B9=E9=BD=90?= =?UTF-8?q?=E5=90=8E=E7=AB=AF=E5=A5=91=E7=BA=A6=EF=BC=88=E6=9C=AA=E6=BF=80?= =?UTF-8?q?=E6=B4=BB+=E9=9C=80=E7=9F=AD=E4=BF=A1=E6=BF=80=E6=B4=BB?= =?UTF-8?q?=EF=BC=89=E5=B9=B6=E9=80=8F=E4=BC=A0=E5=90=8E=E7=AB=AF=20messag?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Admin.vue 确认弹窗:「已激活 + 默认口令」→「未激活 + 默认口令」 (后端 service/admin.js:1619 实际置 activated:false) - Admin.vue 提示行:「重置后可直接用默认口令登录重测」→「需先用默认口令完成短信激活才能登录重测」 - Admin.vue 成功提示: 改为透传后端 message(后端 :1730 已含正确指引),不再自拼后丢弃 - api/request.js: 新增可选开关 returnMessage(不传时默认行为完全不变) - api/admin.js: resetTestData 启用该开关,后端成为唯一真相源 依据: service/admin.js:1619/:1730 + scripts/verify_testdata_mgmt.py:5-9「Req2 重置须重置账号激活状态」 --- src/api/admin.js | 9 +++++++-- src/api/request.js | 7 +++++++ src/views/Admin.vue | 16 ++++++++++++---- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/api/admin.js b/src/api/admin.js index 5014b00..a15efa1 100644 --- a/src/api/admin.js +++ b/src/api/admin.js @@ -341,10 +341,15 @@ export function toggleTestFlag(id, testFlag) { /** * 重置测试数据(仅重置 test_flag=1 的选手及其提交记录) - * @returns {Promise} + * + * returnMessage: true —— 保留后端 message(不再被响应拦截器丢弃)。 + * 后端提示含「已恢复为『未激活 + 默认口令 X』,需先用默认口令完成短信激活即可登录重测」 + * 这一关键指引;前端自拼文案曾写成「可直接用默认口令登录重测」, + * 与后端 activated:false 自相矛盾(用户反馈 Req2)。以后端文案为唯一真相源。 + * @returns {Promise<{code:number,message:string,data:object}>} */ export function resetTestData() { - return request.post('/admin/reset-test-data') + return request.post('/admin/reset-test-data', null, { returnMessage: true }) } // ==================== 综合大题管理(中职/高职) ==================== diff --git a/src/api/request.js b/src/api/request.js index edb4fd9..b6e4b52 100644 --- a/src/api/request.js +++ b/src/api/request.js @@ -168,6 +168,13 @@ request.interceptors.response.use( return Promise.reject(new Error(res.message || '请求失败')) } // 正常返回,只暴露 data 部分 + // 例外:调用方显式传 config.returnMessage = true 时返回**整个业务体**(含 message)。 + // 用途:需要原样透传后端提示文案的场景(如「重置测试数据」的结果指引含 + // 「需先用默认口令完成短信激活」等关键信息,前端自拼文案会与后端契约漂移)。 + // ⛔ 默认行为完全不变(不传该开关时仍只返回 data)。 + if (response.config && response.config.returnMessage) { + return res + } return res.data !== undefined ? res.data : res } diff --git a/src/views/Admin.vue b/src/views/Admin.vue index c0094de..30013e9 100644 --- a/src/views/Admin.vue +++ b/src/views/Admin.vue @@ -104,7 +104,7 @@
- 仅重置标记为"测试"的选手数据,生产数据不受影响。重置后可直接用默认口令「{{ testDefaultPasswordHint }}」登录重测 + 仅重置标记为"测试"的选手数据,生产数据不受影响。⚠️ 重置后账号回到「未激活」,需先用默认口令「{{ testDefaultPasswordHint }}」完成短信激活才能登录重测
@@ -1687,11 +1687,19 @@ async function handleToggleTestFlag(row, val) { async function handleResetTestData() { resetLoading.value = true try { - const data = await adminApi.resetTestData() + // returnMessage 模式:拿到完整业务体,以便透传后端 message。 + // 后端提示含「已恢复为『未激活 + 默认口令 X』,需先用默认口令完成短信激活即可登录重测」 + // —— 这才是唯一真相源;此前前端自拼成「可直接用默认口令登录重测」, + // 与后端 activated:false 自相矛盾(用户反馈 Req2),已弃用自拼文案。 + const res = await adminApi.resetTestData() + const data = (res && res.data) || res || {} if (data.testContestantsFound === 0) { ElMessage.warning('没有找到测试数据,请先在选手管理中将选手标记为"测试"') } else { - ElMessage.success(`测试数据已重置:${data.contestantsReset} 名选手,${data.examSubmissionsDeleted + data.workSubmissionsDeleted} 条提交记录`) + ElMessage.success((res && res.message) + || `测试数据已重置:${data.contestantsReset} 名选手,` + + `${(data.examSubmissionsDeleted || 0) + (data.workSubmissionsDeleted || 0)} 条提交记录。` + + '账号已回到「未激活」,需先用默认口令完成短信激活才能登录重测') } // 刷新统计数据 await fetchStats()