request-2ce564d0.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import{A as e}from"./axios-7accb92c.js";import{N as t}from"./nprogress-85851b89.js";import{c as n,r as s,g as r}from"./index-6530d0f6.js";import{E as o,a}from"./element-plus-842069d4.js";class i{
  2. // 声明一个 Map 用于存储每个请求的标识 和 取消函数
  3. static pending=new Map;
  4. // 白名单, 写入接口名称
  5. static whiteRequest=[];
  6. /**
  7. * 得到该格式的url
  8. * @param {AxiosRequestConfig} config
  9. * @returns
  10. */
  11. static getUrl(e,t){if(t.cancelToken&&t.cancelTokenName)return t.cancelTokenName;if(t.cancelUrl)return t.cancelUrl;let n="";return n=t.cancelToken?[e.method,e.url].join("&"):[e.method,e.url,
  12. (new Date).getTime(),Math.random()].join("&"),t.cancelUrl=n,n}
  13. /**
  14. * 添加请求
  15. * @param {AxiosRequestConfig} config
  16. */static addPending(t,n){const s=this.getUrl(t,n);t.cancelToken=t.cancelToken||new e.CancelToken((e=>{this.pending.has(s)||this.pending.set(s,e)}))}
  17. /**
  18. * 移除请求
  19. * @param {AxiosRequestConfig} config
  20. */static removePending(e,t){const n=this.getUrl(e,t);if(!n)return;const s=n.split("&")&&n.split("&")[1];if(this.pending.has(n)&&!this.whiteRequest.includes(s)){const e=this.pending.get(n);e&&e(n),this.pending.delete(n)}}
  21. /**
  22. * 根据key 手动取消请求: cancelTokenName 清除pending中的请求
  23. */static removePendingByName(e){const t=this.pending.get(e);if(!t){return{success:!1,msg:"不存在该请求",type:"cancelToken"}}t({cancelTokenName:"key",munual:!0});return{success:!0,msg:"取消请求成功",type:"cancelToken"}}
  24. /**
  25. * 清空 pending 中的请求(在路由跳转时调用)
  26. */static clearPending(){for(const[e,t]of this.pending)t&&t(e);this.pending.clear()}}const c={SUCCESS:200,
  27. //成功code值
  28. // ERROR: -1,
  29. KEYS:{
  30. //返回结果集字段枚举
  31. DATA:"data",CODE:"result",ERROR_MSG:"errorMsg"}},l="multipart/form-data;charset=UTF-8",u={400:"发出的请求有错误,服务器没有进行新建或修改数据的操作",401:"您无权访问",403:"当前用户权限不足,不能继续执行",404:"网络请求错误,未找到该资源",405:"网络请求错误,请求方法未允许",406:"请求的格式不可得",408:"接口请求超时,请重试或刷新页面",410:"请求的资源被永久删除,且不会再得到的",422:"当创建一个对象时,发生一个验证错误",423:"指定的功能被锁定",500:"服务器发生错误,请检查服务器或联系管理员",501:"网络未实现",502:"网关错误",503:"服务不可用,服务器暂时过载或维护",504:"网关超时",505:"http版本不支持该请求",9999:"网络异常"};function d(e,t){const r=t.operate,i=t.result;let l=(r.ResultEnum||c).KEYS.ERROR_MSG;const d=r.CodeMsgEnum||u;switch(e){case 2007:o.closeAll(),a.close(),a.confirm(i&&i[l]?i[l]+",请重新登录":d[e],"提示").then((()=>{n.clear(),s.replace("/login")}));break;case 9999:o.closeAll(),a.close(),a.confirm(i&&i[l]||d[e],"提示",{confirmButtonText:"重新加载"}).then((()=>{window.location.reload()}));break;default:if(!r.showErrorMsg)return;o.closeAll(),i&&i[l]?o.error(i[l]):d[e]&&o.error(d[e])}}function m(e,t,n){if(e&&e instanceof Blob){(t=t||{}).filename;const s=t.blobType||"";let r=new Blob([e],{type:s}),o=window.URL.createObjectURL(r);!function(e,t){const n=(e=e||{}).target||"_blank";let s=document.createElement("a");s.style.display="none",s.href=e.url,s.target=n,void 0!==s.download&&s.setAttribute("download",e.filename||""),document.body.appendChild(s),s.click(),document.body.removeChild(s),t&&t({url:e.url,success:!0,msg:"下载成功"}),window.URL.revokeObjectURL(e.url)}({...t,url:o},n)}else n&&n({success:!1,msg:"数据为空或数据格式错误"})}const p={
  32. // vAxios.fileRequest文件流请求入口
  33. download:!0,
  34. // 默认download-true
  35. fileConfig:{
  36. //{*} filename, blobType, 当download为true时有效,文件名称,文件流格式设置
  37. key:"",
  38. //根据后端响应头key即文件名称下载
  39. filename:"",blobType:""},
  40. // vAxios.request请求主入口
  41. isReturnNativeResponse:!1,
  42. //是否返回原生响应头-true成功状态码时不做错误信息提示
  43. standard:!0,
  44. //true-数据为{data,msg,code}返回对象里的data, false-返回{data,msg,code}对象
  45. // 提示语设置
  46. showErrorMsg:!0,
  47. // 展示异常错误信息提示语-默认true-当需自定义时,可设置1.showErrorMsg:false, 2.也可通过message.closeAll();message.error(err && err.msg);
  48. // errorMessageMode: 'none', // 消息提示类型
  49. // token设置
  50. ignoreToken:!1,
  51. //请求是否忽略token,默认false,头部会带token请求
  52. tokenPrefix:"Bearer ",
  53. //token前缀
  54. tokenKey:"Authorization",
  55. //传到后台key-token
  56. // 取消请求设置
  57. ignoreCancel:!1,
  58. //true时请求不存入CancelToken.pending对象中
  59. cancelToken:!1,
  60. //同一接口默认清除上次未完成请求响应-默认false
  61. cancelTokenName:""};const f=new class{_customOperate0;_options;axiosInstance;constructor(t,n){this._customOperate0=null!=n?{...n}:{...p},this._options=t;const s=e.create(this._options);this.axiosInstance=s,this._setupInterceptors()}
  62. /**
  63. * @description: 拦截器配置
  64. */_setupInterceptors(){this.axiosInstance.interceptors.request.use((e=>{t.start();const s=e.customOperate||{},o=n.getItem("userInfo"),a=n.getItem("farmInfo"),c={userId:o&&o.id,
  65. // channel: 'farmPC',
  66. channel:"farmDATAV",systemId:"1",sid:123,farmId:a&&a.farmId||"",serviceCenterId:"",nonce:1736321682006};return"get"==e.method.toLocaleLowerCase()?e.params={...c,...e.params}:e.data={...c,...e.data},!s.ignoreToken&&r()&&(e.headers[s.tokenKey]=s.tokenPrefix+r()),s.token&&(e.headers[s.tokenKey]=s.tokenPrefix+s.token),s.cancelToken&&i.removePending(e,s),!s.ignoreCancel&&i.addPending(e,s),e}),(function(e){return t.done(),Promise.reject(e)})),this.axiosInstance.interceptors.response.use((e=>{t.done();const n=e&&e.config&&e.config.customOperate||{};if(e&&i.removePending(e.config,n),n.isReturnNativeResponse)return Promise.resolve(e);if(!e||!e.data)return Promise.reject({success:!1,msg:"请求出错,请稍候重试"});const s=n.ResultEnum||c;let r=e.data[s.KEYS.DATA],o=e.data[s.KEYS.CODE];return o==s.SUCCESS?n.standard?Promise.resolve(r):Promise.resolve(e.data):(d(o,{result:e.data,operate:n}),Promise.reject(e.data||{}))}),(n=>{t.done();const{response:s}=n||{};return function(t,n){if(e.isCancel(t))return Promise.reject({type:"cancelToken",msg:"取消请求",success:!1,error:t});const{response:s,message:r}=t||{},o=n.operate;try{r.includes("Network Error")&&d(9999,n),r.includes("timeout")&&d(408,n)}catch(m){return Promise.reject(m)}if(!s)return Promise.reject(t);const{status:a,data:i}=s,l=o.ResultEnum||c;let u=i&&i[l.KEYS.CODE];return d(a||u,{result:i,...n,errRes:s}),n.operate.isReturnNativeResponse?Promise.reject(t):Promise.reject(i||s||{})}(n,{operate:s&&s.config&&s.config.customOperate||{}})})),this.axiosInstance.interceptors.response.use(void 0,(function(t){let n=t.config;return n&&n.retry?(n.__retryCount=n.__retryCount||0,n.__retryCount>=n.retry?Promise.reject(t):(n.__retryCount+=1,new Promise((function(e){setTimeout((function(){e()}),n.retryDelay||1)})).then((function(){return e(n)})))):Promise.reject(t)}))}
  67. /**
  68. * @description: 请求主入口
  69. */request(e,t){t=t||{};const n=Object.assign({},this._customOperate0,t);return(e=Object.assign({},e)).customOperate=n,this.axiosInstance.request(e)}
  70. /**
  71. * @description: 最大并发请求
  72. * @params configs 待请求的config数组
  73. * @params maxNum 最大并发数
  74. */concurRequest(e,t){const n=t&&t.maxNum||1;return new Promise((s=>{if(0===e.length)return void s([]);const r=[];let o=0,a=0;const i=async()=>{if(o===e.length)return;const n=o,c=e[o];o++;try{const e=await this.request(c,t);r[n]=e}catch(l){r[n]=l}finally{a++,a===e.length&&s(r),i()}},c=Math.min(n,e.length);for(let e=0;e<c;e++)i()}))}
  75. /**
  76. * @description: 文件流请求入口
  77. * @config 请求参数
  78. * @download 自动下载默认为true
  79. * @fileConfig {*} filename,blobType
  80. * @isReturnNativeResponse true
  81. */fileRequest(e,t){t=t||{};let n=Object.assign({},this._customOperate0,{
  82. // download: true, //请求完下载-默认true
  83. isReturnNativeResponse:!0,...t});return e.responseType=e.responseType||"blob",n.download?new Promise(((t,s)=>{this.request(e,n).then((e=>{let r;const o=n.fileConfig.key||"name";if(e&&e.headers[o]){const t=e.headers[o];r=decodeURI(t)}let a;a=r?{...n.fileConfig,filename:r}:{...n.fileConfig},m(e.data,a,(e=>{0!=e.success?t(e):s(e)}))})).catch((e=>{s(e)}))})):this.request(e,n)}
  84. /**
  85. * @description: 文件上传入口
  86. * @config {*} url,method
  87. * @params {*} name://提交文件名称参数,file: 文件,filename
  88. * 调用上传接口示例
  89. vAxios.uploadFile({ data: form, name:'', file: file, filename:'' },operate);
  90. form-须与file合并的参数,一同传给后台
  91. */uploadFile(e,t,n){t=t||{};const s=new window.FormData,r=t.name||"file";return t.filename?s.append(r,t.file,t.filename):s.append(r,t.file),t.data&&Object.keys(t.data).forEach((e=>{const n=t.data[e];Array.isArray(n)?n.forEach((t=>{s.append(`${e}[]`,t)})):s.append(e,t.data[e])})),this.request({method:"POST",data:s,headers:{"Content-Type":l},...e},n)}}({
  92. //请求地址
  93. // baseURL: '',
  94. //请求超时
  95. // timeout: 1000*10,
  96. // 请求头
  97. // headers: {
  98. // "Content-Type": "application/json;charset=utf-8",
  99. // },
  100. // 是否允许带cookie
  101. withCredentials:!1},{
  102. // vAxios.fileRequest文件流请求入口
  103. download:!0,
  104. // 默认download-true
  105. fileConfig:{
  106. // {*} filename, blobType, 当download为true时有效,文件名称,文件流格式设置
  107. key:"",
  108. //根据后端响应头key即文件名称下载
  109. filename:"",blobType:""},
  110. // vAxios.request请求主入口
  111. isReturnNativeResponse:!1,
  112. //是否返回原生响应头-true成功状态码时不做错误信息提示
  113. standard:!0,
  114. //true-数据为{data,msg,code}返回对象里的data, false-返回{data,msg,code}对象
  115. // 提示语设置
  116. showErrorMsg:!0,
  117. // 展示异常错误信息提示语-默认true-当需自定义时,可设置1.showErrorMsg:false, 2.也可通过message.closeAll();message.error(err && err.msg);
  118. // errorMessageMode: 'none', // 消息提示类型
  119. // token设置
  120. ignoreToken:!1,
  121. //请求是否忽略token,默认false,头部会带token请求
  122. tokenPrefix:"",
  123. //token前缀
  124. tokenKey:"Authorization",
  125. //传到后台key:token
  126. // token: '2f4fed683f7245d6aded31a2f7183f6d',
  127. // 取消请求设置
  128. ignoreCancel:!1,
  129. //true时请求不存入CancelToken.pending对象中
  130. cancelToken:!1,
  131. //同一接口默认清除上次未完成请求响应-默认false
  132. cancelTokenName:""});export{f as v};
  133. //# sourceMappingURL=request-2ce564d0.js.map