stdproject/frontend/src/store/user.ts

110 lines
2.9 KiB
TypeScript
Raw Normal View History

2025-05-30 13:43:31 +08:00
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { login, logout, getCurrentUser } from '@/api/auth'
import { ElMessage } from 'element-plus'
export const useUserStore = defineStore('user', () => {
// 状态
2025-06-19 18:31:46 +08:00
debugger
2025-05-30 13:43:31 +08:00
const token = ref(localStorage.getItem('token') || '')
const userInfo = ref(JSON.parse(localStorage.getItem('userInfo') || 'null'))
const permissions = ref(JSON.parse(localStorage.getItem('permissions') || '[]'))
// 计算属性
const isAuthenticated = computed(() => !!token.value)
const username = computed(() => userInfo.value?.username || '')
const nickname = computed(() => userInfo.value?.nickname || '')
// 登录
const loginAction = async (loginForm) => {
try {
const response = await login(loginForm)
if (response.success) {
const { token: newToken, user, permissions: userPermissions } = response.data
// 保存到状态
token.value = newToken
userInfo.value = user
permissions.value = userPermissions || []
// 保存到本地存储
localStorage.setItem('token', newToken)
localStorage.setItem('userInfo', JSON.stringify(user))
localStorage.setItem('permissions', JSON.stringify(userPermissions || []))
ElMessage.success('登录成功')
return true
} else {
ElMessage.error(response.message || '登录失败')
return false
}
} catch (error) {
console.error('登录错误:', error)
ElMessage.error('登录失败,请检查网络连接')
return false
}
}
// 登出
const logoutAction = async () => {
try {
await logout()
} catch (error) {
console.error('登出错误:', error)
} finally {
// 清除状态
token.value = ''
userInfo.value = null
permissions.value = []
// 清除本地存储
localStorage.removeItem('token')
localStorage.removeItem('userInfo')
localStorage.removeItem('permissions')
ElMessage.success('已退出登录')
}
}
// 获取当前用户信息
const fetchUserInfo = async () => {
try {
const response = await getCurrentUser()
if (response.success) {
userInfo.value = response.data
localStorage.setItem('userInfo', JSON.stringify(response.data))
}
} catch (error) {
console.error('获取用户信息错误:', error)
}
}
// 检查权限
const hasPermission = (permission) => {
return permissions.value.includes(permission)
}
// 检查角色
const hasRole = (role) => {
return userInfo.value?.roles?.includes(role) || false
}
return {
// 状态
token,
userInfo,
permissions,
// 计算属性
isAuthenticated,
username,
nickname,
// 方法
loginAction,
logoutAction,
fetchUserInfo,
hasPermission,
hasRole
}
})