permission.ts
4.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import { defineStore } from 'pinia'
import { ref } from 'vue'
import type { Menu, RouteRecord } from '@/types'
import { getMenuListApi, getUserMenuTree } from '@/api/menu'
import { useUserStore } from './user'
import router from '@/router'
export const usePermissionStore = defineStore('permission', () => {
// 菜单列表
const menuList = ref<Menu[]>([])
// 路由列表
const routes = ref<RouteRecord[]>([])
// 权限列表
const permissions = ref<string[]>([])
// 获取菜单列表
const getMenuList = async (): Promise<Menu[]> => {
try {
const response: Menu[] = await getMenuListApi()
menuList.value = response
return response
} catch (error) {
console.error('获取菜单列表失败:', error)
return []
}
}
// 生成路由
const generateRoutes = (menus: Menu[]): RouteRecord[] => {
const routes: RouteRecord[] = []
menus.forEach(menu => {
if (menu.menuType === '0') {
// 目录
const route: RouteRecord = {
path: menu.path,
name: menu.menuName,
meta: {
title: menu.menuName,
icon: menu.icon,
requiresAuth: true,
permissions: menu.perms ? [menu.perms] : []
},
children: menu.children ? generateRoutes(menu.children) : []
}
routes.push(route)
} else if (menu.menuType === '1') {
// 菜单
const route: RouteRecord = {
path: menu.path,
name: menu.menuName,
component: () => import(/* @vite-ignore */ `@/views${menu.component}`),
meta: {
title: menu.menuName,
icon: menu.icon,
requiresAuth: true,
permissions: menu.perms ? [menu.perms] : []
}
}
routes.push(route)
}
})
return routes
}
// 构建路由
const buildRoutes = async (): Promise<RouteRecord[]> => {
try {
const menus = await getMenuList()
const generatedRoutes = generateRoutes(menus)
// 添加动态路由
generatedRoutes.forEach(route => {
router.addRoute(route as any)
})
routes.value = generatedRoutes
return generatedRoutes
} catch (error) {
console.error('构建路由失败:', error)
return []
}
}
// 检查菜单权限
const checkMenuPermission = (menu: Menu): boolean => {
const userStore = useUserStore()
if (!menu.perms) return true
return userStore.hasPermission(menu.perms)
}
// 过滤有权限的菜单
const filterMenuByPermission = (menus: Menu[]): Menu[] => {
return menus.filter(menu => {
if (!checkMenuPermission(menu)) return false
if (menu.children && menu.children.length > 0) {
menu.children = filterMenuByPermission(menu.children)
return menu.children.length > 0
}
return true
})
}
// 获取有权限的菜单列表
const getPermissionMenuList = async (): Promise<Menu[]> => {
try {
const menus = await getMenuList()
const filteredMenus = filterMenuByPermission(menus)
menuList.value = filteredMenus
return filteredMenus
} catch (error) {
console.error('获取权限菜单列表失败:', error)
return []
}
}
// 根据用户ID获取用户菜单权限
const getUserPermissionMenus = async (userId: number): Promise<Menu[]> => {
try {
const response = await getUserMenuTree(userId)
if (response.code === 200) {
menuList.value = response.data || []
return response.data || []
} else {
console.error('获取用户菜单权限失败:', response.message)
return []
}
} catch (error) {
console.error('获取用户菜单权限失败:', error)
return []
}
}
// 重置状态
const resetState = (): void => {
menuList.value = []
routes.value = []
permissions.value = []
}
return {
// 状态
menuList,
routes,
permissions,
// 方法
getMenuList,
generateRoutes,
buildRoutes,
checkMenuPermission,
filterMenuByPermission,
getPermissionMenuList,
getUserPermissionMenus,
resetState
}
})