/** * 请求封装 */ import $ from "./globalJs"; const tokenKey = "token"; const tokenKeyValue = ""; class Request { constructor(config = {}) { this.config = {}; this.config.baseUrl = config.baseUrl ? config.baseUrl : ""; this.config.dataType = config.dataType ? config.dataType : "json"; this.config.responseType = config.responseType ? config.responseType : "text"; this.config.header = config.header ? config.header : {}; this.reqInterceptors = null; this.resInterceptors = null; this.interceptors = { request: (fn) => { this.reqInterceptors = fn; }, response: (fn) => { this.resInterceptors = fn; }, }; } setConfig(config = {}) { this.config = this._deepCopy(this._merge(this.config, config)); } // 请求封装 globalRequest(url, config, method, isForm = "") { const _this = this; let newConfig = this._deepCopy(this._merge(this.config, config)); let lastConfig = {}; if (this.reqInterceptors && typeof this.reqInterceptors === "function") { let reqInterceptors = this.reqInterceptors(newConfig); if (!reqInterceptors && process.env.NODE_ENV === "development") { console.log("请求被拦截,此消息仅在开发环境显示。"); return false; } else if ( Object.prototype.toString.call(reqInterceptors) === "[object Promise]" ) { return reqInterceptors; } lastConfig = this._deepCopy(reqInterceptors); } else { lastConfig = this._deepCopy(newConfig); } let header = {}; let tokenData = $.getData("token"); if (tokenData) { header[tokenKey] = tokenKeyValue + tokenData; } if (isForm) { header["content-type"] = "application/x-www-form-urlencoded"; } let fullUrl = this._formatUrl(lastConfig.baseUrl, url); if (url.indexOf("http") != -1) { fullUrl = url; } return new Promise((resolve, reject) => { uni.request({ url: fullUrl, method: method, data: config, header: header, async complete(response) { let res = response; if (response.statusCode == 404) { $.toast("请求地址不存在"); } else if (response.statusCode == 500) { $.toast("服务器内部错误"); } else { console.log("response", response.statusCode); let res = response; if ( _this.resInterceptors && typeof _this.resInterceptors === "function" ) { let resInterceptors = _this.resInterceptors(res); // console.log('resInterceptors-----------------',resInterceptors) if ( resInterceptors.statusCode == 401 || resInterceptors.data.code == 403 ) { $.toast("登录信息已过期,请重新登录"); $.removeData("token"); setTimeout(() => { $.openNew("/pages/logIn/logIn"); }, 1500); return; } else if (resInterceptors.statusCode != 200) { $.toast(resInterceptors.data.message); } if (!resInterceptors && resInterceptors != "") { reject("返回值已被您拦截!"); return; } else if ( Object.prototype.toString.call(resInterceptors) === "[object Promise]" ) { try { let promiseRes = await resInterceptors; resolve(promiseRes); } catch (error) { reject(error); } } else { res = resInterceptors; } } } resolve(res.data); }, }); }); } addFile(file, success, progress) { const _this = this; let newConfig = this._deepCopy(this._merge(this.config, {})); let lastConfig = {}; if (this.reqInterceptors && typeof this.reqInterceptors === "function") { let reqInterceptors = this.reqInterceptors(newConfig); if (!reqInterceptors && process.env.NODE_ENV === "development") { console.log("请求被拦截,此消息仅在开发环境显示。"); return false; } else if ( Object.prototype.toString.call(reqInterceptors) === "[object Promise]" ) { return reqInterceptors; } lastConfig = this._deepCopy(reqInterceptors); } else { lastConfig = this._deepCopy(newConfig); } let fullUrl = this._formatUrl(lastConfig.baseUrl, $.imgUrl); let header = { // 'content-Type':'multipart/form-data' }; return new Promise((resolve, reject) => { const UploadTask = uni.uploadFile({ url: fullUrl, filePath: file[0].path, header: header, name: $.fileImgKey, formData: {}, async complete(response) { let res = response; if ( _this.resInterceptors && typeof _this.resInterceptors === "function" ) { let resInterceptors = _this.resInterceptors(res); if (!resInterceptors && resInterceptors != "") { reject("返回值已被您拦截!"); return; } else if ( Object.prototype.toString.call(resInterceptors) === "[object Promise]" ) { try { let promiseRes = await resInterceptors; resolve(promiseRes); } catch (error) { reject(error); } } else { res = resInterceptors; } } success(JSON.parse(res.data)); }, }); // 监听上传进度 if (progress) { UploadTask.onProgressUpdate((res) => { progress(res.progress); }); } }); } // 上传图片 addImg(length = 1, success, progress, type = 1) { // 获取本地图片的路径 uni.chooseImage({ count: length, // original原图compressed压缩图 sizeType: ["compressed"], // 可以指定是原图还是压缩图,默认二者都有 // camera相机album相册 sourceType: ["album", "camera"], // 可以指定来源是相册还是相机,默认二者都有 success: (res) => { // 显示上传动画 $.showLoading("图片上传中..."); var imgs; imgs = res.tempFilePaths; // #ifdef H5 // 调用上传图片的函数 // 处理多选 // if (imgs.length > length) { // imgs = imgs.slice(0, length); // } this.fileImg(imgs, 0, success, progress, type); // #endif // #ifdef APP console.log("imgs", imgs); // 将新添加的图片添加到imgs_arr中 uni.compressImage({ src: imgs[0], quality: 60, // 仅对jpg有效 success: (ress) => { this.fileImg([ress.tempFilePath], 0, success, progress, type); }, fail: (err) => { $.hideLoading("图片上传中..."); }, complete: (msg) => {}, }); // #endif }, complete: (err) => {}, }); } fileImg(imgs, index, success, progress, type) { const _this = this; let newConfig = this._deepCopy(this._merge(this.config, {})); let lastConfig = {}; if (this.reqInterceptors && typeof this.reqInterceptors === "function") { let reqInterceptors = this.reqInterceptors(newConfig); if (!reqInterceptors && process.env.NODE_ENV === "development") { console.log("请求被拦截,此消息仅在开发环境显示。"); return false; } else if ( Object.prototype.toString.call(reqInterceptors) === "[object Promise]" ) { return reqInterceptors; } lastConfig = this._deepCopy(reqInterceptors); } else { lastConfig = this._deepCopy(newConfig); } let fullUrl = this._formatUrl(lastConfig.baseUrl, $.imgUrl); if (type == 2) { fullUrl = this._formatUrl(lastConfig.baseUrl, $.imgUserIdUrl); } let header = { token: $.getData("token"), }; // 如果数组长度大于下标,说明没有上传完 if (imgs.length > index) { var src = imgs[index]; return new Promise((resolve, reject) => { const UploadTask = uni.uploadFile({ url: fullUrl, filePath: src, header: header, name: $.fileImgKey, formData: {}, async complete(response) { let res = response; if ( _this.resInterceptors && typeof _this.resInterceptors === "function" ) { let resInterceptors = _this.resInterceptors(res); // console.log('resInterceptors',resInterceptors) let datasJSON = JSON.parse(resInterceptors.data); if (datasJSON.code == 1101) { } if (!resInterceptors && resInterceptors != "") { reject("返回值已被您拦截!"); return; } else if ( Object.prototype.toString.call(resInterceptors) === "[object Promise]" ) { try { let promiseRes = await resInterceptors; resolve(promiseRes); } catch (error) { reject(error); } } else { res = resInterceptors; } } success(JSON.parse(res.data)); _this.fileImg(imgs, index + 1, progress); }, }); // 监听上传进度 if (progress) { UploadTask.onProgressUpdate((res) => { progress(res.progress); }); } }); // #ifdef H5 // 压缩 // lrz(src, { // quality: 0.7, // }).then((rst) => { // fieldName 为 formData 中多媒体的字段名 // }) // #endif // #ifdef APP-PLUS // #endif } else { $.hideLoading(); } } // 上传视频 addVideo(url, success, progress) { // 获取本地视频的路径 uni.chooseVideo({ sourceType: ["album", "camera"], // 选择方式 success: (res) => { if (res.size > $.videoSize) { let size = parseInt($.videoSize / 1024000); $.toast("上传视频过大,大小请不要超过" + size + "M"); } else { // 显示上传动画 $.showLoading("视频上传中..."); // 调用上传视频的函数 this.fileVideo(res.tempFilePath, url, success, progress); } }, fail: (res) => { console.log(JSON.stringify(res)); }, }); } fileVideo(src, url, success, progress) { const _this = this; let newConfig = this._deepCopy(this._merge(this.config, {})); let lastConfig = {}; if (this.reqInterceptors && typeof this.reqInterceptors === "function") { let reqInterceptors = this.reqInterceptors(newConfig); if (!reqInterceptors && process.env.NODE_ENV === "development") { console.log("请求被拦截,此消息仅在开发环境显示。"); return false; } else if ( Object.prototype.toString.call(reqInterceptors) === "[object Promise]" ) { return reqInterceptors; } lastConfig = this._deepCopy(reqInterceptors); } else { lastConfig = this._deepCopy(newConfig); } let fullUrl = this._formatUrl(lastConfig.baseUrl, $.imgUrl); //上传视频 return new Promise((resolve, reject) => { const UploadTask = uni.uploadFile({ url: fullUrl, filePath: src, name: $.fileVideoKey, async complete(response) { let res = response; if ( _this.resInterceptors && typeof _this.resInterceptors === "function" ) { let resInterceptors = _this.resInterceptors(res); // console.log('resInterceptors',resInterceptors) if (!resInterceptors && resInterceptors != "") { reject("返回值已被您拦截!"); return; } else if ( Object.prototype.toString.call(resInterceptors) === "[object Promise]" ) { try { let promiseRes = await resInterceptors; resolve(promiseRes); } catch (error) { reject(error); } } else { res = resInterceptors; } } success(JSON.parse(res.data)); $.hideLoading(); }, success: (res) => { success(JSON.parse(res.data)); // 关闭上传动画 }, fail: (e) => { // 关闭上传动画 $.hideLoading(); $.toast("上传超时!"); }, }); // 监听上传进度 if (progress) { UploadTask.onProgressUpdate((res) => { progress(res.progress); }); } }); } _formatUrl(baseUrl, url) { if (!baseUrl) return url; let formatUrl = ""; const baseUrlEndsWithSlash = baseUrl.endsWith("/"); const urlStartsWithSlash = url.startsWith("/"); if (baseUrlEndsWithSlash && urlStartsWithSlash) { formatUrl = baseUrl + url.substring(1); } else if (baseUrlEndsWithSlash || urlStartsWithSlash) { formatUrl = baseUrl + url; } else { formatUrl = baseUrl + "/" + url; } return formatUrl; } _merge(oldConfig, newConfig) { let mergeConfig = this._deepCopy(oldConfig); if (!newConfig || !Object.keys(newConfig).length) return mergeConfig; for (let key in newConfig) { if (key !== "header") { mergeConfig[key] = newConfig[key]; } else { if ( Object.prototype.toString.call(newConfig[key]) === "[object Object]" ) { for (let headerKey in newConfig[key]) { mergeConfig[key][headerKey] = newConfig[key][headerKey]; } } } } return mergeConfig; } _deepCopy(obj) { let result = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { if (typeof obj[key] === "object") { result[key] = this._deepCopy(obj[key]); } else { result[key] = obj[key]; } } } return result; } } if (!global.$request) { global.$request = new Request(); } export default global.$request;