first commit
This commit is contained in:
77
src/composables/useCertification.js
Normal file
77
src/composables/useCertification.js
Normal file
@@ -0,0 +1,77 @@
|
||||
import { isPageRequiresCertification } from '@/constants/menu'
|
||||
import { useUserStore } from '@/stores/user'
|
||||
import { computed, onMounted, ref } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
|
||||
export function useCertification() {
|
||||
const route = useRoute()
|
||||
const userStore = useUserStore()
|
||||
const certificationLoading = ref(true)
|
||||
|
||||
const requiresCertification = computed(() => {
|
||||
return isPageRequiresCertification(route.path)
|
||||
})
|
||||
|
||||
// 改为 computed,自动响应 userStore.isCertified 的变化
|
||||
const isCertified = computed(() => {
|
||||
return userStore.isCertified || false
|
||||
})
|
||||
|
||||
const shouldShowCertificationNotice = computed(() => {
|
||||
return requiresCertification.value && !isCertified.value && !certificationLoading.value
|
||||
})
|
||||
|
||||
const checkCertificationStatus = async () => {
|
||||
try {
|
||||
// 这里应该调用实际的API来检查用户认证状态
|
||||
// 实际项目中需要替换为真实的API调用
|
||||
// 例如:const { data } = await userApi.getCertificationStatus()
|
||||
|
||||
// 模拟API调用延迟
|
||||
await new Promise(resolve => setTimeout(resolve, 500))
|
||||
} catch (error) {
|
||||
console.error('Failed to check certification status:', error)
|
||||
} finally {
|
||||
certificationLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
const callProtectedAPI = async (apiMethod, ...args) => {
|
||||
if (!isCertified.value && requiresCertification.value) {
|
||||
console.warn('API call blocked: User not certified')
|
||||
return null
|
||||
}
|
||||
|
||||
try {
|
||||
return await apiMethod(...args)
|
||||
} catch (error) {
|
||||
if (error.response?.status === 403) {
|
||||
console.warn('API call failed: Access denied - certification required')
|
||||
return null
|
||||
}
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
const canCallAPI = computed(() => {
|
||||
return !requiresCertification.value || isCertified.value
|
||||
})
|
||||
|
||||
onMounted(() => {
|
||||
if (requiresCertification.value) {
|
||||
checkCertificationStatus()
|
||||
} else {
|
||||
certificationLoading.value = false
|
||||
}
|
||||
})
|
||||
|
||||
return {
|
||||
isCertified,
|
||||
certificationLoading,
|
||||
requiresCertification,
|
||||
shouldShowCertificationNotice,
|
||||
checkCertificationStatus,
|
||||
callProtectedAPI,
|
||||
canCallAPI
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user