import { defineStore } from 'pinia';
|
import { ref } from 'vue';
|
import type { UserInfo } from '../types/user';
|
import { getToken, setToken, getUserInfo, setUserInfo, clearAuth } from '../utils/auth';
|
import { login as loginApi, getCurrentUserInfo } from '../api/auth';
|
|
export const useAuthStore = defineStore('auth', () => {
|
const token = ref<string | null>(getToken());
|
const userInfo = ref<UserInfo | null>(getUserInfo());
|
const isLoggedIn = ref<boolean>(!!token.value);
|
|
/**
|
* 登录
|
*/
|
async function login(username: string, password: string) {
|
try {
|
const res = await loginApi({ UserName: username, Password: password });
|
if (res.status && res.data) {
|
const { token: newToken, ...user } = res.data;
|
token.value = newToken;
|
userInfo.value = user;
|
isLoggedIn.value = true;
|
setToken(newToken);
|
setUserInfo(user);
|
return true;
|
}
|
return false;
|
} catch (error) {
|
console.error('Login failed:', error);
|
return false;
|
}
|
}
|
|
/**
|
* 登出
|
*/
|
function logout() {
|
token.value = null;
|
userInfo.value = null;
|
isLoggedIn.value = false;
|
clearAuth();
|
}
|
|
/**
|
* 获取当前用户信息
|
*/
|
async function fetchUserInfo() {
|
try {
|
const res = await getCurrentUserInfo();
|
if (res.status && res.data) {
|
userInfo.value = res.data;
|
setUserInfo(res.data);
|
return true;
|
}
|
return false;
|
} catch (error) {
|
console.error('Fetch user info failed:', error);
|
return false;
|
}
|
}
|
|
/**
|
* 更新 Token
|
*/
|
function updateToken(newToken: string) {
|
token.value = newToken;
|
setToken(newToken);
|
}
|
|
return {
|
token,
|
userInfo,
|
isLoggedIn,
|
login,
|
logout,
|
fetchUserInfo,
|
updateToken,
|
};
|
});
|