You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1823 lines
89 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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);
)},)}