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() {
-
+