51 lines
1.4 KiB
JavaScript
51 lines
1.4 KiB
JavaScript
// 用户 Store:登录态、积分余额(游戏结算后实时刷新)
|
||
import { defineStore } from 'pinia'
|
||
import http from '../api/http'
|
||
|
||
export const useUserStore = defineStore('user', {
|
||
state: () => ({
|
||
token: localStorage.getItem('token') || '',
|
||
user: JSON.parse(localStorage.getItem('user') || 'null'),
|
||
}),
|
||
getters: {
|
||
// 是否已登录
|
||
loggedIn: (s) => !!s.token,
|
||
// 是否超级管理员
|
||
isAdmin: (s) => s.user?.role === 1,
|
||
},
|
||
actions: {
|
||
// 保存登录结果
|
||
setLogin({ token, user }) {
|
||
this.token = token
|
||
this.user = user
|
||
localStorage.setItem('token', token)
|
||
localStorage.setItem('user', JSON.stringify(user))
|
||
},
|
||
// 更新用户信息(积分变化、改资料后)
|
||
setUser(user) {
|
||
this.user = user
|
||
localStorage.setItem('user', JSON.stringify(user))
|
||
},
|
||
// 只更新积分余额(结算响应里带了最新余额)
|
||
setPoints(points) {
|
||
if (this.user) {
|
||
this.user.points = points
|
||
localStorage.setItem('user', JSON.stringify(this.user))
|
||
}
|
||
},
|
||
// 从服务端刷新最新资料
|
||
async refresh() {
|
||
if (!this.token) return
|
||
const user = await http.get('/user/profile')
|
||
this.setUser(user)
|
||
},
|
||
// 退出登录
|
||
logout() {
|
||
this.token = ''
|
||
this.user = null
|
||
localStorage.removeItem('token')
|
||
localStorage.removeItem('user')
|
||
},
|
||
},
|
||
})
|