main.js 4.2 KB

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