优化用户信息展示和权限显示逻辑

This commit is contained in:
jxxghp
2025-06-11 12:56:10 +08:00
parent 052d6edd13
commit 3c051b8698
8 changed files with 251 additions and 166 deletions
+55 -7
View File
@@ -19,10 +19,23 @@ const route = useRoute()
const userStore = useUserStore()
// 获取用户权限信息
const userPermissions = computed(() => ({
is_superuser: userStore.superUser,
...userStore.permissions,
}))
const userPermissions = computed(() => {
// 确保用户已认证且信息已加载
if (!userStore || userStore.userID === -1) {
return {
is_superuser: false,
discovery: false,
search: false,
subscribe: false,
manage: false,
}
}
return {
is_superuser: userStore.superUser,
...userStore.permissions,
}
})
// 获取导航菜单
const navMenus = computed(() => {
@@ -41,7 +54,42 @@ const currentMenu = ref<string>(getMenuPathFromRoute(route.path))
// 过滤出底部菜单项
const footerMenus = computed(() => {
return navMenus.value.filter((menu: NavMenu) => menu.footer === true)
// 获取所有有权限的菜单
const allAuthorizedMenus = navMenus.value
// 优先获取有 footer: true 属性的菜单
const footerMenusWithProperty = allAuthorizedMenus.filter((menu: NavMenu) => menu.footer === true)
// 设置期望的底部菜单数量(不包括"更多"按钮)
// 一般来说,底部导航栏显示 3-4 个主要功能比较合适
const expectedFooterMenuCount = 3
// 如果有 footer 属性的菜单已经足够,优先显示它们
if (footerMenusWithProperty.length >= expectedFooterMenuCount) {
return footerMenusWithProperty.slice(0, expectedFooterMenuCount)
}
// 如果不够,从没有 footer 属性或 footer 为 false 的菜单中补充
// 优先选择一些常用的功能菜单
const nonFooterMenus = allAuthorizedMenus.filter(
(menu: NavMenu) =>
menu.footer !== true &&
// 排除已经在 footerMenusWithProperty 中的菜单
!footerMenusWithProperty.some(footerMenu => footerMenu.to === menu.to),
)
// 计算还需要多少个菜单
const needCount = expectedFooterMenuCount - footerMenusWithProperty.length
// 合并菜单:优先显示有 footer 属性的,然后按菜单定义顺序添加其他菜单
let finalMenus = [...footerMenusWithProperty, ...nonFooterMenus.slice(0, needCount)]
// 确保至少有一个菜单显示,如果都没有权限,则显示第一个有权限的菜单
if (finalMenus.length === 0 && allAuthorizedMenus.length > 0) {
finalMenus = [allAuthorizedMenus[0]]
}
return finalMenus
})
// 监听路由变化来更新currentMenu
@@ -209,8 +257,8 @@ const showDynamicButton = computed(() => {
.footer-card-content {
position: relative;
padding-block: 6px;
padding-inline: 8px;
padding-block: 4px;
padding-inline: 6px;
}
.footer-btn-group {
+1
View File
@@ -63,6 +63,7 @@ function logout() {
// 清除登录状态信息
authStore.logout()
userStore.reset()
// 重定向到登录页面或其他适当的页面
router.push('/login')
}