import axios from "axios";
import { message } from "antd";

// 创建 axios 实例
const request = axios.create({
  baseURL: "http://192.168.10.174:8080/api",
  timeout: 10000,
});

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 从 localStorage 获取 token
    const token = localStorage.getItem("token");

    // 如果有 token 则添加到请求头
    if (token) {
      config.headers["token"] = token;
    }


    console.log("发出的请求", config);
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);


// 响应拦截器
request.interceptors.response.use(
  (response) => {
    return response.data;
  },
  (error) => {
    if (error.response) {
      const { status, data } = error.response;

      // 处理 401 未授权错误（token 无效或过期）
      if (status === 401) {
        message.error("登录已过期，请重新登录");

        // 清除本地存储的 token 和用户信息
        localStorage.removeItem("token");
        localStorage.removeItem("user");

        // 重定向到登录页
        if (window.location.pathname !== "/login") {
          window.location.href = "/login";
        }
      } else {
        // 处理其他错误
        // message.error(data.message || "11111请求失败");
        message.error(data.message || "11111请求失败");
      }
    } else if (error.request) {
      // 请求发出但没有收到响应
      message.error("网络错误，请检查您的网络连接");
    } else {
      // 请求配置出错
      message.error(error.message || "请求配置错误");
    }

    return Promise.reject(error);
  }
);

export default request; 