From 3d2a2845b9a2fc6ffa261e8cbaf9ba41ba3053ad Mon Sep 17 00:00:00 2001 From: duanshuwen Date: Thu, 27 Aug 2026 15:03:50 +0800 Subject: [PATCH 1/5] =?UTF-8?q?fix(=E7=99=BB=E5=BD=95=E9=A1=B5):=20?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E7=99=BB=E5=BD=95=E9=A1=B5=E7=A1=AC=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E7=9A=84=E9=BB=98=E8=AE=A4=E8=B4=A6=E5=8F=B7=E5=AF=86?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增单元测试用例验证该改动,确保不会预填硬编码的默认凭据,同时保留记住账号的恢复逻辑 --- WonderQ-Admin-UI-Vue/src/pages/LoginPage.test.ts | 15 +++++++++++++++ WonderQ-Admin-UI-Vue/src/pages/LoginPage.vue | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 WonderQ-Admin-UI-Vue/src/pages/LoginPage.test.ts diff --git a/WonderQ-Admin-UI-Vue/src/pages/LoginPage.test.ts b/WonderQ-Admin-UI-Vue/src/pages/LoginPage.test.ts new file mode 100644 index 0000000..c0abb41 --- /dev/null +++ b/WonderQ-Admin-UI-Vue/src/pages/LoginPage.test.ts @@ -0,0 +1,15 @@ +import { readFileSync } from "node:fs"; +import { describe, expect, it } from "vitest"; + +const source = readFileSync(new URL("./LoginPage.vue", import.meta.url), "utf8"); + +describe("登录页凭据初始化", () => { + it("不预填账号和密码,但保留记住密码的账号恢复逻辑", () => { + expect(source).toContain("email: rememberedEmail, password: \"\""); + expect(source).toContain("rememberMe: Boolean(rememberedEmail)"); + expect(source).toContain("window.localStorage.setItem(rememberedEmailKey, form.email.trim())"); + expect(source).toContain("window.localStorage.removeItem(rememberedEmailKey)"); + expect(source).not.toContain("admin@example.com"); + expect(source).not.toContain("ChangeMe123!"); + }); +}); diff --git a/WonderQ-Admin-UI-Vue/src/pages/LoginPage.vue b/WonderQ-Admin-UI-Vue/src/pages/LoginPage.vue index fe465d1..4002b93 100644 --- a/WonderQ-Admin-UI-Vue/src/pages/LoginPage.vue +++ b/WonderQ-Admin-UI-Vue/src/pages/LoginPage.vue @@ -10,7 +10,7 @@ const router = useRouter(); const route = useRoute(); const rememberedEmailKey = "wonderq-admin-remembered-email"; const rememberedEmail = typeof window === "undefined" ? "" : window.localStorage.getItem(rememberedEmailKey) ?? ""; -const form = reactive({ email: rememberedEmail || "admin@example.com", password: "ChangeMe123!", captchaId: "", captchaCode: "", rememberMe: Boolean(rememberedEmail) }); +const form = reactive({ email: rememberedEmail, password: "", captchaId: "", captchaCode: "", rememberMe: Boolean(rememberedEmail) }); const error = ref(""); const captchaImage = ref(""); const captchaLoading = ref(false); From 5ccdfd7f06d112a5005d686d268c49fdd093c957 Mon Sep 17 00:00:00 2001 From: duanshuwen Date: Thu, 27 Aug 2026 15:16:52 +0800 Subject: [PATCH 2/5] =?UTF-8?q?fix(config):=20=E6=9B=BF=E6=8D=A2=20=5F=5Fd?= =?UTF-8?q?irname=20=E4=B8=BA=20import.meta.dirname=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E8=A7=A3=E6=9E=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ES 模块环境中不支持 __dirname,使用 import.meta.dirname 替代可确保路径解析正确。 --- WonderQ-Admin-UI-Vue/vite.config.ts | 2 +- WonderQ-MiniAPP/vite.config.ts | 6 +++--- WonderQ-MiniAPP/vitest.config.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/WonderQ-Admin-UI-Vue/vite.config.ts b/WonderQ-Admin-UI-Vue/vite.config.ts index 3dd01ba..680199a 100644 --- a/WonderQ-Admin-UI-Vue/vite.config.ts +++ b/WonderQ-Admin-UI-Vue/vite.config.ts @@ -8,7 +8,7 @@ export default defineConfig(({ mode }) => { base: "/admin/", plugins: [vue()], resolve: { - alias: { "@": path.resolve(__dirname, "./src") }, + alias: { "@": path.resolve(import.meta.dirname, "./src") }, }, server: { host: "0.0.0.0", diff --git a/WonderQ-MiniAPP/vite.config.ts b/WonderQ-MiniAPP/vite.config.ts index ab80c1a..4122ee7 100644 --- a/WonderQ-MiniAPP/vite.config.ts +++ b/WonderQ-MiniAPP/vite.config.ts @@ -9,7 +9,7 @@ const uni = : (uniModule as { default: typeof uniModule }).default; export default defineConfig(({ mode }) => { - const env = loadEnv(mode, __dirname, "VITE_"); + const env = loadEnv(mode, import.meta.dirname, "VITE_"); const apiBaseUrl = env.VITE_API_BASE_URL?.trim() ?? ""; return { @@ -18,7 +18,7 @@ export default defineConfig(({ mode }) => { }, resolve: { alias: { - "@": path.resolve(__dirname, "src"), + "@": path.resolve(import.meta.dirname, "src"), }, }, server: { @@ -36,7 +36,7 @@ export default defineConfig(({ mode }) => { cssOptions: { rem2rpx: true, }, - cssEntries: [path.resolve(__dirname, "src/app.css")], + cssEntries: [path.resolve(import.meta.dirname, "src/app.css")], }), ], }; diff --git a/WonderQ-MiniAPP/vitest.config.ts b/WonderQ-MiniAPP/vitest.config.ts index 10abcea..fd7c1ad 100644 --- a/WonderQ-MiniAPP/vitest.config.ts +++ b/WonderQ-MiniAPP/vitest.config.ts @@ -4,7 +4,7 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ resolve: { alias: { - "@": path.resolve(__dirname, "src"), + "@": path.resolve(import.meta.dirname, "src"), }, }, test: { From 68d2b88c0495b38b53111a3d270d394ece311cca Mon Sep 17 00:00:00 2001 From: duanshuwen Date: Thu, 27 Aug 2026 15:33:35 +0800 Subject: [PATCH 3/5] =?UTF-8?q?fix(layout/sidebar-item):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=BE=A7=E8=BE=B9=E6=A0=8F=E8=8F=9C=E5=8D=95=E9=A1=B9?= =?UTF-8?q?=E7=9A=84=E4=B8=A4=E5=A4=84=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将侧边栏内容容器从span改为div,避免Tooltip触发器被误判为隐藏文本 - 折叠父菜单时子菜单强制不折叠以保留子项标题 - 新增对应单元测试覆盖修复场景 --- .../src/components/layout/SidebarItem.test.ts | 17 +++++++++++++++++ .../src/components/layout/SidebarItem.vue | 10 +++++----- 2 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 WonderQ-Admin-UI-Vue/src/components/layout/SidebarItem.test.ts diff --git a/WonderQ-Admin-UI-Vue/src/components/layout/SidebarItem.test.ts b/WonderQ-Admin-UI-Vue/src/components/layout/SidebarItem.test.ts new file mode 100644 index 0000000..b178878 --- /dev/null +++ b/WonderQ-Admin-UI-Vue/src/components/layout/SidebarItem.test.ts @@ -0,0 +1,17 @@ +import { readFileSync } from "node:fs"; +import { describe, expect, it } from "vitest"; + +const source = readFileSync(new URL("./SidebarItem.vue", import.meta.url), "utf8"); + +describe("侧栏菜单图标容器", () => { + it("避免折叠菜单把 Tooltip 触发器误判为隐藏文本", () => { + expect(source).toContain('