axios.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import Vue from "vue";
  2. import axios from "axios";
  3. import router from "../router";
  4. // Full config: https://github.com/axios/axios#request-config
  5. // axios.defaults.baseURL = process.env.baseURL || process.env.apiUrl || '';
  6. // axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
  7. // axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  8. let config = {
  9. // baseURL: process.env.baseURL || process.env.apiUrl || ""
  10. timeout: 60 * 1000, // Timeout
  11. withCredentials: true // Check cross-site Access-Control
  12. };
  13. const _axios = axios.create(config);
  14. const _axiosWithoutResponseInterceptors = axios.create(config);
  15. /**
  16. * A. token lifecycle
  17. * 1. /login UI => localStorage.removeItem('token') && localStorage.setItem('token')
  18. * 2. non /login UI => axios if(!wk_token) wk_token = window.sessionStorage.getItem("token"), send request
  19. * 3. if axios request fail with 401/403, wk_token = null, redirect to /login removeItem('token')
  20. * 4. logout to /login, before send request, invalidate wk_token
  21. * */
  22. let wk_token, wk_key;
  23. let wk_orgId;
  24. _axios.interceptors.request.use(
  25. function(config) {
  26. // Do something before request is sent
  27. if (config.url.includes("/login") === false) {
  28. if (!wk_token) {
  29. const user = JSON.parse(window.sessionStorage.getItem("user"));
  30. if (!user) {
  31. Vue.prototype.$alert("登录失效,请重新登录!", "提示", {
  32. confirmButtonText: "确定",
  33. callback: () => {
  34. router.push("/login/" + "?orgId=" + wk_orgId);
  35. }
  36. });
  37. return;
  38. }
  39. wk_token = user.token;
  40. wk_key = user.key;
  41. wk_orgId = user.rootOrgId;
  42. }
  43. if (wk_token && config.headers.common["token"] == null) {
  44. config.headers.common["token"] = wk_token;
  45. config.headers.common["key"] = wk_key;
  46. }
  47. } else {
  48. wk_token = null;
  49. }
  50. return config;
  51. },
  52. function(error) {
  53. // Do something with request error
  54. Vue.prototype.$notify({
  55. showClose: true,
  56. message: error,
  57. type: "error"
  58. });
  59. return Promise.reject(error);
  60. }
  61. );
  62. _axiosWithoutResponseInterceptors.interceptors.request.use(
  63. function(config) {
  64. // Do something before request is sent
  65. if (config.url.includes("/login") === false) {
  66. if (!wk_token) {
  67. const user = JSON.parse(window.sessionStorage.getItem("user"));
  68. wk_token = user.token;
  69. wk_key = user.key;
  70. wk_orgId = user.rootOrgId;
  71. }
  72. if (wk_token && config.headers.common["token"] == null) {
  73. config.headers.common["token"] = wk_token;
  74. config.headers.common["key"] = wk_key;
  75. }
  76. } else {
  77. wk_token = null;
  78. }
  79. return config;
  80. },
  81. function(error) {
  82. // Do something with request error
  83. Vue.prototype.$notify({
  84. showClose: true,
  85. message: error,
  86. type: "error"
  87. });
  88. return Promise.reject(error);
  89. }
  90. );
  91. // Add a response interceptor
  92. _axios.interceptors.response.use(
  93. response => {
  94. return response;
  95. },
  96. error => {
  97. console.log(error);
  98. if (!error.response) {
  99. // "Network Error" 网络不通,直接返回
  100. Vue.prototype.$notify({
  101. showClose: true,
  102. message: "网络连接异常,请检查网络设置。",
  103. type: "error"
  104. });
  105. return Promise.reject(error);
  106. }
  107. // 这里是返回状态码不为200时候的错误处理
  108. let status = error.response.status;
  109. // 登录失效 跳转登录页面
  110. if (status == 403 || status == 401) {
  111. Vue.prototype.$alert("登录失效,请重新登录!", "提示", {
  112. confirmButtonText: "确定",
  113. callback: () => {
  114. router.push("/login/" + "?orgId=" + wk_orgId);
  115. }
  116. });
  117. return Promise.reject(error);
  118. } else if (status == 405) {
  119. Vue.prototype.$alert("没有权限!", "提示", {
  120. confirmButtonText: "确定",
  121. callback: () => {
  122. router.push("/login/" + "?orgId=" + wk_orgId);
  123. }
  124. });
  125. return Promise.reject(error);
  126. }
  127. if (status != 200) {
  128. const data = error.response.data;
  129. if (data && data.desc) {
  130. Vue.prototype.$notify({
  131. showClose: true,
  132. message: data.desc,
  133. type: "error"
  134. });
  135. } else {
  136. Vue.prototype.$notify({
  137. showClose: true,
  138. message: "未定义异常: " + JSON.stringify(data, 2),
  139. type: "error"
  140. });
  141. }
  142. return Promise.reject(error);
  143. }
  144. }
  145. );
  146. Plugin.install = function(Vue) {
  147. Vue.$http = _axiosWithoutResponseInterceptors;
  148. Object.defineProperties(Vue.prototype, {
  149. $http: {
  150. get() {
  151. return _axiosWithoutResponseInterceptors;
  152. }
  153. }
  154. });
  155. Vue.$httpWithMsg = _axios;
  156. Object.defineProperties(Vue.prototype, {
  157. $httpWithMsg: {
  158. get() {
  159. return _axios;
  160. }
  161. }
  162. });
  163. };
  164. Vue.use(Plugin);
  165. export default Plugin;