xiangyixiangqin/miniapp/store/user.js
2026-01-02 18:00:49 +08:00

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 })
}
}
})