66 lines
1.5 KiB
TypeScript
66 lines
1.5 KiB
TypeScript
import { ref, computed } from 'vue'
|
|
import { defineStore } from 'pinia'
|
|
|
|
export interface UserInfo {
|
|
headerImg?: string
|
|
nickName?: string
|
|
userName?: string
|
|
[key: string]: unknown
|
|
}
|
|
|
|
const STORAGE_KEY = 'poly-user'
|
|
|
|
function loadStored(): { token: string; user: UserInfo } | null {
|
|
try {
|
|
const raw = localStorage.getItem(STORAGE_KEY)
|
|
if (!raw) return null
|
|
return JSON.parse(raw) as { token: string; user: UserInfo }
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
function saveToStorage(token: string, user: UserInfo) {
|
|
try {
|
|
localStorage.setItem(STORAGE_KEY, JSON.stringify({ token, user }))
|
|
} catch {
|
|
//
|
|
}
|
|
}
|
|
|
|
function clearStorage() {
|
|
try {
|
|
localStorage.removeItem(STORAGE_KEY)
|
|
} catch {
|
|
//
|
|
}
|
|
}
|
|
|
|
export const useUserStore = defineStore('user', () => {
|
|
const stored = loadStored()
|
|
const token = ref<string>(stored?.token ?? '')
|
|
const user = ref<UserInfo | null>(stored?.user ?? null)
|
|
|
|
const isLoggedIn = computed(() => !!token.value && !!user.value)
|
|
const avatarUrl = computed(() => user.value?.headerImg ?? '')
|
|
/** 钱包余额显示,如 "0.00",可从接口更新 */
|
|
const balance = ref<string>('0.00')
|
|
|
|
function setUser(loginData: { token?: string; user?: UserInfo }) {
|
|
const t = loginData.token ?? ''
|
|
const u = loginData.user ?? null
|
|
token.value = t
|
|
user.value = u
|
|
if (t && u) saveToStorage(t, u)
|
|
else clearStorage()
|
|
}
|
|
|
|
function logout() {
|
|
token.value = ''
|
|
user.value = null
|
|
clearStorage()
|
|
}
|
|
|
|
return { token, user, isLoggedIn, avatarUrl, balance, setUser, logout }
|
|
})
|