/* eslint-disable @typescript-eslint/no-var-requires */ import * as qs from 'qs'; import { requestInstance } from 'common/request'; import { fastMessage } from 'components/ui'; import { formatObjBySwitchArrToStr, formatObjByDeleteEmptyStr, setDefaultValue, getSearchParams, parseData2Url, } from 'utils/tool'; import { App } from 'utils/types'; const projectConfig = require('configure/projectConfig.json'); const localHost = projectConfig.localhost || []; localHost.push('localhost'); const env = localHost.includes(window.location.hostname) ? 'local.' : ''; const ajax = (config: App.Ajax, data: App.Dict = []) => { const { locationSearchParam, fixedParam, accept = [], urlParams, method = 'GET', contentType = 'application/x-www-form-urlencoded', notSwitchArrToStr, switchArrToStrSeparator, acceptEmptyStr, } = config; let formatedData: App.Dict = data; const { notSwitchArrToStr: globalNotSwitchArrToStr, acceptEmptyStr: globalAcceptEmptyStr, switchArrToStrSeparator: globalSwitchArrToStrSeparator, dataKey = 'data', codeKey, code, msg, outSessionCode, } = projectConfig; if (!notSwitchArrToStr && !globalNotSwitchArrToStr) { formatedData = formatObjBySwitchArrToStr(formatedData as App.Dict, switchArrToStrSeparator || globalSwitchArrToStrSeparator || ','); } if (!acceptEmptyStr && !globalAcceptEmptyStr) { formatedData = formatObjByDeleteEmptyStr(formatedData); } if (fixedParam) { Object.assign(formatedData, fixedParam); } if (locationSearchParam?.length) { locationSearchParam.forEach((item: any) => { formatedData[item] = setDefaultValue(getSearchParams()[item]); }); } const headers: App.Dict = {}; if (contentType) { headers['Content-Type'] = contentType; } const { url, data: nextFormatedData }: { url: string, data: App.Dict } = parseData2Url(formatedData, config[`${env as string}url`], accept as [], urlParams as []); if (contentType === App.AjaxContentType['multipart/form-data']) { formatedData = formatedData as App.Dict; const formData = new FormData(); Object.keys(formatedData).forEach((key: string) => { formData.append(key, formatedData[key]); }); formatedData = formData; } else { formatedData = nextFormatedData; } if (url.includes('#{key}')) { // console.error('存在#{key}未填充'); return Promise.reject(); } const requestConfig: App.RequestConfig = { url, method: method as App.AjaxMethod, headers, }; if (method === App.AjaxMethod.POST) { requestConfig.data = contentType === App.AjaxContentType['application/x-www-form-urlencoded'] ? qs.stringify(formatedData) : formatedData; } else { requestConfig.params = formatedData; } return requestInstance.request(requestConfig).then((rs: App.Dict) => { if (rs[codeKey] === code || rs.code === code) { return Promise.resolve(rs[dataKey]); } if (rs[codeKey] === outSessionCode) { return window.location.href = rs[dataKey].loginUrl; } fastMessage.error(rs[msg] || '操作失败'); return Promise.reject(rs); }); }; export default ajax;