2025-12-19 15:54:26 +08:00
|
|
|
import Cookies from "js-cookie";
|
|
|
|
|
import { defineStore } from "pinia";
|
|
|
|
|
import { ref } from "vue";
|
|
|
|
|
import { useRoute, useRouter } from "vue-router";
|
|
|
|
|
import { message } from "ant-design-vue";
|
2025-12-17 17:00:29 +08:00
|
|
|
|
2025-12-19 15:54:26 +08:00
|
|
|
import { useUserStore } from "./user";
|
|
|
|
|
import { login, logout as logoutApi } from "@/api/system";
|
|
|
|
|
import { TokenKey as TOKEN_KEY } from "@/utils/auth";
|
|
|
|
|
import type { LoginInfo } from "@/api/system/model";
|
2025-12-17 17:00:29 +08:00
|
|
|
|
2025-12-19 15:54:26 +08:00
|
|
|
export const useAuthStore = defineStore("auth", () => {
|
|
|
|
|
const route = useRoute();
|
2025-12-17 17:00:29 +08:00
|
|
|
const router = useRouter();
|
|
|
|
|
const userStore = useUserStore();
|
|
|
|
|
|
|
|
|
|
const loginLoading = ref(false);
|
|
|
|
|
const token = ref(Cookies.get(TOKEN_KEY) || null);
|
|
|
|
|
|
|
|
|
|
function setToken(newToken: string) {
|
|
|
|
|
token.value = newToken;
|
|
|
|
|
Cookies.set(TOKEN_KEY, newToken);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function clearToken() {
|
|
|
|
|
token.value = null;
|
|
|
|
|
Cookies.remove(TOKEN_KEY);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function authLogin(params: LoginInfo) {
|
|
|
|
|
try {
|
|
|
|
|
loginLoading.value = true;
|
|
|
|
|
const res = await login(params);
|
|
|
|
|
if (res.code === 200) {
|
|
|
|
|
setToken(res.token as string);
|
|
|
|
|
await userStore.fetchUserInfo();
|
2025-12-19 15:54:26 +08:00
|
|
|
message.success("登录成功");
|
|
|
|
|
const redirect = route.query.redirect || "/";
|
|
|
|
|
router.replace(redirect as string);
|
2025-12-17 17:00:29 +08:00
|
|
|
return res;
|
|
|
|
|
} else {
|
|
|
|
|
// 抛出错误,让调用方处理
|
2025-12-19 15:54:26 +08:00
|
|
|
throw new Error(res.msg || "登录失败");
|
2025-12-17 17:00:29 +08:00
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
throw error;
|
|
|
|
|
} finally {
|
|
|
|
|
loginLoading.value = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function logout() {
|
|
|
|
|
// 在实际应用中,这里可以调用后端的退出登录接口
|
2025-12-19 15:54:26 +08:00
|
|
|
await logoutApi();
|
2025-12-17 17:00:29 +08:00
|
|
|
clearToken();
|
|
|
|
|
userStore.clearUserInfo();
|
2025-12-19 15:54:26 +08:00
|
|
|
await router.push("/login");
|
|
|
|
|
message.success("已成功退出");
|
2025-12-17 17:00:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
token,
|
|
|
|
|
loginLoading,
|
|
|
|
|
authLogin,
|
|
|
|
|
logout,
|
|
|
|
|
};
|
|
|
|
|
});
|