Parcourir la source

优化路由守卫逻辑,确保用户信息完整性,未通过验证的用户将被重定向到登录页。同时更新导航菜单项的角色过滤逻辑,确保根据用户角色正确显示菜单项。

wuyi il y a 3 mois
Parent
commit
46a41d5dcb
2 fichiers modifiés avec 30 ajouts et 26 suppressions
  1. 18 5
      src/router/index.js
  2. 12 21
      src/views/MainView.vue

+ 18 - 5
src/router/index.js

@@ -88,17 +88,30 @@ router.beforeEach(async (to, from, next) => {
   const teamStore = useTeamStore()
 
   if (to.meta.requiresAuth) {
-    if (userStore.token && userStore.userInfo.id) {
+    if (userStore.token && userStore.userInfo.id && userStore.userInfo.role) {
       if (userStore.userInfo.role === 'admin') {
         await teamStore.loadTeams()
       }
       next()
     } else if (userStore.token) {
-      await userStore.sync()
-      if (userStore.userInfo.role === 'admin') {
-        await teamStore.loadTeams()
+      try {
+        await userStore.sync()
+        // 确保用户信息完整后再继续
+        if (userStore.userInfo.id && userStore.userInfo.role) {
+          if (userStore.userInfo.role === 'admin') {
+            await teamStore.loadTeams()
+          }
+          next()
+        } else {
+          // 用户信息不完整,清除token并重定向到登录页
+          userStore.logout()
+          next('/login')
+        }
+      } catch (error) {
+        console.error('同步用户信息失败:', error)
+        userStore.logout()
+        next('/login')
       }
-      next()
     } else {
       next('/login')
     }

+ 12 - 21
src/views/MainView.vue

@@ -87,35 +87,26 @@ const allNavItems = [
   }
 ]
 
-// 根据用户角色过滤菜单项
 const navItems = computed(() => {
-  const userRole = userStore.userInfo?.role || 'user'
+  const { userInfo } = userStore
+  if (!userInfo?.id || !userInfo?.role) return []
 
-  const filterItemsByRole = (items) => {
-    return items
+  const filterItemsByRole = (items, role) =>
+    items
+      .filter((item) => !item.roles || item.roles.includes(role))
       .map((item) => {
-        if (item.roles && !item.roles.includes(userRole)) {
-          return null
-        }
-
-        // 如果有子菜单,也需要过滤
         if (item.items) {
-          const filteredSubItems = filterItemsByRole(item.items)
-          if (filteredSubItems.length === 0) {
-            return null
-          }
-          return {
-            ...item,
-            items: filteredSubItems
+          const subItems = filterItemsByRole(item.items, role)
+          if (subItems.length > 0) {
+            return { ...item, items: subItems }
           }
+          return null
         }
-
         return item
       })
-      .filter((item) => item !== null)
-  }
+      .filter(Boolean)
 
-  return filterItemsByRole(allNavItems)
+  return filterItemsByRole(allNavItems, userInfo.role)
 })
 
 const userMenuItems = [
@@ -135,7 +126,7 @@ const userMenuItems = [
 ]
 
 const logout = () => {
-  useUserStore().logout()
+  userStore.logout()
   router.push('/login')
 }