import { defineStore } from 'pinia';
import { getConfig } from 'cube-front/core/configure';
import { type AxiosRequestConfig, type AxiosResponse } from 'axios';
import request from '../utils/request';
import { removeAccessToken } from '../utils/token';
/** ç”¨æˆ·ä¿¡æ¯ */
export interface UserInfo {
id: number;
name: string;
realName: string;
email: string;
avatar: string;
phone: string;
role: string;
token: string;
roles: string[];
}
const state: {
userInfo: Partial<UserInfo> | undefined;
loading: boolean;
} = {
userInfo: undefined,
loading: false,
};
export const useUserStore = defineStore('user', {
state: () => state,
getters: {
hasUserInfo: (state) => !!state.userInfo,
},
actions: {
setUserInfo(info: Partial<UserInfo>) {
this.userInfo = { ...this.userInfo, ...info };
},
/**
* 用户登出
* 先调用登出接å£ï¼Œå†æ¸…除用户状æ€å’Œtoken,并é‡å®šå‘到登录页
*/
async logout() {
try {
// 获å–认è¯é…ç½®
const config = getConfig();
const authConfig = config.auth;
// 默认登出请求é…ç½®
let axiosConfig: AxiosRequestConfig;
// 如果有专门的登出é…置,则使用该é…ç½®
if (authConfig.logoutAxiosConfig) {
if (typeof authConfig.logoutAxiosConfig === 'function') {
const configResult = authConfig.logoutAxiosConfig();
if (configResult instanceof Promise) {
axiosConfig = await configResult;
} else {
axiosConfig = configResult;
}
} else {
axiosConfig = authConfig.logoutAxiosConfig;
}
// 调用登出接å£
await request(axiosConfig);
}
} catch (error) {
console.error('登出接å£è°ƒç”¨å¤±è´¥:', error);
} finally {
// æ— è®ºæŽ¥å£è°ƒç”¨æˆåŠŸä¸Žå¦ï¼Œéƒ½æ‰§è¡Œæœ¬åœ°æ¸…ç†æ“作
// 清除用户信æ¯
this.userInfo = undefined;
// 清除token
removeAccessToken();
// é‡å®šå‘到登录页
window.location.href = '/login';
}
},
async fetchUserInfoAsync() {
if (this.loading) return;
this.loading = true;
// 如果没有用户信æ¯ï¼Œåˆ™èŽ·å–获å–用户信æ¯ã€èœå•ä¿¡æ¯
if (!this.hasUserInfo) {
try {
const config = getConfig();
const userConfig = config.user;
const getUserInfoAxiosConfig = userConfig.getUserInfoAxiosConfig;
let axiosConfig: AxiosRequestConfig;
if (typeof getUserInfoAxiosConfig === 'function') {
const configResult = getUserInfoAxiosConfig();
if (configResult instanceof Promise) {
axiosConfig = await configResult;
} else {
axiosConfig = configResult;
}
} else {
axiosConfig = getUserInfoAxiosConfig;
}
const response: AxiosResponse<Partial<UserInfo>> = await request<
Partial<UserInfo>,
AxiosResponse<Partial<UserInfo>>
>(axiosConfig);
this.setUserInfo(response.data);
} catch (error) {
console.error('Failed to fetch user info:', error);
} finally {
this.loading = false;
}
}
},
},
});
|