Files
frontend_hmi_station/src/store/system/auth.ts
2026-01-12 17:17:58 +08:00

69 lines
1.9 KiB
TypeScript

import { defineStore } from "pinia";
import { ref } from "vue";
import { useRoute, useRouter } from "vue-router";
import { message, notification } from "ant-design-vue";
import { useUserStore } from "./user";
import { login, logout as logoutApi } from "@/api/system";
import { setToken, getToken, removeToken, removeAccount, getRememberMe } from "@/utils/auth";
import type { LoginInfo } from "@/api/system/model";
export const useAuthStore = defineStore("auth", () => {
const route = useRoute();
const router = useRouter();
const userStore = useUserStore();
const loginLoading = ref(false);
const token = ref(getToken() || null);
async function authLogin(params: LoginInfo, rememberMe: boolean) {
try {
loginLoading.value = true;
const res = await login(params);
if (res.code === 200) {
setToken(res.token as string);
await userStore.fetchUserInfo();
notification.success({
message: "登录成功",
description: `欢迎回来,${params.username}`,
duration: 3,
});
if (rememberMe) {
userStore.setUserInfo({ ...params, rememberMe });
} else {
userStore.clearUserInfo();
userStore.setUsername(params.username);
}
const redirect = route.query.redirect || "/";
router.replace(redirect as string);
return res;
} else {
// 抛出错误,让调用方处理
throw new Error(res.msg || "登录失败");
}
} catch (error) {
throw error;
} finally {
loginLoading.value = false;
}
}
async function logout() {
// 在实际应用中,这里可以调用后端的退出登录接口
await logoutApi();
removeToken();
!getRememberMe() && removeAccount();
await router.push("/login");
message.success("已成功退出");
}
return {
token,
loginLoading,
authLogin,
logout,
};
});