42 lines
1.2 KiB
JavaScript
42 lines
1.2 KiB
JavaScript
import { defineStore } from 'pinia'
|
|
import { ref } from 'vue'
|
|
import { authApi } from '../api'
|
|
|
|
export const useAuthStore = defineStore('auth', () => {
|
|
const user = ref(null)
|
|
const token = ref(localStorage.getItem('token') || '')
|
|
|
|
async function login(username, password) {
|
|
const res = await authApi.login({ username, password })
|
|
token.value = res.access_token
|
|
localStorage.setItem('token', res.access_token)
|
|
// 登录后立即获取用户信息,失败不影响登录流程
|
|
try {
|
|
user.value = await authApi.me()
|
|
} catch (e) {
|
|
console.error('fetchUser after login failed:', e)
|
|
}
|
|
}
|
|
|
|
async function fetchUser() {
|
|
if (!token.value) return
|
|
try {
|
|
user.value = await authApi.me()
|
|
} catch {
|
|
logout()
|
|
}
|
|
}
|
|
|
|
function logout() {
|
|
user.value = null
|
|
token.value = ''
|
|
localStorage.removeItem('token')
|
|
}
|
|
|
|
const isOwner = () => user.value?.role === 'Owner'
|
|
const isSupervisor = () => ['Owner', '主管'].includes(user.value?.role)
|
|
const isLeaderOrAbove = () => ['Owner', '主管', '组长'].includes(user.value?.role)
|
|
|
|
return { user, token, login, fetchUser, logout, isOwner, isSupervisor, isLeaderOrAbove }
|
|
})
|