171 lines
3.7 KiB
TypeScript
171 lines
3.7 KiB
TypeScript
/**
|
|
* 用户状态管理
|
|
* 使用 uni-app x 的响应式系统
|
|
*/
|
|
|
|
import type { UserInfo } from '../api/auth'
|
|
import { clearHomeStudentProfile } from './home'
|
|
|
|
// 用户状态类型
|
|
type UserState = {
|
|
userInfo: UserInfo | null
|
|
token: string
|
|
isLoggedIn: boolean
|
|
rememberPassword: boolean
|
|
rememberedPhone: string
|
|
rememberedPassword: string
|
|
}
|
|
|
|
// 创建响应式用户状态
|
|
const userState = reactive<UserState>({
|
|
userInfo: null,
|
|
token: '',
|
|
isLoggedIn: false,
|
|
rememberPassword: false,
|
|
rememberedPhone: '',
|
|
rememberedPassword: ''
|
|
})
|
|
|
|
/**
|
|
* 初始化用户状态
|
|
* 从本地存储恢复登录状态和记住密码信息
|
|
*/
|
|
export function initUserStore() {
|
|
// 恢复登录状态
|
|
const token = uni.getStorageSync('token') as string
|
|
const userInfo = uni.getStorageSync('userInfo') as UserInfo | null
|
|
|
|
if (token && userInfo) {
|
|
userState.token = token
|
|
userState.userInfo = userInfo
|
|
userState.isLoggedIn = true
|
|
}
|
|
|
|
// 恢复记住密码信息
|
|
const rememberInfo = uni.getStorageSync('rememberInfo') as any
|
|
if (rememberInfo && rememberInfo.remember) {
|
|
userState.rememberPassword = true
|
|
userState.rememberedPhone = rememberInfo.phone
|
|
userState.rememberedPassword = rememberInfo.password
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 设置用户信息
|
|
*/
|
|
export function setUserInfo(userInfo: UserInfo) {
|
|
userState.userInfo = userInfo
|
|
userState.token = userInfo.token
|
|
userState.isLoggedIn = true
|
|
|
|
// 保存到本地存储
|
|
uni.setStorageSync('token', userInfo.token)
|
|
uni.setStorageSync('refreshToken', userInfo.refreshToken)
|
|
uni.setStorageSync('userInfo', userInfo)
|
|
}
|
|
|
|
/**
|
|
* 保存记住密码信息
|
|
*/
|
|
export function saveRememberInfo(phone: string, password: string, remember: boolean) {
|
|
userState.rememberPassword = remember
|
|
userState.rememberedPhone = phone
|
|
userState.rememberedPassword = password
|
|
|
|
if (remember) {
|
|
uni.setStorageSync('rememberInfo', {
|
|
phone,
|
|
password,
|
|
remember: true
|
|
})
|
|
} else {
|
|
uni.removeStorageSync('rememberInfo')
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取记住的密码信息
|
|
*/
|
|
export function getRememberInfo(): { phone: string, password: string, remember: boolean } {
|
|
return {
|
|
phone: userState.rememberedPhone,
|
|
password: userState.rememberedPassword,
|
|
remember: userState.rememberPassword
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 清除用户状态
|
|
*/
|
|
export function clearUserInfo() {
|
|
userState.userInfo = null
|
|
userState.token = ''
|
|
userState.isLoggedIn = false
|
|
|
|
// 清除本地存储
|
|
uni.removeStorageSync('token')
|
|
uni.removeStorageSync('refreshToken')
|
|
uni.removeStorageSync('userInfo')
|
|
clearHomeStudentProfile()
|
|
}
|
|
|
|
/**
|
|
* 退出登录
|
|
*/
|
|
export function logout() {
|
|
clearUserInfo()
|
|
|
|
// 跳转到登录页
|
|
uni.reLaunch({
|
|
url: '/pages/login/index'
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 获取用户信息
|
|
*/
|
|
export function getUserInfo(): UserInfo | null {
|
|
return userState.userInfo
|
|
}
|
|
|
|
/**
|
|
* 获取Token
|
|
*/
|
|
export function getToken(): string {
|
|
return userState.token
|
|
}
|
|
|
|
/**
|
|
* 获取登录状态
|
|
*/
|
|
export function getIsLoggedIn(): boolean {
|
|
return userState.isLoggedIn
|
|
}
|
|
|
|
/**
|
|
* 更新Token
|
|
*/
|
|
export function updateToken(token: string, refreshToken: string) {
|
|
userState.token = token
|
|
uni.setStorageSync('token', token)
|
|
uni.setStorageSync('refreshToken', refreshToken)
|
|
|
|
if (userState.userInfo !== null) {
|
|
userState.userInfo.token = token
|
|
userState.userInfo.refreshToken = refreshToken
|
|
uni.setStorageSync('userInfo', userState.userInfo)
|
|
}
|
|
}
|
|
|
|
// 导出用户状态(只读)
|
|
export function useUserStore() {
|
|
return {
|
|
userInfo: computed(() => userState.userInfo),
|
|
token: computed(() => userState.token),
|
|
isLoggedIn: computed(() => userState.isLoggedIn),
|
|
rememberPassword: computed(() => userState.rememberPassword),
|
|
rememberedPhone: computed(() => userState.rememberedPhone),
|
|
rememberedPassword: computed(() => userState.rememberedPassword)
|
|
}
|
|
}
|