Files
cashier-web/src/store/modules/user.ts

133 lines
3.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}