import { unref, nextTick } from 'vue'; import { defineStore } from 'pinia'; import { router as globalRouter } from '@/router'; import { useRouterPush } from '@/composables'; import { fetchLogin, fetchUserInfo } from '@/service'; import { getUserInfo, getToken, setUserInfo, setToken, setRefreshToken, clearAuthStorage } from '@/utils'; import { useTabStore } from '../tab'; import { useRouteStore } from '../route'; interface AuthState { /** 用户信息 */ userInfo: Auth.UserInfo; /** 用户token */ token: string; /** 登录的加载状态 */ loginLoading: boolean; } export const useAuthStore = defineStore('auth-store', { state: (): AuthState => ({ userInfo: getUserInfo(), token: getToken(), loginLoading: false }), getters: { /** 是否登录 */ isLogin(state) { return Boolean(state.token); } }, actions: { /** 重置auth状态 */ resetAuthStore() { const { toLogin } = useRouterPush(false); const { resetTabStore } = useTabStore(); const { resetRouteStore } = useRouteStore(); const route = unref(globalRouter.currentRoute); clearAuthStorage(); this.$reset(); if (route.meta.requiresAuth) { toLogin(); } nextTick(() => { resetTabStore(); resetRouteStore(); }); }, /** * 根据token进行登录 * @param backendToken - 返回的token */ async loginByToken(backendToken: ApiAuth.Token) { const { toLoginRedirect } = useRouterPush(false); // 先把token存储到缓存中(后面接口的请求头需要token) const { token, refreshToken } = backendToken; setToken(token); setRefreshToken(refreshToken); // 获取用户信息 const { data } = await fetchUserInfo(); if (data) { // 成功后把用户信息存储到缓存中 setUserInfo(data); // 更新状态 Object.assign(this, { userInfo: data, token }); // 跳转登录后的地址 toLoginRedirect(); // 登录成功弹出欢迎提示 window.$notification?.success({ title: '登录成功!', content: `欢迎回来,${data.userName}!`, duration: 3000 }); } else { // 不成功则重置状态 this.resetAuthStore(); } }, /** * 登录 * @param userName - 用户名 * @param password - 密码 */ async login(userName: string, password: string) { this.loginLoading = true; const { data } = await fetchLogin(userName, password); if (data) { await this.loginByToken(data); } this.loginLoading = false; }, updateUserRole(userRole: Auth.RoleType) { this.userInfo.userRole = userRole; } } });