feat: 功能

This commit is contained in:
2025-11-12 22:45:29 +08:00
parent 94c114a44d
commit fc7d2ccea5
41 changed files with 2406 additions and 343 deletions

View File

@@ -1,6 +1,7 @@
import { ref, computed, watch } from 'vue'
import { defineStore } from 'pinia'
import { getJSON, setJSON, remove } from '@/utils/storage'
import { clearAllTokens } from '@gold/utils/token-manager'
// 本地持久化的 key
const STORAGE_KEY = 'user_store_v1'
@@ -105,7 +106,48 @@ export const useUserStore = defineStore('user', () => {
await persist()
}
/**
* 获取用户信息(从后端)
* 登录成功后调用,更新用户信息
* 使用公共 hook @gold/hooks/web/useUserInfo
*/
async function fetchUserInfo() {
try {
// 使用公共 hook 获取用户信息
const { getUserInfo } = await import('@gold/hooks/web/useUserInfo')
const { getToken } = await import('@gold/utils/token-manager')
const userInfo = await getUserInfo({
getToken,
})
if (userInfo) {
// 更新用户信息
userId.value = String(userInfo.id || userInfo.userId || userId.value)
nickname.value = userInfo.nickname || nickname.value
avatar.value = userInfo.avatar || avatar.value
// 如果有其他字段,也可以更新
if (userInfo.point !== undefined) credits.value = Number(userInfo.point || 0)
if (userInfo.experience !== undefined) {
// experience 可以映射到其他字段,根据实际需求
}
await persist()
}
} catch (error) {
console.error('获取用户信息失败:', error)
// 不抛出错误,避免影响登录流程
}
}
async function logout() {
// 1. 清空所有 token
try {
clearAllTokens()
} catch (e) {
console.error('清空 token 失败:', e)
}
// 2. 清空用户信息
isLoggedIn.value = false
userId.value = ''
nickname.value = ''
@@ -117,13 +159,22 @@ export const useUserStore = defineStore('user', () => {
balance.value = 0
vipLevel.value = 0
credits.value = 0
// 3. 删除本地存储的用户数据
await remove(STORAGE_KEY)
}
// 初始化标志
const isHydrated = ref(false)
// 初始化从本地恢复
hydrateFromStorage()
hydrateFromStorage().then(() => {
isHydrated.value = true
})
return {
// 状态
isHydrated,
// state
isLoggedIn,
userId,
@@ -143,6 +194,7 @@ export const useUserStore = defineStore('user', () => {
loginWithPhone,
loginWithWeChat,
updateBalance,
fetchUserInfo,
logout,
}
})