2026-01-16 22:04:12 +08:00
|
|
|
import { defineStore } from 'pinia'
|
|
|
|
|
import { getMemberProfile } from '~/api/member'
|
2026-04-07 11:01:11 +08:00
|
|
|
import { navigateTo } from 'nuxt/app'
|
2026-01-16 22:04:12 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
interface Member {
|
|
|
|
|
token: string | null
|
2026-04-07 11:01:11 +08:00
|
|
|
refreshToken: string | null
|
2026-01-16 22:04:12 +08:00
|
|
|
info: Record<string, any> | null,
|
2026-04-07 11:01:11 +08:00
|
|
|
loginPopup: boolean
|
2026-01-16 22:04:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export const useMemberStore = defineStore('member', {
|
|
|
|
|
state: (): Member => {
|
|
|
|
|
return {
|
2026-04-07 11:01:11 +08:00
|
|
|
token: '',
|
|
|
|
|
refreshToken: '',
|
|
|
|
|
info: null,
|
|
|
|
|
loginPopup: false
|
2026-01-16 22:04:12 +08:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
actions: {
|
2026-04-07 11:01:11 +08:00
|
|
|
async setToken(token: string, refreshToken: string) {
|
2026-01-16 22:04:12 +08:00
|
|
|
this.token = token
|
2026-04-07 11:01:11 +08:00
|
|
|
this.refreshToken = refreshToken
|
|
|
|
|
this.info = null
|
|
|
|
|
// 静默获取用户信息,不阻塞 token 设置
|
|
|
|
|
// 如果失败不执行 logout,保留 refreshToken 以便后续刷新
|
|
|
|
|
this.getMemberInfoSilent()
|
2026-01-16 22:04:12 +08:00
|
|
|
},
|
|
|
|
|
async getMemberInfo() {
|
2026-04-07 11:01:11 +08:00
|
|
|
if (!this.token) {
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-01-16 22:04:12 +08:00
|
|
|
await getMemberProfile()
|
|
|
|
|
.then((res: any) => {
|
2026-04-07 11:01:11 +08:00
|
|
|
this.info = res || null
|
2026-01-16 22:04:12 +08:00
|
|
|
})
|
|
|
|
|
.catch((err) => {
|
2026-04-07 11:01:11 +08:00
|
|
|
console.error('[getMemberInfo] Error:', err)
|
|
|
|
|
// 这里不调用 logout,保留 refreshToken 以便 token 刷新机制工作
|
|
|
|
|
this.info = null
|
2026-01-16 22:04:12 +08:00
|
|
|
})
|
|
|
|
|
},
|
2026-04-07 11:01:11 +08:00
|
|
|
async getMemberInfoSilent() {
|
|
|
|
|
// 静默获取用户信息,不抛出错误
|
|
|
|
|
if (!this.token) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
const res: any = await getMemberProfile()
|
|
|
|
|
this.info = res || null
|
|
|
|
|
} catch (err) {
|
|
|
|
|
console.error('[getMemberInfoSilent] Error:', err)
|
|
|
|
|
// 不执行 logout,只清除 info
|
|
|
|
|
this.info = null
|
|
|
|
|
}
|
2026-01-16 22:04:12 +08:00
|
|
|
},
|
2026-04-07 11:01:11 +08:00
|
|
|
logout() {
|
|
|
|
|
this.token = ''
|
|
|
|
|
this.refreshToken = ''
|
|
|
|
|
this.info = null
|
|
|
|
|
this.loginPopup = false
|
|
|
|
|
// 跳转到首页
|
|
|
|
|
navigateTo('/')
|
|
|
|
|
},
|
|
|
|
|
logOpen() {
|
2026-01-16 22:04:12 +08:00
|
|
|
this.loginPopup = true
|
|
|
|
|
},
|
2026-04-07 11:01:11 +08:00
|
|
|
logClose() {
|
2026-01-16 22:04:12 +08:00
|
|
|
this.loginPopup = false
|
|
|
|
|
}
|
2026-04-07 11:01:11 +08:00
|
|
|
},
|
|
|
|
|
persist: {
|
|
|
|
|
key: 'member-store',
|
|
|
|
|
pick: ['token', 'refreshToken', 'info', 'loginPopup']
|
2026-01-16 22:04:12 +08:00
|
|
|
}
|
|
|
|
|
})
|