87 lines
2.0 KiB
JavaScript
87 lines
2.0 KiB
JavaScript
import { defineStore } from 'pinia'
|
|
import { ref, computed } from 'vue'
|
|
|
|
export const useAuthStore = defineStore('auth', () => {
|
|
// 状态
|
|
const userInfo = ref(null)
|
|
const token = ref(null)
|
|
const isLoggedIn = ref(false)
|
|
|
|
// 计算属性
|
|
const isAuthenticated = computed(() => {
|
|
return isLoggedIn.value && token.value && userInfo.value
|
|
})
|
|
|
|
// 登录
|
|
const login = (userData, authToken) => {
|
|
userInfo.value = userData
|
|
token.value = authToken
|
|
isLoggedIn.value = true
|
|
|
|
// 保存到本地存储
|
|
uni.setStorageSync('userInfo', userData)
|
|
uni.setStorageSync('token', authToken)
|
|
uni.setStorageSync('isLoggedIn', true)
|
|
}
|
|
|
|
// 登出
|
|
const logout = () => {
|
|
userInfo.value = null
|
|
token.value = null
|
|
isLoggedIn.value = false
|
|
|
|
// 清除本地存储
|
|
uni.removeStorageSync('userInfo')
|
|
uni.removeStorageSync('token')
|
|
uni.removeStorageSync('isLoggedIn')
|
|
|
|
console.log('用户已登出')
|
|
}
|
|
|
|
// 初始化认证状态(从本地存储恢复)
|
|
const initAuth = () => {
|
|
try {
|
|
const savedUserInfo = uni.getStorageSync('userInfo')
|
|
const savedToken = uni.getStorageSync('token')
|
|
const savedIsLoggedIn = uni.getStorageSync('isLoggedIn')
|
|
|
|
if (savedUserInfo && savedToken && savedIsLoggedIn) {
|
|
userInfo.value = savedUserInfo
|
|
token.value = savedToken
|
|
isLoggedIn.value = savedIsLoggedIn
|
|
console.log('从本地存储恢复用户状态')
|
|
}
|
|
} catch (error) {
|
|
console.error('初始化认证状态失败:', error)
|
|
}
|
|
}
|
|
|
|
// 检查登录状态
|
|
const checkAuth = () => {
|
|
return isAuthenticated.value
|
|
}
|
|
|
|
// 更新用户信息
|
|
const updateUserInfo = (newUserInfo) => {
|
|
userInfo.value = { ...userInfo.value, ...newUserInfo }
|
|
uni.setStorageSync('userInfo', userInfo.value)
|
|
}
|
|
|
|
return {
|
|
// 状态
|
|
userInfo,
|
|
token,
|
|
isLoggedIn,
|
|
|
|
// 计算属性
|
|
isAuthenticated,
|
|
|
|
// 方法
|
|
login,
|
|
logout,
|
|
initAuth,
|
|
checkAuth,
|
|
updateUserInfo
|
|
}
|
|
})
|