2026-02-08 14:50:38 +08:00

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 }
})