|
|
|
|
|
layui.define(['store'], function(exports){
|
|
|
// 定义axios模块,版本v0.21.0,作者Matt Zabriskie
|
|
|
(function webpackUniversalModuleDefinition(root, factory) {
|
|
|
// 模块定义函数,支持CommonJS, AMD和全局变量
|
|
|
if(typeof exports === 'object' && typeof module === 'object')
|
|
|
module.exports = factory();
|
|
|
// 如果是CommonJS环境
|
|
|
else if(typeof define === 'function' && define.amd)
|
|
|
define([], factory);
|
|
|
// 如果是AMD环境
|
|
|
else if(typeof exports === 'object')
|
|
|
exports["axios"] = factory();
|
|
|
// 如果是作为对象导出
|
|
|
else
|
|
|
root["axios"] = factory();
|
|
|
// 如果是全局变量
|
|
|
})(this, function() {
|
|
|
return (function(modules) { // webpackBootstrap
|
|
|
// 模块缓存
|
|
|
var installedModules = {};
|
|
|
|
|
|
// 模块加载函数
|
|
|
function __webpack_require__(moduleId) {
|
|
|
// 如果模块已经在缓存中,直接返回模块的导出内容
|
|
|
if(installedModules[moduleId])
|
|
|
return installedModules[moduleId].exports;
|
|
|
|
|
|
|
|
|
// 创建一个新的模块对象,并将其存储在installedModules数组中
|
|
|
var module = installedModules[moduleId] = {
|
|
|
// 初始化模块的exports属性为空对象
|
|
|
exports: {},
|
|
|
// 设置模块的id为传入的moduleId
|
|
|
id: moduleId,
|
|
|
// 初始化模块的loaded属性为false,表示模块尚未加载
|
|
|
loaded: false
|
|
|
};
|
|
|
|
|
|
// 执行模块函数
|
|
|
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
|
|
|
|
// 标记模块为已加载
|
|
|
module.loaded = true;
|
|
|
|
|
|
// 返回模块的导出内容
|
|
|
return module.exports;
|
|
|
}
|
|
|
|
|
|
|
|
|
// 暴露模块对象 (__webpack_modules__)
|
|
|
__webpack_require__.m = modules;
|
|
|
|
|
|
// 暴露模块缓存
|
|
|
__webpack_require__.c = installedModules;
|
|
|
|
|
|
// 设置公共路径 (__webpack_public_path__)
|
|
|
__webpack_require__.p = "";
|
|
|
|
|
|
// 加载入口模块并返回导出内容
|
|
|
return __webpack_require__(0);
|
|
|
})
|
|
|
|
|
|
([
|
|
|
/* 0 */
|
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
|
|
// 将模块1的导出设置为当前模块的导出
|
|
|
module.exports = __webpack_require__(1);
|
|
|
|
|
|
/***/ }),
|
|
|
/* 1 */
|
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
// 引入工具模块
|
|
|
var utils = __webpack_require__(2);
|
|
|
// 引入绑定函数
|
|
|
var bind = __webpack_require__(3);
|
|
|
// 引入Axios类
|
|
|
var Axios = __webpack_require__(4);
|
|
|
// 引入合并配置函数
|
|
|
var mergeConfig = __webpack_require__(22);
|
|
|
// 引入默认配置
|
|
|
var defaults = __webpack_require__(10);
|
|
|
|
|
|
function createInstance(defaultConfig) {
|
|
|
// 创建一个 Axios 实例,使用默认配置
|
|
|
var context = new Axios(defaultConfig);
|
|
|
// 将 Axios 的 request 方法绑定到新创建的 context 实例上
|
|
|
var instance = bind(Axios.prototype.request, context);
|
|
|
|
|
|
// 将 Axios 原型上的方法复制到 instance 上,同时绑定 context
|
|
|
utils.extend(instance, Axios.prototype, context);
|
|
|
|
|
|
// 将 context 的属性复制到 instance 上
|
|
|
utils.extend(instance, context);
|
|
|
|
|
|
// 返回新创建的 instance 实例
|
|
|
return instance;
|
|
|
}
|
|
|
|
|
|
// 创建默认实例以供导出
|
|
|
var axios = createInstance(defaults);
|
|
|
|
|
|
// 暴露 Axios 类以允许类继承
|
|
|
axios.Axios = Axios;
|
|
|
|
|
|
// 工厂方法用于创建新实例
|
|
|
axios.create = function create(instanceConfig) {
|
|
|
// 创建一个新的axios实例,通过合并默认配置和实例配置
|
|
|
return createInstance(mergeConfig(axios.defaults, instanceConfig));
|
|
|
};
|
|
|
|
|
|
// 暴露Cancel & CancelToken模块
|
|
|
axios.Cancel = __webpack_require__(23);
|
|
|
// 引入取消请求的功能模块,并赋值给 axios.Cancel
|
|
|
|
|
|
axios.CancelToken = __webpack_require__(24);
|
|
|
// 引入取消令牌的功能模块,并赋值给 axios.CancelToken
|
|
|
|
|
|
axios.isCancel = __webpack_require__(9);
|
|
|
// 引入判断是否为取消请求的函数,并赋值给 axios.isCancel
|
|
|
|
|
|
// Expose all/spread
|
|
|
axios.all = function all(promises) {
|
|
|
// 返回一个 Promise,该 Promise 在所有传入的 promises 都被解决后才会被解决
|
|
|
return Promise.all(promises);
|
|
|
};
|
|
|
// 将 __webpack_require__(25) 赋值给 axios.spread 方法
|
|
|
axios.spread = __webpack_require__(25);
|
|
|
|
|
|
// 导出 axios 对象
|
|
|
module.exports = axios;
|
|
|
|
|
|
// 允许在 TypeScript 中使用默认导入语法
|
|
|
module.exports.default = axios;
|
|
|
/***/ }),
|
|
|
/* 2 */
|
|
|
(function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
// 引入绑定函数
|
|
|
var bind = __webpack_require__(3);
|
|
|
// utils 是一个包含与 axios 无关的通用辅助函数的库
|
|
|
|
|
|
// 获取 Object.prototype.toString 方法的引用
|
|
|
var toString = Object.prototype.toString;
|
|
|
|
|
|
|
|
|
function isArray(val) {
|
|
|
// 使用 Object.prototype.toString 方法判断值的类型是否为 '[object Array]'
|
|
|
return toString.call(val) === '[object Array]';
|
|
|
}
|
|
|
|
|
|
|
|
|
function isUndefined(val) {
|
|
|
// 判断传入的值是否为未定义类型
|
|
|
return typeof val === 'undefined';
|
|
|
}
|
|
|
|
|
|
function isBuffer(val) {
|
|
|
// 检查传入的值是否为 Buffer 类型
|
|
|
// 首先确保 val 不为 null,并且 val 不是 undefined
|
|
|
return val !== null && !isUndefined(val)
|
|
|
// 确保 val.constructor 不为 null,并且 val.constructor 不是 undefined
|
|
|
&& val.constructor !== null && !isUndefined(val.constructor)
|
|
|
// 确保 val.constructor.isBuffer 是一个函数
|
|
|
&& typeof val.constructor.isBuffer === 'function'
|
|
|
// 调用 val.constructor.isBuffer 方法来验证 val 是否为 Buffer 类型
|
|
|
&& val.constructor.isBuffer(val);
|
|
|
}
|
|
|
|
|
|
|
|
|
// 判断给定的值是否为 ArrayBuffer 对象
|
|
|
function isArrayBuffer(val) {
|
|
|
// 使用Object.prototype.toString方法判断传入的值是否为ArrayBuffer类型
|
|
|
return toString.call(val) === '[object ArrayBuffer]';
|
|
|
}
|
|
|
|
|
|
function isFormData(val) {
|
|
|
// 判断传入的值是否为 FormData 类型
|
|
|
return (typeof FormData !== 'undefined') && (val instanceof FormData);
|
|
|
}
|
|
|
|
|
|
function isArrayBufferView(val) {
|
|
|
// 判断传入的值是否为 ArrayBufferView 类型
|
|
|
var result;
|
|
|
if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
|
|
|
// 使用ArrayBuffer.isView方法判断值是否为ArrayBuffer视图对象
|
|
|
result = ArrayBuffer.isView(val);
|
|
|
} else {
|
|
|
// 如果ArrayBuffer.isView方法不可用,则通过检查值的buffer属性是否为ArrayBuffer实例来判断
|
|
|
result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
function isString(val) {
|
|
|
// 判断传入的值是否为字符串类型
|
|
|
return typeof val === 'string';
|
|
|
}
|
|
|
|
|
|
function isNumber(val) {
|
|
|
// 检查传入的值是否为数字类型
|
|
|
return typeof val === 'number';
|
|
|
}
|
|
|
|
|
|
function isObject(val) {
|
|
|
// 检查传入的值是否为对象且不为null
|
|
|
return val !== null && typeof val === 'object';
|
|
|
}
|
|
|
|
|
|
function isPlainObject(val) {
|
|
|
// 检查 val 是否是一个普通的对象
|
|
|
if (toString.call(val) !== '[object Object]') {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
// 获取 val 的原型对象
|
|
|
var prototype = Object.getPrototypeOf(val);
|
|
|
// 检查原型对象是否为 null 或 Object.prototype
|
|
|
return prototype === null || prototype === Object.prototype;
|
|
|
}
|
|
|
|
|
|
function isDate(val) {
|
|
|
// 检查输入的值是否为 Date 对象
|
|
|
return toString.call(val) === '[object Date]';
|
|
|
}
|
|
|
|
|
|
function isFile(val) {
|
|
|
// 检查传入的值是否为 File 对象
|
|
|
return toString.call(val) === '[object File]';
|
|
|
}
|
|
|
|
|
|
function isBlob(val) {
|
|
|
// 检查传入的值是否为 Blob 对象
|
|
|
return toString.call(val) === '[object Blob]';
|
|
|
}
|
|
|
|
|
|
function isFunction(val) {
|
|
|
// 检查给定的值是否为函数
|
|
|
return toString.call(val) === '[object Function]';
|
|
|
}
|
|
|
|
|
|
function isStream(val) {
|
|
|
// 检查给定的值是否为一个包含 pipe 方法的对象
|
|
|
return isObject(val) && isFunction(val.pipe);
|
|
|
}
|
|
|
|
|
|
function isURLSearchParams(val) {
|
|
|
// 检查 URLSearchParams 是否在全局作用域中定义,并且 val 是否是 URLSearchParams 的实例
|
|
|
return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;
|
|
|
}
|
|
|
|
|
|
function trim(str) {
|
|
|
// 移除字符串开头和结尾的空白字符
|
|
|
return str.replace(/^\s*/, '').replace(/\s*$/, '');
|
|
|
}
|
|
|
|
|
|
|
|
|
function isStandardBrowserEnv() {
|
|
|
// 检查是否在非标准浏览器环境中运行,如 ReactNative, NativeScript, NS
|
|
|
if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||
|
|
|
navigator.product === 'NativeScript' ||
|
|
|
navigator.product === 'NS')) {
|
|
|
return false; // 如果是非标准环境,返回 false
|
|
|
}
|
|
|
// 确认是否在标准浏览器环境中,通过检查 window 和 document 对象是否存在
|
|
|
return (
|
|
|
typeof window !== 'undefined' &&
|
|
|
typeof document !== 'undefined'
|
|
|
);
|
|
|
}
|
|
|
|
|
|
|
|
|
function forEach(obj, fn) {
|
|
|
// 不处理如果提供的值为空
|
|
|
if (obj === null || typeof obj === 'undefined') {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 如果不是可迭代的对象,强制转换为数组
|
|
|
if (typeof obj !== 'object') {
|
|
|
/*eslint no-param-reassign:0*/
|
|
|
obj = [obj];
|
|
|
}
|
|
|
|
|
|
if (isArray(obj)) {
|
|
|
// 遍历数组中的每个值
|
|
|
for (var i = 0, l = obj.length; i < l; i++) {
|
|
|
// 调用传入的函数,参数为当前元素、索引和整个数组
|
|
|
fn.call(null, obj[i], i, obj);
|
|
|
}
|
|
|
} else {
|
|
|
// 遍历对象的每个键
|
|
|
for (var key in obj) {
|
|
|
// 确保对象自身包含该属性,而不是从原型链继承的属性
|
|
|
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
|
// 调用传入的函数,参数为当前属性值、键和整个对象
|
|
|
fn.call(null, obj[key], key, obj);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
function merge(/* obj1, obj2, obj3, ... */) {
|
|
|
// 初始化结果对象
|
|
|
var result = {};
|
|
|
|
|
|
// 定义一个函数来处理每个键值对的合并逻辑
|
|
|
function assignValue(val, key) {
|
|
|
if (isPlainObject(result[key]) && isPlainObject(val)) {
|
|
|
// 如果结果对象和当前值都是普通对象,则递归合并
|
|
|
result[key] = merge(result[key], val);
|
|
|
} else if (isPlainObject(val)) {
|
|
|
// 如果当前值是普通对象,则将其深度复制到结果对象中
|
|
|
result[key] = merge({}, val);
|
|
|
} else if (isArray(val)) {
|
|
|
// 如果当前值是数组,则将其浅复制到结果对象中
|
|
|
result[key] = val.slice();
|
|
|
} else {
|
|
|
// 否则直接赋值
|
|
|
result[key] = val;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 遍历所有传入的对象,并调用assignValue函数来合并它们的属性
|
|
|
for (var i = 0, l = arguments.length; i < l; i++) {
|
|
|
forEach(arguments[i], assignValue);
|
|
|
}
|
|
|
// 返回合并后的结果对象
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
|
|
|
function extend(a, b, thisArg) {
|
|
|
// 遍历对象b的每个属性,并将其合并到对象a中
|
|
|
// 如果thisArg存在且属性值是函数,则将该函数绑定到thisArg
|
|
|
forEach(b, function assignValue(val, key) {
|
|
|
// 如果thisArg存在并且当前属性值是函数类型
|
|
|
if (thisArg && typeof val === 'function') {
|
|
|
// 将函数绑定到thisArg并赋值给对象a的对应属性
|
|
|
a[key] = bind(val, thisArg);
|
|
|
} else {
|
|
|
// 否则直接将属性值赋值给对象a的对应属性
|
|
|
a[key] = val;
|
|
|
}
|
|
|
});
|
|
|
// 返回合并后的对象a
|
|
|
return a;
|
|
|
}
|
|
|
|
|
|
|
|
|
function stripBOM(content) {
|
|
|
// 检查字符串的第一个字符是否为UTF-8 BOM的标记
|
|
|
// 如果是,则移除该标记
|
|
|
if (content.charCodeAt(0) === 0xFEFF) {
|
|
|
content = content.slice(1);
|
|
|
}
|
|
|
// 返回处理后的字符串
|
|
|
return content;
|
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
|
// 判断变量是否为数组
|
|
|
|
|
|
isArray: isArray,
|
|
|
// 判断变量是否为ArrayBuffer
|
|
|
isArrayBuffer: isArrayBuffer,
|
|
|
// 判断变量是否为Buffer
|
|
|
isBuffer: isBuffer,
|
|
|
// 判断变量是否为FormData
|
|
|
isFormData: isFormData,
|
|
|
// 判断变量是否为ArrayBufferView
|
|
|
isArrayBufferView: isArrayBufferView,
|
|
|
// 判断变量是否为字符串
|
|
|
isString: isString,
|
|
|
// 判断变量是否为数字
|
|
|
isNumber: isNumber,
|
|
|
// 判断变量是否为对象
|
|
|
isObject: isObject,
|
|
|
// 判断变量是否为普通对象
|
|
|
isPlainObject: isPlainObject,
|
|
|
// 判断变量是否为未定义
|
|
|
isUndefined: isUndefined,
|
|
|
// 判断变量是否为日期对象
|
|
|
isDate: isDate,
|
|
|
// 判断变量是否为文件对象
|
|
|
isFile: isFile,
|
|
|
// 判断变量是否为Blob对象
|
|
|
isBlob: isBlob,
|
|
|
// 判断变量是否为函数
|
|
|
isFunction: isFunction,
|
|
|
// 判断变量是否为流对象
|
|
|
isStream: isStream,
|
|
|
// 判断变量是否为URLSearchParams对象
|
|
|
isURLSearchParams: isURLSearchParams,
|
|
|
// 判断当前环境是否为标准浏览器环境
|
|
|
isStandardBrowserEnv: isStandardBrowserEnv,
|
|
|
// 遍历数组或对象
|
|
|
forEach: forEach,
|
|
|
// 合并多个对象到一个对象
|
|
|
merge: merge,
|
|
|
// 扩展目标对象的属性
|
|
|
extend: extend,
|
|
|
// 去除字符串两端的空白字符
|
|
|
trim: trim,
|
|
|
// 去除字符串开头的BOM字符
|
|
|
stripBOM: stripBOM
|
|
|
}
|
|
|
|
|
|
/***/ }
|
|
|
/* 3 */
|
|
|
/***/ (function(module, exports) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
// 定义一个名为 bind 的函数,接收两个参数:fn (要绑定的函数) 和 thisArg (要绑定的 this 上下文)
|
|
|
module.exports = function bind(fn, thisArg) {
|
|
|
// 返回一个新的函数 wrap,该函数在调用时会将 fn 的 this 指向 thisArg,并传递所有参数
|
|
|
return function wrap() {
|
|
|
// 创建一个数组 args,长度与调用 wrap 时传递的参数数量相同
|
|
|
var args = new Array(arguments.length);
|
|
|
// 将 wrap 函数接收到的所有参数复制到 args 数组中
|
|
|
for (var i = 0; i < args.length; i++) {
|
|
|
args[i] = arguments[i];
|
|
|
}
|
|
|
// 使用 apply 方法调用 fn,使其 this 指向 thisArg,并传递 args 数组中的参数
|
|
|
return fn.apply(thisArg, args);
|
|
|
};
|
|
|
};
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
/* 4 */
|
|
|
(function(module, exports, __webpack_require__) {
|
|
|
// 使用严格模式
|
|
|
'use strict';
|
|
|
|
|
|
var utils = __webpack_require__(2); // 引入工具函数模块
|
|
|
var buildURL = __webpack_require__(5); // 引入构建URL的模块
|
|
|
var InterceptorManager = __webpack_require__(6); // 引入拦截器管理模块
|
|
|
var dispatchRequest = __webpack_require__(7); // 引入发送请求的模块
|
|
|
var mergeConfig = __webpack_require__(22); // 引入合并配置的模块
|
|
|
|
|
|
function Axios(instanceConfig) {
|
|
|
// 初始化 Axios 实例,默认配置为 instanceConfig
|
|
|
this.defaults = instanceConfig;
|
|
|
// 创建拦截器管理对象,包含请求和响应拦截器
|
|
|
this.interceptors = {
|
|
|
request: new InterceptorManager(),
|
|
|
response: new InterceptorManager(),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Axios:prototype.request = function request(config) {
|
|
|
|
|
|
// 允许使用 axios('example/url'[, config]) 类似于 fetch API
|
|
|
if (typeof config === 'string') {
|
|
|
// 如果传入的参数是字符串,则将其视为 URL,并从第二个参数中获取配置对象
|
|
|
config = arguments[1] || {};
|
|
|
// 将第一个参数设置为 URL
|
|
|
config.url = arguments[0];
|
|
|
} else {
|
|
|
// 如果传入的参数不是字符串,则直接使用该对象作为配置
|
|
|
config = config || {};
|
|
|
}
|
|
|
// 合并默认配置和传入的配置
|
|
|
config = mergeConfig(this.defaults, config);
|
|
|
|
|
|
// 设置 config.method
|
|
|
// 确保请求方法为小写形式,若config中未定义,则使用默认方法,最后默认为'get'方法
|
|
|
// 根据配置设置请求方法,若未提供则使用默认值 'get'
|
|
|
if (config.method) {
|
|
|
// 将请求方法转换为小写
|
|
|
config.method = config.method.toLowerCase();
|
|
|
} else if (this.defaults.method) {
|
|
|
// 使用默认配置中的请求方法,并将其转换为小写
|
|
|
config.method = this.defaults.method.toLowerCase();
|
|
|
} else {
|
|
|
// 如果没有提供请求方法,则默认使用 'get' 方法
|
|
|
config.method = 'get';
|
|
|
}
|
|
|
|
|
|
// 初始化拦截器链,包含请求处理函数和未定义的占位符
|
|
|
var chain = [dispatchRequest, undefined];
|
|
|
// 创建一个已解决的Promise对象,初始值为config
|
|
|
var promise = Promise.resolve(config);
|
|
|
|
|
|
// 将请求拦截器添加到链的开头
|
|
|
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
|
|
|
// 将每个请求拦截器的fulfilled和rejected方法插入到链的开头
|
|
|
chain.unshift(interceptor.fulfilled, interceptor.rejected);
|
|
|
});
|
|
|
|
|
|
// 将响应拦截器添加到链的末尾
|
|
|
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
|
|
|
// 将每个响应拦截器的fulfilled和rejected方法插入到链的末尾
|
|
|
chain.push(interceptor.fulfilled, interceptor.rejected);
|
|
|
});
|
|
|
|
|
|
// 依次执行链中的每个拦截器
|
|
|
while (chain.length) {
|
|
|
// 从链中移除并执行第一个拦截器,并将其结果作为新的promise继续链式调用
|
|
|
promise = promise.then(chain.shift(), chain.shift());
|
|
|
}
|
|
|
// 返回最终的promise对象
|
|
|
return promise;
|
|
|
|
|
|
// 获取请求的 URI
|
|
|
Axios.prototype.getUri = function getUri(config) {
|
|
|
// 合并默认配置和传入的配置
|
|
|
config = mergeConfig(this.defaults, config);
|
|
|
// 构建 URL,并移除开头的问号
|
|
|
return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, '');
|
|
|
};
|
|
|
|
|
|
// 为没有请求体的方法提供别名
|
|
|
utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
|
|
|
/*eslint func-names:0*/
|
|
|
// 定义Axios原型上的方法,如delete, get, head, options
|
|
|
Axios.prototype[method] = function(url, config) {
|
|
|
// 调用request方法,并合并配置对象
|
|
|
return this.request(mergeConfig(config || {}, {
|
|
|
// 设置HTTP方法
|
|
|
method: method,
|
|
|
// 设置请求的URL
|
|
|
url: url,
|
|
|
// 设置请求的数据,如果config存在则使用其data属性
|
|
|
data: (config || {}).data
|
|
|
}));
|
|
|
};
|
|
|
});
|
|
|
|
|
|
utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
|
|
|
/*eslint func-names:0*/
|
|
|
// 为 Axios 原型添加 post, put, patch 方法,这些方法接受 url, data 和 config 参数并返回请求结果
|
|
|
Axios.prototype[method] = function(url, data, config) {
|
|
|
// 调用 this.request 方法,传入合并后的 config 对象,该对象包含 method, url 和 data 属性
|
|
|
return this.request(mergeConfig(config || {}, {
|
|
|
method: method, // 设置请求方法为当前遍历到的方法(post, put, patch)
|
|
|
url: url, // 设置请求的 URL
|
|
|
data: data // 设置请求的数据
|
|
|
}));
|
|
|
};
|
|
|
});
|
|
|
|
|
|
// 导出 Axios 对象
|
|
|
module.exports = Axios;
|
|
|
|
|
|
/* 5 */
|
|
|
(function(module, exports, __webpack_require__) {
|
|
|
// 使用严格模式,避免一些常见的错误
|
|
|
'use strict';
|
|
|
|
|
|
// 引入utils模块
|
|
|
var utils = __webpack_require__(2);
|
|
|
|
|
|
/**
|
|
|
* 对输入值进行 URL 编码,并替换特定的百分比编码为对应的字符
|
|
|
* @param {string} val - 需要编码的字符串
|
|
|
* @returns {string} - 编码后的字符串
|
|
|
*/
|
|
|
function encode(val) {
|
|
|
// 使用encodeURIComponent对字符串进行URL编码
|
|
|
return encodeURIComponent(val).
|
|
|
// 将%3A替换为:
|
|
|
replace(/%3A/gi, ':').
|
|
|
// 将%24替换为$
|
|
|
replace(/%24/g, '$').
|
|
|
// 将%2C替换为,
|
|
|
replace(/%2C/gi, ',').
|
|
|
// 将%20替换为+
|
|
|
replace(/%20/g, '+').
|
|
|
// 将%5B替换为[
|
|
|
replace(/%5B/gi, '[').
|
|
|
// 将%5D替换为]
|
|
|
replace(/%5D/gi, ']');
|
|
|
}
|
|
|
|
|
|
|
|
|
module.exports = function buildURL(url, params, paramsSerializer) {
|
|
|
/*eslint no-param-reassign:0*/
|
|
|
// 如果没有参数,直接返回原始URL
|
|
|
if (!params) {
|
|
|
return url;
|
|
|
}
|
|
|
|
|
|
var serializedParams;
|
|
|
// 如果提供了参数序列化函数,则使用它
|
|
|
if (paramsSerializer) {
|
|
|
serializedParams = paramsSerializer(params);
|
|
|
// 否则,检查参数是否是URLSearchParams对象
|
|
|
} else if (utils.isURLSearchParams(params)) {
|
|
|
serializedParams = params.toString();
|
|
|
// 如果不是,则手动序列化参数
|
|
|
} else {
|
|
|
var parts = [];
|
|
|
|
|
|
// 遍历参数对象,将其序列化为查询字符串
|
|
|
utils.forEach(params, function serialize(val, key) {
|
|
|
// 忽略null或undefined的值
|
|
|
if (val === null || typeof val === 'undefined') {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 如果值是数组,则键名后加上'[]'
|
|
|
if (utils.isArray(val)) {
|
|
|
key = key + '[]';
|
|
|
// 否则,将值转换为数组
|
|
|
} else {
|
|
|
val = [val];
|
|
|
}
|
|
|
// 遍历数组中的每个值,进行编码并添加到parts数组中
|
|
|
utils.forEach(val, function parseValue(v) {
|
|
|
// 如果值是日期类型,将其转换为ISO字符串格式
|
|
|
if (utils.isDate(v)) {
|
|
|
v = v.toISOString();
|
|
|
}
|
|
|
// 如果值是对象类型,将其转换为JSON字符串
|
|
|
else if (utils.isObject(v)) {
|
|
|
v = JSON.stringify(v);
|
|
|
}
|
|
|
// 将键和值进行URL编码后,以"key=value"的形式添加到parts数组中
|
|
|
parts.push(encode(key) + '=' + encode(v));
|
|
|
});
|
|
|
});
|
|
|
// 将所有部分用'&'连接,形成完整的查询字符串
|
|
|
serializedParams = parts.join('&');
|
|
|
}
|
|
|
if (serializedParams) {
|
|
|
// 检查 URL 中是否包含哈希标记 (#),如果包含则移除哈希标记后的所有内容
|
|
|
var hashmarkIndex = url.indexOf('#');
|
|
|
if (hashmarkIndex !== -1) {
|
|
|
url = url.slice(0, hashmarkIndex);
|
|
|
}
|
|
|
|
|
|
// 将序列化后的参数附加到 URL 上,如果 URL 中已经包含查询参数,则使用 & 连接,否则使用 ? 连接
|
|
|
url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
|
|
|
}
|
|
|
|
|
|
// 返回处理后的 URL
|
|
|
return url;
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
/* 6 */
|
|
|
(function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict'; // 启用严格模式,以捕获常见的编码错误和不安全的操作
|
|
|
// 引入utils模块,用于提供通用的工具函数
|
|
|
var utils = __webpack_require__(2);
|
|
|
|
|
|
|
|
|
function InterceptorManager() {
|
|
|
// 初始化一个空数组,用于存储拦截器处理程序
|
|
|
this.handlers = [];
|
|
|
}
|
|
|
|
|
|
|
|
|
InterceptorManager.prototype.use = function use(fulfilled, rejected) {
|
|
|
// 将拦截器添加到处理程序堆栈中
|
|
|
this.handlers.push({
|
|
|
fulfilled: fulfilled,
|
|
|
rejected: rejected
|
|
|
});
|
|
|
// 返回拦截器的ID,即堆栈中的索引
|
|
|
return this.handlers.length - 1;
|
|
|
};
|
|
|
|
|
|
|
|
|
InterceptorManager.prototype.eject = function eject(id) {
|
|
|
// 如果给定ID的拦截器存在,则将其设置为null以标记为已移除
|
|
|
if (this.handlers[id]) {
|
|
|
this.handlers[id] = null;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
InterceptorManager.prototype.forEach = function forEach(fn) {
|
|
|
// 遍历拦截器管理器中的所有处理器,并对每个非空处理器执行给定的函数 fn
|
|
|
utils.forEach(this.handlers, function forEachHandler(h) {
|
|
|
if (h !== null) {
|
|
|
fn(h);
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
|
|
|
module.exports = InterceptorManager;
|
|
|
// 导出拦截器管理器类/构造函数,用于管理请求和响应的拦截器
|
|
|
/***/ }),
|
|
|
/* 7 */
|
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
// 引入工具模块
|
|
|
var utils = __webpack_require__(2);
|
|
|
// 引入数据转换模块
|
|
|
var transformData = __webpack_require__(8);
|
|
|
// 引入取消请求判断模块
|
|
|
var isCancel = __webpack_require__(9);
|
|
|
// 引入默认配置模块
|
|
|
var defaults = __webpack_require__(10);
|
|
|
|
|
|
function throwIfCancellationRequested(config) {
|
|
|
// 如果配置中存在取消令牌,则检查是否已请求取消,如果是则抛出异常
|
|
|
if (config.cancelToken) {
|
|
|
config.cancelToken.throwIfRequested();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
module.exports = function dispatchRequest(config) {
|
|
|
// 检查请求是否已被取消,如果取消则抛出异常
|
|
|
throwIfCancellationRequested(config);
|
|
|
|
|
|
// 确保请求头存在
|
|
|
config.headers = config.headers || {};
|
|
|
|
|
|
// 转换请求数据
|
|
|
config.data = transformData(
|
|
|
config.data,
|
|
|
config.headers,
|
|
|
config.transformRequest
|
|
|
);
|
|
|
}
|
|
|
|
|
|
// 合并通用请求头和特定方法的请求头
|
|
|
config.headers = utils.merge(
|
|
|
// 获取通用请求头,如果不存在则使用空对象
|
|
|
config.headers.common || {},
|
|
|
// 获取特定方法的请求头,如果不存在则使用空对象
|
|
|
config.headers[config.method] || {},
|
|
|
// 获取所有请求头
|
|
|
config.headers
|
|
|
);
|
|
|
|
|
|
// 清理请求头中与HTTP方法无关的配置
|
|
|
utils.forEach(
|
|
|
['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
|
|
|
function cleanHeaderConfig(method) {
|
|
|
// 删除配置对象中的指定HTTP方法的头部信息
|
|
|
delete config.headers[method];
|
|
|
}
|
|
|
);
|
|
|
// 获取配置中的适配器,如果没有则使用默认适配器
|
|
|
var adapter = config.adapter || defaults.adapter;
|
|
|
|
|
|
// 使用配置的适配器或默认适配器发送请求,并处理响应
|
|
|
return adapter(config).then(function onAdapterResolution(response) {
|
|
|
// 检查是否取消请求
|
|
|
throwIfCancellationRequested(config);
|
|
|
|
|
|
// 转换响应数据
|
|
|
response.data = transformData(
|
|
|
// 调用transformData函数,将响应数据进行转换
|
|
|
response.data,
|
|
|
// 传递响应头信息
|
|
|
response.headers,
|
|
|
// 传递配置中的transformResponse选项
|
|
|
config.transformResponse
|
|
|
);
|
|
|
// 返回响应
|
|
|
return response;
|
|
|
}, function onAdapterRejection(reason) {
|
|
|
// 如果错误原因不是取消请求,则进一步处理
|
|
|
if (!isCancel(reason)) {
|
|
|
// 检查是否请求被取消,如果是则抛出异常
|
|
|
throwIfCancellationRequested(config);
|
|
|
|
|
|
// 检查是否存在reason对象及其response属性
|
|
|
if (reason && reason.response) {
|
|
|
// 调用transformData函数,将响应数据、响应头和配置中的transformResponse进行转换
|
|
|
reason.response.data = transformData(
|
|
|
reason.response.data, // 原始响应数据
|
|
|
reason.response.headers, // 响应头信息
|
|
|
config.transformResponse // 配置中的transformResponse函数
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return Promise.reject(reason);
|
|
|
});
|
|
|
};
|
|
|
|
|
|
|
|
|
/* 8 */
|
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
var utils = __webpack_require__(2);
|
|
|
|
|
|
// 定义一个用于转换数据的函数,接受数据、头部信息和函数数组作为参数
|
|
|
module.exports = function transformData(data, headers, fns) {
|
|
|
/*eslint no-param-reassign:0*/
|
|
|
// 遍历传入的函数数组,依次对数据和头部信息进行处理
|
|
|
utils.forEach(fns, function transform(fn) {
|
|
|
data = fn(data, headers);
|
|
|
});
|
|
|
|
|
|
// 返回处理后的数据
|
|
|
return data;
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
/* 9 */
|
|
|
(function(module, exports) {
|
|
|
'use strict';
|
|
|
|
|
|
// 检查给定的值是否是一个取消操作的标记
|
|
|
module.exports = function isCancel(value) {
|
|
|
// 如果值存在且具有 __CANCEL__ 属性,则返回 true;否则返回 false
|
|
|
return !!(value && value.__CANCEL__);
|
|
|
};
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
/* 10 */
|
|
|
(function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
// 引入 utils 模块
|
|
|
var utils = __webpack_require__(2);
|
|
|
// 引入 normalizeHeaderName 模块
|
|
|
var normalizeHeaderName = __webpack_require__(11);
|
|
|
|
|
|
// 定义默认的内容类型
|
|
|
var DEFAULT_CONTENT_TYPE = {
|
|
|
'Content-Type': 'application/x-www-form-urlencoded'
|
|
|
};
|
|
|
|
|
|
function setContentTypeIfUnset(headers, value) {
|
|
|
// 如果 headers 不是未定义且 headers 中没有设置 'Content-Type',则设置 'Content-Type' 为指定的 value
|
|
|
if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
|
|
|
headers['Content-Type'] = value;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function getDefaultAdapter() {
|
|
|
var adapter;
|
|
|
// 检查是否在浏览器环境中,如果是则使用 XHR 适配器
|
|
|
if (typeof XMLHttpRequest !== 'undefined') {
|
|
|
adapter = __webpack_require__(12);
|
|
|
} else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
|
|
|
// 检查是否在 Node 环境中,如果是则使用 HTTP 适配器
|
|
|
adapter = __webpack_require__(12);
|
|
|
}
|
|
|
return adapter;
|
|
|
}
|
|
|
|
|
|
var defaults = {
|
|
|
// 获取默认的适配器
|
|
|
adapter: getDefaultAdapter(),
|
|
|
|
|
|
// transformRequest 是一个数组,包含一个函数,该函数用于在请求发送之前对请求数据进行转换
|
|
|
transformRequest: [function transformRequest(data, headers) {
|
|
|
// 标准化请求头名称为 'Accept'
|
|
|
normalizeHeaderName(headers, 'Accept');
|
|
|
// 标准化请求头名称为 'Content-Type'
|
|
|
normalizeHeaderName(headers, 'Content-Type');
|
|
|
// 如果数据是 FormData、ArrayBuffer、Buffer、Stream、File 或 Blob 类型,直接返回数据
|
|
|
// 检查数据是否为FormData对象
|
|
|
if (utils.isFormData(data) ||
|
|
|
// 检查数据是否为ArrayBuffer对象
|
|
|
utils.isArrayBuffer(data) ||
|
|
|
// 检查数据是否为Buffer对象
|
|
|
utils.isBuffer(data) ||
|
|
|
// 检查数据是否为Stream对象
|
|
|
utils.isStream(data) ||
|
|
|
// 检查数据是否为File对象
|
|
|
utils.isFile(data) ||
|
|
|
// 检查数据是否为Blob对象
|
|
|
utils.isBlob(data)
|
|
|
) {
|
|
|
// 如果数据是上述任何一种类型,直接返回数据
|
|
|
return data;
|
|
|
}
|
|
|
// 如果数据是 ArrayBufferView 类型,返回其 buffer
|
|
|
if (utils.isArrayBufferView(data)) {
|
|
|
// 如果数据是 ArrayBufferView 类型,返回其底层的 ArrayBuffer
|
|
|
return data.buffer;
|
|
|
}
|
|
|
// 如果数据是 URLSearchParams 类型,设置默认的 'Content-Type' 并返回数据的字符串形式
|
|
|
if (utils.isURLSearchParams(data)) {
|
|
|
setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
|
|
|
return data.toString();
|
|
|
}
|
|
|
// 如果数据是对象类型,设置默认的 'Content-Type' 并返回数据的 JSON 字符串形式
|
|
|
if (utils.isObject(data)) {
|
|
|
setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
|
|
|
return JSON.stringify(data);
|
|
|
}
|
|
|
// 对于其他类型的数据,直接返回数据
|
|
|
return data;
|
|
|
}],
|
|
|
};
|
|
|
|
|
|
transformResponse: [function transformResponse(data) {
|
|
|
// 如果响应数据是字符串类型,尝试将其解析为 JSON 对象
|
|
|
/*eslint no-param-reassign:0*/
|
|
|
if (typeof data === 'string') {
|
|
|
try {
|
|
|
// 尝试将字符串解析为 JSON 对象
|
|
|
data = JSON.parse(data);
|
|
|
} catch (e) {
|
|
|
// 如果解析失败,忽略错误并保持原样
|
|
|
/* Ignore */
|
|
|
}
|
|
|
}
|
|
|
// 返回处理后的数据
|
|
|
return data;
|
|
|
}],
|
|
|
|
|
|
// 设置请求的超时时间,单位为毫秒
|
|
|
timeout:0,
|
|
|
// 定义 XSRF Token 的 Cookie 名称
|
|
|
xsrfCookieName: 'XSRF-TOKEN',
|
|
|
// 定义 XSRF Token 的请求头名称
|
|
|
xsrfHeaderName: 'X-XSRF-TOKEN',
|
|
|
|
|
|
// 定义响应内容的最大长度,-1 表示无限制
|
|
|
maxContentLength: -1,
|
|
|
// 定义请求体的最大长度,-1 表示无限制
|
|
|
maxBodyLength: -1,
|
|
|
// 定义一个函数来验证 HTTP 响应状态码是否在成功范围内
|
|
|
validateStatus: function validateStatus(status) {
|
|
|
// 如果状态码大于等于200且小于300,则返回true,表示请求成功
|
|
|
return status >= 200 && status < 300;
|
|
|
}
|
|
|
|
|
|
// 设置默认的请求头信息,包括通用的 'Accept' 头部
|
|
|
defaults.headers = {
|
|
|
common: {
|
|
|
'Accept': 'application/json, text/plain, */*'
|
|
|
}
|
|
|
};
|
|
|
|
|
|
// 为 'delete', 'get', 'head' 方法设置空的头部信息
|
|
|
utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
|
|
|
// 初始化这些方法的头部信息为空对象
|
|
|
defaults.headers[method] = {};
|
|
|
});
|
|
|
|
|
|
// 为 'post', 'put', 'patch' 方法设置默认的内容类型头部信息
|
|
|
utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
|
|
|
// 合并默认的内容类型头部信息到这些方法的头部中
|
|
|
defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
|
|
|
});
|
|
|
/**
|
|
|
* 导出defaults模块,使其可以在其他文件中被引用和使用。
|
|
|
*/
|
|
|
module.exports = defaults;
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
/* 11 */
|
|
|
(function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
// 引入utils模块
|
|
|
var utils = __webpack_require__(2);
|
|
|
|
|
|
module.exports = function normalizeHeaderName(headers, normalizedName) {
|
|
|
// 遍历headers对象中的每一个键值对
|
|
|
utils.forEach(headers, function processHeader(value, name) {
|
|
|
// 如果当前头部名称与规范化名称不同且不区分大小写相同
|
|
|
if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
|
|
|
// 将当前头部的值赋给规范化名称
|
|
|
headers[normalizedName] = value;
|
|
|
// 删除原来的头部名称
|
|
|
delete headers[name];
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
|
|
|
|
|
|
(function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
// 引入工具模块,用于提供各种实用函数
|
|
|
var utils = __webpack_require__(2);
|
|
|
// 引入处理请求结果的模块,用于处理请求完成后的操作
|
|
|
var settle = __webpack_require__(13);
|
|
|
// 引入处理 cookies 的模块,用于操作和管理 cookies
|
|
|
var cookies = __webpack_require__(16);
|
|
|
// 引入构建 URL 的模块,用于生成完整的请求 URL
|
|
|
var buildURL = __webpack_require__(5);
|
|
|
// 引入构建完整请求路径的模块,用于生成包含查询参数和哈希的完整路径
|
|
|
var buildFullPath = __webpack_require__(17);
|
|
|
// 引入解析响应头的模块,用于将响应头字符串解析为对象
|
|
|
var parseHeaders = __webpack_require__(20);
|
|
|
// 引入判断请求是否为同源的模块,用于检查请求是否与当前页面同源
|
|
|
var isURLSameOrigin = __webpack_require__(21);
|
|
|
// 引入创建错误的模块,用于生成错误对象
|
|
|
var createError = __webpack_require__(14);
|
|
|
|
|
|
// 定义 xhr 适配器函数
|
|
|
module.exports = function xhrAdapter(config) {
|
|
|
// 返回一个新的 Promise 实例
|
|
|
return new Promise(function dispatchXhrRequest(resolve, reject) {
|
|
|
// 获取请求数据
|
|
|
var requestData = config.data;
|
|
|
// 获取请求头
|
|
|
var requestHeaders = config.headers;
|
|
|
|
|
|
// 如果请求数据是 FormData 类型,删除 Content-Type 请求头,让浏览器自动设置
|
|
|
if (utils.isFormData(requestData)) {
|
|
|
delete requestHeaders['Content-Type'];
|
|
|
}
|
|
|
|
|
|
// 创建一个新的 XMLHttpRequest 实例
|
|
|
var request = new XMLHttpRequest();
|
|
|
// 如果配置中包含认证信息,则设置 HTTP basic authentication
|
|
|
if (config.auth) {
|
|
|
var username = config.auth.username || '';
|
|
|
var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
|
|
|
requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
|
|
|
}
|
|
|
|
|
|
// 构建完整的请求路径
|
|
|
var fullPath = buildFullPath(config.baseURL, config.url);
|
|
|
request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
|
|
|
|
|
|
// 设置请求的超时时间(毫秒)
|
|
|
request.timeout = config.timeout;
|
|
|
|
|
|
// 定义请求状态改变时的处理函数
|
|
|
request.onreadystatechange = function handleLoad() {
|
|
|
// 如果请求未完成或不存在,则返回
|
|
|
if (!request || request.readyState !== 4) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 处理请求错误情况,状态为0且非file协议时处理
|
|
|
if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 准备响应数据
|
|
|
// 检查 request 对象中是否存在 getAllResponseHeaders 方法,如果存在则解析响应头,否则返回 null
|
|
|
var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
|
|
|
|
|
|
// 根据配置的 responseType 决定使用 responseText 还是 response 作为响应数据
|
|
|
var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;
|
|
|
|
|
|
// 构建响应对象,包含响应数据、状态码、状态文本、响应头、配置和请求对象
|
|
|
var response = {
|
|
|
// 响应数据
|
|
|
data: responseData,
|
|
|
// HTTP 状态码
|
|
|
status: request.status,
|
|
|
// HTTP 状态文本
|
|
|
statusText: request.statusText,
|
|
|
// 响应头信息
|
|
|
headers: responseHeaders,
|
|
|
// 请求的配置信息
|
|
|
config: config,
|
|
|
// 原始请求对象
|
|
|
request: request
|
|
|
};
|
|
|
|
|
|
settle(resolve, reject, response);
|
|
|
|
|
|
// 清理请求对象
|
|
|
request = null;
|
|
|
};
|
|
|
|
|
|
// 处理浏览器请求取消(非手动取消)
|
|
|
request.onabort = function handleAbort() {
|
|
|
// 检查请求对象是否存在,如果不存在则直接返回
|
|
|
if (!request) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 调用reject函数并传入错误信息,表示请求被中止
|
|
|
reject(createError('Request aborted', config, 'ECONNABORTED', request));
|
|
|
|
|
|
// 清理请求对象,将其置为null
|
|
|
request = null;
|
|
|
};
|
|
|
|
|
|
// 处理底层网络错误
|
|
|
request.onerror = function handleError() {
|
|
|
// 真实的错误被浏览器隐藏
|
|
|
// onerror 应该只在网络错误时触发
|
|
|
reject(createError('Network Error', config, null, request));
|
|
|
|
|
|
// 清理请求对象
|
|
|
request = null;
|
|
|
};
|
|
|
|
|
|
// 处理请求超时
|
|
|
request.ontimeout = function handleTimeout() {
|
|
|
// 定义默认的超时错误信息
|
|
|
var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';
|
|
|
// 如果配置中提供了自定义的超时错误信息,则使用该信息
|
|
|
if (config.timeoutErrorMessage) {
|
|
|
timeoutErrorMessage = config.timeoutErrorMessage;
|
|
|
}
|
|
|
// 调用reject函数并传入创建的错误对象,包含超时错误信息、配置和错误代码'ECONNABORTED'
|
|
|
reject(createError(timeoutErrorMessage, config, 'ECONNABORTED', request));
|
|
|
|
|
|
// 清理请求对象
|
|
|
request = null;
|
|
|
};
|
|
|
|
|
|
|
|
|
if (utils.isStandardBrowserEnv()) {
|
|
|
// 检查当前环境是否为标准浏览器环境
|
|
|
// Add xsrf header
|
|
|
var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?
|
|
|
// 如果配置中允许携带凭证或请求的URL与当前页面同源,并且配置了xsrfCookieName
|
|
|
cookies.read(config.xsrfCookieName) :
|
|
|
// 从cookie中读取xsrfCookieName对应的值
|
|
|
undefined;
|
|
|
// 否则,xsrfValue为undefined
|
|
|
|
|
|
if (xsrfValue) {
|
|
|
// 如果xsrfValue存在
|
|
|
requestHeaders[config.xsfHeaderName] = xsrfValue;
|
|
|
// 将xsrfValue添加到请求头中,键名为xsfHeaderName
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 添加请求头到请求中
|
|
|
// 检查 request 对象是否具有 setRequestHeader 方法
|
|
|
if ('setRequestHeader' in request) {
|
|
|
// 遍历 requestHeaders 对象,为每个键值对调用 setRequestHeader 函数
|
|
|
utils.forEach(requestHeaders, function setRequestHeader(val, key) {
|
|
|
// 如果 requestData 未定义且当前键为 'content-type'
|
|
|
if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
|
|
|
// 删除 Content-Type 头信息
|
|
|
delete requestHeaders[key];
|
|
|
} else {
|
|
|
// 否则将头信息添加到请求中
|
|
|
request.setRequestHeader(key, val);
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
|
|
|
|
|
|
// 检查配置对象中的 withCredentials 属性是否未定义
|
|
|
if (!utils.isUndefined(config.withCredentials)) {
|
|
|
// 如果 withCredentials 属性已定义,则将其值转换为布尔类型并赋值给请求对象的 withCredentials 属性
|
|
|
request.withCredentials = !!config.withCredentials;
|
|
|
}
|
|
|
|
|
|
// 根据配置添加 responseType 属性,并处理可能的异常
|
|
|
// 检查配置中是否定义了响应类型
|
|
|
if (config.responseType) {
|
|
|
try {
|
|
|
// 尝试将请求的响应类型设置为配置中的响应类型
|
|
|
request.responseType = config.responseType;
|
|
|
} catch (e) {
|
|
|
// 捕获浏览器不兼容XMLHttpRequest Level 2时抛出的DOMException异常
|
|
|
// 但是,对于'json'类型,可以默认使用'transformResponse'函数进行解析,因此可以忽略此异常
|
|
|
if (config.responseType !== 'json') {
|
|
|
// 如果响应类型不是'json',则重新抛出异常
|
|
|
throw e;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
,
|
|
|
|
|
|
// 添加下载进度事件处理
|
|
|
if (typeof config.onDownloadProgress === 'function') {
|
|
|
request.addEventListener('progress', config.onDownloadProgress);
|
|
|
}
|
|
|
|
|
|
// 添加上传进度事件处理,如果浏览器支持
|
|
|
if (typeof config.onUploadProgress === 'function' && request.upload) {
|
|
|
request.upload.addEventListener('progress', config.onUploadProgress);
|
|
|
}
|
|
|
|
|
|
// 处理取消请求的情况
|
|
|
if (config.cancelToken) {
|
|
|
// 如果存在取消令牌,则监听取消事件,取消请求并拒绝
|
|
|
config.cancelToken.promise.then(function onCanceled(cancel) {
|
|
|
// 检查请求对象是否存在,如果不存在则直接返回
|
|
|
if (!request) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 终止当前请求
|
|
|
request.abort();
|
|
|
// 拒绝Promise并传递取消原因
|
|
|
reject(cancel);
|
|
|
// 将请求对象置为空,以便后续处理
|
|
|
request = null;
|
|
|
});
|
|
|
|
|
|
// 确保 requestData 为 null 如果未提供
|
|
|
if (!requestData) {
|
|
|
// 如果 requestData 为空,则将其设置为 null
|
|
|
requestData = null;
|
|
|
}
|
|
|
|
|
|
// 发送请求,将 requestData 作为请求体发送
|
|
|
request.send(requestData);
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
/* 13 */
|
|
|
(function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
// 引入createError模块,用于创建错误对象
|
|
|
var createError = __webpack_require__(14);
|
|
|
|
|
|
module.exports = function settle(resolve, reject, response) {
|
|
|
// 获取响应配置中的状态验证函数
|
|
|
var validateStatus = response.config.validateStatus;
|
|
|
if (!response.status || !validateStatus || validateStatus(response.status)) {
|
|
|
// 如果响应状态不存在或状态验证函数未定义或验证通过,则解决请求
|
|
|
resolve(response);
|
|
|
} else {
|
|
|
// 如果状态验证失败,则拒绝请求并创建错误信息
|
|
|
reject(createError(
|
|
|
'Request failed with status code ' + response.status, // 错误信息包含状态码
|
|
|
response.config, // 请求配置
|
|
|
null, // 无特定错误代码
|
|
|
response.request, // 请求对象
|
|
|
response // 响应对象
|
|
|
));
|
|
|
}
|
|
|
};
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
/* 14 */
|
|
|
(function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
// 引入增强错误处理的模块
|
|
|
var enhanceError = __webpack_require__(15);
|
|
|
|
|
|
|
|
|
module.exports = function createError(message, config, code, request, response) {
|
|
|
// 创建一个新的错误对象,并传入错误信息
|
|
|
var error = new Error(message);
|
|
|
// 使用增强错误处理函数对错误对象进行增强,并返回增强后的错误对象
|
|
|
return enhanceError(error, config, code, request, response);
|
|
|
};
|
|
|
/***/ }),
|
|
|
/* 15 */
|
|
|
/***/ (function(module, exports) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
module.exports = function enhanceError(error, config, code, request, response) {
|
|
|
// 将配置对象附加到错误对象上
|
|
|
error.config = config;
|
|
|
// 如果存在错误码,则将其附加到错误对象上
|
|
|
if (code) {
|
|
|
error.code = code;
|
|
|
}
|
|
|
|
|
|
// 将请求对象附加到错误对象上
|
|
|
error.request = request;
|
|
|
// 将响应对象附加到错误对象上
|
|
|
error.response = response;
|
|
|
// 标记此错误对象为 Axios 错误
|
|
|
error.isAxiosError = true;
|
|
|
|
|
|
// 定义错误对象的 toJSON 方法,用于将错误对象转换为 JSON 格式
|
|
|
error.toJSON = function toJSON() {
|
|
|
return {
|
|
|
// 标准错误属性
|
|
|
message: this.message, // 错误信息
|
|
|
name: this.name, // 错误名称
|
|
|
// Microsoft 特定的错误属性
|
|
|
description: this.description, // 错误描述
|
|
|
number: this.number, // 错误编号
|
|
|
// Mozilla 特定的错误属性
|
|
|
fileName: this.fileName, // 发生错误的文件名
|
|
|
lineNumber: this.lineNumber, // 发生错误的行号
|
|
|
columnNumber: this.columnNumber, // 发生错误的列号
|
|
|
stack: this.stack, // 错误堆栈信息
|
|
|
// Axios 特定的错误属性
|
|
|
config: this.config, // 请求配置
|
|
|
code: this.code // 错误代码
|
|
|
};
|
|
|
};
|
|
|
// 创建并返回一个错误对象
|
|
|
return error;
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
/* 16 */
|
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
var utils = __webpack_require__(2);
|
|
|
|
|
|
// 根据环境选择合适的 cookie 操作方法
|
|
|
module.exports = (
|
|
|
utils.isStandardBrowserEnv() ?
|
|
|
|
|
|
// 标准浏览器环境支持 document.cookie
|
|
|
(function standardBrowserEnv() {
|
|
|
return {
|
|
|
// 写入 cookie 的方法
|
|
|
write: function write(name, value, expires, path, domain, secure) {
|
|
|
// 创建一个空数组用于存储cookie的各个部分
|
|
|
var cookie = [];
|
|
|
// 将name和value添加到cookie数组中,并对value进行编码
|
|
|
cookie.push(name + '=' + encodeURIComponent(value));
|
|
|
|
|
|
// 如果expires是一个数字,则将其转换为GMT字符串格式并添加到cookie数组中
|
|
|
if (utils.isNumber(expires)) {
|
|
|
cookie.push('expires=' + new Date(expires).toGMTString());
|
|
|
}
|
|
|
|
|
|
// 如果path是一个字符串,则将其添加到cookie数组中
|
|
|
if (utils.isString(path)) {
|
|
|
cookie.push('path=' + path);
|
|
|
}
|
|
|
|
|
|
// 如果domain是一个字符串,则将其添加到cookie数组中
|
|
|
if (utils.isString(domain)) {
|
|
|
cookie.push('domain=' + domain);
|
|
|
}
|
|
|
|
|
|
// 如果secure为true,则向cookie数组中添加'secure'
|
|
|
if (secure === true) {
|
|
|
cookie.push('secure');
|
|
|
}
|
|
|
|
|
|
// 将cookie数组内容拼接为字符串并赋值给document.cookie
|
|
|
document.cookie = cookie.join('; ');
|
|
|
},
|
|
|
|
|
|
read: function read(name) {
|
|
|
// 使用正则表达式匹配document.cookie中的name对应的cookie值
|
|
|
var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
|
|
|
// 如果找到匹配项,则返回解码后的cookie值;否则返回null
|
|
|
return (match ? decodeURIComponent(match[3]) : null);
|
|
|
},
|
|
|
|
|
|
remove: function remove(name) {
|
|
|
// 调用write方法,将cookie的过期时间设置为当前时间的前一天,从而删除cookie
|
|
|
this.write(name, '', Date.now() - 86400000);
|
|
|
}
|
|
|
};
|
|
|
})() :
|
|
|
// 非标准浏览器环境(如web workers、react-native)不支持cookie操作
|
|
|
(function nonStandardBrowserEnv() {
|
|
|
return {
|
|
|
write: function write() {},
|
|
|
read: function read() { return null; },
|
|
|
remove: function remove() {}
|
|
|
};
|
|
|
})()
|
|
|
);
|
|
|
/***/ }),
|
|
|
/* 17 */
|
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
// 引入判断URL是否为绝对路径的模块
|
|
|
var isAbsoluteURL = __webpack_require__(18);
|
|
|
// 引入组合URL的模块
|
|
|
var combineURLs = __webpack_require__(19);
|
|
|
|
|
|
module.exports = function buildFullPath(baseURL, requestedURL) {
|
|
|
// 根据提供的 baseURL 和 requestedURL 构建完整路径
|
|
|
// 如果 baseURL 存在且 requestedURL 不是绝对 URL,则将两者组合
|
|
|
// 否则直接返回 requestedURL
|
|
|
// 如果提供了基础URL并且请求的URL不是绝对URL,则将基础URL与请求的URL组合
|
|
|
if (baseURL && !isAbsoluteURL(requestedURL)) {
|
|
|
return combineURLs(baseURL, requestedURL);
|
|
|
}
|
|
|
// 如果请求的URL是绝对URL,则直接返回请求的URL
|
|
|
return requestedURL;
|
|
|
};
|
|
|
|
|
|
|
|
|
// 模块定义的结束部分
|
|
|
/***/ }),
|
|
|
|
|
|
// 模块加载函数的定义开始
|
|
|
/***/ (function(module, exports) {
|
|
|
|
|
|
// 严格模式
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
module.exports = function isAbsoluteURL(url) {
|
|
|
// URL被认为是绝对的,如果它以"<scheme>://"或"//"(协议相对URL)开头。
|
|
|
// RFC 3986定义的方案名称是一系列字符,以字母开头,后跟任意字母、数字、加号、点或连字符的组合。
|
|
|
return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
/* 19 */
|
|
|
/***/ (function(module, exports) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
module.exports = function combineURLs(baseURL, relativeURL) {
|
|
|
// 结合基础URL和相对URL,确保URL正确拼接
|
|
|
return relativeURL
|
|
|
? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
|
|
|
: baseURL;
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
/* 20 */
|
|
|
(function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
// 引入 utils 模块
|
|
|
var utils = __webpack_require__(2);
|
|
|
|
|
|
)
|
|
|
|
|
|
// 定义一个数组,包含需要忽略重复的请求头字段
|
|
|
var ignoreDuplicateOf = [
|
|
|
'age', 'authorization', 'content-length', 'content-type', 'etag',
|
|
|
'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
|
|
|
'last-modified', 'location', 'max-forwards', 'proxy-authorization',
|
|
|
'referer', 'retry-after', 'user-agent'
|
|
|
];
|
|
|
// 定义一个数组,包含在HTTP请求头中不应被重复设置的字段名称
|
|
|
|
|
|
module.exports = function parseHeaders(headers) {
|
|
|
// 初始化一个空对象用于存储解析后的头部信息
|
|
|
var parsed = {};
|
|
|
// 声明变量用于存储当前头部信息的键
|
|
|
var key;
|
|
|
// 声明变量用于存储当前头部信息的值
|
|
|
var val;
|
|
|
// 声明变量用于循环计数
|
|
|
var i;
|
|
|
|
|
|
}
|
|
|
if (!headers) { return parsed; }
|
|
|
|
|
|
// 遍历每一行header信息,调用parser函数进行解析
|
|
|
utils.forEach(headers.split('\n'), function parser(line) {
|
|
|
// 解析每一行header信息,存入对象中
|
|
|
i = line.indexOf(':');
|
|
|
key = utils.trim(line.substr(0, i)).toLowerCase();
|
|
|
val = utils.trim(line.substr(i + 1));
|
|
|
|
|
|
if (key) {
|
|
|
// 忽略重复的header信息
|
|
|
if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
|
|
|
return;
|
|
|
}
|
|
|
// 处理set-cookie header信息的拼接
|
|
|
if (key === 'set-cookie') {
|
|
|
parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
|
|
|
} else {
|
|
|
parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
|
|
|
// 返回解析后的对象
|
|
|
return parsed;
|
|
|
},
|
|
|
|
|
|
/***/ }
|
|
|
),
|
|
|
/* 21 */
|
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
// 引入 utils 模块
|
|
|
var utils = __webpack_require__(2);
|
|
|
|
|
|
// 根据环境导出不同的模块
|
|
|
module.exports = (
|
|
|
utils.isStandardBrowserEnv() ?
|
|
|
|
|
|
// 标准浏览器环境支持测试请求 URL 是否与当前地址同源的 API
|
|
|
(function standardBrowserEnv() {
|
|
|
var msie = /(msie|trident)/i.test(navigator.userAgent);
|
|
|
var urlParsingNode = document.createElement('a');
|
|
|
var originURL;
|
|
|
|
|
|
|
|
|
function resolveURL(url) {
|
|
|
// 初始化 href 变量为传入的 URL
|
|
|
var href = url;
|
|
|
|
|
|
if (msie) {
|
|
|
// IE 浏览器需要设置 href 属性两次以规范化属性
|
|
|
urlParsingNode.setAttribute('href', href);
|
|
|
// 获取规范化后的 href 值
|
|
|
href = urlParsingNode.href;
|
|
|
}
|
|
|
// 再次设置 href 属性,确保解析正确
|
|
|
urlParsingNode.setAttribute('href', href);
|
|
|
|
|
|
// 返回一个解析后的URL对象,包含协议、主机、搜索字符串、哈希、主机名、端口和路径名等信息
|
|
|
return {
|
|
|
// 完整的 URL 地址
|
|
|
href: urlParsingNode.href,
|
|
|
// 协议部分,去掉末尾的冒号
|
|
|
protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
|
|
|
// 主机部分,包括域名和端口号
|
|
|
host: urlParsingNode.host,
|
|
|
// 查询字符串部分,去掉开头的问号
|
|
|
search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
|
|
|
// 哈希部分,去掉开头的井号
|
|
|
hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
|
|
|
// 主机名部分,不包括端口号
|
|
|
hostname: urlParsingNode.hostname,
|
|
|
// 端口号部分
|
|
|
port: urlParsingNode.port,
|
|
|
// 路径名部分,如果路径不以斜杠开头,则添加斜杠
|
|
|
pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
|
|
|
urlParsingNode.pathname :
|
|
|
'/' + urlParsingNode.pathname
|
|
|
};
|
|
|
}
|
|
|
// 使用resolveURL函数解析当前窗口的URL,并将结果赋值给originURL变量
|
|
|
originURL = resolveURL(window.location.href);
|
|
|
|
|
|
return function isURLSameOrigin(requestURL) {
|
|
|
// 解析请求的URL,如果是字符串则调用resolveURL函数进行解析
|
|
|
var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
|
|
|
// 比较解析后的URL与当前页面的协议和主机是否相同
|
|
|
return (parsed.protocol === originURL.protocol &&
|
|
|
parsed.host === originURL.host);
|
|
|
};
|
|
|
})()
|
|
|
|
|
|
// 非标准浏览器环境(如 web workers, react-native)缺乏必要的支持。
|
|
|
(function nonStandardBrowserEnv() {
|
|
|
// 返回一个总是返回 true 的函数,表示在非标准浏览器环境中,默认认为 URL 是同源的
|
|
|
return function isURLSameOrigin() {
|
|
|
return true;
|
|
|
};
|
|
|
})()
|
|
|
/* 22 */
|
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
// 引入 utils 模块
|
|
|
var utils = __webpack_require__(2);
|
|
|
|
|
|
// 导出一个函数,用于合并两个配置对象
|
|
|
module.exports = function mergeConfig(config1, config2) {
|
|
|
// 如果未提供 config2,则将其设置为空对象
|
|
|
config2 = config2 || {};
|
|
|
var config = {};
|
|
|
|
|
|
// 定义需要从 config2 获取值的键
|
|
|
var valueFromConfig2Keys = ['url', 'method', 'data'];
|
|
|
|
|
|
// 定义需要深度合并属性的键
|
|
|
var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params'];
|
|
|
|
|
|
// 定义默认优先使用 config2 值的键
|
|
|
var defaultToConfig2Keys = [
|
|
|
'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer',
|
|
|
'timeout', 'timeoutMessage', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName',
|
|
|
'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'decompress',
|
|
|
'maxContentLength', 'maxBodyLength', 'maxRedirects', 'transport', 'httpAgent',
|
|
|
'httpsAgent', 'cancelToken', 'socketPath', 'responseEncoding'
|
|
|
];
|
|
|
|
|
|
// 定义需要直接合并的键
|
|
|
var directMergeKeys = ['validateStatus'];
|
|
|
|
|
|
// 定义一个函数,用于根据键获取合并后的值
|
|
|
function getMergedValue(target, source) {
|
|
|
// 合并两个普通对象,如果source是普通对象则合并,如果source是数组则复制,否则直接返回source
|
|
|
// 如果目标和源都是普通对象,则合并它们
|
|
|
if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
|
|
|
return utils.merge(target, source);
|
|
|
// 如果只有源是普通对象,则合并到一个空对象中
|
|
|
} else if (utils.isPlainObject(source)) {
|
|
|
return utils.merge({}, source);
|
|
|
// 如果源是数组,则返回源数组的浅拷贝
|
|
|
} else if (utils.isArray(source)) {
|
|
|
return source.slice();
|
|
|
}
|
|
|
// 否则直接返回源
|
|
|
return source;
|
|
|
|
|
|
function mergeDeepProperties(prop) {
|
|
|
// 深度合并config1和config2中的属性,优先使用config2的属性
|
|
|
if (!utils.isUndefined(config2[prop])) {
|
|
|
config[prop] = getMergedValue(config1[prop], config2[prop]);
|
|
|
} else if (!utils.isUndefined(config1[prop])) {
|
|
|
config[prop] = getMergedValue(undefined, config1[prop]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) {
|
|
|
// 将config2中的属性复制到config中,如果config2中存在该属性
|
|
|
if (!utils.isUndefined(config2[prop])) {
|
|
|
config[prop] = getMergedValue(undefined, config2[prop]);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
// 深度合并指定的属性
|
|
|
utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties);
|
|
|
|
|
|
// 将默认值设置为 config2 中的属性值
|
|
|
utils.forEach(defaultToConfig2Keys, function defaultToConfig2(propp) {
|
|
|
// 将config2或config1中的属性复制到config中,优先使用config2的属性
|
|
|
if (!utils.isUndefined(config2[prop])) {
|
|
|
config[prop] = getMergedValue(undefined, config2[prop]);
|
|
|
} else if (!utils.isUndefined(config1[prop])) {
|
|
|
config[prop] = getMergedValue(undefined, config1[prop]);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
// 遍历 directMergeKeys 数组,将 config1 和 config2 中对应属性的值合并到 config 中
|
|
|
utils.forEach(directMergeKeys, function merge(prop) {
|
|
|
// 合并config1和config2中的属性到config中,如果config2中存在该属性则使用config2和config1合并的结果,否则使用config1的属性
|
|
|
if (prop in config2) {
|
|
|
config[prop] = getMergedValue(config1[prop], config2[prop]);
|
|
|
} else if (prop in config1) {
|
|
|
config[prop] = getMergedValue(undefined, config1[prop]);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
// 合并axios配置时需要特殊处理的键集合
|
|
|
var axiosKeys = valueFromConfig2Keys
|
|
|
.concat(mergeDeepPropertiesKeys)
|
|
|
.concat(defaultToConfig2Keys)
|
|
|
.concat(directMergeKeys);
|
|
|
|
|
|
// 获取所有不在axiosKeys中的键
|
|
|
var otherKeys = Object
|
|
|
.keys(config1)
|
|
|
.concat(Object.keys(config2))
|
|
|
.filter(function filterAxiosKeys(key) {
|
|
|
return axiosKeys.indexOf(key) === -1;
|
|
|
});
|
|
|
|
|
|
// 对于不在特殊处理集合中的键,进行深度合并
|
|
|
utils.forEach(otherKeys, mergeDeepProperties);
|
|
|
|
|
|
// 返回合并后的配置对象
|
|
|
return config;
|
|
|
};
|
|
|
/* 23 */
|
|
|
/***/ (function(module, exports) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
// 定义一个构造函数 Cancel,用于创建取消操作的对象
|
|
|
function Cancel(message) {
|
|
|
// 设置取消操作的消息内容
|
|
|
this.message = message;
|
|
|
}
|
|
|
|
|
|
Cancel.prototype.toString = function toString() {
|
|
|
// 返回 Cancel 对象的字符串表示形式,如果存在 message 属性,则将其包含在返回的字符串中
|
|
|
return 'Cancel' + (this.message ? ': ' + this.message : '');
|
|
|
};
|
|
|
|
|
|
// 定义 Cancel 类的原型属性 __CANCEL__ 为 true
|
|
|
Cancel.prototype.__CANCEL__ = true;
|
|
|
|
|
|
// 导出 Cancel 类
|
|
|
module.exports = Cancel;
|
|
|
|
|
|
/***/ }),
|
|
|
/* 24 */
|
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
// 定义一个立即执行函数表达式,通常用于模块化管理,避免变量污染全局作用域
|
|
|
// 参数 module, exports, __webpack_require__ 用于模块的加载和导出功能
|
|
|
)
|
|
|
'use strict';
|
|
|
|
|
|
var Cancel = __webpack_require__(23);
|
|
|
|
|
|
// 取消令牌类,用于处理取消请求的操作
|
|
|
function CancelToken(executor) {
|
|
|
// 检查传入的执行器是否为函数类型,如果不是则抛出类型错误
|
|
|
if (typeof executor !== 'function') {
|
|
|
throw new TypeError('executor must be a function.');
|
|
|
}
|
|
|
|
|
|
// 定义一个用于解决 Promise 的函数
|
|
|
var resolvePromise;
|
|
|
// 创建一个 Promise 实例,该实例用于表示取消操作的状态
|
|
|
this.promise = new Promise(function promiseExecutor(resolve) {
|
|
|
resolvePromise = resolve;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
var token = this;
|
|
|
executor(function cancel(message) {
|
|
|
if (token.reason) {
|
|
|
// 取消请求已被提出
|
|
|
return;
|
|
|
}
|
|
|
// 定义取消请求的执行器函数,接收一个消息参数
|
|
|
// 如果token.reason已经存在,说明请求已经被取消,直接返回
|
|
|
// 否则,执行取消逻辑
|
|
|
});
|
|
|
token.reason = new Cancel(message);
|
|
|
resolvePromise(token.reason);
|
|
|
});
|
|
|
}
|
|
|
// 设置取消请求的原因并解析Promise
|
|
|
|
|
|
|
|
|
// 如果请求已取消,则抛出取消原因
|
|
|
CancelToken.prototype.throwIfRequested = function throwIfRequested() {
|
|
|
if (this.reason) {
|
|
|
throw this.reason;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
CancelToken.source = function source() {
|
|
|
// 创建一个取消令牌和取消函数的源
|
|
|
var cancel;
|
|
|
var token = new CancelToken(function executor(c) {
|
|
|
// 执行器函数,接收一个取消函数并赋值给cancel变量
|
|
|
cancel = c;
|
|
|
});
|
|
|
// 返回一个包含取消令牌和取消函数的对象
|
|
|
return {
|
|
|
token: token,
|
|
|
cancel: cancel
|
|
|
};
|
|
|
};
|
|
|
|
|
|
// 导出CancelToken类或构造函数
|
|
|
module.exports = CancelToken;
|
|
|
|
|
|
/***/ }):
|
|
|
/* 25 */
|
|
|
/***/ (function(module, exports) {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
// 定义一个名为 spread 的函数,该函数接受一个回调函数作为参数
|
|
|
module.exports = function spread(callback) {
|
|
|
// 返回一个新的函数,该函数接受一个数组参数
|
|
|
return function wrap(arr) {
|
|
|
// 使用 apply 方法将数组展开作为参数传递给 callback 函数
|
|
|
return callback.apply(null, arr);
|
|
|
};
|
|
|
};
|
|
|
/***/ )
|
|
|
/******/ ]);
|
|
|
,
|
|
|
//# sourceMappingURL=axios.map
|
|
|
|
|
|
|
|
|
let axios;
|
|
|
axios.interceptors.request.use(function(config){
|
|
|
// 如果存储中有有效令牌,则执行以下操作
|
|
|
if(store.getToken()){
|
|
|
// 将令牌添加到请求头中
|
|
|
config.headers.token=store.getToken();
|
|
|
}
|
|
|
// 返回修改后的配置对象
|
|
|
return config;
|
|
|
},function(error){
|
|
|
// 拦截请求错误并返回一个被拒绝的Promise
|
|
|
return Promise.reject(error);
|
|
|
});
|
|
|
// 该函数在请求发送之前检查存储中是否存在 token,如果存在则将其添加到请求头中,然后返回配置对象。如果请求过程中发生错误,则返回一个被拒绝的 Promise。
|
|
|
|
|
|
axios.interceptors.response.use(function(response){
|
|
|
if(response.headers.token){
|
|
|
store.setToken(response.headers.token);
|
|
|
}
|
|
|
});
|
|
|
// 设置响应拦截器,在接收到响应时执行
|
|
|
// 检查响应头中是否存在'token'字段,如果存在则调用store.setToken方法保存该token
|
|
|
// 检查HTTP响应状态是否为200
|
|
|
if(response.status==200){
|
|
|
// 获取响应数据
|
|
|
const res = response.data;
|
|
|
// 后端返回的数据为200的时候为正常数据
|
|
|
if(res.code==200){
|
|
|
// 返回正常的响应数据
|
|
|
return res;
|
|
|
}else if(res.code==400){//token过时
|
|
|
// 如果响应代码为400,表示token已过期,重定向到登录页面
|
|
|
window.location.href = 'login.html';
|
|
|
return ;
|
|
|
}else{
|
|
|
// 其他情况返回一个被拒绝的 Promise,拒绝原因设置为响应消息
|
|
|
return Promise.reject(res.msg);
|
|
|
}
|
|
|
}
|
|
|
)else{
|
|
|
// 如果响应状态不是成功,则返回一个被拒绝的 Promise,拒绝原因设置为响应的状态文本
|
|
|
return Promise.reject(response.statusText);
|
|
|
}
|
|
|
},},function(error){
|
|
|
// 拒绝 Promise 并返回错误信息
|
|
|
return Promise.reject(error);
|
|
|
});
|
|
|
// 设置 axios 的默认基础 URL
|
|
|
axios.defaults.baseURL="http://localhost:8888/dormitory"
|
|
|
// 输出 axios
|
|
|
exports('axios', axios);
|
|
|
)},)}
|