117 lines
2.8 KiB
TypeScript
117 lines
2.8 KiB
TypeScript
/**
|
|
* 用户状态管理
|
|
*/
|
|
import { defineStore } from 'pinia'
|
|
import { ref, computed } from 'vue'
|
|
import type { UserInfo, LoginParams, LoginResult, CaptchaResult } from '@/types'
|
|
import { mockGetCaptcha, mockLogin, mockGetUserInfo } from '@/mock'
|
|
|
|
// 是否使用Mock数据
|
|
const USE_MOCK = true
|
|
|
|
export const useUserStore = defineStore('user', () => {
|
|
// 状态
|
|
const token = ref<string>(localStorage.getItem('token') || '')
|
|
const userInfo = ref<UserInfo | null>(null)
|
|
|
|
// 计算属性
|
|
const isLoggedIn = computed(() => !!token.value)
|
|
const username = computed(() => userInfo.value?.username || '')
|
|
const nickname = computed(() => userInfo.value?.nickname || userInfo.value?.username || '')
|
|
const avatar = computed(() => userInfo.value?.avatar || '')
|
|
|
|
// 获取验证码
|
|
async function getCaptcha(): Promise<CaptchaResult> {
|
|
if (USE_MOCK) {
|
|
return await mockGetCaptcha()
|
|
}
|
|
// 真实API调用
|
|
const { request } = await import('@/utils/request')
|
|
const res = await request.get<CaptchaResult>('/auth/captcha')
|
|
return res.data.data
|
|
}
|
|
|
|
// 登录
|
|
async function login(params: LoginParams): Promise<LoginResult> {
|
|
let data: LoginResult
|
|
|
|
if (USE_MOCK) {
|
|
data = await mockLogin(params)
|
|
} else {
|
|
// 真实API调用
|
|
const { request } = await import('@/utils/request')
|
|
const res = await request.post<LoginResult>('/auth/login', params)
|
|
data = res.data.data
|
|
}
|
|
|
|
// 保存token
|
|
token.value = data.token
|
|
localStorage.setItem('token', data.token)
|
|
|
|
// 保存用户信息
|
|
userInfo.value = data.userInfo
|
|
|
|
return data
|
|
}
|
|
|
|
// 登出
|
|
async function logout(): Promise<void> {
|
|
try {
|
|
if (!USE_MOCK) {
|
|
const { request } = await import('@/utils/request')
|
|
await request.post('/auth/logout')
|
|
}
|
|
} catch (error) {
|
|
console.error('登出请求失败:', error)
|
|
} finally {
|
|
// 清除本地状态
|
|
token.value = ''
|
|
userInfo.value = null
|
|
localStorage.removeItem('token')
|
|
}
|
|
}
|
|
|
|
// 获取用户信息
|
|
async function getUserInfo(): Promise<UserInfo> {
|
|
if (USE_MOCK) {
|
|
const info = await mockGetUserInfo()
|
|
userInfo.value = info
|
|
return info
|
|
}
|
|
const { request } = await import('@/utils/request')
|
|
const res = await request.get<UserInfo>('/user/info')
|
|
userInfo.value = res.data.data
|
|
return res.data.data
|
|
}
|
|
|
|
// 设置用户信息
|
|
function setUserInfo(info: UserInfo) {
|
|
userInfo.value = info
|
|
}
|
|
|
|
// 重置状态
|
|
function resetState() {
|
|
token.value = ''
|
|
userInfo.value = null
|
|
localStorage.removeItem('token')
|
|
}
|
|
|
|
return {
|
|
// 状态
|
|
token,
|
|
userInfo,
|
|
// 计算属性
|
|
isLoggedIn,
|
|
username,
|
|
nickname,
|
|
avatar,
|
|
// 方法
|
|
getCaptcha,
|
|
login,
|
|
logout,
|
|
getUserInfo,
|
|
setUserInfo,
|
|
resetState
|
|
}
|
|
})
|