- 用户store新增fetchUserInfo action,调用/userInfo接口获取完整用户信息 - 登录页修复:LoginResponse只有token和userId,登录成功后调用fetchUserInfo获取资料 - App.vue启动时若已登录自动刷新用户信息 - 我的页面onShow时刷新用户信息,新增下拉刷新支持 - pages.json为我的页面启用enablePullDownRefresh
165 lines
4.2 KiB
JavaScript
165 lines
4.2 KiB
JavaScript
/**
|
|
* 用户状态管理模块
|
|
*/
|
|
|
|
import { defineStore } from 'pinia'
|
|
import {
|
|
getToken, setToken, removeToken,
|
|
getRefreshToken, setRefreshToken, removeRefreshToken,
|
|
getUserInfo, setUserInfo, removeUserInfo
|
|
} from '../utils/storage.js'
|
|
import { getUserInfo as fetchUserInfoApi } from '../api/user.js'
|
|
|
|
/** 用户等级常量 */
|
|
export const USER_LEVEL = {
|
|
NORMAL: 1, // 普通用户
|
|
PARTNER: 2, // 合伙人
|
|
CHANNEL: 3 // 渠道合伙人
|
|
}
|
|
|
|
export const useUserStore = defineStore('user', {
|
|
state: () => ({
|
|
token: getToken() || '',
|
|
refreshToken: getRefreshToken() || '',
|
|
userId: 0,
|
|
uid: '',
|
|
nickname: '',
|
|
avatar: '',
|
|
phone: '',
|
|
userLevel: USER_LEVEL.NORMAL
|
|
}),
|
|
|
|
getters: {
|
|
/**
|
|
* 是否已登录
|
|
*/
|
|
isLoggedIn: (state) => !!state.token && state.token.length > 0,
|
|
|
|
/**
|
|
* 是否是合伙人(合伙人或渠道合伙人)
|
|
*/
|
|
isPartner: (state) => state.userLevel >= USER_LEVEL.PARTNER,
|
|
|
|
/**
|
|
* 是否是渠道合伙人
|
|
*/
|
|
isChannelPartner: (state) => state.userLevel === USER_LEVEL.CHANNEL
|
|
},
|
|
|
|
actions: {
|
|
/**
|
|
* 登录 - 设置token和用户信息
|
|
* @param {Object} loginData - 登录数据
|
|
* @param {string} loginData.token - 访问令牌
|
|
* @param {string} loginData.refreshToken - 刷新令牌
|
|
* @param {Object} loginData.userInfo - 用户信息
|
|
*/
|
|
login(loginData) {
|
|
const { token, refreshToken, userInfo } = loginData
|
|
|
|
this.token = token
|
|
setToken(token)
|
|
|
|
if (refreshToken) {
|
|
this.refreshToken = refreshToken
|
|
setRefreshToken(refreshToken)
|
|
}
|
|
|
|
if (userInfo) {
|
|
this.updateUserInfo(userInfo)
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 登出 - 清除所有用户状态
|
|
*/
|
|
logout() {
|
|
this.token = ''
|
|
this.refreshToken = ''
|
|
removeToken()
|
|
removeRefreshToken()
|
|
|
|
this.userId = 0
|
|
this.uid = ''
|
|
this.nickname = ''
|
|
this.avatar = ''
|
|
this.phone = ''
|
|
this.userLevel = USER_LEVEL.NORMAL
|
|
removeUserInfo()
|
|
},
|
|
|
|
/**
|
|
* 更新用户信息
|
|
* @param {Object} userInfo - 用户信息
|
|
*/
|
|
updateUserInfo(userInfo) {
|
|
if (!userInfo) return
|
|
|
|
if (userInfo.userId !== undefined) this.userId = userInfo.userId
|
|
if (userInfo.uid !== undefined) this.uid = userInfo.uid
|
|
if (userInfo.nickname !== undefined) this.nickname = userInfo.nickname
|
|
if (userInfo.avatar !== undefined) this.avatar = userInfo.avatar
|
|
if (userInfo.phone !== undefined) this.phone = userInfo.phone
|
|
if (userInfo.userLevel !== undefined) this.userLevel = userInfo.userLevel
|
|
|
|
setUserInfo({
|
|
userId: this.userId,
|
|
uid: this.uid,
|
|
nickname: this.nickname,
|
|
avatar: this.avatar,
|
|
phone: this.phone,
|
|
userLevel: this.userLevel
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 从服务器获取用户信息
|
|
* 登录后、App启动时、下拉刷新时调用
|
|
*/
|
|
async fetchUserInfo() {
|
|
try {
|
|
const res = await fetchUserInfoApi()
|
|
if (res && res.code === 0 && res.data) {
|
|
const d = res.data
|
|
this.updateUserInfo({
|
|
userId: d.Id ?? d.id,
|
|
uid: d.Uid ?? d.uid,
|
|
nickname: d.Nickname ?? d.nickname,
|
|
avatar: d.Headimg ?? d.headimg,
|
|
phone: d.Mobile ?? d.mobile,
|
|
userLevel: d.Vip ?? d.vip ?? USER_LEVEL.NORMAL
|
|
})
|
|
}
|
|
} catch (e) {
|
|
console.warn('获取用户信息失败:', e)
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 从存储恢复用户状态
|
|
*/
|
|
restoreFromStorage() {
|
|
const token = getToken()
|
|
const refreshToken = getRefreshToken()
|
|
const userInfo = getUserInfo()
|
|
|
|
if (token) {
|
|
this.token = token
|
|
}
|
|
|
|
if (refreshToken) {
|
|
this.refreshToken = refreshToken
|
|
}
|
|
|
|
if (userInfo) {
|
|
this.userId = userInfo.userId || 0
|
|
this.uid = userInfo.uid || ''
|
|
this.nickname = userInfo.nickname || ''
|
|
this.avatar = userInfo.avatar || ''
|
|
this.phone = userInfo.phone || ''
|
|
this.userLevel = userInfo.userLevel || USER_LEVEL.NORMAL
|
|
}
|
|
}
|
|
}
|
|
})
|