181 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| layui.define(['jquery', 'layer'], function (exports) {
 | |
|     "use strict";
 | |
| 
 | |
|     var $ = layui.jquery;
 | |
|     var layer = layui.layer;
 | |
| 
 | |
|     var http = {};
 | |
|     http.ajax = function (userOptions) {
 | |
|         userOptions = userOptions || {};
 | |
| 
 | |
|         var options = $.extend(true, {}, http.ajax.defaultOpts, userOptions);
 | |
|         var oldBeforeSendOption = options.beforeSend;
 | |
|         options.beforeSend = function (xhr) {
 | |
|             if (oldBeforeSendOption) {
 | |
|                 oldBeforeSendOption(xhr);
 | |
|             }
 | |
| 
 | |
|             xhr.setRequestHeader("Pragma", "no-cache");
 | |
|             xhr.setRequestHeader("Cache-Control", "no-cache");
 | |
|             xhr.setRequestHeader("Expires", "Sat, 01 Jan 2000 00:00:00 GMT");
 | |
|         };
 | |
| 
 | |
|         options.success = undefined;
 | |
|         options.error = undefined;
 | |
| 
 | |
|         return $.Deferred(function ($dfd) {
 | |
|             $.ajax(options)
 | |
|                 .done(function (data, textStatus, jqXHR) {
 | |
|                     $dfd.resolve(data);
 | |
|                     userOptions.success && userOptions.success(data);
 | |
|                 })
 | |
|                 .fail(function (jqXHR) {
 | |
|                     http.ajax.handleErrorResponse(jqXHR, userOptions, $dfd);
 | |
|                 });
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     $.extend(http.ajax, {
 | |
|         defaultOpts: {
 | |
|             dataType: 'json',
 | |
|             type: 'POST',
 | |
|             contentType: 'application/json',
 | |
|             headers: {
 | |
|                 'X-Requested-With': 'XMLHttpRequest'
 | |
|             },
 | |
|             customHandleError: true
 | |
|         },
 | |
| 
 | |
|         defaultError: {
 | |
|             message: 'An error has occurred!',
 | |
|             details: 'Error detail not sent by server.'
 | |
|         },
 | |
| 
 | |
|         defaultError401: {
 | |
|             message: 'You are not authenticated!',
 | |
|             details: 'You should be authenticated (sign in) in order to perform this operation.'
 | |
|         },
 | |
| 
 | |
|         defaultError403: {
 | |
|             message: 'You are not authorized!',
 | |
|             details: 'You are not allowed to perform this operation.'
 | |
|         },
 | |
| 
 | |
|         defaultError404: {
 | |
|             message: 'Resource not found!',
 | |
|             details: 'The resource requested could not found on the server.'
 | |
|         },
 | |
| 
 | |
|         logError: function (error) {
 | |
|             console.log(error);
 | |
|         },
 | |
| 
 | |
|         showError: function (error) {
 | |
|             if (error.details) {
 | |
|                 return layer.alert(error.details, {
 | |
|                     title: error.message,
 | |
|                     icon: 2,
 | |
|                     closeBtn: 0
 | |
|                 });
 | |
|             } else {
 | |
|                 return layer.alert(http.ajax.defaultError.details, {
 | |
|                     title: error.message || http.ajax.defaultError.message,
 | |
|                     icon: 2,
 | |
|                     closeBtn: 0
 | |
|                 });
 | |
|             }
 | |
|         },
 | |
| 
 | |
|         showErrorAndRedirectUrl: function (error, targetUrl) {
 | |
|             if (error.details) {
 | |
|                 return layer.alert(error.details, {
 | |
|                     title: error.message,
 | |
|                     icon: 2,
 | |
|                     closeBtn: 0,
 | |
|                     end: http.ajax.handleTargetUrl(targetUrl)
 | |
|                 });
 | |
|             } else {
 | |
|                 return layer.alert(http.ajax.defaultError.details, {
 | |
|                     title: error.message || http.ajax.defaultError.message,
 | |
|                     icon: 2,
 | |
|                     closeBtn: 0,
 | |
|                     end: http.ajax.handleTargetUrl(targetUrl)
 | |
|                 });
 | |
|             }
 | |
|         },
 | |
| 
 | |
|         handleTargetUrl: function (targetUrl) {
 | |
|             if (!targetUrl) {
 | |
|                 location.href = http.appPath;
 | |
|             } else {
 | |
|                 location.href = targetUrl;
 | |
|             }
 | |
|         },
 | |
| 
 | |
|         handleErrorResponse: function (jqXHR, userOptions, $dfd) {
 | |
|             if (!userOptions.customHandleError) {
 | |
|                 switch (jqXHR.status) {
 | |
|                     case 401:
 | |
|                         http.ajax.showErrorAndRedirectUrl(http.ajax.defaultError401, http.appPath);
 | |
|                         break;
 | |
|                     case 403:
 | |
|                         http.ajax.showError(http.ajax.defaultError403);
 | |
|                         break;
 | |
|                     case 404:
 | |
|                         http.ajax.showError(http.ajax.defaultError404);
 | |
|                         break;
 | |
|                     default:
 | |
|                         http.ajax.showError(http.ajax.defaultError);
 | |
|                         break;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             $dfd.reject.apply(this, arguments);
 | |
|             userOptions.error && userOptions.error.apply(this, arguments);
 | |
|         },
 | |
| 
 | |
|         ajaxSendHandler: function (event, request, settings) {
 | |
|             var token = http.ajax.getToken();
 | |
|             if (!token) {
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             if (!settings.headers || settings.headers[http.ajax.tokenHeaderName] === undefined) {
 | |
|                 request.setRequestHeader(http.ajax.tokenHeaderName, token);
 | |
|             }
 | |
|         },
 | |
| 
 | |
|         getToken: function () {
 | |
|             return http.ajax.getCookieValue(http.ajax.tokenCookieName);
 | |
|         },
 | |
| 
 | |
|         tokenCookieName: 'XSRF-TOKEN',
 | |
|         tokenHeaderName: 'X-XSRF-TOKEN',
 | |
| 
 | |
|         getCookieValue: function (key) {
 | |
|             var equalities = document.cookie.split('; ');
 | |
|             for (var i = 0; i < equalities.length; i++) {
 | |
|                 if (!equalities[i]) {
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 var splitted = equalities[i].split('=');
 | |
|                 if (splitted.length != 2) {
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 if (decodeURIComponent(splitted[0]) === key) {
 | |
|                     return decodeURIComponent(splitted[1] || '');
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return null;
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     $(document).ajaxSend(function (event, request, settings) {
 | |
|         return http.ajax.ajaxSendHandler(event, request, settings);
 | |
|     });
 | |
| 
 | |
|     exports('http', http);
 | |
| }); |