From b322c930fa9cf3db2110fee3d187d4065bedafea Mon Sep 17 00:00:00 2001 From: duanshuwen Date: Thu, 27 Aug 2026 09:31:49 +0800 Subject: [PATCH] =?UTF-8?q?refactor(admin-ui):=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=8A=BD=E5=B1=89=E7=BC=96=E8=BE=91=E5=99=A8?= =?UTF-8?q?=E5=B8=83=E5=B1=80=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=BA=9F=E5=BC=83?= =?UTF-8?q?API=E7=94=A8=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为所有抽屉式编辑器组件添加统一的样式规范,实现内容区域可滚动、操作栏固定于底部的布局,适配移动端安全区域间距。替换布局设置抽屉中el-radio-button的废弃label属性为value属性以消除组件警告。重构首页配置页面的编辑器关闭逻辑,拆分状态重置与关闭操作优化代码复用。新增单元测试用例验证抽屉编辑器的布局一致性。 --- .../concierge/ConciergeAdvisorEditor.vue | 18 +++-- .../src/components/home/HomeContentEditor.vue | 44 +++++----- .../src/components/layout/SettingsDrawer.vue | 11 +-- .../site-config/SiteConfigEditor.vue | 80 ++++++++++--------- .../components/wanfa/WanfaCategoryEditor.vue | 22 ++--- .../src/components/wanfa/WanfaRouteEditor.vue | 34 ++++---- .../src/pages/ConciergePage.vue | 2 +- WonderQ-Admin-UI-Vue/src/pages/HomePage.vue | 20 +++-- WonderQ-Admin-UI-Vue/src/pages/WanfaPage.vue | 4 +- .../src/pages/drawer-editors.test.ts | 52 ++++++++++++ WonderQ-Admin-UI-Vue/src/styles.css | 8 +- 11 files changed, 186 insertions(+), 109 deletions(-) create mode 100644 WonderQ-Admin-UI-Vue/src/pages/drawer-editors.test.ts diff --git a/WonderQ-Admin-UI-Vue/src/components/concierge/ConciergeAdvisorEditor.vue b/WonderQ-Admin-UI-Vue/src/components/concierge/ConciergeAdvisorEditor.vue index 48f109a..63108a1 100644 --- a/WonderQ-Admin-UI-Vue/src/components/concierge/ConciergeAdvisorEditor.vue +++ b/WonderQ-Admin-UI-Vue/src/components/concierge/ConciergeAdvisorEditor.vue @@ -37,14 +37,16 @@ function toDraft(advisor?: ConciergeAdvisor): ConciergeAdvisorCreate { diff --git a/WonderQ-Admin-UI-Vue/src/components/home/HomeContentEditor.vue b/WonderQ-Admin-UI-Vue/src/components/home/HomeContentEditor.vue index ed53de7..9158419 100644 --- a/WonderQ-Admin-UI-Vue/src/components/home/HomeContentEditor.vue +++ b/WonderQ-Admin-UI-Vue/src/components/home/HomeContentEditor.vue @@ -45,31 +45,33 @@ function updateLines(field: "detailParagraphs", value: string) { diff --git a/WonderQ-Admin-UI-Vue/src/components/layout/SettingsDrawer.vue b/WonderQ-Admin-UI-Vue/src/components/layout/SettingsDrawer.vue index 141c35d..21bf790 100644 --- a/WonderQ-Admin-UI-Vue/src/components/layout/SettingsDrawer.vue +++ b/WonderQ-Admin-UI-Vue/src/components/layout/SettingsDrawer.vue @@ -18,6 +18,7 @@ function reset() { diff --git a/WonderQ-Admin-UI-Vue/src/pages/drawer-editors.test.ts b/WonderQ-Admin-UI-Vue/src/pages/drawer-editors.test.ts new file mode 100644 index 0000000..edc8ec3 --- /dev/null +++ b/WonderQ-Admin-UI-Vue/src/pages/drawer-editors.test.ts @@ -0,0 +1,52 @@ +import { readFileSync } from "node:fs"; +import { describe, expect, it } from "vitest"; + +const readSource = (path: string) => readFileSync(new URL(path, import.meta.url), "utf8"); + +const homePage = readSource("./HomePage.vue"); +const wanfaPage = readSource("./WanfaPage.vue"); +const conciergePage = readSource("./ConciergePage.vue"); +const settingsDrawer = readSource("../components/layout/SettingsDrawer.vue"); +const styles = readSource("../styles.css"); + +const editorSources = [ + readSource("../components/site-config/SiteConfigEditor.vue"), + readSource("../components/home/HomeContentEditor.vue"), + readSource("../components/wanfa/WanfaCategoryEditor.vue"), + readSource("../components/wanfa/WanfaRouteEditor.vue"), + readSource("../components/concierge/ConciergeAdvisorEditor.vue"), +]; + +describe("side drawer editor contracts", () => { + it("keeps editor content scrollable and action buttons in a bottom action bar", () => { + for (const source of editorSources) { + expect(source).toMatch(/]*class="[^"]*drawer-editor-form[^"]*"/); + expect(source).toContain('class="drawer-editor-form__content"'); + expect(source).toContain('class="editor-actions"'); + } + + expect(styles).toMatch(/\.drawer-editor-form\s*\{[^}]*display:\s*flex/); + expect(styles).toMatch(/\.drawer-editor-form__content\s*\{[^}]*overflow-y:\s*auto/); + expect(styles).toMatch(/\.editor-actions\s*\{[^}]*margin-top:\s*0/); + }); + + it("closes both home configuration drawers after a successful save", () => { + expect(homePage).toMatch(/async function saveSiteItem\(\)[\s\S]*?closeEditorAfterSave\(\);/); + expect(homePage).toMatch(/async function saveHomeItem\(\)[\s\S]*?closeEditorAfterSave\(\);/); + }); + + it("keeps successful save closure wired for route and concierge drawers", () => { + expect(wanfaPage).toMatch(/async function saveCategory\(label: string\)[\s\S]*?categoryDrawer\.value = false;/); + expect(wanfaPage).toMatch(/async function saveRoute\([\s\S]*?details\.value = [\s\S]*?routeDrawer\.value = false;/); + expect(conciergePage).toMatch(/async function save\(input: ConciergeAdvisorCreate\)[\s\S]*?editorOpen\.value = false;/); + }); + + it("uses the non-deprecated value API in the settings drawer", () => { + expect(settingsDrawer).toContain(''); + expect(settingsDrawer).toContain(''); + expect(settingsDrawer).toContain(''); + expect(settingsDrawer).toContain(''); + expect(settingsDrawer).toContain(''); + expect(settingsDrawer).not.toContain('