diff --git a/src/@layouts/types.d.ts b/src/@layouts/types.d.ts index 0bc745ee..83d2e244 100644 --- a/src/@layouts/types.d.ts +++ b/src/@layouts/types.d.ts @@ -122,8 +122,8 @@ export interface NavLink extends NavLinkProps, Partial { export interface NavMenu extends NavLink { header: string - admin: boolean description?: string + permission?: string } // 👉 Vertical nav group diff --git a/src/layouts/components/DefaultLayoutWithVerticalNav.vue b/src/layouts/components/DefaultLayout.vue similarity index 61% rename from src/layouts/components/DefaultLayoutWithVerticalNav.vue rename to src/layouts/components/DefaultLayout.vue index c6a72a5c..80e18059 100644 --- a/src/layouts/components/DefaultLayoutWithVerticalNav.vue +++ b/src/layouts/components/DefaultLayout.vue @@ -18,18 +18,65 @@ const appMode = computed(() => { return localStorage.getItem('MP_APPMODE') != '0' && display.mdAndDown.value }) -// 从Vuex Store中获取superuser信息 -const superUser = store.state.auth.superUser +// 是否超级用户 +let superUser = store.state.auth.superUser + +// 用户权限 +const permissions = store.state.auth.permissions + +// 检查是否有权限 +function hasPermission(permission: string | null = null) { + if (!permission) return true + // permission是一个以.分隔的字符串,例如:'user.create' + const permissionList = permission.split('.') + let permissions_obj = permissions + for (const element of permissionList) { + if (!permissions_obj[element]) { + return false + } else if (typeof permissions_obj[element] === 'object') { + permissions_obj = permissions_obj[element] + } else { + return true + } + } + return false +} + +// 开始菜单项 +const startMenus = ref([]) + +// 发现菜单项 +const discoveryMenus = ref([]) + +// 订阅菜单项 +const subscribeMenus = ref([]) + +// 整理菜单项 +const organizeMenus = ref([]) + +// 系统菜单项 +const systemMenus = ref([]) // 根据分类获取菜单列表 const getMenuList = (header: string) => { - return SystemNavMenus.filter((item: NavMenu) => item.header === header && (!item.admin || superUser)) + return SystemNavMenus.filter( + (item: NavMenu) => item.header === header && (superUser || hasPermission(item.permission)), + ) } // 返回上一页 function goBack() { history.back() } + +onMounted(() => { + // 获取菜单列表 + startMenus.value = getMenuList('开始') + discoveryMenus.value = getMenuList('发现') + subscribeMenus.value = getMenuList('订阅') + organizeMenus.value = getMenuList('整理') + systemMenus.value = getMenuList('系统') +})