Explorar o código

新增获取当前用户团队的API,更新团队列表接口以支持通过ID查询,调整团队管理视图以根据用户角色加载团队信息,并优化导航菜单项的角色过滤逻辑。

wuyi hai 3 meses
pai
achega
64f2318886
Modificáronse 4 ficheiros con 81 adicións e 17 borrados
  1. 8 1
      src/services/api.js
  2. 19 6
      src/stores/team.js
  3. 53 10
      src/views/MainView.vue
  4. 1 0
      src/views/TeamView.vue

+ 8 - 1
src/services/api.js

@@ -271,8 +271,9 @@ export const createTeam = async (teamData) => {
 }
 
 // 获取团队列表
-export const listTeams = async (page = 0, size = 20, name) => {
+export const listTeams = async (page = 0, size = 20, id, name) => {
   const params = { page, size }
+  if (id) params.id = id
   if (name) params.name = name
 
   const response = await api.get('/teams', { params })
@@ -321,6 +322,12 @@ export const getAllTeams = async () => {
   return response.data
 }
 
+// 获取当前用户团队
+export const getCurrentUserTeam = async () => {
+  const response = await api.get('/teams/getTeam')
+  return response.data
+}
+
 
 // ==================== 团队成员管理相关API ====================
 

+ 19 - 6
src/stores/team.js

@@ -1,28 +1,39 @@
 import { defineStore } from 'pinia'
 import { ref } from 'vue'
-import { getAllTeams } from '@/services/api'
+import { getAllTeams, getCurrentUserTeam } from '@/services/api'
 import { useUserStore } from '@/stores/user'
 
 export const useTeamStore = defineStore('team', () => {
     const teams = ref([])
+    const currentTeam = ref(null)
     const isLoading = ref(false)
     const error = ref(null)
 
     const loadTeams = async () => {
         const userStore = useUserStore()
 
-        if (!userStore.userInfo || userStore.userInfo.role !== 'admin') {
+        if (!userStore.userInfo) {
             return
         }
-        if (teams.value.length > 0) return
+
+        const userRole = userStore.userInfo.role
 
         try {
             isLoading.value = true
             error.value = null
-            const data = await getAllTeams()
-            teams.value = data
+
+            if (userRole === 'admin') {
+                if (teams.value.length > 0) return
+                const data = await getAllTeams()
+                teams.value = data
+            } else if (userRole === 'team') {
+                if (currentTeam.value) return
+                const data = await getCurrentUserTeam()
+                currentTeam.value = data
+            }
         } catch (err) {
-            console.error('加载团队列表失败:', err)
+            console.error('加载团队信息失败:', err)
+            error.value = err.message || '加载团队信息失败'
         } finally {
             isLoading.value = false
         }
@@ -30,12 +41,14 @@ export const useTeamStore = defineStore('team', () => {
 
     const reset = () => {
         teams.value = []
+        currentTeam.value = null
         isLoading.value = false
         error.value = null
     }
 
     return {
         teams,
+        currentTeam,
         isLoading,
         error,
         loadTeams,

+ 53 - 10
src/views/MainView.vue

@@ -1,5 +1,5 @@
 <script setup>
-import { ref } from 'vue'
+import { ref, computed } from 'vue'
 import { useRouter } from 'vue-router'
 import Button from 'primevue/button'
 import Menu from 'primevue/menu'
@@ -17,64 +17,107 @@ import { useUserStore } from '@/stores/user'
 import { resetPasswordApi } from '@/services/api'
 import { zodResolver } from '@primevue/forms/resolvers/zod'
 import { z } from 'zod'
+import { UserRole } from '@/enums'
 
 const router = useRouter()
 const sidebarVisible = ref(false)
 const userMenuRef = ref()
 const toast = useToast()
+const userStore = useUserStore()
+
 const showUserMenu = (event) => {
   userMenuRef.value.toggle(event)
 }
 
-const navItems = [
+const allNavItems = [
   {
     label: '首页',
     icon: 'pi pi-fw pi-home',
-    name: 'dashboard'
+    name: 'dashboard',
+    roles: ['admin', 'team', 'user']
   },
   {
     label: '团队管理',
     icon: 'pi pi-fw pi-building',
+    roles: ['admin', 'team'],
     items: [
       {
         label: '团队信息',
         icon: 'pi pi-fw pi-info-circle',
-        name: 'team-info'
+        name: 'team-info',
+        roles: ['admin', 'team']
       },
       {
         label: '成员信息',
         icon: 'pi pi-fw pi-users',
-        name: 'team-members'
+        name: 'team-members',
+        roles: ['admin', 'team']
       }
     ]
   },
   {
     label: '推广链接',
     icon: 'pi pi-fw pi-link',
-    name: 'link'
+    name: 'link',
+    roles: ['admin', 'team', 'user']
   },
   {
     label: '财务记录',
     icon: 'pi pi-fw pi-credit-card',
-    name: 'finance'
+    name: 'finance',
+    roles: ['admin', 'team']
   },
   {
     label: '收入记录',
     icon: 'pi pi-fw pi-wallet',
-    name: 'income'
+    name: 'income',
+    roles: ['admin', 'team', 'user']
   },
   {
     label: '用户管理',
     icon: 'pi pi-fw pi-user',
-    name: 'user'
+    name: 'user',
+    roles: ['admin']
   },
   {
     label: '参数配置',
     icon: 'pi pi-fw pi-cog',
-    name: 'sys-config'
+    name: 'sys-config',
+    roles: ['admin']
   }
 ]
 
+// 根据用户角色过滤菜单项
+const navItems = computed(() => {
+  const userRole = userStore.userInfo?.role || 'user'
+
+  const filterItemsByRole = (items) => {
+    return items
+      .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
+          }
+        }
+
+        return item
+      })
+      .filter((item) => item !== null)
+  }
+
+  return filterItemsByRole(allNavItems)
+})
+
 const userMenuItems = [
   {
     label: '修改密码',

+ 1 - 0
src/views/TeamView.vue

@@ -256,6 +256,7 @@ const fetchData = async () => {
     const response = await listTeams(
       tableData.value.metadata.page,
       tableData.value.metadata.size,
+      searchForm.value.id || undefined,
       searchForm.value.name || undefined
     )
     tableData.value = response