request.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. import axios from "axios";
  2. import { Notification, MessageBox, Message, Loading } from "element-ui";
  3. import store from "@/store";
  4. import { getToken } from "@/utils/auth";
  5. import errorCode from "@/utils/errorCode";
  6. import { tansParams, blobValidate } from "@/utils/ruoyi";
  7. import cache from "@/plugins/cache";
  8. import { saveAs } from "file-saver";
  9. let downloadLoadingInstance;
  10. // 是否显示重新登录
  11. export let isRelogin = { show: false };
  12. axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
  13. // 创建axios实例
  14. const service = axios.create({
  15. // axios中请求配置有baseURL选项,表示请求URL公共部分
  16. baseURL: process.env.VUE_APP_BASE_API,
  17. // 超时
  18. timeout: 10000,
  19. });
  20. // request拦截器
  21. service.interceptors.request.use(
  22. (config) => {
  23. // 是否需要设置 token
  24. const isToken = (config.headers || {}).isToken === false;
  25. // 是否需要防止数据重复提交
  26. const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
  27. // 是否存在列表查询
  28. const isQueryList =
  29. config.url.includes("/list") || config.url.includes("/query");
  30. if (getToken() && !isToken) {
  31. config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
  32. }
  33. // get请求映射params参数
  34. if (config.method === "get" && config.params) {
  35. let url = config.url + "?" + tansParams(config.params);
  36. url = url.slice(0, -1);
  37. config.params = {};
  38. config.url = url;
  39. }
  40. if (
  41. !isRepeatSubmit &&
  42. !isQueryList &&
  43. (config.method === "post" || config.method === "put")
  44. ) {
  45. const requestObj = {
  46. url: config.url,
  47. data:
  48. typeof config.data === "object"
  49. ? JSON.stringify(config.data)
  50. : config.data,
  51. time: new Date().getTime(),
  52. };
  53. const sessionObj = cache.session.getJSON("sessionObj");
  54. if (
  55. sessionObj === undefined ||
  56. sessionObj === null ||
  57. sessionObj === ""
  58. ) {
  59. cache.session.setJSON("sessionObj", requestObj);
  60. } else {
  61. const s_url = sessionObj.url; // 请求地址
  62. const s_data = sessionObj.data; // 请求数据
  63. const s_time = sessionObj.time; // 请求时间
  64. const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
  65. if (
  66. s_data === requestObj.data &&
  67. requestObj.time - s_time < interval &&
  68. s_url === requestObj.url
  69. ) {
  70. const message = "数据正在处理,请勿重复提交";
  71. console.warn(`[${s_url}]: ` + message);
  72. return Promise.reject(new Error(message));
  73. } else {
  74. cache.session.setJSON("sessionObj", requestObj);
  75. }
  76. }
  77. }
  78. return config;
  79. },
  80. (error) => {
  81. console.log(error);
  82. Promise.reject(error);
  83. }
  84. );
  85. // 响应拦截器
  86. service.interceptors.response.use(
  87. (res) => {
  88. // 未设置状态码则默认成功状态
  89. const code = res.data.code || 200;
  90. // 获取错误信息
  91. const msg =
  92. errorCode[code] ||
  93. res.data.msg.replaceAll(/(\n|\r|\r\n|↵)/g, "<br/>") ||
  94. errorCode["default"];
  95. // 二进制数据则直接返回
  96. if (
  97. res.request.responseType === "blob" ||
  98. res.request.responseType === "arraybuffer"
  99. ) {
  100. return res.data;
  101. }
  102. if (code === 401) {
  103. if (!isRelogin.show) {
  104. isRelogin.show = true;
  105. MessageBox.confirm(
  106. "登录状态已过期,您可以继续留在该页面,或者重新登录",
  107. "系统提示",
  108. {
  109. confirmButtonText: "重新登录",
  110. cancelButtonText: "取消",
  111. type: "warning",
  112. }
  113. )
  114. .then(() => {
  115. isRelogin.show = false;
  116. store.dispatch("LogOut").then(() => {
  117. location.href = "/index";
  118. });
  119. })
  120. .catch(() => {
  121. isRelogin.show = false;
  122. });
  123. }
  124. return Promise.reject("无效的会话,或者会话已过期,请重新登录。");
  125. } else if (code === 500) {
  126. Notification.error({ title: "error", message: msg });
  127. // Message({ message: msg, type: "error" });
  128. return Promise.reject(new Error(msg));
  129. } else if (code === 601) {
  130. Notification.warning({ title: "error", message: msg });
  131. // Message({ message: msg, type: "warning" });
  132. return Promise.reject("error");
  133. } else if (code !== 200) {
  134. Notification.error({ title: msg });
  135. return Promise.reject("error");
  136. } else {
  137. return res.data;
  138. }
  139. },
  140. (error) => {
  141. console.log("err" + error);
  142. let { message } = error;
  143. if (message == "Network Error") {
  144. message = "后端接口连接异常";
  145. } else if (message.includes("timeout")) {
  146. message = "系统接口请求超时";
  147. } else if (message.includes("Request failed with status code")) {
  148. message = "系统接口" + message.substr(message.length - 3) + "异常";
  149. }
  150. Message({ message: message, type: "error", duration: 5 * 1000 });
  151. return Promise.reject(error);
  152. }
  153. );
  154. // 通用下载方法
  155. export function download(url, params, filename, config) {
  156. downloadLoadingInstance = Loading.service({
  157. text: "正在下载数据,请稍候",
  158. spinner: "el-icon-loading",
  159. background: "rgba(255, 255, 255, 0.7)",
  160. });
  161. return service
  162. .post(url, params, {
  163. transformRequest: [
  164. (params) => {
  165. return tansParams(params);
  166. },
  167. ],
  168. headers: { "Content-Type": "application/x-www-form-urlencoded" },
  169. responseType: "blob",
  170. ...config,
  171. })
  172. .then(async (data) => {
  173. const isBlob = blobValidate(data);
  174. if (isBlob) {
  175. const blob = new Blob([data]);
  176. saveAs(blob, filename);
  177. } else {
  178. const resText = await data.text();
  179. const rspObj = JSON.parse(resText);
  180. const errMsg =
  181. errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
  182. Message.error(errMsg);
  183. }
  184. downloadLoadingInstance.close();
  185. })
  186. .catch((r) => {
  187. console.error(r);
  188. Message.error("下载文件出现错误,请联系管理员!");
  189. downloadLoadingInstance.close();
  190. });
  191. }
  192. // // 通用上传方法
  193. // export function upload(url, params, filename, config) {
  194. // downloadLoadingInstance = Loading.service({
  195. // text: "正在上传数据,请稍候",
  196. // spinner: "el-icon-loading",
  197. // background: "rgba(255, 255, 255, 0.7)",
  198. // });
  199. // return service
  200. // .post(url, params, {
  201. // transformRequest: [
  202. // (params) => {
  203. // return tansParams(params);
  204. // },
  205. // ],
  206. // headers: { "Content-Type": "application/x-www-form-urlencoded" },
  207. // responseType: "blob",
  208. // ...config,
  209. // })
  210. // .then(async (data) => {
  211. // const isBlob = blobValidate(data);
  212. // if (isBlob) {
  213. // const blob = new Blob([data]);
  214. // saveAs(blob, filename);
  215. // } else {
  216. // const resText = await data.text();
  217. // const rspObj = JSON.parse(resText);
  218. // const errMsg =
  219. // errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
  220. // Message.error(errMsg);
  221. // }
  222. // downloadLoadingInstance.close();
  223. // })
  224. // .catch((r) => {
  225. // console.error(r);
  226. // Message.error("下载文件出现错误,请联系管理员!");
  227. // downloadLoadingInstance.close();
  228. // });
  229. // }
  230. export default service;