perf: 优化个人中心会员卡进度展示

This commit is contained in:
richarjiang
2026-09-09 11:27:03 +08:00
parent 726c65f0f0
commit 57107c02dc
6 changed files with 213 additions and 120 deletions

View File

@@ -26,6 +26,13 @@ export const useUserStore = defineStore('user', () => {
const user = ref<UserProfileResponse | null>(null)
const stats = ref<UserStatsResponse | null>(null)
const memberships = ref<readonly MembershipWithCardType[]>([])
const membershipsLoading = ref(false)
const membershipsLoaded = ref(false)
const membershipsError = ref(false)
const statsLoading = ref(false)
const statsError = ref(false)
let membershipRequestId = 0
let statsRequestId = 0
const token = ref<string>(uni.getStorageSync('token') as string || '')
// Getters
@@ -82,23 +89,42 @@ export const useUserStore = defineStore('user', () => {
}
}
async function fetchStats() {
if (!isLoggedIn()) return
async function fetchStats(): Promise<boolean> {
if (!isLoggedIn()) return false
const id = ++statsRequestId
const session = token.value
statsLoading.value = true
statsError.value = false
try {
stats.value = await get<UserStatsResponse>('/user/stats')
} catch (err) {
console.error('Fetch stats failed:', err)
const result = await get<UserStatsResponse>('/user/stats')
if (id !== statsRequestId || session !== token.value) return false
stats.value = result
return true
} catch {
if (id === statsRequestId && session === token.value) statsError.value = true
return false
} finally {
if (id === statsRequestId && session === token.value) statsLoading.value = false
}
}
async function fetchMemberships(): Promise<boolean> {
if (!isLoggedIn()) return false
const id = ++membershipRequestId
const session = token.value
membershipsLoading.value = true
membershipsError.value = false
try {
memberships.value = await get<MembershipWithCardType[]>('/membership/my')
const result = await get<MembershipWithCardType[]>('/membership/my')
if (id !== membershipRequestId || session !== token.value) return false
memberships.value = [...result]
membershipsLoaded.value = true
return true
} catch (err) {
console.error('Fetch memberships failed:', err)
} catch {
if (id === membershipRequestId && session === token.value) membershipsError.value = true
return false
} finally {
if (id === membershipRequestId && session === token.value) membershipsLoading.value = false
}
}
@@ -122,6 +148,13 @@ export const useUserStore = defineStore('user', () => {
}
function clearSession() {
membershipRequestId++
statsRequestId++
membershipsLoading.value = false
membershipsLoaded.value = false
membershipsError.value = false
statsLoading.value = false
statsError.value = false
token.value = ''
useInviteStore().reset()
user.value = null
@@ -138,6 +171,11 @@ export const useUserStore = defineStore('user', () => {
setUnauthorizedHandler(clearSession)
return {
membershipsLoading,
membershipsLoaded,
membershipsError,
statsLoading,
statsError,
user,
stats,
memberships,