import { defineStore } from 'pinia';
import { getConfig } from 'cube-front/core/configure';
import axios, { 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 authConfig = getConfig().auth;
// 默认登出请求配置
let axiosConfig: AxiosRequestConfig;
// 如果有专门的登出配置,则使用该配置
if (authConfig.logoutAxiosConfig) {
if (typeof authConfig.logoutAxiosConfig === 'function') {
const config = authConfig.logoutAxiosConfig();
if (config instanceof Promise) {
axiosConfig = await authConfig.logoutAxiosConfig();
} else {
axiosConfig = config;
}
} 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) {
const userConfig = getConfig().user;
const getUserInfoAxiosConfig = userConfig.getUserInfoAxiosConfig;
let axiosConfig: AxiosRequestConfig;
if (typeof getUserInfoAxiosConfig === 'function') {
const config = getUserInfoAxiosConfig();
if (config instanceof Promise) {
axiosConfig = await getUserInfoAxiosConfig();
} else {
axiosConfig = config;
}
} else {
axiosConfig = getUserInfoAxiosConfig;
}
try {
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;
}
}
},
},
});
|