Files
codePortAdmin/src/stores/user.ts
2025-12-28 22:09:44 +08:00

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