axios.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. import Vue from "vue";
  2. import axios from "axios";
  3. import router from "../router";
  4. import { loadProgressBar } from "axios-progress-bar";
  5. const ERROR_MSG_CONFIG = require("./errorMsgConfig").default;
  6. // Full config: https://github.com/axios/axios#request-config
  7. // axios.defaults.baseURL = process.env.baseURL || process.env.apiUrl || '';
  8. // axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
  9. // axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  10. let config = {
  11. // baseURL: process.env.baseURL || process.env.apiUrl || ""
  12. timeout: 60 * 1000, // Timeout
  13. withCredentials: true // Check cross-site Access-Control
  14. };
  15. const _$httpWith500Msg = axios.create(config);
  16. const _$http = axios.create(config); // no auto 500 error UI
  17. /**
  18. * A. token lifecycle
  19. * 1. /login UI => localStorage.removeItem('token') && localStorage.setItem('token')
  20. * 2. non /login UI => axios if(!wk_token) wk_token = window.sessionStorage.getItem("token"), send request
  21. * 3. if axios request fail with 401/403, wk_token = null, redirect to /login removeItem('token')
  22. * 4. logout to /login, before send request, invalidate wk_token
  23. * */
  24. let wk_token, wk_key;
  25. let wk_orgId;
  26. function getRootOrgId() {
  27. if (location.hostname.includes("qmth.com.cn")) {
  28. return "";
  29. } else {
  30. return "?orgId=" + (wk_orgId === undefined ? "" : wk_orgId);
  31. }
  32. }
  33. _$httpWith500Msg.interceptors.request.use(
  34. function(config) {
  35. // Do something before request is sent
  36. if (
  37. config.url.includes("/login") === false &&
  38. config.url.includes("/auth/thirdPartyAccess") === false
  39. ) {
  40. if (!wk_token) {
  41. const user = JSON.parse(window.sessionStorage.getItem("user"));
  42. if (!user) {
  43. Vue.prototype.$alert("登录失效,请重新登录!", "提示", {
  44. confirmButtonText: "确定",
  45. callback: () => {
  46. // if (process.env.NODE_ENV !== "production") {
  47. // router.push("/login/" + "?orgId=" + wk_orgId);
  48. // } else {
  49. // router.push("/login");
  50. // }
  51. router.push("/login/" + getRootOrgId());
  52. }
  53. });
  54. return;
  55. }
  56. wk_token = user.token;
  57. wk_key = user.key;
  58. wk_orgId = user.rootOrgId;
  59. }
  60. if (wk_token && config.headers.common["token"] == null) {
  61. config.headers.common["token"] = wk_token;
  62. config.headers.common["key"] = wk_key;
  63. }
  64. } else {
  65. wk_token = null;
  66. }
  67. return config;
  68. },
  69. function(error) {
  70. // Do something with request error
  71. Vue.prototype.$notify({
  72. showClose: true,
  73. message: error,
  74. type: "error"
  75. });
  76. return Promise.reject(error);
  77. }
  78. );
  79. _$http.interceptors.request.use(
  80. // no auto 500 error UI
  81. function(config) {
  82. // Do something before request is sent
  83. if (config.url.includes("/login") === false) {
  84. if (!wk_token) {
  85. const user = JSON.parse(window.sessionStorage.getItem("user"));
  86. if (!user) {
  87. Vue.prototype.$alert("登录失效,请重新登录!", "提示", {
  88. confirmButtonText: "确定",
  89. callback: () => {
  90. router.push("/login/" + getRootOrgId());
  91. }
  92. });
  93. return;
  94. }
  95. wk_token = user.token;
  96. wk_key = user.key;
  97. wk_orgId = user.rootOrgId;
  98. }
  99. if (wk_token && config.headers.common["token"] == null) {
  100. config.headers.common["token"] = wk_token;
  101. config.headers.common["key"] = wk_key;
  102. }
  103. } else {
  104. wk_token = null;
  105. }
  106. return config;
  107. },
  108. function(error) {
  109. // Do something with request error
  110. Vue.prototype.$notify({
  111. showClose: true,
  112. message: error,
  113. type: "error"
  114. });
  115. return Promise.reject(error);
  116. }
  117. );
  118. // Add a response interceptor
  119. _$httpWith500Msg.interceptors.response.use(
  120. response => {
  121. return response;
  122. },
  123. error => {
  124. console.log(error);
  125. if (!error.response) {
  126. // "Network Error" 网络不通,直接返回
  127. Vue.prototype.$notify({
  128. showClose: true,
  129. message: "网络连接异常,请检查网络设置。",
  130. type: "error"
  131. });
  132. return Promise.reject(error);
  133. }
  134. // 这里是返回状态码不为200时候的错误处理
  135. let status = error.response.status;
  136. // 登录失效 跳转登录页面
  137. if (status == 403 || status == 401) {
  138. Vue.prototype.$alert("登录失效,请重新登录!", "提示", {
  139. confirmButtonText: "确定",
  140. callback: () => {
  141. router.push("/login/" + getRootOrgId());
  142. }
  143. });
  144. return Promise.reject(error);
  145. } else if (status == 405) {
  146. Vue.prototype.$alert("没有权限!", "提示", {
  147. confirmButtonText: "确定",
  148. callback: () => {
  149. router.push("/login/" + getRootOrgId());
  150. }
  151. });
  152. return Promise.reject(error);
  153. } else if (status == 502) {
  154. Vue.prototype.$alert("服务器异常!", "提示", {
  155. confirmButtonText: "确定"
  156. });
  157. return Promise.reject(error);
  158. }
  159. if (status != 200) {
  160. const data = error.response.data;
  161. if (ERROR_MSG_CONFIG.map(v => v.code).includes(data.code)) {
  162. const MSG = ERROR_MSG_CONFIG.find(v => v.code === data.code);
  163. if (MSG.display) {
  164. Vue.prototype.$notify({
  165. showClose: true,
  166. message: MSG.message,
  167. type: "error"
  168. });
  169. }
  170. } else {
  171. if (data && data.desc) {
  172. Vue.prototype.$notify({
  173. showClose: true,
  174. message: data.desc,
  175. type: "error"
  176. });
  177. } else {
  178. Vue.prototype.$notify({
  179. showClose: true,
  180. message: "未定义异常: " + JSON.stringify(data, 2),
  181. type: "error"
  182. });
  183. }
  184. }
  185. return Promise.reject(error);
  186. }
  187. }
  188. );
  189. // Add a response interceptor
  190. _$http.interceptors.response.use(
  191. // no auto 500 error UI
  192. response => {
  193. return response;
  194. },
  195. error => {
  196. if (!error.response) {
  197. Vue.prototype.$notify({
  198. showClose: true,
  199. message: "网络连接异常,请检查网络设置。",
  200. type: "error"
  201. });
  202. return Promise.reject(error);
  203. }
  204. // 这里是返回状态码不为200时候的错误处理
  205. let status = error.response.status;
  206. // 登录失效 跳转登录页面
  207. if (status == 403 || status == 401) {
  208. Vue.prototype.$alert("登录失效,请重新登录!", "提示", {
  209. confirmButtonText: "确定",
  210. callback: () => {
  211. router.push("/login/" + getRootOrgId());
  212. }
  213. });
  214. return Promise.reject(error);
  215. } else if (status == 405) {
  216. Vue.prototype.$alert("没有权限!", "提示", {
  217. confirmButtonText: "确定",
  218. callback: () => {
  219. router.push("/login/" + getRootOrgId());
  220. }
  221. });
  222. return Promise.reject(error);
  223. } else if (status == 502) {
  224. Vue.prototype.$alert("服务器异常!", "提示", {
  225. confirmButtonText: "确定"
  226. });
  227. return Promise.reject(error);
  228. }
  229. if (status != 200) {
  230. return Promise.reject(error);
  231. }
  232. }
  233. );
  234. Plugin.install = function(Vue) {
  235. Vue.$http = _$http; // no auto 500 error UI
  236. Object.defineProperties(Vue.prototype, {
  237. $http: {
  238. get() {
  239. return _$http; // no auto 500 error UI
  240. }
  241. }
  242. });
  243. Vue.$httpWithMsg = _$httpWith500Msg;
  244. Object.defineProperties(Vue.prototype, {
  245. $httpWithMsg: {
  246. get() {
  247. return _$httpWith500Msg;
  248. }
  249. }
  250. });
  251. // for below request
  252. // config.url.includes("/api/ecs_ques/paper/") === false &&
  253. // config.url.includes("/api/ecs_ques/questionAudio") === false
  254. const _a = axios.create(config);
  255. Vue.$httpWithoutAuth = _a;
  256. Object.defineProperties(Vue.prototype, {
  257. $httpWithoutAuth: {
  258. get() {
  259. return _a;
  260. }
  261. }
  262. });
  263. };
  264. Vue.use(Plugin);
  265. loadProgressBar({}, Vue.$http);
  266. loadProgressBar({}, Vue.$httpWithMsg);
  267. loadProgressBar({}, Vue.$httpWithoutAuth);
  268. import "axios-progress-bar/dist/nprogress.css";
  269. export default Plugin;