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被认为是绝对的,如果它以"://"或"//"(协议相对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); )},)}