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.
 
 
 
 
 
 

464 lines
13 KiB

/**
* 请求封装
*/
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.errMsg == 'request:ok')) {
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);
}else{
reject()
}
},
});
});
}
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;