micro_request.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import axios from "axios";
  2. import { showNotify, showDialog } from 'vant';
  3. import { Local, Session } from '/@/utils/storage';
  4. import errorCode from "/@/utils/errorCode.js";
  5. import { useRouter } from 'vue-router'
  6. const router = useRouter()
  7. axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
  8. const service: any = axios.create({
  9. // axios中请求配置有baseURL选项,表示请求URL公共部分
  10. baseURL: import.meta.env.VITE_API_URL,
  11. // 超时
  12. timeout: 60000
  13. });
  14. // request拦截器
  15. service.interceptors.request.use(
  16. config => {
  17. config.headers["Tenant"] = import.meta.env.VITE_TENANT;
  18. // 是否需要设置 token
  19. const isToken = (config.headers || {}).isToken === false;
  20. if (Local.get('token') && !isToken) {
  21. config.headers["Authorization"] = "Bearer " + Local.get('token'); // 让每个请求携带自定义token 请根据实际情况自行修改
  22. }
  23. return config;
  24. },
  25. error => {
  26. console.log(error);
  27. Promise.reject(error);
  28. }
  29. );
  30. // 响应拦截器
  31. service.interceptors.response.use(
  32. res => {
  33. if (res.request.responseType == "blob") {
  34. // 判断是否是文件流
  35. let fileReader = new FileReader();
  36. fileReader.readAsText(res.data);
  37. fileReader.onload = function() {
  38. try {
  39. let jsonData = JSON.parse(this.result as string); // 解析成功说明是普通对象数据,后端返回的是文件上传的错误信息
  40. res.data = jsonData;
  41. processResponse(res);
  42. return;
  43. } catch (err) {
  44. // 解析成对象失败,说明是文件流
  45. downLoadBlobFile(res);
  46. return;
  47. }
  48. };
  49. }
  50. // 常规响应处理
  51. return processResponse(res);
  52. },
  53. error => {
  54. console.log("err" + error);
  55. showNotify({
  56. message: error.message,
  57. type: "danger",
  58. duration: 5 * 1000
  59. });
  60. return Promise.reject(error);
  61. }
  62. );
  63. service.postRequest = function postRequest(basePath, srvName, funcName, data) {
  64. if (data == undefined) {
  65. let nullParam = {
  66. nullparam: 0
  67. };
  68. data = nullParam;
  69. }
  70. return service.request({
  71. url: basePath,
  72. method: "post",
  73. headers: {
  74. "Content-Type": "application/rpcx",
  75. "X-RPCX-SerializeType": "1",
  76. "X-RPCX-ServicePath": srvName,
  77. "X-RPCX-ServiceMethod": funcName
  78. },
  79. data: data
  80. });
  81. };
  82. // 发出请求并要求把客户端信息传输给后端(IP和User-Agent)
  83. service.postRequestWithClientInfo = function postRequest(
  84. basePath,
  85. srvName,
  86. funcName,
  87. data
  88. ) {
  89. if (data == undefined) {
  90. let nullParam = { nullparam: 0 };
  91. data = nullParam;
  92. }
  93. return service.request({
  94. url: basePath,
  95. method: "post",
  96. headers: {
  97. "Content-Type": "application/rpcx",
  98. "X-RPCX-SerializeType": "1",
  99. "X-RPCX-ServicePath": srvName,
  100. "X-RPCX-ServiceMethod": funcName,
  101. "X-RPCX-Meta": "need_clint_Info=1"
  102. },
  103. data: data
  104. });
  105. };
  106. // Excel文件下载(服务端生成文件流)
  107. service.downloadExcel = function downloadExcel(
  108. basePath,
  109. srvName,
  110. funcName,
  111. data
  112. ) {
  113. if (data == undefined) {
  114. let nullParam = {
  115. nullparam: 0
  116. };
  117. data = nullParam;
  118. }
  119. var base_Path = "";
  120. if (basePath == import.meta.env.VUE_APP_FOSHAN_PATH) {
  121. base_Path = import.meta.env.VUE_APP_MicroSrvProxy_foshan_API + basePath;
  122. } else if (basePath == import.meta.env.VUE_APP_AdminPath) {
  123. base_Path = import.meta.env.VUE_APP_MicroSrvProxy_API + basePath;
  124. }
  125. service.request({
  126. url: base_Path,
  127. method: "post",
  128. responseType: "blob",
  129. headers: {
  130. "Content-Type": "application/rpcx",
  131. "X-RPCX-SerializeType": "1",
  132. "X-RPCX-ServicePath": srvName,
  133. "X-RPCX-ServiceMethod": funcName
  134. },
  135. data: data
  136. });
  137. };
  138. function processResponse(res) {
  139. // 未设置状态码则默认成功状态
  140. const code = res.data.code || 200;
  141. // 获取错误信息
  142. const message = errorCode[code] || res.data.message || errorCode["default"];
  143. if (code === 401) {
  144. showDialog({
  145. message: "登录状态已过期,请重新登录"
  146. }).then(() => {
  147. // / 清除缓存/token等
  148. Session.clear();
  149. Local.remove('token')
  150. window.location.reload()
  151. })
  152. } else if (code === 500) {
  153. showNotify({
  154. message: message,
  155. type: "danger"
  156. });
  157. return Promise.reject(new Error(message));
  158. } else if (code !== 200) {
  159. showNotify({ message: message, type: 'danger' });
  160. return Promise.reject(res.data);
  161. } else {
  162. // if (res.data.msg) {
  163. // Message({
  164. // message: res.data.msg,
  165. // type: "success"
  166. // });
  167. // }
  168. return res.data;
  169. }
  170. }
  171. function downLoadBlobFile(res: any, mimeType?: string) {
  172. if (mimeType == undefined) {
  173. mimeType = "application/vnd.ms-excel";
  174. }
  175. const aLink = document.createElement("a");
  176. var blob = new Blob([res.data], {
  177. type: mimeType
  178. });
  179. // //从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名;
  180. var patt = new RegExp("filename=([^;]+\\.[^\\.;]+);*");
  181. var contentDisposition = decodeURI(
  182. res.headers["content-disposition"] || res.headers["Content-Disposition"]
  183. );
  184. var result = patt.exec(contentDisposition);
  185. var fileName = "data.xlsx";
  186. if (result != undefined) {
  187. fileName = result[1];
  188. fileName = decodeURI(escape(fileName));
  189. fileName = fileName.replace(/\"/g, "");
  190. }
  191. aLink.href = URL.createObjectURL(blob);
  192. aLink.setAttribute("download", fileName); // 设置下载文件名称
  193. document.body.appendChild(aLink);
  194. aLink.click();
  195. document.body.appendChild(aLink);
  196. }
  197. export default service;