import { defineStore } from 'pinia' /** * 用户信息 Store * 用于管理用户登录状态、token等信息 */ export const useUserStore = defineStore('user', { state: () => { const storedPrivateView = uni.getStorageSync('privateView') const normalizePrivateView = () => { if (typeof storedPrivateView === 'boolean') return storedPrivateView if (storedPrivateView === '' || storedPrivateView === undefined || storedPrivateView === null) { return false } return !!storedPrivateView } return { // 用户 token token: uni.getStorageSync('token') || '', // 用户信息 userInfo: uni.getStorageSync('userInfo') || null, // token 过期时间(可选) tokenExpireTime: uni.getStorageSync('tokenExpireTime') || null, // 是否启用私有视角 privateView: normalizePrivateView() } }, getters: { /** * 判断是否已登录 */ isLogin: (state) => { return !!state.token }, /** * 获取用户 token */ getToken: (state) => { return state.token }, /** * 获取用户信息 */ getUserInfo: (state) => { return state.userInfo }, /** * 获取私有视角设置 */ getPrivateView: (state) => { return state.privateView }, /** * 判断 token 是否过期(如果设置了过期时间) */ isTokenExpired: (state) => { if (!state.tokenExpireTime) return false return Date.now() > state.tokenExpireTime } }, actions: { /** * 设置 token * @param {string} token - 用户 token * @param {number} expireTime - 过期时间(可选,时间戳) */ setToken(token, expireTime = null) { this.token = token this.tokenExpireTime = expireTime // 同步到本地存储 uni.setStorageSync('token', token) if (expireTime) { uni.setStorageSync('tokenExpireTime', expireTime) } }, /** * 设置用户信息 * @param {object} userInfo - 用户信息对象 */ setUserInfo(userInfo) { this.userInfo = userInfo uni.setStorageSync('userInfo', userInfo) }, /** * 登录 * @param {string} token - 用户 token * @param {object} userInfo - 用户信息(可选) * @param {number} expireTime - 过期时间(可选) */ login(token, userInfo = null, expireTime = null) { this.setToken(token, expireTime) if (userInfo) { this.setUserInfo(userInfo) } }, /** * 退出登录 */ logout() { this.token = '' this.userInfo = null this.tokenExpireTime = null this.privateView = false // 清除本地存储 uni.removeStorageSync('token') uni.removeStorageSync('userInfo') uni.removeStorageSync('tokenExpireTime') uni.removeStorageSync('privateView') }, /** * 更新 token(用于 token 刷新) * @param {string} token - 新的 token * @param {number} expireTime - 过期时间(可选) */ updateToken(token, expireTime = null) { this.setToken(token, expireTime) }, /** * 设置私有视角 * @param {boolean} value */ setPrivateView(value) { this.privateView = value uni.setStorageSync('privateView', value) } } })