Step F1:前端工程骨架 & 登录鉴权
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
import { defineStore } from "pinia";
|
||||
import { ref } from "vue";
|
||||
import { login as apiLogin, fetchMe } from "../api/auth";
|
||||
import { setToken, clearToken, getToken } from "../utils/auth";
|
||||
import type { UserInfo } from "../types/api";
|
||||
|
||||
export const useAuthStore = defineStore("auth", () => {
|
||||
const token = ref<string | null>(getToken());
|
||||
const user = ref<UserInfo | null>(null);
|
||||
const loading = ref(false);
|
||||
|
||||
const login = async (username: string, password: string) => {
|
||||
loading.value = true;
|
||||
try {
|
||||
const { data } = await apiLogin({ username, password });
|
||||
token.value = data.access_token;
|
||||
setToken(data.access_token);
|
||||
await fetchMeAction();
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
const fetchMeAction = async () => {
|
||||
const { data } = await fetchMe();
|
||||
user.value = data;
|
||||
return data;
|
||||
};
|
||||
|
||||
const logout = () => {
|
||||
token.value = null;
|
||||
user.value = null;
|
||||
clearToken();
|
||||
};
|
||||
|
||||
return {
|
||||
token,
|
||||
user,
|
||||
loading,
|
||||
login,
|
||||
fetchMe: fetchMeAction,
|
||||
logout,
|
||||
};
|
||||
});
|
||||
Reference in New Issue
Block a user