From 39dfc645ffc1e574a0dd67d94a4e6e7daccd20aa Mon Sep 17 00:00:00 2001 From: chenxing Date: Tue, 29 Sep 2026 10:53:03 +0800 Subject: [PATCH] =?UTF-8?q?[CMS-REWORK]=20#2=20Tab=E5=81=87=E8=84=8F:=20se?= =?UTF-8?q?eding=E7=AA=97=E5=8F=A3=E8=A6=86=E7=9B=96=E5=BC=82=E6=AD=A5flus?= =?UTF-8?q?h=E7=9A=84watcher=20+=20=E5=AD=90=E7=BB=84=E4=BB=B6emitUp=20no-?= =?UTF-8?q?op=E5=AE=88=E5=8D=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/siteSetting.spec.ts | 30 +++++++++++++++++++ src/views/cms/SiteSetting.vue | 11 +++++-- src/views/cms/components/SiteConfigForm.vue | 11 +++++-- src/views/cms/homeLayout/HomeLayoutEditor.vue | 11 +++++-- 4 files changed, 56 insertions(+), 7 deletions(-) diff --git a/src/__tests__/siteSetting.spec.ts b/src/__tests__/siteSetting.spec.ts index 6f90209..4fec090 100644 --- a/src/__tests__/siteSetting.spec.ts +++ b/src/__tests__/siteSetting.spec.ts @@ -297,3 +297,33 @@ describe("SiteSetting 编辑模式(site/setting/:id,docs/20 F1 7 Tab)", () expect(config.home_layout).toBeTruthy(); // 其他 Tab 键不受影响 }); }); + +describe("SiteSetting 假脏防护(docs/20 返工 #2)", () => { + it("冷加载不标脏:7 个 Tab 标题均无 ●(种值触发的 watcher 落在 seeding 窗口内)", async () => { + routeMock.params = { id: "1" }; + const el = mountPage(); + await flush(); + + const labels = Array.from(el.querySelectorAll(".ivu-tabs-tab")).map(t => t.textContent!.trim()); + expect(labels.length).toBe(7); + labels.forEach(t => expect(t.includes("●")).toBe(false)); + }); + + it("真实编辑才标脏:改站点名称 → 基本信息 ●;保存成功后 ● 消失", async () => { + routeMock.params = { id: "1" }; + const el = mountPage(); + await flush(); + const labels = () => Array.from(el.querySelectorAll(".ivu-tabs-tab")).map(t => t.textContent!.trim()); + + const nameInput = el.querySelector('input[placeholder="如 XX学校门户网站"]')!; + setInputValue(nameInput, "改名后的门户"); + await flush(); + expect(labels().find(t => t.includes("基本信息"))!.includes("●")).toBe(true); + + const saveBtn = [...el.querySelectorAll("button")].find(b => b.textContent?.includes("保存基本信息"))!; + saveBtn.dispatchEvent(new MouseEvent("click", { bubbles: true })); + await flush(); + expect(mocks.siteSave).toHaveBeenCalledTimes(1); + expect(labels().find(t => t.includes("基本信息"))!.includes("●")).toBe(false); + }); +}); diff --git a/src/views/cms/SiteSetting.vue b/src/views/cms/SiteSetting.vue index 5a10bea..227236f 100644 --- a/src/views/cms/SiteSetting.vue +++ b/src/views/cms/SiteSetting.vue @@ -1,5 +1,5 @@