46 lines
1.5 KiB
TypeScript
46 lines
1.5 KiB
TypeScript
|
|
import { defineStore } from 'pinia'
|
|||
|
|
import { login } from '@/api/auth'
|
|||
|
|
import { ref } from 'vue'
|
|||
|
|
|
|||
|
|
export const useUserStore = defineStore('user', () => {
|
|||
|
|
const token = ref(localStorage.getItem('token') || '')
|
|||
|
|
const role = ref(localStorage.getItem('role') || '') // 持久化角色
|
|||
|
|
const username = ref(localStorage.getItem('username') || '')
|
|||
|
|
|
|||
|
|
const handleLogin = async (loginForm: any) => {
|
|||
|
|
try {
|
|||
|
|
const res = await login(loginForm)
|
|||
|
|
// res.data 结构: { access_token, user: { role, username, ... } }
|
|||
|
|
const data = res.data
|
|||
|
|
|
|||
|
|
token.value = data.access_token
|
|||
|
|
role.value = data.user.role
|
|||
|
|
username.value = data.user.username
|
|||
|
|
|
|||
|
|
// 持久化存储 (简单处理,生产环境建议加密或仅存Token)
|
|||
|
|
localStorage.setItem('token', data.access_token)
|
|||
|
|
localStorage.setItem('role', data.user.role)
|
|||
|
|
localStorage.setItem('username', data.user.username)
|
|||
|
|
|
|||
|
|
return true
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error(error)
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const logout = () => {
|
|||
|
|
token.value = ''
|
|||
|
|
role.value = ''
|
|||
|
|
username.value = ''
|
|||
|
|
localStorage.clear()
|
|||
|
|
window.location.reload()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 辅助函数:判断当前用户是否拥有某些角色
|
|||
|
|
const hasRole = (roles: string[]) => {
|
|||
|
|
return roles.includes(role.value)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return { token, role, username, handleLogin, logout, hasRole }
|
|||
|
|
})
|