task-11(壳层/路由): 实现无菜单权限空状态

empty-state 定义标题/引导文案与 shouldShowEmptyMenu 纯判定(Boolean 化防 undefined);
AdminLayout 侧边栏与内容区(根路由)共用空态,加载中不闪现,未初始化不误报。
This commit is contained in:
2026-09-05 12:22:52 +08:00
parent f1fa5f7adf
commit 50e70c43ab
4 changed files with 84 additions and 4 deletions
+14 -2
View File
@@ -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() {
</el-menu-item>
</template>
</el-menu>
<el-empty v-if="!menuEntries.length && !session.loading" description="暂无可用菜单" :image-size="72" />
<el-empty v-if="emptyMenu" :description="EMPTY_MENU_TITLE" :image-size="72" />
</el-scrollbar>
<button class="sidebar-collapse" type="button" @click="collapsed = !collapsed">
@@ -79,7 +85,13 @@ async function signOut() {
</header>
<main class="admin-content">
<el-alert v-if="session.error" :title="session.error" type="error" show-icon :closable="false" />
<RouterView />
<el-empty
v-if="emptyMenu && route.path === '/'"
:title="EMPTY_MENU_TITLE"
:description="EMPTY_MENU_DESCRIPTION"
:image-size="96"
/>
<RouterView v-else />
</main>
</section>
</div>