|
@@ -1,32 +1,34 @@
|
|
|
-// stores/user.ts - 管理用户信息、登录状态、角色权限等
|
|
|
+// stores/user.ts
|
|
|
import { defineStore } from 'pinia'
|
|
|
import Taro from '@tarojs/taro'
|
|
|
-import { userService} from '@/services/user'
|
|
|
+import { userService } from '@/services/user'
|
|
|
import { type UserInfo, UserRole } from '@/types/user'
|
|
|
import { ref, computed } from 'vue'
|
|
|
|
|
|
export const useUserStore = defineStore('user', () => {
|
|
|
- // 基本状态
|
|
|
+ // 基本用户信息
|
|
|
const openid = ref('')
|
|
|
const nickname = ref('')
|
|
|
const avatar = ref('')
|
|
|
- const role = ref<UserRole | undefined>(UserRole.USER)
|
|
|
+ const role = ref<UserRole>(UserRole.USER)
|
|
|
const isRegistered = ref(false)
|
|
|
+
|
|
|
+ // 当前状态
|
|
|
const currentRoom = ref<string | null>(null)
|
|
|
const currentGameId = ref<string | null>(null)
|
|
|
const loading = ref(false)
|
|
|
const error = ref<string | null>(null)
|
|
|
|
|
|
// 经验值系统
|
|
|
- const points = ref(0) // 积分
|
|
|
- const exp = ref(0) // 经验值
|
|
|
- const level = ref(1) // 等级
|
|
|
- const nextLevelExp = ref(100) // 下一级所需经验
|
|
|
+ const points = ref(0)
|
|
|
+ const exp = ref(0)
|
|
|
+ const level = ref(1)
|
|
|
+ const nextLevelExp = ref(100)
|
|
|
|
|
|
// 游戏统计数据
|
|
|
- const gameCount = ref(0) // 参与游戏数量
|
|
|
- const roomCount = ref(0) // 创建房间数量
|
|
|
-
|
|
|
+ const gameCount = ref(0)
|
|
|
+ const roomCount = ref(0)
|
|
|
+
|
|
|
// 计算属性
|
|
|
const userInfo = computed<UserInfo>(() => ({
|
|
|
openid: openid.value,
|
|
@@ -35,35 +37,33 @@ export const useUserStore = defineStore('user', () => {
|
|
|
role: role.value
|
|
|
}))
|
|
|
|
|
|
- // 经验值百分比
|
|
|
const expPercentage = computed(() => {
|
|
|
return (exp.value / nextLevelExp.value) * 100
|
|
|
})
|
|
|
-
|
|
|
- // 保存用户状态到本地存储
|
|
|
+
|
|
|
+ // 保存/加载用户数据
|
|
|
function saveUserToStorage() {
|
|
|
const userData = {
|
|
|
openid: openid.value,
|
|
|
nickname: nickname.value,
|
|
|
avatar: avatar.value,
|
|
|
role: role.value,
|
|
|
- currentRoom: currentRoom.value,
|
|
|
isRegistered: isRegistered.value,
|
|
|
- // 经验值系统数据
|
|
|
+ currentRoom: currentRoom.value,
|
|
|
+ currentGameId: currentGameId.value,
|
|
|
points: points.value,
|
|
|
exp: exp.value,
|
|
|
level: level.value,
|
|
|
nextLevelExp: nextLevelExp.value,
|
|
|
- // 统计数据
|
|
|
gameCount: gameCount.value,
|
|
|
roomCount: roomCount.value
|
|
|
}
|
|
|
|
|
|
Taro.setStorageSync('userInfo', JSON.stringify(userData))
|
|
|
+ console.log('userData', userData)
|
|
|
return userData
|
|
|
}
|
|
|
|
|
|
- // 从本地存储加载用户状态
|
|
|
function loadUserFromStorage(): boolean {
|
|
|
try {
|
|
|
const userInfo = Taro.getStorageSync('userInfo')
|
|
@@ -76,17 +76,17 @@ export const useUserStore = defineStore('user', () => {
|
|
|
role.value = data.role || UserRole.USER
|
|
|
isRegistered.value = !!data.isRegistered
|
|
|
currentRoom.value = data.currentRoom || null
|
|
|
+ currentGameId.value = data.currentGameId || null
|
|
|
|
|
|
- // 加载经验值系统数据
|
|
|
points.value = data.points || 0
|
|
|
exp.value = data.exp || 0
|
|
|
level.value = data.level || 1
|
|
|
nextLevelExp.value = data.nextLevelExp || 100
|
|
|
|
|
|
- // 加载统计数据
|
|
|
gameCount.value = data.gameCount || 0
|
|
|
roomCount.value = data.roomCount || 0
|
|
|
|
|
|
+ console.log('loadUserFromStorage', userInfo)
|
|
|
return true
|
|
|
} catch (error) {
|
|
|
console.error('加载用户信息失败:', error)
|
|
@@ -94,26 +94,46 @@ export const useUserStore = defineStore('user', () => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 初始化用户信息
|
|
|
+ // 设置用户数据 - 用于从API设置完整用户数据
|
|
|
+ function setUserData(userData: any) {
|
|
|
+ if (!userData) return
|
|
|
+
|
|
|
+ openid.value = userData.openid || openid.value
|
|
|
+ nickname.value = userData.nickname || nickname.value
|
|
|
+ avatar.value = userData.avatar || avatar.value
|
|
|
+ role.value = userData.role || role.value
|
|
|
+ isRegistered.value = userData.isRegistered !== undefined ? userData.isRegistered : isRegistered.value
|
|
|
+
|
|
|
+ // 设置可选的扩展数据
|
|
|
+ if (userData.points !== undefined) points.value = userData.points
|
|
|
+ if (userData.exp !== undefined) exp.value = userData.exp
|
|
|
+ if (userData.level !== undefined) level.value = userData.level
|
|
|
+ if (userData.gameCount !== undefined) gameCount.value = userData.gameCount
|
|
|
+ if (userData.roomCount !== undefined) roomCount.value = userData.roomCount
|
|
|
+
|
|
|
+ saveUserToStorage()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化用户
|
|
|
async function initUser() {
|
|
|
loading.value = true
|
|
|
error.value = null
|
|
|
-
|
|
|
+
|
|
|
try {
|
|
|
// 1. 尝试从本地存储加载
|
|
|
const localDataLoaded = loadUserFromStorage()
|
|
|
|
|
|
- // 2. 如果本地有数据且已注册,直接返回成功
|
|
|
+ // 2. 如果已有数据且注册,直接返回
|
|
|
if (localDataLoaded && isRegistered.value) {
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
- // 3. 如果本地有openid但未注册,保持现状
|
|
|
- if (localDataLoaded && openid.value && !isRegistered.value) {
|
|
|
+ // 3. 如果有openid但未注册,保持现状
|
|
|
+ if (localDataLoaded && openid.value) {
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
- // 4. 否则,进行静默登录获取openid
|
|
|
+ // 4. 否则,执行静默登录获取openid
|
|
|
return await silentLogin()
|
|
|
} catch (e) {
|
|
|
console.error('初始化用户失败:', e)
|
|
@@ -126,32 +146,22 @@ export const useUserStore = defineStore('user', () => {
|
|
|
|
|
|
// 静默登录 - 仅获取openid
|
|
|
async function silentLogin() {
|
|
|
- loading.value = true
|
|
|
- error.value = null
|
|
|
-
|
|
|
try {
|
|
|
- const loginRes = await Taro.login()
|
|
|
- if (!loginRes.code) {
|
|
|
- error.value = '登录失败'
|
|
|
- return false
|
|
|
- }
|
|
|
+ // userService处理mock或真实环境逻辑
|
|
|
+ const result = await userService.login()
|
|
|
|
|
|
- const result = await userService.getOpenId(loginRes.code)
|
|
|
- if (!result.success || !result.data) {
|
|
|
- error.value = result.message || '获取OpenID失败'
|
|
|
+ if (result.success && result.data) {
|
|
|
+ // 设置用户数据
|
|
|
+ setUserData(result.data)
|
|
|
+ return true
|
|
|
+ } else {
|
|
|
+ error.value = result.message || '登录失败'
|
|
|
return false
|
|
|
}
|
|
|
-
|
|
|
- // 设置openid
|
|
|
- openid.value = result.data.openid
|
|
|
- saveUserToStorage()
|
|
|
- return true
|
|
|
} catch (e) {
|
|
|
console.error('静默登录失败:', e)
|
|
|
error.value = '静默登录失败'
|
|
|
return false
|
|
|
- } finally {
|
|
|
- loading.value = false
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -167,43 +177,16 @@ export const useUserStore = defineStore('user', () => {
|
|
|
if (!loginSuccess) return false
|
|
|
}
|
|
|
|
|
|
- // 微信环境使用getUserProfile
|
|
|
- if (process.env.TARO_ENV === 'weapp') {
|
|
|
- const profileRes = await Taro.getUserProfile({
|
|
|
- desc: '用于完善用户资料'
|
|
|
- })
|
|
|
-
|
|
|
- if (!profileRes.userInfo) {
|
|
|
- error.value = '获取用户信息失败'
|
|
|
- return false
|
|
|
- }
|
|
|
-
|
|
|
- // 更新本地状态
|
|
|
- nickname.value = profileRes.userInfo.nickName
|
|
|
- avatar.value = profileRes.userInfo.avatarUrl
|
|
|
- isRegistered.value = true
|
|
|
-
|
|
|
- // 保存到本地存储
|
|
|
- saveUserToStorage()
|
|
|
-
|
|
|
- // 同步到云端 - 使用Service层处理
|
|
|
- await userService.saveUserToCloud({
|
|
|
- openid: openid.value,
|
|
|
- nickname: nickname.value,
|
|
|
- avatar: avatar.value,
|
|
|
- role: role.value
|
|
|
- })
|
|
|
-
|
|
|
+ // 调用userService处理注册逻辑(内部处理mock/真实环境)
|
|
|
+ const result = await userService.register(openid.value)
|
|
|
+
|
|
|
+ if (result.success && result.data) {
|
|
|
+ // 设置用户数据
|
|
|
+ setUserData(result.data)
|
|
|
return true
|
|
|
} else {
|
|
|
- // 非微信环境模拟注册
|
|
|
- nickname.value = '模拟用户_' + Date.now().toString().slice(-4)
|
|
|
- avatar.value = 'https://example.com/avatar.jpg'
|
|
|
- isRegistered.value = true
|
|
|
-
|
|
|
- // 保存到本地
|
|
|
- saveUserToStorage()
|
|
|
- return true
|
|
|
+ error.value = result.message || '注册失败'
|
|
|
+ return false
|
|
|
}
|
|
|
} catch (e) {
|
|
|
console.error('用户注册失败:', e)
|
|
@@ -214,94 +197,83 @@ export const useUserStore = defineStore('user', () => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 设置用户角色
|
|
|
- function setRole(newRole: UserRole) {
|
|
|
- role.value = newRole
|
|
|
- saveUserToStorage()
|
|
|
- }
|
|
|
-
|
|
|
- // 设置当前房间
|
|
|
- function setCurrentRoom(roomId: string) {
|
|
|
- currentRoom.value = roomId
|
|
|
- saveUserToStorage()
|
|
|
- }
|
|
|
-
|
|
|
- // 退出登录
|
|
|
- function logout() {
|
|
|
- openid.value = ''
|
|
|
- nickname.value = ''
|
|
|
- avatar.value = ''
|
|
|
- isRegistered.value = false
|
|
|
- currentRoom.value = null
|
|
|
- currentGameId.value = null
|
|
|
-
|
|
|
- // 清除本地存储
|
|
|
- Taro.removeStorageSync('userInfo')
|
|
|
- }
|
|
|
-
|
|
|
- // 设置当前游戏
|
|
|
- function setCurrentGame(gameId: string | null) {
|
|
|
- currentGameId.value = gameId
|
|
|
- }
|
|
|
-
|
|
|
- // 重置用户角色到普通用户
|
|
|
- function resetToNormalUser() {
|
|
|
- role.value = UserRole.USER
|
|
|
- saveUserToStorage()
|
|
|
- }
|
|
|
-
|
|
|
- // 清除房间和游戏信息
|
|
|
- function clearGameSession() {
|
|
|
- currentRoom.value = null
|
|
|
- currentGameId.value = null
|
|
|
- saveUserToStorage()
|
|
|
- }
|
|
|
-
|
|
|
- // 经验值系统相关方法
|
|
|
-
|
|
|
- // 增加积分
|
|
|
+ // 经验值系统
|
|
|
function addPoints(amount: number) {
|
|
|
points.value += amount
|
|
|
saveUserToStorage()
|
|
|
}
|
|
|
|
|
|
- // 增加经验值
|
|
|
function addExp(amount: number) {
|
|
|
exp.value += amount
|
|
|
-
|
|
|
- // 检查是否升级
|
|
|
checkLevelUp()
|
|
|
-
|
|
|
saveUserToStorage()
|
|
|
return { level: level.value, exp: exp.value, nextLevelExp: nextLevelExp.value }
|
|
|
}
|
|
|
|
|
|
- // 检查是否升级
|
|
|
function checkLevelUp() {
|
|
|
while (exp.value >= nextLevelExp.value) {
|
|
|
- // 升级
|
|
|
level.value++
|
|
|
exp.value -= nextLevelExp.value
|
|
|
-
|
|
|
- // 调整下一级所需经验值 (每级增加20%)
|
|
|
nextLevelExp.value = Math.floor(nextLevelExp.value * 1.2)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 统计数据相关方法
|
|
|
-
|
|
|
- // 记录参与游戏
|
|
|
+ // 统计数据
|
|
|
function recordGameParticipation() {
|
|
|
gameCount.value++
|
|
|
saveUserToStorage()
|
|
|
}
|
|
|
|
|
|
- // 记录创建房间
|
|
|
function recordRoomCreation() {
|
|
|
roomCount.value++
|
|
|
saveUserToStorage()
|
|
|
}
|
|
|
|
|
|
+ // 简单setter方法
|
|
|
+ function setCurrentRoom(roomId: string) {
|
|
|
+ currentRoom.value = roomId
|
|
|
+ saveUserToStorage()
|
|
|
+ }
|
|
|
+
|
|
|
+ function setCurrentGame(gameId: string | null) {
|
|
|
+ currentGameId.value = gameId
|
|
|
+ saveUserToStorage()
|
|
|
+ }
|
|
|
+
|
|
|
+ function setRole(newRole: UserRole) {
|
|
|
+ role.value = newRole
|
|
|
+ saveUserToStorage()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 重置/清除
|
|
|
+ function logout() {
|
|
|
+ openid.value = ''
|
|
|
+ nickname.value = ''
|
|
|
+ avatar.value = ''
|
|
|
+ isRegistered.value = false
|
|
|
+ currentRoom.value = null
|
|
|
+ currentGameId.value = null
|
|
|
+ points.value = 0
|
|
|
+ exp.value = 0
|
|
|
+ level.value = 1
|
|
|
+ nextLevelExp.value = 100
|
|
|
+ gameCount.value = 0
|
|
|
+ roomCount.value = 0
|
|
|
+
|
|
|
+ Taro.removeStorageSync('userInfo')
|
|
|
+ }
|
|
|
+
|
|
|
+ function resetToNormalUser() {
|
|
|
+ role.value = UserRole.USER
|
|
|
+ saveUserToStorage()
|
|
|
+ }
|
|
|
+
|
|
|
+ function clearGameSession() {
|
|
|
+ currentRoom.value = null
|
|
|
+ currentGameId.value = null
|
|
|
+ saveUserToStorage()
|
|
|
+ }
|
|
|
+
|
|
|
return {
|
|
|
// 状态
|
|
|
openid,
|
|
@@ -329,11 +301,12 @@ export const useUserStore = defineStore('user', () => {
|
|
|
// 方法
|
|
|
initUser,
|
|
|
registerUser,
|
|
|
+ silentLogin,
|
|
|
setRole,
|
|
|
setCurrentRoom,
|
|
|
- logout,
|
|
|
setCurrentGame,
|
|
|
- resetToNormalUser, // 方法名称更新
|
|
|
+ logout,
|
|
|
+ resetToNormalUser,
|
|
|
clearGameSession,
|
|
|
|
|
|
// 经验值系统方法
|