import { store } from "@/store";
|
import { usePermissionStoreHook } from "@/store/modules/permission.store";
|
import { useDictStoreHook } from "@/store/modules/dict.store";
|
|
import { setAccessToken, clearToken } from "@/utils/auth";
|
import UserApi, { type LoginFormData, LoginResult, UserInfo } from "@/api/user";
|
|
export const useUserStore = defineStore("user", () => {
|
const userInfo = useStorage<UserInfo>("userInfo", {} as UserInfo);
|
|
/**
|
* 登录
|
*
|
* @returns
|
* @param loginData
|
*/
|
function login(loginData: LoginFormData) {
|
return new Promise<void>((resolve, reject) => {
|
const { username: name, password: pwd } = loginData;
|
UserApi.login(name, pwd)
|
.then((result: LoginResult) => {
|
console.log(result);
|
const { code, data, data2 } = result;
|
if (code === 1 && data) {
|
console.log(123);
|
setAccessToken("fg");
|
Object.assign(userInfo.value, { ...data2, ...{ roles: [], perms: [] } });
|
if (userInfo.value.roleId === 2) {
|
userInfo.value.roles = ["admin"];
|
userInfo.value.perms = [
|
"sys:user:add",
|
"sys:user:edit",
|
"sys:user:delete",
|
"sys:user:upload",
|
];
|
} else {
|
userInfo.value.roles = ["customer"];
|
}
|
resolve();
|
} else {
|
reject("登录失败");
|
}
|
})
|
.catch((error) => {
|
reject(error);
|
});
|
});
|
}
|
|
/**
|
* 登出
|
*/
|
function logout() {
|
return new Promise<void>((resolve, reject) => {
|
UserApi.logout()
|
.then(() => {
|
clearSessionAndCache();
|
resolve();
|
})
|
.catch((error) => {
|
reject(error);
|
});
|
});
|
}
|
|
/**
|
* 清除用户会话和缓存
|
*/
|
function clearSessionAndCache() {
|
return new Promise<void>((resolve) => {
|
clearToken();
|
usePermissionStoreHook().resetRouter();
|
useDictStoreHook().clearDictCache();
|
resolve();
|
});
|
}
|
|
return {
|
userInfo,
|
login,
|
logout,
|
clearSessionAndCache,
|
};
|
});
|
|
/**
|
* 用于在组件外部(如在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);
|
}
|