request.js 3.81 KB
// http.js

// import axios from "axios";
import axios from "axios/dist/axios";
import { getToken } from "./local-store";
import {ElLoading, ElMessage} from "element-plus";
import { saveAs } from 'file-saver'
import { useStorage } from "@vueuse/core/index";
import {blobValidate, tansParams} from "@/utils/ruoyi";
import errorCode from "@/utils/errorCode";
const language = useStorage("language", 0);
const baseURL = import.meta.env.VITE_TICKET_BASE_API
// const baseURL = VITE_TICKET_BASE_API; //"http://book.xiaojinyu.games"; // 这里填入你的基础 API URL

// const baseURL = "ticket"; //"http://book.xiaojinyu.games"; // 这里填入你的基础 API URL

const timeout = 150000; // 请求超时时间

const http = axios.create({
  baseURL,
  timeout,
  headers: {
    "Content-Type": "application/json",
    Language: "zh-cn",
    client: "browser",
  },
});

// 请求拦截器
http.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    if (language.value == 1) config.headers.Language = "en-us";
    const TOKEN = getToken();
    if (TOKEN) config.headers.Authorization = TOKEN;
    if (config.method == "get") config.params = config.data;
    // console.log("config", config);
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
http.interceptors.response.use(
  (response) => {
    // 判断是否有异常
      if (
          response.request.responseType === 'blob' ||
          response.request.responseType === 'arraybuffer'
      ) {
          return response
      }

    let error = null; // 若无异常此值为null
    if (response.status !== 200) {
      error = Error(`Request failed with statuCode ${response.status}`);
    }

    if (response.data.code != 200) {
      ElMessage({ type: "error", message: response.data.msg });
      return Promise.reject(response.data);
    }


    return response.data;
  },
  (error) => {
    // 对响应错误做点什么
    return Promise.reject(error);
  }
);

export function download(url, params, filename, config) {
    return http.post( url,params, {
            transformRequest: [
                (params) => {
                    return tansParams(params)
                }
            ],
            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            responseType: 'blob',
            ...config
        })
        .then(async(res) => {
            const data = res.data
            console.log(blobValidate(data))
            const isBlob = blobValidate(data)
            if (isBlob) {
                let hz = ''
                if (res.headers['content-disposition'].indexOf('zip') > -1 || res.headers['content-type'].indexOf('pdf') > -1) {
                    // if (res.headers['content-type'].indexOf('zip') > -1) {
                    //   hz = '.zip'
                    // } else if (res.headers['content-type'].indexOf('pdf') > -1) {
                    //   hz = '.pdf'
                    // }
                    const index = res.headers['content-disposition'].indexOf('=')
                    hz = res.headers['content-disposition'].substr(index + 1, res.headers['content-disposition'].length)
                }
                const blob = new Blob([data])
                saveAs(blob, hz ? filename = decodeURIComponent(hz) : filename)
            } else {
                const resText = await data.text()
                const rspObj = JSON.parse(resText)
                const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
                ElMessage.error(errMsg)
            }
        }).catch((r) => {
            console.error(url,r)
            ElMessage.error('下载文件出现错误,请联系管理员!')
        })
}

// 封装请求函数
function request(method, url, data = null){
  return http({
    method,
    url,
    data,
  });
}

export default request;