From 50e70c43ab6a54883691e68ba76db24711985326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E8=87=AA=E8=BE=BE?= <980324341@qq.com> Date: Sat, 5 Sep 2026 12:22:52 +0800 Subject: [PATCH] =?UTF-8?q?task-11(=E5=A3=B3=E5=B1=82/=E8=B7=AF=E7=94=B1):?= =?UTF-8?q?=20=E5=AE=9E=E7=8E=B0=E6=97=A0=E8=8F=9C=E5=8D=95=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=A9=BA=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit empty-state 定义标题/引导文案与 shouldShowEmptyMenu 纯判定(Boolean 化防 undefined); AdminLayout 侧边栏与内容区(根路由)共用空态,加载中不闪现,未初始化不误报。 --- admin-frontend-vue/src/layout/AdminLayout.vue | 16 +++++- admin-frontend-vue/src/layout/empty-state.ts | 11 ++++ admin-frontend-vue/tests/task-11.test.ts | 57 +++++++++++++++++++ admin-frontend-vue/tests/task-3.test.ts | 4 +- 4 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 admin-frontend-vue/src/layout/empty-state.ts create mode 100644 admin-frontend-vue/tests/task-11.test.ts diff --git a/admin-frontend-vue/src/layout/AdminLayout.vue b/admin-frontend-vue/src/layout/AdminLayout.vue index 4d361049..7e8b3071 100644 --- a/admin-frontend-vue/src/layout/AdminLayout.vue +++ b/admin-frontend-vue/src/layout/AdminLayout.vue @@ -6,6 +6,11 @@ import { useAdminSessionStore } from '@/stores/admin-session' import { joinAdminPath } from '@/config/app' import { pageTitleOf, topbarUserOf } from '@/layout/topbar-model' import { groupKeysForActive, toSidebarEntries } from '@/layout/menu-mapper' +import { + EMPTY_MENU_DESCRIPTION, + EMPTY_MENU_TITLE, + shouldShowEmptyMenu, +} from '@/layout/empty-state' const route = useRoute() const router = useRouter() @@ -15,6 +20,7 @@ const collapsed = ref(false) const activePath = computed(() => route.path) const menuEntries = computed(() => toSidebarEntries(session.menuTree)) const openedKeys = computed(() => groupKeysForActive(menuEntries.value, route.path)) +const emptyMenu = computed(() => shouldShowEmptyMenu(menuEntries.value.length > 0, session.loading, session.initialized)) const pageTitle = computed(() => pageTitleOf(route.meta.title)) const userVm = computed(() => topbarUserOf(session.user)) const logoUrl = joinAdminPath('assets', 'logo.jpg') @@ -55,7 +61,7 @@ async function signOut() { - +