ruoyi-plus-soybean/src/store/modules/auth/index.ts

93 lines
2.4 KiB
TypeScript
Raw Normal View History

import { unref } from 'vue';
import { defineStore } from 'pinia';
2022-01-05 01:35:32 +08:00
import { router as globalRouter } from '@/router';
import { useRouterPush } from '@/composables';
2022-01-05 01:35:32 +08:00
import { fetchLogin, fetchUserInfo } from '@/service';
import { getUserInfo, getToken, setUserInfo, setToken, setRefreshToken, clearAuthStorage } from '@/utils';
interface AuthState {
/** 用户信息 */
userInfo: Auth.UserInfo;
/** 用户token */
token: string;
2022-01-05 01:35:32 +08:00
/** 登录的加载状态 */
loginLoding: boolean;
}
export const useAuthStore = defineStore('auth-store', {
state: (): AuthState => ({
userInfo: getUserInfo(),
token: getToken(),
loginLoding: false,
}),
getters: {
/** 是否登录 */
isLogin(state) {
return Boolean(state.token);
},
},
actions: {
/** 重置auth状态 */
resetAuthStore() {
const { toLogin } = useRouterPush(false);
const route = unref(globalRouter.currentRoute);
clearAuthStorage();
this.$reset();
if (route.meta.requiresAuth) {
toLogin();
}
},
/**
* token进行登录
* @param backendToken - token
*/
async loginByToken(backendToken: ApiAuth.Token) {
const { toLoginRedirect } = useRouterPush(false);
2022-01-05 01:35:32 +08:00
// 先把token存储到缓存中
const { token, refreshToken } = backendToken;
setToken(token);
setRefreshToken(refreshToken);
2022-01-05 01:35:32 +08:00
// 获取用户信息
const { data } = await fetchUserInfo();
if (data) {
// 成功后把用户信息存储到缓存中
setUserInfo(data);
2022-01-05 01:35:32 +08:00
// 更新状态
Object.assign(this, { userInfo: data, token });
2022-01-05 01:35:32 +08:00
// 跳转登录后的地址
toLoginRedirect();
2022-01-05 01:35:32 +08:00
// 登录成功弹出欢迎提示
window.$notification?.success({
title: '登录成功!',
content: `欢迎回来,${data.userName}!`,
duration: 3000,
});
} else {
// 不成功则重置状态
this.resetAuthStore();
}
},
/**
*
* @param phone -
* @param pwdOrCode -
* @param type - 登录方式: pwd - ; sms -
*/
async login(phone: string, pwdOrCode: string, type: 'pwd' | 'sms') {
this.loginLoding = true;
const { data } = await fetchLogin(phone, pwdOrCode, type);
if (data) {
await this.loginByToken(data);
}
this.loginLoding = false;
},
},
});