//定义一个大写的State类型 import { IUser, IUserInfo } from "@/types/user.uts" export type State = { uid : number tokens : ITokens | null info : IUserInfo | null profile : UTSJSONObject | null // 如有需要,可增加更多属性 } export type ITokens = { accessToken : string | null accessExpired : number | null refreshToken : string | null refreshExpired : number | null } // 实例化为state const userState = reactive({ uid: 0, tokens: null, info: null, profile: null } as State) export const isLoggedIn = computed(() => { const tokens = getUserToken() if (tokens == null) return false const { accessToken, accessExpired } = tokens return accessToken != null && accessExpired != null && accessExpired > Date.now() }) export const setUserToken = (accessToken : string, accessExpired : number | null, refreshToken : string | null, refreshExpired : number | null) : void => { userState.tokens = { accessToken: accessToken, accessExpired: accessExpired ?? 0, refreshToken: refreshToken ?? userState.tokens?.refreshToken ?? null, refreshExpired: refreshExpired ?? userState.tokens?.refreshExpired ?? 0 } as ITokens uni.setStorageSync('user_tokens', JSON.stringify(userState.tokens)) } export const getUserToken = function () : ITokens | null { try { if (userState.tokens == null) { const storageValue = uni.getStorageSync('user_tokens') // 增加空字符串判断 if (storageValue != null && storageValue.toString().length > 0) { // #ifndef APP const localTokens : string = storageValue.toString() const objcet = JSON.parse(localTokens) as ITokens // #endif // #ifdef APP const localToken = JSON.parseObject(storageValue.toString()) const objcet = localToken?.parse() // #endif userState.tokens = objcet } } if (userState.tokens != null && userState.tokens.accessToken != null) { return userState.tokens } } catch (e) { // 建议清除无效的存储,避免下次继续报错 uni.removeStorageSync('user_tokens') return null } return null } export const clearToken = () => { userState.tokens = null; uni.removeStorageSync('user_tokens') } export const getUserInfo = function () : IUserInfo | null { if (userState.info == null) { const storageValue = uni.getStorageSync('user_info') const localUserInfo : string = storageValue != null ? storageValue.toString() : "" if (localUserInfo.length > 0) { const objcet = JSON.parseObject(localUserInfo) userState.info = objcet?.parse() userState.uid = userState.info?.uid ?? 0 } } if (userState.info != null) { return userState.info } return null } export const setUserInfo = (info : IUserInfo | null) => { userState.info = info if (info != null) { uni.setStorageSync('user_info', JSON.stringify(info)) } else { uni.removeStorageSync('user_info') } } export const initStore = () => { try { const tokens = getUserToken() } catch (e) { console.error('解析用户Token失败', e) } try { const info = getUserInfo() } catch (e) { console.error('解析用户信息失败', e) } } export default userState