OfficeSystem/store/user.js
2025-11-12 17:09:46 +08:00

143 lines
3.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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