2022-01-05 01:35:32 +08:00
|
|
|
|
import { ref, computed, reactive, unref } from 'vue';
|
2022-01-03 22:20:10 +08:00
|
|
|
|
import type { Ref, ComputedRef } from 'vue';
|
2021-08-13 14:22:35 +08:00
|
|
|
|
import { defineStore } from 'pinia';
|
2022-01-05 01:35:32 +08:00
|
|
|
|
import { router as globalRouter } from '@/router';
|
2022-01-06 02:00:42 +08:00
|
|
|
|
import { useRouterPush } from '@/composables';
|
2022-01-05 01:35:32 +08:00
|
|
|
|
import { useLoading } from '@/hooks';
|
|
|
|
|
import { fetchLogin, fetchUserInfo } from '@/service';
|
|
|
|
|
import { getUserInfo, getToken, setUserInfo, setToken, setRefreshToken, clearAuthStorage } from '@/utils';
|
2021-05-29 03:02:15 +08:00
|
|
|
|
|
2022-01-03 22:20:10 +08:00
|
|
|
|
interface AuthStore {
|
2021-08-13 14:22:35 +08:00
|
|
|
|
/** 用户信息 */
|
2022-01-03 22:20:10 +08:00
|
|
|
|
userInfo: Auth.UserInfo;
|
|
|
|
|
/** 用户token */
|
|
|
|
|
token: Ref<string>;
|
|
|
|
|
/** 是否登录 */
|
|
|
|
|
isLogin: ComputedRef<boolean>;
|
2022-01-05 01:35:32 +08:00
|
|
|
|
/**
|
|
|
|
|
* 重置authStore
|
|
|
|
|
* 是否需要跳转页面(例如当前页面是需要权限的,登出后需要跳转到登录页面)
|
|
|
|
|
*/
|
|
|
|
|
resetAuthStore(pushRoute: boolean): void;
|
|
|
|
|
/** 登录的加载状态 */
|
|
|
|
|
loginLoding: Ref<boolean>;
|
|
|
|
|
/**
|
|
|
|
|
* 登录
|
|
|
|
|
* @param phone - 手机号
|
|
|
|
|
* @param pwdOrCode - 密码或验证码
|
|
|
|
|
* @param type - 登录方式: pwd - 密码登录; sms - 验证码登录
|
|
|
|
|
*/
|
|
|
|
|
login(phone: string, pwdOrCode: string, type: 'pwd' | 'sms'): void;
|
2021-05-29 03:02:15 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-01-03 22:20:10 +08:00
|
|
|
|
export const useAuthStore = defineStore('auth-store', () => {
|
2022-01-05 01:35:32 +08:00
|
|
|
|
const { toLogin, toLoginRedirect } = useRouterPush(false);
|
|
|
|
|
|
2022-01-03 22:20:10 +08:00
|
|
|
|
const userInfo: Auth.UserInfo = reactive(getUserInfo());
|
2022-01-05 01:35:32 +08:00
|
|
|
|
function handleSetUserInfo(data: Auth.UserInfo) {
|
|
|
|
|
Object.assign(userInfo, data);
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-03 22:20:10 +08:00
|
|
|
|
const token = ref(getToken());
|
2022-01-05 01:35:32 +08:00
|
|
|
|
function handleSetToken(data: string) {
|
|
|
|
|
token.value = data;
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-03 22:20:10 +08:00
|
|
|
|
const isLogin = computed(() => Boolean(token.value));
|
2022-01-05 01:35:32 +08:00
|
|
|
|
|
2022-01-09 13:25:42 +08:00
|
|
|
|
const { loading: loginLoding, startLoading: startLoginLoading, endLoading: endLoginLoading } = useLoading();
|
|
|
|
|
|
|
|
|
|
function resetStore() {
|
|
|
|
|
handleSetUserInfo(getUserInfo());
|
|
|
|
|
handleSetToken(getToken());
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-05 01:35:32 +08:00
|
|
|
|
function resetAuthStore(pushRoute: boolean = true) {
|
|
|
|
|
const route = unref(globalRouter.currentRoute);
|
|
|
|
|
|
|
|
|
|
clearAuthStorage();
|
2022-01-09 13:25:42 +08:00
|
|
|
|
resetStore();
|
2022-01-05 01:35:32 +08:00
|
|
|
|
|
|
|
|
|
if (pushRoute && route.meta.requiresAuth) {
|
|
|
|
|
toLogin();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function login(phone: string, pwdOrCode: string, type: 'pwd' | 'sms') {
|
|
|
|
|
startLoginLoading();
|
|
|
|
|
const { data } = await fetchLogin(phone, pwdOrCode, type);
|
|
|
|
|
if (data) {
|
|
|
|
|
await loginByToken(data);
|
|
|
|
|
}
|
|
|
|
|
endLoginLoading();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function loginByToken(backendToken: ApiAuth.Token) {
|
|
|
|
|
// 1.先把token存储到缓存中
|
|
|
|
|
const { token, refreshToken } = backendToken;
|
|
|
|
|
setToken(token);
|
|
|
|
|
setRefreshToken(refreshToken);
|
|
|
|
|
|
|
|
|
|
// 2.获取用户信息
|
|
|
|
|
const { data } = await fetchUserInfo();
|
|
|
|
|
if (data) {
|
|
|
|
|
// 成功后把用户信息存储到缓存中
|
|
|
|
|
setUserInfo(data);
|
|
|
|
|
handleSetToken(token);
|
|
|
|
|
handleSetUserInfo(data);
|
|
|
|
|
// 3. 跳转登录后的地址
|
2022-01-06 02:00:42 +08:00
|
|
|
|
toLoginRedirect();
|
2022-01-05 01:35:32 +08:00
|
|
|
|
// 4.登录成功弹出欢迎提示
|
|
|
|
|
window.$notification?.success({
|
|
|
|
|
title: '登录成功!',
|
|
|
|
|
content: `欢迎回来,${userInfo.userName}!`,
|
|
|
|
|
duration: 3000
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
// 不成功则重置状态
|
|
|
|
|
resetAuthStore(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-05-29 03:02:15 +08:00
|
|
|
|
|
2022-01-03 22:20:10 +08:00
|
|
|
|
const authStore: AuthStore = {
|
|
|
|
|
userInfo,
|
|
|
|
|
token,
|
|
|
|
|
isLogin,
|
2022-01-05 01:35:32 +08:00
|
|
|
|
resetAuthStore,
|
|
|
|
|
loginLoding,
|
|
|
|
|
login
|
2022-01-03 22:20:10 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return authStore;
|
|
|
|
|
});
|