vue2server7 7.0.50 → 7.0.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,248 +0,0 @@
1
- # Vue3 按钮权限管理(进阶版:自定义指令)
2
-
3
- ## 📌 目标
4
- 实现一套通用的按钮权限控制方案,支持:
5
-
6
- - ✅ 单权限 / 多权限
7
- - ✅ AND / OR 权限判断
8
- - ✅ 隐藏 或 禁用 控制
9
- - ✅ 动态更新权限
10
- - ✅ 可扩展(Pinia / 后端权限)
11
-
12
- ---
13
-
14
- ## 🧩 一、指令实现
15
-
16
- ```ts
17
- // src/directives/permission.ts
18
- import type { Directive } from 'vue'
19
-
20
- function getPermissions(): string[] {
21
- return JSON.parse(localStorage.getItem('permissions') || '[]')
22
- }
23
-
24
- function checkPermission(value: any, permissions: string[]) {
25
- if (typeof value === 'string') {
26
- return permissions.includes(value)
27
- }
28
-
29
- if (Array.isArray(value)) {
30
- return value.some(p => permissions.includes(p))
31
- }
32
-
33
- if (typeof value === 'object') {
34
- const { code, mode = 'or' } = value
35
-
36
- if (Array.isArray(code)) {
37
- return mode === 'and'
38
- ? code.every(p => permissions.includes(p))
39
- : code.some(p => permissions.includes(p))
40
- }
41
-
42
- return permissions.includes(code)
43
- }
44
-
45
- return false
46
- }
47
-
48
- function handleEl(el: HTMLElement, hasPermission: boolean, effect = 'remove') {
49
- if (hasPermission) return
50
-
51
- if (effect === 'disable') {
52
- el.setAttribute('disabled', 'true')
53
- el.classList.add('is-disabled')
54
- el.style.pointerEvents = 'none'
55
- } else {
56
- el.parentNode?.removeChild(el)
57
- }
58
- }
59
-
60
- export const permissionDirective: Directive = {
61
- mounted(el, binding) {
62
- const permissions = getPermissions()
63
- const { value, arg } = binding
64
-
65
- const hasPermission = checkPermission(value, permissions)
66
-
67
- handleEl(el, hasPermission, arg)
68
- },
69
-
70
- updated(el, binding) {
71
- const permissions = getPermissions()
72
- const { value, arg } = binding
73
-
74
- const hasPermission = checkPermission(value, permissions)
75
-
76
- handleEl(el, hasPermission, arg)
77
- }
78
- }
79
- ```
80
-
81
- ---
82
-
83
- ## 🚀 二、全局注册
84
-
85
- ```ts
86
- // main.ts
87
- import { createApp } from 'vue'
88
- import App from './App.vue'
89
- import { permissionDirective } from '@/directives/permission'
90
-
91
- const app = createApp(App)
92
-
93
- app.directive('permission', permissionDirective)
94
-
95
- app.mount('#app')
96
- ```
97
-
98
- ---
99
-
100
- ## 🎯 三、使用方式
101
-
102
- ### 1️⃣ 单权限
103
- ```vue
104
- <el-button v-permission="'user:add'">新增</el-button>
105
- ```
106
-
107
- ---
108
-
109
- ### 2️⃣ 多权限(满足一个)
110
- ```vue
111
- <el-button v-permission="['user:add','user:create']">
112
- 新增
113
- </el-button>
114
- ```
115
-
116
- ---
117
-
118
- ### 3️⃣ 多权限(必须全部满足)
119
- ```vue
120
- <el-button v-permission="{ code: ['user:add','user:vip'], mode: 'and' }">
121
- 高级新增
122
- </el-button>
123
- ```
124
-
125
- ---
126
-
127
- ### 4️⃣ 无权限 → 禁用按钮
128
- ```vue
129
- <el-button v-permission:disable="'user:add'">
130
- 新增
131
- </el-button>
132
- ```
133
-
134
- ---
135
-
136
- ## 🧠 四、推荐优化(生产环境必做)
137
-
138
- ### ✔ 使用 Pinia 管理权限
139
-
140
- ```ts
141
- // stores/user.ts
142
- import { defineStore } from 'pinia'
143
-
144
- export const useUserStore = defineStore('user', {
145
- state: () => ({
146
- permissions: [] as string[]
147
- })
148
- })
149
- ```
150
-
151
- ### ✔ 修改指令权限来源
152
-
153
- ```ts
154
- import { useUserStore } from '@/stores/user'
155
-
156
- const permissions = useUserStore().permissions
157
- ```
158
-
159
- ---
160
-
161
- ## 📦 五、权限格式规范
162
-
163
- 建议统一格式:
164
-
165
- ```
166
- user:add
167
- user:delete
168
- order:list
169
- order:create
170
- ```
171
-
172
- ---
173
-
174
- ## 🔐 六、后端权限校验(必须)
175
-
176
- 前端权限只是 UI 控制,后端必须校验:
177
-
178
- ```ts
179
- if (!user.permissions.includes('user:add')) {
180
- throw new Error('Forbidden')
181
- }
182
- ```
183
-
184
- ---
185
-
186
- ## ⚠️ 七、常见问题
187
-
188
- ### ❌ 权限变化 UI 不更新
189
- ✔ 已通过 `updated` 生命周期解决
190
-
191
- ---
192
-
193
- ### ❌ Element Plus 禁用无效
194
- ✔ 必须加:
195
-
196
- ```ts
197
- el.style.pointerEvents = 'none'
198
- ```
199
-
200
- ---
201
-
202
- ### ❌ 使用 v-if 控制权限
203
- 不推荐,会导致:
204
- - 模板混乱
205
- - 逻辑分散
206
-
207
- ---
208
-
209
- ## 🏁 总结
210
-
211
- 推荐最终方案:
212
-
213
- 👉 自定义指令(控制 UI)
214
- 👉 Pinia(存权限)
215
- 👉 后端校验(保证安全)
216
-
217
- 这样你的权限系统:
218
- - 清晰
219
- - 可维护
220
- - 可扩展
221
-
222
-
223
- type Button = {
224
- appName: string
225
- }
226
-
227
- type Menu = {
228
- children?: Menu[]
229
- buttonChildren?: Button[]
230
- }
231
-
232
- export function getButtonPermissions(menuTree: Menu[]): string[] {
233
- const set = new Set<string>()
234
-
235
- const dfs = (nodes: Menu[]) => {
236
- nodes.forEach(node => {
237
- node.buttonChildren?.forEach(btn => {
238
- if (btn.appName) set.add(btn.appName)
239
- })
240
-
241
- if (node.children) dfs(node.children)
242
- })
243
- }
244
-
245
- dfs(menuTree)
246
-
247
- return [...set]
248
- }