robot-admin-web/src/stores/user.ts

52 lines
1.2 KiB
TypeScript

import { defineStore } from 'pinia'
import { ref } from 'vue'
import { login as loginApi } from '@/api/auth'
import router from '@/router'
export interface UserInfo {
id: number
name: string
avatar: string
}
export const useUserStore = defineStore('user', () => {
const token = ref(localStorage.getItem('token') || '')
const user = ref<UserInfo | null>(parseStoredUser())
function parseStoredUser(): UserInfo | null {
try {
const stored = localStorage.getItem('user')
return stored ? JSON.parse(stored) : null
} catch {
return null
}
}
async function login(username: string, password: string) {
const res = await loginApi(username, password)
const data = res.data
token.value = data.token
user.value = {
id: data.userVO.id,
name: data.userVO.name,
avatar: data.userVO.avatar,
}
localStorage.setItem('token', data.token)
localStorage.setItem('user', JSON.stringify(user.value))
}
function logout() {
token.value = ''
user.value = null
localStorage.removeItem('token')
localStorage.removeItem('user')
router.push('/login')
}
function isLoggedIn(): boolean {
return !!token.value
}
return { token, user, login, logout, isLoggedIn }
})