From 106f352017a69a74306e7159d31c5c0e18c4a37f Mon Sep 17 00:00:00 2001 From: sanyekana Date: Sat, 31 Jan 2026 11:31:02 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Fixed=20a=20bug=20where=20the=20front=20?= =?UTF-8?q?end=20still=20displayed=20a=20success=20messag=E2=80=A6=20(#476?= =?UTF-8?q?8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: Fixed a bug where the front end still displayed a success message when Skills upload failed. * refactor(dashboard): unify API response handling in SkillsSection --- .../components/extension/SkillsSection.vue | 57 +++++++++++++++---- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/dashboard/src/components/extension/SkillsSection.vue b/dashboard/src/components/extension/SkillsSection.vue index 185801388..410441a86 100644 --- a/dashboard/src/components/extension/SkillsSection.vue +++ b/dashboard/src/components/extension/SkillsSection.vue @@ -118,6 +118,16 @@ export default { } }; + const handleApiResponse = (res, successMessage, failureMessageDefault, onSuccess) => { + if (res && res.data && res.data.status === "ok") { + showMessage(successMessage, "success"); + if (onSuccess) onSuccess(); + } else { + const msg = (res && res.data && res.data.message) || failureMessageDefault; + showMessage(msg, "error"); + } + }; + const uploadSkill = async () => { if (!uploadFile.value) return; uploading.value = true; @@ -131,13 +141,19 @@ export default { return; } formData.append("file", file); - await axios.post("/api/skills/upload", formData, { + const res = await axios.post("/api/skills/upload", formData, { headers: { "Content-Type": "multipart/form-data" }, }); - showMessage(tm("skills.uploadSuccess"), "success"); - uploadDialog.value = false; - uploadFile.value = null; - await fetchSkills(); + handleApiResponse( + res, + tm("skills.uploadSuccess"), + tm("skills.uploadFailed"), + async () => { + uploadDialog.value = false; + uploadFile.value = null; + await fetchSkills(); + } + ); } catch (err) { showMessage(tm("skills.uploadFailed"), "error"); } finally { @@ -149,9 +165,18 @@ export default { const nextActive = !skill.active; itemLoading[skill.name] = true; try { - await axios.post("/api/skills/update", { name: skill.name, active: nextActive }); - skill.active = nextActive; - showMessage(tm("skills.updateSuccess"), "success"); + const res = await axios.post("/api/skills/update", { + name: skill.name, + active: nextActive, + }); + handleApiResponse( + res, + tm("skills.updateSuccess"), + tm("skills.updateFailed"), + () => { + skill.active = nextActive; + } + ); } catch (err) { showMessage(tm("skills.updateFailed"), "error"); } finally { @@ -168,10 +193,18 @@ export default { if (!skillToDelete.value) return; deleting.value = true; try { - await axios.post("/api/skills/delete", { name: skillToDelete.value.name }); - showMessage(tm("skills.deleteSuccess"), "success"); - deleteDialog.value = false; - await fetchSkills(); + const res = await axios.post("/api/skills/delete", { + name: skillToDelete.value.name, + }); + handleApiResponse( + res, + tm("skills.deleteSuccess"), + tm("skills.deleteFailed"), + async () => { + deleteDialog.value = false; + await fetchSkills(); + } + ); } catch (err) { showMessage(tm("skills.deleteFailed"), "error"); } finally {