133 lines
3.4 KiB
TypeScript
133 lines
3.4 KiB
TypeScript
import { store } from "@/store";
|
||
import { usePermissionStoreHook } from "@/store/modules/permission";
|
||
import { useDictStoreHook } from "@/store/modules/dict";
|
||
|
||
import AuthAPI, { type loginRequest } from "@/api/account/login";
|
||
import UserAPI, { type UserInfo } from "@/api/system/user";
|
||
|
||
import { setToken, setRefreshToken, getRefreshToken, clearToken } from "@/utils/auth";
|
||
|
||
export const useUserStore = defineStore("user", () => {
|
||
const userInfo = useStorage<UserInfo>("userInfo", {} as UserInfo);
|
||
const promissionList = useStorage<string[]>("promissionList", [] as string[]);
|
||
|
||
localStorage.setItem("shopId", "" + userInfo.value.shopId);
|
||
|
||
/**
|
||
* 登录
|
||
*
|
||
* @param {loginRequest}
|
||
* @returns
|
||
*/
|
||
function login(loginRequest: loginRequest) {
|
||
return new Promise<void>((resolve, reject) => {
|
||
AuthAPI.login(loginRequest)
|
||
.then((data) => {
|
||
Object.assign(userInfo.value, { ...data.shopInfo });
|
||
promissionList.value = data.promissionList;
|
||
const token = data.tokenInfo.tokenValue;
|
||
setToken(token); // Bearer eyJhbGciOiJIUzI1NiJ9.xxx.xxx
|
||
setRefreshToken(token);
|
||
resolve();
|
||
})
|
||
.catch((error) => {
|
||
reject(error);
|
||
});
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 获取用户信息
|
||
*
|
||
* @returns {UserInfo} 用户信息
|
||
*/
|
||
function getUserInfo() {
|
||
return new Promise<UserInfo>((resolve, reject) => {
|
||
UserAPI.getInfo(userInfo.value.shopId)
|
||
.then((data) => {
|
||
if (!data) {
|
||
reject("Verification failed, please Login again.");
|
||
return;
|
||
}
|
||
localStorage.setItem("shopId", "" + userInfo.value.shopId);
|
||
Object.assign(userInfo.value, { ...data });
|
||
resolve(data);
|
||
})
|
||
.catch((error) => {
|
||
reject(error);
|
||
});
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 登出
|
||
*/
|
||
function logout() {
|
||
return new Promise<void>((resolve, reject) => {
|
||
clearUserData();
|
||
resolve();
|
||
// AuthAPI.logout()
|
||
// .then(() => {
|
||
// clearUserData();
|
||
// resolve();
|
||
// })
|
||
// .catch((error) => {
|
||
// reject(error);
|
||
// });
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 刷新 token
|
||
*/
|
||
function refreshToken() {
|
||
const refreshToken = getRefreshToken();
|
||
return new Promise<void>((resolve, reject) => {
|
||
// AuthAPI.refreshToken(refreshToken)
|
||
// .then((data) => {
|
||
// const { token } = data;
|
||
// setToken(token);
|
||
// setRefreshToken(refreshToken);
|
||
// resolve();
|
||
// })
|
||
// .catch((error) => {
|
||
// console.log(" refreshToken 刷新失败", error);
|
||
// reject(error);
|
||
// });
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 清理用户数据
|
||
*
|
||
* @returns
|
||
*/
|
||
function clearUserData() {
|
||
return new Promise<void>((resolve) => {
|
||
clearToken();
|
||
usePermissionStoreHook().resetRouter();
|
||
useDictStoreHook().clearDictionaryCache();
|
||
resolve();
|
||
});
|
||
}
|
||
|
||
return {
|
||
userInfo,
|
||
promissionList,
|
||
getUserInfo,
|
||
login,
|
||
logout,
|
||
clearUserData,
|
||
refreshToken,
|
||
};
|
||
});
|
||
|
||
/**
|
||
* 用于在组件外部(如在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);
|
||
}
|