mhttp.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. /**
  2. * 管理后台http客户端,避免冲突导出为mhttp
  3. */
  4. layui.define(['jquery', 'layer', 'http', 'toast', 'madmin'], function (exports) {
  5. "use strict";
  6. var $ = layui.jquery;
  7. var layer = layui.layer;
  8. var toast = layui.toast;
  9. var admin = layui.madmin;
  10. var http = {};
  11. http.ajax = function (userOptions, innerData) {
  12. var objOptions = {};
  13. if (userOptions && typeof(userOptions) == 'string') {
  14. // 参数是字符串,直接拼接选项url.
  15. objOptions.url = userOptions;
  16. userOptions = objOptions;
  17. }
  18. userOptions = userOptions || {};
  19. if (userOptions) {
  20. if (typeof(userOptions.url) != 'undefined') {
  21. var originUrl = userOptions.url;
  22. var config = admin.getConfig();
  23. var baseUrl = window._CONFIG_.sysconfig.apiServerBaseUrl;
  24. var reg1 = /^(http:|https:)/;
  25. if (!reg1.test(originUrl)) {
  26. userOptions.url = baseUrl.rtrim('/') + '/' + userOptions.url.ltrim('/');
  27. }
  28. var urlConcat = '&';
  29. if (userOptions.url.lastIndexOf('?') == -1) {
  30. // 没有找到.
  31. urlConcat = '?';
  32. }
  33. // 追加刷新随机hash.
  34. userOptions.url += urlConcat + '_fresh=' + Math.random() * 100000;
  35. // 相对协议.
  36. userOptions.url = slashesUrl(userOptions.url);
  37. }
  38. }
  39. if (innerData) {
  40. userOptions.data = JSON.stringify({
  41. "data" : innerData,
  42. "handshake": ''
  43. });
  44. }
  45. var originInnerData ={};
  46. if (userOptions.data){
  47. originInnerData = userOptions.data;
  48. }
  49. userOptions.data = JSON.stringify({
  50. "data" : originInnerData,
  51. "handshake": ''
  52. });
  53. var options = $.extend(true, {}, http.ajax.defaultOpts, userOptions);
  54. var oldBeforeSendOption = options.beforeSend;
  55. options.beforeSend = function (xhr) {
  56. if (oldBeforeSendOption) {
  57. oldBeforeSendOption(xhr);
  58. }
  59. xhr.setRequestHeader("Pragma", "no-cache");
  60. xhr.setRequestHeader("Cache-Control", "no-cache");
  61. xhr.setRequestHeader("Expires", "Sat, 01 Jan 2000 00:00:00 GMT");
  62. };
  63. options.success = undefined;
  64. options.error = undefined;
  65. return $.Deferred(function ($dfd) {
  66. $.ajax(options)
  67. .done(function (data, textStatus, jqXHR) {
  68. if (data.hasOwnProperty('code') && data.hasOwnProperty('handshake')) {
  69. // 盲写,还没对接接口测试.
  70. var intCode = parseInt(data.code);
  71. var redirectUrl = window.rootUrl + '/login.html';
  72. if (intCode == 403) {
  73. http.ajax.showErrorAndRedirectUrl(http.ajax.defaultError403, redirectUrl);
  74. } else if (intCode == 401) {
  75. // 仅仅是过期了,这里可以有其他逻辑补偿.
  76. // 暂时跳到登陆页面
  77. // refreshToken();
  78. http.ajax.showErrorAndRedirectUrlByYes(http.ajax.defaultError401, redirectUrl);
  79. }
  80. }
  81. $dfd.resolve(data);
  82. userOptions.success && userOptions.success(data);
  83. })
  84. .fail(function (jqXHR) {
  85. http.ajax.handleErrorResponse(jqXHR, userOptions, $dfd);
  86. });
  87. });
  88. }
  89. $.extend(http.ajax, {
  90. defaultOpts: {
  91. dataType: 'json',
  92. type: 'POST',
  93. contentType: 'application/json',
  94. // async:false,// 改成同步请求
  95. headers: {
  96. // 'X-Requested-With': 'XMLHttpRequest'
  97. }
  98. },
  99. defaultError: {
  100. message: '发生错误!',
  101. details: '未知错误.'
  102. },
  103. defaultError401: {
  104. message: '授权过期',
  105. details: '请重新登陆.'
  106. },
  107. defaultError403: {
  108. message: '认证失效!',
  109. details: '无权操作.'
  110. },
  111. defaultError404: {
  112. message: '资源未找到',
  113. details: '服务器上没找到资源.'
  114. },
  115. logError: function (error) {
  116. console.log(error);
  117. },
  118. showError: function (error) {
  119. if (error.details) {
  120. return layer.alert(error.details, {
  121. title: error.message,
  122. icon: 2,
  123. closeBtn: 0
  124. });
  125. } else {
  126. return layer.alert(http.ajax.defaultError.details, {
  127. title: error.message || http.ajax.defaultError.message,
  128. icon: 2,
  129. closeBtn: 0
  130. });
  131. }
  132. },
  133. showErrorAndRedirectUrlByYes: function (error, targetUrl) {
  134. return layer.alert(http.ajax.defaultError401.details, {
  135. title: http.ajax.defaultError401.message,
  136. icon: 2,
  137. closeBtn: 0
  138. }
  139. ,
  140. function (index) {
  141. http.ajax.handleTargetUrl(targetUrl)
  142. layer.close(index);
  143. }
  144. );
  145. },
  146. showErrorAndRedirectUrl: function (error, targetUrl) {
  147. if (error.details) {
  148. return layer.alert(error.details, {
  149. title: error.message,
  150. icon: 2,
  151. closeBtn: 0
  152. ,
  153. end: http.ajax.handleTargetUrl(targetUrl)
  154. }
  155. // ,
  156. // function (index) {
  157. // http.ajax.handleTargetUrl(targetUrl)
  158. // layer.close(index);
  159. // }
  160. );
  161. } else {
  162. return layer.alert(http.ajax.defaultError.details, {
  163. title: error.message || http.ajax.defaultError.message,
  164. icon: 2,
  165. closeBtn: 0
  166. ,
  167. end: http.ajax.handleTargetUrl(targetUrl)
  168. }
  169. // ,
  170. // function (index) {
  171. // http.ajax.handleTargetUrl(targetUrl)
  172. // layer.close(index);
  173. // }
  174. );
  175. }
  176. },
  177. handleTargetUrl: function (targetUrl) {
  178. if (!targetUrl) {
  179. parent.location.href = http.appPath;
  180. } else {
  181. parent.location.href = targetUrl;
  182. }
  183. },
  184. handleErrorResponse: function (jqXHR, userOptions, $dfd) {
  185. if (userOptions.customHandleError !== false) {
  186. switch (jqXHR.status) {
  187. case 401:
  188. http.ajax.showErrorAndRedirectUrl(http.ajax.defaultError401, http.appPath);
  189. break;
  190. case 403:
  191. http.ajax.showError(http.ajax.defaultError403);
  192. break;
  193. case 404:
  194. http.ajax.showError(http.ajax.defaultError404);
  195. break;
  196. default:
  197. http.ajax.showError(http.ajax.defaultError);
  198. break;
  199. }
  200. }
  201. $dfd.reject.apply(this, arguments);
  202. userOptions.error && userOptions.error.apply(this, arguments);
  203. },
  204. ajaxSendHandler: function (event, request, settings) {
  205. var token = http.ajax.getToken();
  206. if (!token) {
  207. return;
  208. }
  209. if (!settings.headers || settings.headers[http.ajax.tokenHeaderName] === undefined) {
  210. request.setRequestHeader(http.ajax.tokenHeaderName, token);
  211. }
  212. },
  213. setToken: function (token) {
  214. localStorage.setItem(http.ajax.tokenCookieName, token);
  215. },
  216. delToken: function () {
  217. localStorage.removeItem(http.ajax.tokenCookieName);
  218. },
  219. getToken: function () {
  220. return localStorage.getItem(http.ajax.tokenCookieName);
  221. },
  222. tokenCookieName :'XSRF-TOKEN',
  223. tokenHeaderName : 'AUTH-TOKEN',
  224. getCookieValue: function (key) {
  225. var equalities = document.cookie.split('; ');
  226. for (var i = 0; i < equalities.length; i++) {
  227. if (!equalities[i]) {
  228. continue;
  229. }
  230. var splitted = equalities[i].split('=');
  231. if (splitted.length != 2) {
  232. continue;
  233. }
  234. if (decodeURIComponent(splitted[0]) === key) {
  235. return decodeURIComponent(splitted[1] || '');
  236. }
  237. }
  238. return null;
  239. }
  240. });
  241. $(document).ajaxSend(function (event, request, settings) {
  242. return http.ajax.ajaxSendHandler(event, request, settings);
  243. });
  244. exports('mhttp', http);
  245. });