first commit
This commit is contained in:
116
src/stores/user.ts
Normal file
116
src/stores/user.ts
Normal file
@@ -0,0 +1,116 @@
|
||||
/**
|
||||
* 用户状态管理
|
||||
*/
|
||||
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
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user