95 lines
2.3 KiB
TypeScript
95 lines
2.3 KiB
TypeScript
import AuthAPI, { type LoginData } from "@/api/auth";
|
||
import UserAPI, { type UserInfo } from "@/api/user";
|
||
import { resetRouter } from "@/router";
|
||
import { store } from "@/store";
|
||
import { setToken, removeToken } from "@/utils/auth";
|
||
|
||
export const useUserStore = defineStore("user", () => {
|
||
const user = ref<UserInfo>({
|
||
roles: [],
|
||
perms: [],
|
||
});
|
||
|
||
/**
|
||
* 登录
|
||
*
|
||
* @param {LoginData}
|
||
* @returns
|
||
*/
|
||
function login(loginData: LoginData) {
|
||
return new Promise<void>((resolve, reject) => {
|
||
AuthAPI.login(loginData)
|
||
.then((data) => {
|
||
const { tokenType, accessToken } = data;
|
||
setToken(tokenType + " " + accessToken); // Bearer eyJhbGciOiJIUzI1NiJ9.xxx.xxx
|
||
resolve();
|
||
})
|
||
.catch((error) => {
|
||
reject(error);
|
||
});
|
||
});
|
||
}
|
||
|
||
// 获取信息(用户昵称、头像、角色集合、权限集合)
|
||
function getUserInfo() {
|
||
return new Promise<UserInfo>((resolve, reject) => {
|
||
UserAPI.getInfo()
|
||
.then((data) => {
|
||
if (!data) {
|
||
reject("Verification failed, please Login again.");
|
||
return;
|
||
}
|
||
if (!data.roles || data.roles.length <= 0) {
|
||
reject("getUserInfo: roles must be a non-null array!");
|
||
return;
|
||
}
|
||
Object.assign(user.value, { ...data });
|
||
resolve(data);
|
||
})
|
||
.catch((error) => {
|
||
reject(error);
|
||
});
|
||
});
|
||
}
|
||
|
||
// user logout
|
||
function logout() {
|
||
return new Promise<void>((resolve, reject) => {
|
||
AuthAPI.logout()
|
||
.then(() => {
|
||
location.reload(); // 清空路由
|
||
resolve();
|
||
})
|
||
.catch((error) => {
|
||
reject(error);
|
||
});
|
||
});
|
||
}
|
||
|
||
// remove token
|
||
function resetToken() {
|
||
return new Promise<void>((resolve) => {
|
||
removeToken();
|
||
resetRouter();
|
||
resolve();
|
||
});
|
||
}
|
||
|
||
return {
|
||
user,
|
||
login,
|
||
getUserInfo,
|
||
logout,
|
||
resetToken,
|
||
};
|
||
});
|
||
|
||
/**
|
||
* 用于在组件外部(如在Pinia Store 中)使用 Pinia 提供的 store 实例。
|
||
* 官方文档解释了如何在组件外部使用 Pinia Store:
|
||
* https://pinia.vuejs.org/core-concepts/outside-component-usage.html#using-a-store-outside-of-a-component
|
||
*/
|
||
export function useUserStoreHook() {
|
||
return useUserStore(store);
|
||
}
|