197 lines
5.4 KiB
JavaScript
197 lines
5.4 KiB
JavaScript
/**
|
|
* 用户状态管理模块
|
|
* Requirements: 1.2, 9.1, 9.2
|
|
*/
|
|
|
|
import { defineStore } from 'pinia'
|
|
import {
|
|
getToken, setToken, removeToken,
|
|
getUserInfo, setUserInfo, removeUserInfo,
|
|
getGenderPreference, setGenderPreference
|
|
} from '../utils/storage.js'
|
|
|
|
/**
|
|
* 用户状态定义
|
|
* @typedef {Object} UserState
|
|
* @property {string} token - JWT token
|
|
* @property {number} userId - 用户ID
|
|
* @property {string} nickname - 昵称
|
|
* @property {string} avatar - 头像
|
|
* @property {string} xiangQinNo - 相亲号
|
|
* @property {boolean} isProfileCompleted - 资料是否完成
|
|
* @property {boolean} isMember - 是否会员
|
|
* @property {number} memberLevel - 会员等级
|
|
* @property {boolean} isRealName - 是否实名
|
|
* @property {number} genderPreference - 性别偏好 (1男 2女)
|
|
*/
|
|
|
|
export const useUserStore = defineStore('user', {
|
|
state: () => ({
|
|
token: getToken() || '',
|
|
userId: 0,
|
|
nickname: '',
|
|
avatar: '',
|
|
xiangQinNo: '',
|
|
isProfileCompleted: false,
|
|
isMember: false,
|
|
memberLevel: 0,
|
|
isRealName: false,
|
|
genderPreference: getGenderPreference() || 0
|
|
}),
|
|
|
|
getters: {
|
|
/**
|
|
* 是否已登录
|
|
* Property 17: Login State UI - token为空或无效时显示登录提示
|
|
*/
|
|
isLoggedIn: (state) => !!state.token && state.token.length > 0,
|
|
|
|
/**
|
|
* 是否需要完善资料
|
|
* Property 18: Profile Completion UI - 资料未完成时显示"立即填写"按钮
|
|
*/
|
|
needCompleteProfile: (state) => !state.isProfileCompleted,
|
|
|
|
/**
|
|
* 是否需要选择性别偏好
|
|
*/
|
|
needSelectGender: (state) => state.genderPreference === 0
|
|
},
|
|
|
|
actions: {
|
|
/**
|
|
* 登录 - 设置token和用户信息
|
|
* @param {Object} loginData - 登录返回数据
|
|
* @param {string} loginData.token - JWT token
|
|
* @param {Object} loginData.userInfo - 用户信息
|
|
*/
|
|
login(loginData) {
|
|
const { token, userInfo } = loginData
|
|
|
|
// 存储token
|
|
this.token = token
|
|
setToken(token)
|
|
|
|
// 更新用户信息
|
|
if (userInfo) {
|
|
this.updateUserInfo(userInfo)
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 登出 - 清除所有用户状态
|
|
*/
|
|
logout() {
|
|
// 清除token
|
|
this.token = ''
|
|
removeToken()
|
|
|
|
// 清除用户信息
|
|
this.userId = 0
|
|
this.nickname = ''
|
|
this.avatar = ''
|
|
this.xiangQinNo = ''
|
|
this.isProfileCompleted = false
|
|
this.isMember = false
|
|
this.memberLevel = 0
|
|
this.isRealName = false
|
|
removeUserInfo()
|
|
},
|
|
|
|
/**
|
|
* 更新用户信息
|
|
* @param {Object} userInfo - 用户信息对象
|
|
*/
|
|
updateUserInfo(userInfo) {
|
|
if (!userInfo) return
|
|
|
|
if (userInfo.userId !== undefined) this.userId = userInfo.userId
|
|
if (userInfo.nickname !== undefined) this.nickname = userInfo.nickname
|
|
if (userInfo.avatar !== undefined) this.avatar = userInfo.avatar
|
|
if (userInfo.xiangQinNo !== undefined) this.xiangQinNo = userInfo.xiangQinNo
|
|
if (userInfo.isProfileCompleted !== undefined) this.isProfileCompleted = userInfo.isProfileCompleted
|
|
if (userInfo.isMember !== undefined) this.isMember = userInfo.isMember
|
|
if (userInfo.memberLevel !== undefined) this.memberLevel = userInfo.memberLevel
|
|
if (userInfo.isRealName !== undefined) this.isRealName = userInfo.isRealName
|
|
|
|
// 持久化用户信息
|
|
setUserInfo({
|
|
userId: this.userId,
|
|
nickname: this.nickname,
|
|
avatar: this.avatar,
|
|
xiangQinNo: this.xiangQinNo,
|
|
isProfileCompleted: this.isProfileCompleted,
|
|
isMember: this.isMember,
|
|
memberLevel: this.memberLevel,
|
|
isRealName: this.isRealName
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 设置性别偏好
|
|
* @param {number} gender - 1男 2女
|
|
*/
|
|
setGenderPref(gender) {
|
|
this.genderPreference = gender
|
|
setGenderPreference(gender)
|
|
},
|
|
|
|
/**
|
|
* 从存储恢复用户状态
|
|
*/
|
|
restoreFromStorage() {
|
|
const token = getToken()
|
|
const userInfo = getUserInfo()
|
|
const genderPref = getGenderPreference()
|
|
|
|
if (token) {
|
|
this.token = token
|
|
}
|
|
|
|
if (userInfo) {
|
|
this.userId = userInfo.userId || 0
|
|
this.nickname = userInfo.nickname || ''
|
|
this.avatar = userInfo.avatar || ''
|
|
this.xiangQinNo = userInfo.xiangQinNo || ''
|
|
this.isProfileCompleted = userInfo.isProfileCompleted || false
|
|
this.isMember = userInfo.isMember || false
|
|
this.memberLevel = userInfo.memberLevel || 0
|
|
this.isRealName = userInfo.isRealName || false
|
|
}
|
|
|
|
if (genderPref) {
|
|
this.genderPreference = genderPref
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 设置资料完成状态
|
|
* @param {boolean} completed - 是否完成
|
|
*/
|
|
setProfileCompleted(completed) {
|
|
this.isProfileCompleted = completed
|
|
this.updateUserInfo({ isProfileCompleted: completed })
|
|
},
|
|
|
|
/**
|
|
* 设置会员状态
|
|
* @param {boolean} isMember - 是否会员
|
|
* @param {number} level - 会员等级
|
|
*/
|
|
setMemberStatus(isMember, level = 0) {
|
|
this.isMember = isMember
|
|
this.memberLevel = level
|
|
this.updateUserInfo({ isMember, memberLevel: level })
|
|
},
|
|
|
|
/**
|
|
* 设置实名状态
|
|
* @param {boolean} isRealName - 是否实名
|
|
*/
|
|
setRealNameStatus(isRealName) {
|
|
this.isRealName = isRealName
|
|
this.updateUserInfo({ isRealName })
|
|
}
|
|
}
|
|
})
|