2023-01-29 13:44:19 +08:00
|
|
|
import { defineStore } from "pinia";
|
|
|
|
|
import router from "../../router";
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
import { LocalStorage } from "/src/utils/util.storage";
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
import * as UserApi from "/src/api/modules/api.user";
|
2024-11-28 17:36:45 +08:00
|
|
|
import { RegisterReq, SmsLoginReq } from "/src/api/modules/api.user";
|
2023-01-29 13:44:19 +08:00
|
|
|
// @ts-ignore
|
|
|
|
|
import { LoginReq, UserInfoRes } from "/@/api/modules/api.user";
|
2024-09-05 14:33:45 +08:00
|
|
|
import { message, Modal, notification } from "ant-design-vue";
|
2023-01-29 13:44:19 +08:00
|
|
|
import { useI18n } from "vue-i18n";
|
|
|
|
|
|
|
|
|
|
import { mitter } from "/src/utils/util.mitt";
|
2025-03-03 19:24:51 +00:00
|
|
|
import { resetAllStores, useAccessStore } from "/@/vben/stores";
|
2023-01-29 13:44:19 +08:00
|
|
|
|
2025-03-07 18:01:51 +08:00
|
|
|
import { useUserStore as vbenUserStore } from "/@/vben/stores/modules/user";
|
|
|
|
|
|
2023-01-29 13:44:19 +08:00
|
|
|
interface UserState {
|
|
|
|
|
userInfo: Nullable<UserInfoRes>;
|
|
|
|
|
token?: string;
|
2024-08-14 21:24:12 +08:00
|
|
|
}
|
|
|
|
|
|
2023-01-29 13:44:19 +08:00
|
|
|
const USER_INFO_KEY = "USER_INFO";
|
|
|
|
|
const TOKEN_KEY = "TOKEN";
|
|
|
|
|
export const useUserStore = defineStore({
|
|
|
|
|
id: "app.user",
|
|
|
|
|
state: (): UserState => ({
|
|
|
|
|
// user info
|
|
|
|
|
userInfo: null,
|
|
|
|
|
// token
|
2024-10-20 01:54:49 +08:00
|
|
|
token: undefined
|
2023-01-29 13:44:19 +08:00
|
|
|
}),
|
|
|
|
|
getters: {
|
|
|
|
|
getUserInfo(): UserInfoRes {
|
|
|
|
|
return this.userInfo || LocalStorage.get(USER_INFO_KEY) || {};
|
|
|
|
|
},
|
|
|
|
|
getToken(): string {
|
|
|
|
|
return this.token || LocalStorage.get(TOKEN_KEY);
|
2024-08-05 12:49:44 +08:00
|
|
|
},
|
|
|
|
|
isAdmin(): boolean {
|
2024-10-15 12:01:38 +08:00
|
|
|
return this.getUserInfo.roleIds?.includes(1) || this.getUserInfo.id === 1;
|
2023-01-29 13:44:19 +08:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
actions: {
|
2025-03-03 19:24:51 +00:00
|
|
|
setToken(token: string, expire: number) {
|
|
|
|
|
this.token = token;
|
|
|
|
|
const accessStore = useAccessStore();
|
|
|
|
|
accessStore.setAccessToken(token);
|
2023-01-29 13:44:19 +08:00
|
|
|
LocalStorage.set(TOKEN_KEY, this.token, expire);
|
|
|
|
|
},
|
|
|
|
|
setUserInfo(info: UserInfoRes) {
|
|
|
|
|
this.userInfo = info;
|
2025-03-07 18:01:51 +08:00
|
|
|
const userStore = vbenUserStore();
|
|
|
|
|
userStore.setUserInfo(info);
|
2023-01-29 13:44:19 +08:00
|
|
|
LocalStorage.set(USER_INFO_KEY, info);
|
|
|
|
|
},
|
|
|
|
|
resetState() {
|
|
|
|
|
this.userInfo = null;
|
|
|
|
|
this.token = "";
|
|
|
|
|
LocalStorage.remove(TOKEN_KEY);
|
|
|
|
|
LocalStorage.remove(USER_INFO_KEY);
|
|
|
|
|
},
|
2023-06-27 09:29:43 +08:00
|
|
|
async register(user: RegisterReq) {
|
|
|
|
|
await UserApi.register(user);
|
|
|
|
|
notification.success({
|
|
|
|
|
message: "注册成功,请登录"
|
|
|
|
|
});
|
|
|
|
|
await router.replace("/login");
|
|
|
|
|
},
|
2023-01-29 13:44:19 +08:00
|
|
|
/**
|
|
|
|
|
* @description: login
|
|
|
|
|
*/
|
2024-11-28 17:36:45 +08:00
|
|
|
async login(loginType: string, params: LoginReq | SmsLoginReq): Promise<any> {
|
2023-01-29 13:44:19 +08:00
|
|
|
try {
|
2024-11-28 17:36:45 +08:00
|
|
|
let loginRes: any = null;
|
|
|
|
|
if (loginType === "sms") {
|
|
|
|
|
loginRes = await UserApi.loginBySms(params as SmsLoginReq);
|
|
|
|
|
} else {
|
|
|
|
|
loginRes = await UserApi.login(params as LoginReq);
|
|
|
|
|
}
|
2023-01-29 13:44:19 +08:00
|
|
|
|
2024-11-28 17:36:45 +08:00
|
|
|
const { token, expire } = loginRes;
|
2023-01-29 13:44:19 +08:00
|
|
|
// save token
|
|
|
|
|
this.setToken(token, expire);
|
|
|
|
|
// get user info
|
2024-11-28 17:36:45 +08:00
|
|
|
return await this.onLoginSuccess(loginRes);
|
2023-01-29 13:44:19 +08:00
|
|
|
} catch (error) {
|
2025-03-07 18:01:51 +08:00
|
|
|
console.error(error);
|
2023-01-29 13:44:19 +08:00
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
async getUserInfoAction(): Promise<UserInfoRes> {
|
|
|
|
|
const userInfo = await UserApi.mine();
|
|
|
|
|
this.setUserInfo(userInfo);
|
|
|
|
|
return userInfo;
|
|
|
|
|
},
|
2024-08-14 21:24:12 +08:00
|
|
|
|
2024-11-01 10:22:40 +08:00
|
|
|
async loadUserInfo() {
|
|
|
|
|
await this.getUserInfoAction();
|
|
|
|
|
},
|
|
|
|
|
|
2024-08-14 21:24:12 +08:00
|
|
|
async onLoginSuccess(loginData: any) {
|
2025-03-06 21:11:07 +08:00
|
|
|
// await this.getUserInfoAction();
|
|
|
|
|
// const userInfo = await this.getUserInfoAction();
|
|
|
|
|
mitter.emit("app.login", { token: loginData });
|
2024-08-14 21:24:12 +08:00
|
|
|
await router.replace("/");
|
|
|
|
|
},
|
|
|
|
|
|
2023-01-29 13:44:19 +08:00
|
|
|
/**
|
|
|
|
|
* @description: logout
|
|
|
|
|
*/
|
|
|
|
|
logout(goLogin = true) {
|
|
|
|
|
this.resetState();
|
2025-03-03 19:24:51 +00:00
|
|
|
resetAllStores();
|
2023-01-29 13:44:19 +08:00
|
|
|
goLogin && router.push("/login");
|
|
|
|
|
mitter.emit("app.logout");
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @description: Confirm before logging out
|
|
|
|
|
*/
|
|
|
|
|
confirmLoginOut() {
|
|
|
|
|
const { t } = useI18n();
|
2024-10-01 23:52:44 +08:00
|
|
|
Modal.confirm({
|
2023-01-29 13:44:19 +08:00
|
|
|
iconType: "warning",
|
|
|
|
|
title: t("app.login.logoutTip"),
|
|
|
|
|
content: t("app.login.logoutMessage"),
|
|
|
|
|
onOk: async () => {
|
|
|
|
|
await this.logout(true);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|