From d2ff5b43aa1323a88823412dc8aa33382103734f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=8B=87?= <530521314@qq.com> Date: Sun, 6 Dec 2020 12:55:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ajax=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- component/pear/modules/http.js | 180 +++++++++++++++++++++++++++++++++ component/pear/pear.all.js | 3 +- component/pear/pear.js | 3 +- 3 files changed, 184 insertions(+), 2 deletions(-) create mode 100644 component/pear/modules/http.js diff --git a/component/pear/modules/http.js b/component/pear/modules/http.js new file mode 100644 index 0000000..0779728 --- /dev/null +++ b/component/pear/modules/http.js @@ -0,0 +1,180 @@ +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' + } + }, + + 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 !== false) { + 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); +}); \ No newline at end of file diff --git a/component/pear/pear.all.js b/component/pear/pear.all.js index 1e603ca..447e5de 100644 --- a/component/pear/pear.all.js +++ b/component/pear/pear.all.js @@ -40,5 +40,6 @@ layui.config({ loading: "loading", // 加载组件 cropper:"cropper", // 裁剪组件 convert:"convert", // 数据转换 - context:"context" // 上下文组件 + context: "context", // 上下文组件 + http: "http" // ajax请求组件 }); diff --git a/component/pear/pear.js b/component/pear/pear.js index 1e603ca..447e5de 100644 --- a/component/pear/pear.js +++ b/component/pear/pear.js @@ -40,5 +40,6 @@ layui.config({ loading: "loading", // 加载组件 cropper:"cropper", // 裁剪组件 convert:"convert", // 数据转换 - context:"context" // 上下文组件 + context: "context", // 上下文组件 + http: "http" // ajax请求组件 });