feat: 初始化提交
笑笑 authored at 2025-05-13 21:25:06
3.18 KiB
cube-front
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;
        }
      }
    },
  },
});