usePermission.js
9.79 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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
/**
* 通用权限检查 Composable
*
* @description 提供统一的权限检查逻辑,支持登录、VIP 等多种权限类型
* @module composables/usePermission
* @author Claude Code
* @created 2026-02-13
*
* @example
* // 基础使用 - 检查登录权限
* const { requireLogin } = usePermission()
*
* requireLogin(() => {
* // 已登录时执行的操作
* openDocument()
* })
*
* @example
* // 高级使用 - 自定义提示文案
* const { checkPermission } = usePermission()
*
* checkPermission(PermissionType.LOGIN, callback, {
* content: '请先登录后查看完整内容',
* confirmText: '立即登录'
* })
*/
import { useUserStore } from '@/stores/user'
import Taro from '@tarojs/taro'
import { routerStore } from '@/stores/router'
import { PermissionType, getPermissionConfig, getActionPermissionConfig } from '@/config/permissions'
/**
* 通用权限检查 Hook
*
* @description 提供权限检查、权限弹窗等功能
* @returns {Object} 权限检查方法集合
*/
export function usePermission() {
const userStore = useUserStore()
/**
* 检查登录状态
* @description 判断用户是否已登录
* @returns {boolean} 是否已登录
*
* @example
* const { isLoggedIn } = usePermission()
* if (isLoggedIn()) {
* console.log('用户已登录')
* }
*/
const isLoggedIn = () => {
return userStore.isLoggedIn
}
const getCurrentPageUrl = () => {
const pages = Taro.getCurrentPages()
const currentPage = pages[pages.length - 1]
if (!currentPage || !currentPage.route) {
return ''
}
const options = currentPage.options || {}
const query = Object.keys(options)
.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(options[key])}`)
.join('&')
return `/${currentPage.route}${query ? `?${query}` : ''}`
}
/**
* 通用权限检查
* @description 检查指定权限,无权限时弹窗提示,有权限时执行回调
* @param {string} permissionType - 权限类型(使用 PermissionType 枚举)
* @param {Function} callback - 有权限时执行的回调函数
* @param {Object} customOptions - 自定义配置选项(会覆盖默认配置)
* @returns {boolean} 是否有权限(true=有权限,false=无权限)
*
* @example
* // 使用默认配置
* checkPermission(PermissionType.LOGIN, () => {
* console.log('已登录,执行操作')
* })
*
* @example
* // 自定义提示文案
* checkPermission(PermissionType.LOGIN, callback, {
* content: '请先登录后查看完整内容',
* confirmText: '立即登录'
* })
*/
const checkPermission = (permissionType, callback, customOptions = {}) => {
console.log(`[usePermission] 检查权限: ${permissionType}`)
// 根据权限类型执行不同的检查逻辑
switch (permissionType) {
case PermissionType.LOGIN:
return checkLoginPermission(callback, customOptions)
case PermissionType.VIP:
return checkVipPermission(callback, customOptions)
case PermissionType.VERIFIED:
return checkVerifiedPermission(callback, customOptions)
default:
console.warn(`[usePermission] 未知的权限类型: ${permissionType}`)
return false
}
}
/**
* 检查登录权限
* @description 判断用户是否登录,未登录时弹窗引导
* @param {Function} callback - 已登录时执行的回调
* @param {Object} customOptions - 自定义配置选项
* @returns {boolean} 是否已登录
* @private
*/
const checkLoginPermission = (callback, customOptions = {}) => {
if (isLoggedIn()) {
// 已登录,直接执行回调
console.log('[usePermission] 用户已登录,执行回调')
callback?.()
return true
}
// 未登录,弹窗提示
console.log('[usePermission] 用户未登录,显示登录提示')
showLoginModal(callback, customOptions)
return false
}
/**
* 检查 VIP 权限(预留)
* @description 检查用户是否为 VIP,非 VIP 时弹窗引导
* @param {Function} callback - 有权限时执行的回调
* @param {Object} customOptions - 自定义配置选项
* @returns {boolean} 是否有权限
* @private
*/
const checkVipPermission = (callback, customOptions = {}) => {
// 预留:检查 VIP 状态
// const isVip = userStore.userInfo?.is_vip
const isVip = true // 暂时返回 true
if (isVip) {
callback?.()
return true
}
showPermissionModal(PermissionType.VIP, callback, customOptions)
return false
}
/**
* 检查实名认证权限(预留)
* @description 检查用户是否实名认证,未认证时弹窗引导
* @param {Function} callback - 有权限时执行的回调
* @param {Object} customOptions - 自定义配置选项
* @returns {boolean} 是否有权限
* @private
*/
const checkVerifiedPermission = (callback, customOptions = {}) => {
// 预留:检查实名认证状态
// const isVerified = userStore.userInfo?.is_verified
const isVerified = true // 暂时返回 true
if (isVerified) {
callback?.()
return true
}
showPermissionModal(PermissionType.VERIFIED, callback, customOptions)
return false
}
/**
* 显示登录弹窗
* @description 显示登录引导弹窗,点击确定跳转登录页
* @param {Function} callback - 用户登录成功后希望执行的回调(用于登录后返回)
* @param {Object} customOptions - 自定义配置选项
* @private
*/
const showLoginModal = (callback, customOptions = {}) => {
const config = getPermissionConfig(PermissionType.LOGIN, customOptions)
Taro.showModal({
title: config.title,
content: config.content,
confirmText: config.confirmText,
cancelText: config.cancelText,
success: (res) => {
if (res.confirm) {
// 用户点击"去登录"
console.log('[usePermission] 用户选择去登录')
const store = routerStore()
const currentUrl = getCurrentPageUrl()
if (currentUrl) {
store.add(currentUrl)
}
goToLoginPage()
} else {
// 用户点击"暂不登录"
console.log('[usePermission] 用户取消登录')
}
}
})
}
/**
* 显示权限提示弹窗(通用)
* @description 显示权限不足的提示弹窗
* @param {string} permissionType - 权限类型
* @param {Function} callback - 有权限时执行的回调
* @param {Object} customOptions - 自定义配置选项
* @private
*/
const showPermissionModal = (permissionType, callback, customOptions = {}) => {
const config = getPermissionConfig(permissionType, customOptions)
Taro.showModal({
title: config.title,
content: config.content,
confirmText: config.confirmText,
cancelText: config.cancelText,
success: (res) => {
if (res.confirm) {
console.log(`[usePermission] 用户确认权限提示: ${permissionType}`)
// 根据权限类型执行不同操作
handlePermissionAction(permissionType)
}
}
})
}
/**
* 处理权限确认后的操作
* @description 根据权限类型跳转到对应页面
* @param {string} permissionType - 权限类型
* @private
*/
const handlePermissionAction = (permissionType) => {
switch (permissionType) {
case PermissionType.LOGIN:
goToLoginPage()
break
case PermissionType.VIP:
// 跳转到 VIP 开通页面
console.log('[usePermission] 跳转到 VIP 开通页面')
break
case PermissionType.VERIFIED:
// 跳转到实名认证页面
console.log('[usePermission] 跳转到实名认证页面')
break
}
}
/**
* 跳转到登录页
* @description 跳转到登录页面
* @private
*/
const goToLoginPage = () => {
Taro.navigateTo({
url: '/pages/login/index'
})
}
/**
* 便捷方法:要求登录权限
* @description 专门用于检查登录权限的便捷方法
* @param {Function} callback - 已登录时执行的回调
* @param {Object} customOptions - 自定义配置选项
* @returns {boolean} 是否已登录
*
* @example
* const { requireLogin } = usePermission()
*
* // 查看资料需要登录
* onView(item) {
* requireLogin(() => {
* openDocument(item.url)
* })
* }
*/
const requireLogin = (callback, customOptions = {}) => {
return checkPermission(PermissionType.LOGIN, callback, customOptions)
}
const requireAction = (action, callback, customOptions = {}) => {
const actionConfig = getActionPermissionConfig(action, customOptions)
return checkPermission(actionConfig.permission_type, callback, actionConfig.options)
}
/**
* 便捷方法:静默检查权限(不弹窗)
* @description 只检查权限状态,不弹窗提示
* @param {string} permissionType - 权限类型
* @returns {boolean} 是否有权限
*
* @example
* const { hasPermission } = usePermission()
*
* if (hasPermission(PermissionType.LOGIN)) {
* console.log('用户已登录')
* }
*/
const hasPermission = (permissionType) => {
switch (permissionType) {
case PermissionType.LOGIN:
return isLoggedIn()
case PermissionType.VIP:
return true // 暂时返回 true
case PermissionType.VERIFIED:
return true // 暂时返回 true
default:
return false
}
}
// ========== 返回 ==========
return {
/** 核心方法:通用权限检查 */
checkPermission,
/** 便捷方法:检查登录权限(最常用) */
requireLogin,
requireAction,
/** 工具方法:静默检查是否有权限(不弹窗) */
hasPermission,
/** 工具方法:获取当前登录状态 */
isLoggedIn
}
}