main.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import Vue from "vue";
  2. import App from "./App.vue";
  3. import router from "./router";
  4. import ElementUI from "element-ui";
  5. import "element-ui/lib/theme-chalk/index.css";
  6. import "./assets/css/common.css";
  7. import axios from "axios";
  8. const axiosRetry = require("axios-retry");
  9. Vue.config.productionTip = false;
  10. // Vue.use(VueResource);
  11. Vue.use(ElementUI);
  12. const qmInstance = axios.create({});
  13. let wk_token;
  14. // 正在处理的请求数
  15. window.requestInProcessingTotal = 0;
  16. // 并发的总错误数
  17. window.faceppConcurrencyErrorNum = 0;
  18. // 每分钟并发错误的数量
  19. window.faceppConcurrencyErrorNumPerMinute = 0;
  20. let faceppConCurrencyErrorArray = [];
  21. qmInstance.interceptors.request.use(
  22. config => {
  23. if (config.url.includes("/login") === false) {
  24. if (!wk_token) {
  25. wk_token = window.localStorage.getItem("token");
  26. }
  27. if (wk_token && config.headers.common["token"] == null) {
  28. config.headers.common["key"] = window.localStorage.getItem("key");
  29. config.headers.common["token"] = wk_token;
  30. }
  31. } else {
  32. wk_token = null;
  33. }
  34. window.requestInProcessingTotal++;
  35. return config;
  36. },
  37. error => {
  38. console.log(error);
  39. return Promise.resolve(error);
  40. }
  41. );
  42. // 计算每分钟的并发错误数
  43. function calcErrorPerMinute(now) {
  44. const valid = faceppConCurrencyErrorArray.filter(
  45. t => now - t < 3 * 60 * 1000
  46. );
  47. window.faceppConcurrencyErrorNumPerMinute = (
  48. (60 * 1000 * valid.length) /
  49. (now - valid[0])
  50. ).toFixed(2);
  51. if (valid.length <= 1) {
  52. window.faceppConcurrencyErrorNumPerMinute = 0;
  53. }
  54. }
  55. //响应拦截
  56. qmInstance.interceptors.response.use(
  57. response => {
  58. window.requestInProcessingTotal--;
  59. // 相当于timer的作用
  60. const now = Date.now();
  61. calcErrorPerMinute(now);
  62. return response;
  63. },
  64. error => {
  65. window.requestInProcessingTotal--;
  66. // 这里是返回状态码不为200时候的错误处理
  67. const status = error.response.status;
  68. if (status != 200) {
  69. console.log(error);
  70. if (error.response.data.error_message) {
  71. console.log(error.response.data.error_message);
  72. if (error.response.data.error_message.toLowerCase().includes("limit")) {
  73. // 这是facepp并发错误的response特征
  74. const now = Date.now();
  75. faceppConCurrencyErrorArray.push(now);
  76. if (faceppConCurrencyErrorArray.length > 200) {
  77. faceppConCurrencyErrorArray.shift();
  78. }
  79. calcErrorPerMinute(now);
  80. window.faceppConcurrencyErrorNum++;
  81. }
  82. }
  83. }
  84. // 判断reponse的内容,如果是no login就退出
  85. if (
  86. error.response.data.code === "403"
  87. // &&
  88. // error.response.data.desc === "no login." // 线上可能是 token is wrong
  89. ) {
  90. wk_token = null;
  91. localStorage.removeItem("rootOrgId");
  92. localStorage.removeItem("userName");
  93. window.localStorage.removeItem("token");
  94. window.localStorage.removeItem("key");
  95. if (Date.now() - (window.logAlertDate || 0) > 10000) {
  96. window.logAlertDate = Date.now();
  97. alert("登录失效 跳转登录页面");
  98. }
  99. // router.push({
  100. // name: "login"
  101. // });
  102. location.replace("/");
  103. }
  104. // 登录失效 跳转登录页面 //facepp可能返回403
  105. // if (status == 403 || status == 401) {
  106. // wk_token = null;
  107. // localStorage.removeItem("rootOrgId");
  108. // localStorage.removeItem("userName");
  109. // localStorage.removeItem("user_token");
  110. // if (Date.now() - (window.logAlertDate || 0) > 10000) {
  111. // window.logAlertDate = Date.now();
  112. // alert("登录失效 跳转登录页面");
  113. // }
  114. // router.push({
  115. // name: "login"
  116. // });
  117. // }
  118. return Promise.reject(error);
  119. }
  120. );
  121. qmInstance.defaults.withCredentials = true; //允许跨域携带cookie
  122. qmInstance.defaults.timeout = 10000; //超时时间
  123. qmInstance.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest"; //标识这是一个 ajax 请求
  124. axiosRetry(qmInstance, {
  125. retries: 5, // 重试5次
  126. retryCondition: err => {
  127. // 根据err的特征来执行请求,目前是全部请求
  128. console.log(
  129. `below error status code: ${err.response.status} and retry ...`
  130. );
  131. console.log(err);
  132. console.log();
  133. return true;
  134. }
  135. });
  136. Vue.prototype.$http = qmInstance;
  137. new Vue({
  138. router,
  139. render: h => h(App)
  140. }).$mount("#app");