581 lines
15 KiB
JavaScript
581 lines
15 KiB
JavaScript
/**
|
||
* @description 请求配置
|
||
*/
|
||
import axios from "axios";
|
||
import CryptoJS from "crypto-js";
|
||
import { Base64 } from "js-base64";
|
||
import { getToken, removeToken } from "./auth.js";
|
||
import JSONBig from "json-bigint";
|
||
|
||
import { v1 as uuidv1 } from "uuid";
|
||
|
||
// export const baseUrl = "https://lingniu-gateway.demo.chinawayltd.com/";
|
||
// export const baseUrl = "http://192.168.1.6:6902/";
|
||
|
||
const ENV = {
|
||
test: {
|
||
URL: "https://lingniu.test.chinawayltd.com/gateway/",
|
||
},
|
||
demo: {
|
||
URL: "https://lingniu-gateway.demo.chinawayltd.com/",
|
||
},
|
||
loce: {
|
||
URL: "http://192.168.130.136:6902/",
|
||
},
|
||
loce2: {
|
||
URL: "http://192.168.110.222:6902/",
|
||
},
|
||
loce3: {
|
||
URL: "http://192.168.110.23:6902/",
|
||
},
|
||
local: {
|
||
URL: "http://lingniu.huixintop.com/",
|
||
},
|
||
online: {
|
||
URL: "https://lnh2e.com/api/",
|
||
},
|
||
beta: {
|
||
URL: "https://beta.lnh2e.com/api/",
|
||
},
|
||
test2: {
|
||
URL: "http://115.230.138.233:6902/",
|
||
},
|
||
huixin: {
|
||
URL: "https://lingniu.huixintop.com/",
|
||
},
|
||
};
|
||
|
||
const vega = {
|
||
["lingniu-manager-v1"]: {
|
||
key: "lingniu_server",
|
||
secret: "TiDjIe7dEaNfzI7n2w9emXkXlCbLmPar",
|
||
},
|
||
["lingniu-export-v1"]: {
|
||
key: "lingniu_server",
|
||
secret: "TiDjIe7dEaNfzI7n2w9emXkXlCbLmPar",
|
||
},
|
||
};
|
||
|
||
const product = "lingniu-manager-v1";
|
||
const uploadProduct = "lingniu-export-v1";
|
||
const version = "v1";
|
||
const sin_key = "lingniu_server";
|
||
const sin_secret = "TiDjIe7dEaNfzI7n2w9emXkXlCbLmPar";
|
||
|
||
export const baseUrl = ENV.beta.URL;
|
||
console.log("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" + baseUrl);
|
||
class REQUEST {
|
||
static request(config) {
|
||
return new Promise((resolve, reject) => {
|
||
uni.request({
|
||
...config,
|
||
success: (res) => {
|
||
resolve(res.data.data);
|
||
},
|
||
fail: (e) => {
|
||
reject(e);
|
||
},
|
||
});
|
||
});
|
||
}
|
||
|
||
static get(url, data, config) {
|
||
return this.request({
|
||
url: url, //仅为示例,并非真实接口地址。
|
||
method: "get",
|
||
data: data,
|
||
...config,
|
||
});
|
||
}
|
||
|
||
static post(url, data, config = {}) {
|
||
return this.request({
|
||
url: url, //仅为示例,并非真实接口地址。
|
||
method: "post",
|
||
data: data,
|
||
...config,
|
||
});
|
||
}
|
||
|
||
static put(url, data, config = {}) {
|
||
return this.request({
|
||
url: url, //仅为示例,并非真实接口地址。
|
||
method: "put",
|
||
data: data,
|
||
...config,
|
||
});
|
||
}
|
||
|
||
static delete(url, data, config = {}) {
|
||
return this.request({
|
||
url: url, //仅为示例,并非真实接口地址。
|
||
method: "delete",
|
||
data: data,
|
||
...config,
|
||
});
|
||
}
|
||
|
||
static upload(url, config = {}) {
|
||
const _this = this;
|
||
return new Promise((resolve, reject) => {
|
||
uni.uploadFile({
|
||
url,
|
||
...config,
|
||
success: (res) => {
|
||
resolve(res.data);
|
||
},
|
||
fail: (e) => {
|
||
reject(e);
|
||
},
|
||
});
|
||
});
|
||
}
|
||
|
||
static download(url, fileName, cb) {
|
||
let config = {
|
||
responseType: "blob",
|
||
};
|
||
_requestAxios("get", {
|
||
url: url,
|
||
data: {},
|
||
config: config,
|
||
}).then((res) => {
|
||
if (cb) {
|
||
cb();
|
||
}
|
||
const blob = new Blob([res.data]);
|
||
const link = document.createElement("a");
|
||
link.href = URL.createObjectURL(blob);
|
||
link.download = fileName || _getFileName(res);
|
||
link.style.display = "none";
|
||
document.body.appendChild(link);
|
||
link.click();
|
||
window.URL.revokeObjectURL(link.href);
|
||
document.body.removeChild(link);
|
||
|
||
function _getFileName(res) {
|
||
let headers = res.headers;
|
||
let contentDisposition = headers["content-disposition"];
|
||
let reg = /(filename=)(\S)*(;)?/g;
|
||
let fileNameArr = contentDisposition.match(reg);
|
||
if (fileNameArr.length < 1) {
|
||
return "template.txt";
|
||
}
|
||
let fileNameStr = fileNameArr[0].replace(";", "");
|
||
let fileName = fileNameStr.replace("filename=", "");
|
||
return decodeURI(fileName);
|
||
}
|
||
});
|
||
return false;
|
||
}
|
||
|
||
static getImageUrlParam(url, data, config = {}) {
|
||
config.params = data;
|
||
let reg = _regurl(url);
|
||
if (Array.isArray(reg) && reg.length >= 4) {
|
||
const [, product, version, path] = reg;
|
||
|
||
const key = vega[product].key;
|
||
const secret = vega[product].secret;
|
||
|
||
const timestamp = Date.now();
|
||
const stringToSign = `GET\n${timestamp}\n/${product}/${version}${path}`;
|
||
const sign = Base64.btoa(
|
||
CryptoJS.HmacSHA1(stringToSign, secret).toString()
|
||
);
|
||
|
||
return `g7liteSaasGatewayAppKey=${key}&g7liteSaasGatewayTimestamp=${timestamp}&g7liteSaasGatewaySign=${encodeURIComponent(
|
||
sign
|
||
)}&g7liteGToken=${encodeURIComponent(getToken())}`;
|
||
} else {
|
||
console.warn("vega配置存在问题,请检查vega相关配置");
|
||
}
|
||
}
|
||
}
|
||
|
||
//BlobUrl转blob数据
|
||
function funobjectURLToBlob(blodurl, nmae) {
|
||
return new Promise((resolve, reject) => {
|
||
const fileManager = uni.getFileSystemManager();
|
||
fileManager.readFile({
|
||
filePath: `${blodurl}`,
|
||
position: 0,
|
||
success(res) {
|
||
// let files = new window.File([res.data], name, {
|
||
// type: 'image'
|
||
// });
|
||
// console.log(res.data)
|
||
resolve(res);
|
||
},
|
||
fail(res) {
|
||
console.error(res);
|
||
},
|
||
});
|
||
// var http = new XMLHttpRequest();
|
||
// http.open('GET', blodurl, true);
|
||
// http.responseType = 'blob';
|
||
// http.onload = function(e) {
|
||
|
||
// };
|
||
// http.send();
|
||
});
|
||
}
|
||
|
||
function _regurl(url) {
|
||
return url.match(/([^/]+)\/(v\d)(\/\S+)/);
|
||
}
|
||
|
||
function _requestAxios(type, { url, config = {}, data = {} }) {
|
||
console.log(/(http|https):\/\/([\w.]+\/?)\S*/.test(url));
|
||
const reqUrl = /(http|https):\/\/([\w.]+\/?)\S*/.test(url)
|
||
? url
|
||
: baseUrl + url;
|
||
let sign = {};
|
||
const langMapping = {
|
||
zh: "zh_CN",
|
||
en: "en_US",
|
||
th: "th_TH",
|
||
tw: "zh_TW",
|
||
};
|
||
if (Array.isArray(reg) && reg.length >= 4) {
|
||
const [, product, version, path] = reg;
|
||
let pathArr = path.split("?");
|
||
let pathStr = pathArr[0];
|
||
sign = _makeApiSign({
|
||
reqType: type,
|
||
path: pathStr,
|
||
product,
|
||
version,
|
||
key: vega[product].key,
|
||
secret: vega[product].secret,
|
||
});
|
||
} else {
|
||
console.warn("vega配置存在问题,请检查vega相关配置");
|
||
}
|
||
|
||
config.headers = Object.assign(
|
||
{
|
||
"Content-Type": "application/json",
|
||
from_type: 1,
|
||
},
|
||
{
|
||
"G7LITE-LANGUAGE": "zh_CN",
|
||
g7liteGToken: getToken(),
|
||
g7liteSaasGatewayAppKey: sign.key,
|
||
g7liteSaasGatewayTimestamp: sign.timestamp,
|
||
g7liteSaasGatewaySign: sign.sign,
|
||
},
|
||
config.headers
|
||
);
|
||
|
||
_formatRequestData(type, config, data);
|
||
let requestConfig = Object.assign(config, {
|
||
method: type.toLowerCase(),
|
||
url: reqUrl,
|
||
});
|
||
return axios(requestConfig)
|
||
.then((res) => _requestThen(config, res))
|
||
.catch((error) => _requestCatch(config, error));
|
||
|
||
function _requestThen(config, res) {
|
||
return new Promise((resolve, reject) => {
|
||
if (!config.responseType || config.responseType === "json") {
|
||
if (res.data.code === 0 && res.data.subCode === 0) {
|
||
resolve(res.data);
|
||
} else {
|
||
const vegaErrorCode = [
|
||
"330000011",
|
||
"330000012",
|
||
"330000013",
|
||
"330000014",
|
||
"330000015",
|
||
"330000016",
|
||
"330000017",
|
||
"330000018",
|
||
"330000019",
|
||
"331040003", // gtoken not allow empty
|
||
"331040007", // gtoken not existed
|
||
];
|
||
if (
|
||
vegaErrorCode.includes("" + res.data.subCode) ||
|
||
vegaErrorCode.includes("" + res.data.code)
|
||
) {
|
||
console.log("token失效");
|
||
removeToken();
|
||
uni.reLaunch({
|
||
url: "pages/index/index",
|
||
});
|
||
}
|
||
|
||
if (!config.hideErrorMsg) {
|
||
if (res.data.subCode === 331090010) {
|
||
uni.$u.toast("禁止访问");
|
||
} else {
|
||
let messageStr = "系统错误";
|
||
if (res.data.message) {
|
||
messageStr = res.data.message;
|
||
}
|
||
|
||
if (res.data.subMessage) {
|
||
messageStr = res.data.subMessage;
|
||
}
|
||
|
||
uni.$u.toast(messageStr);
|
||
}
|
||
}
|
||
reject(res);
|
||
}
|
||
} else {
|
||
if (res && res.data) {
|
||
resolve(res);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
function _formatRequestData(type, config, data) {
|
||
const isBody = ["PUT", "put", "POST", "post", "PATCH", "patch"];
|
||
let resultData = {};
|
||
|
||
data.hash = Math.random() * 100000000000000;
|
||
|
||
if (isBody.includes(type)) {
|
||
resultData = _trimParams(data) || {};
|
||
|
||
if (
|
||
config.headers &&
|
||
config.headers["Content-Type"] &&
|
||
config.headers["Content-Type"].indexOf(
|
||
"application/x-www-form-urlencoded"
|
||
) > -1
|
||
) {
|
||
resultData = _formatParams(data);
|
||
}
|
||
config.data = resultData;
|
||
} else {
|
||
data = config.params || data;
|
||
config.params = _trimParams(data) || {};
|
||
resultData = config;
|
||
}
|
||
return resultData;
|
||
}
|
||
|
||
function _trimParams(data) {
|
||
if (data.constructor === Object) {
|
||
for (let i in data) {
|
||
if (typeof data[i] === "string") {
|
||
data[i] = data[i].trim();
|
||
}
|
||
}
|
||
}
|
||
|
||
return data;
|
||
}
|
||
|
||
function _formatParams(data) {
|
||
if (data.constructor === Object) {
|
||
const arr = [];
|
||
|
||
for (const i in data) {
|
||
arr.push(encodeURIComponent(i) + "=" + encodeURIComponent(data[i]));
|
||
}
|
||
|
||
data = arr.join("&");
|
||
}
|
||
|
||
return data;
|
||
}
|
||
|
||
function _requestCatch(config, error = {}) {
|
||
return new Promise((resolve, reject) => {
|
||
if (!error.isCancel) {
|
||
if (config.needReject) {
|
||
reject(error);
|
||
} else {
|
||
const res = (error || {}).data || {};
|
||
const messageText = res.code !== 0 ? res.message : res.subMessage;
|
||
this.$refs.uToast.show({
|
||
type: "error",
|
||
message: messageText || "请求失败",
|
||
complete() {
|
||
params.url &&
|
||
uni.navigateTo({
|
||
url: params.url,
|
||
});
|
||
},
|
||
});
|
||
reject(error);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
function _makeApiSign(config) {
|
||
const { reqType, path, product = "", version, key, secret } = config;
|
||
const timestamp = Date.now();
|
||
const stringToSign = `${reqType.toUpperCase()}\n${timestamp}\n/${product}/${version}${path}`;
|
||
const sign = Base64.btoa(
|
||
CryptoJS.HmacSHA1(stringToSign, secret).toString()
|
||
);
|
||
|
||
return {
|
||
key,
|
||
sign,
|
||
timestamp,
|
||
};
|
||
}
|
||
}
|
||
|
||
function _makeApiSign(config) {
|
||
const { reqType, path, product = "", version, key, secret } = config;
|
||
const timestamp = Date.now();
|
||
const stringToSign = `${reqType.toUpperCase()}\n${timestamp}\n/${product}/${version}${path}`;
|
||
const sign = Base64.btoa(CryptoJS.HmacSHA1(stringToSign, secret).toString());
|
||
|
||
return {
|
||
key,
|
||
sign,
|
||
timestamp,
|
||
};
|
||
}
|
||
|
||
async function getFormDataParams() {
|
||
const date = new Date();
|
||
date.setHours(date.getHours() + 1);
|
||
const policyText = {
|
||
expiration: date.toISOString(), // 设置policy过期时间。
|
||
conditions: [
|
||
// 限制上传大小。
|
||
["content-length-range", 0, 1024 * 1024 * 1024],
|
||
],
|
||
};
|
||
const credentials = await axios.get("/getToken");
|
||
const policy = Base64.encode(JSON.stringify(policyText)); // policy必须为base64的string。
|
||
const signature = computeSignature(credentials.AccessKeySecret, policy);
|
||
const formData = {
|
||
OSSAccessKeyId: credentials.AccessKeyId,
|
||
signature,
|
||
policy,
|
||
"x-oss-security-token": credentials.SecurityToken,
|
||
};
|
||
return formData;
|
||
}
|
||
|
||
uni.addInterceptor("uploadFile", {
|
||
invoke(args) {
|
||
// request 触发前拼接 url
|
||
let pathArr = args.url.split("?");
|
||
const pathStr = pathArr[0];
|
||
args.url = baseUrl + uploadProduct + "/" + version + args.url;
|
||
// args.url = "http://127.0.0.1:6902/"+uploadProduct+"/"+version+ args.url
|
||
const sign = _makeApiSign({
|
||
reqType: "post",
|
||
path: pathStr,
|
||
uploadProduct,
|
||
version,
|
||
key: sin_key,
|
||
secret: sin_secret,
|
||
});
|
||
args.header = {
|
||
...args.header,
|
||
"G7lite-Language": "zh_CN",
|
||
g7liteSaasGatewayAppKey: sign.key,
|
||
g7liteSaasGatewayTimestamp: sign.timestamp,
|
||
g7liteSaasGatewaySign: sign.sign,
|
||
G7litegtoken: getToken(),
|
||
};
|
||
},
|
||
success(res) {},
|
||
});
|
||
uni.addInterceptor("request", {
|
||
invoke(args) {
|
||
// request 触发前拼接 url
|
||
let pathArr = args.url.split("?");
|
||
const pathStr = pathArr[0];
|
||
// 如果是附件上传接口,则使用 uploadProduct
|
||
if (pathStr == "/attachment/upload") {
|
||
args.url = baseUrl + uploadProduct + "/" + version + args.url;
|
||
} else if (pathStr.indexOf("/apis.map.qq.co") > -1) {
|
||
args.url = args.url;
|
||
} else {
|
||
args.url = baseUrl + product + "/" + version + args.url;
|
||
}
|
||
//地图API单独处理
|
||
|
||
const sign = _makeApiSign({
|
||
reqType: args.method,
|
||
path: pathStr,
|
||
product,
|
||
version,
|
||
key: sin_key,
|
||
secret: sin_secret,
|
||
});
|
||
args.header = {
|
||
...args.header,
|
||
"G7lite-Language": "zh_CN",
|
||
g7liteSaasGatewayAppKey: sign.key,
|
||
g7liteSaasGatewayTimestamp: sign.timestamp,
|
||
g7liteSaasGatewaySign: sign.sign,
|
||
G7litegtoken: getToken(),
|
||
};
|
||
},
|
||
success(res) {
|
||
res.data = res.data;
|
||
if (
|
||
(res.data.code === 0 && res.data.subCode === 0) ||
|
||
(res.statusCode === 200 && res.data.code === 200) || //获取地图markers接口
|
||
(res.statusCode === 200 && res.data.status === 0) //微信泛解析地址接口
|
||
) {
|
||
return res.data;
|
||
}
|
||
const vegaErrorCode = [
|
||
"330000011",
|
||
"330000012",
|
||
"330000013",
|
||
"330000014",
|
||
"330000015",
|
||
"330000016",
|
||
"330000017",
|
||
"330000018",
|
||
"330000019",
|
||
"331040003", // gtoken not allow empty
|
||
"331040007", // gtoken not existed
|
||
];
|
||
console.log("请求失败", res);
|
||
if (
|
||
vegaErrorCode.includes("" + res.data.subCode) ||
|
||
vegaErrorCode.includes("" + res.data.code)
|
||
) {
|
||
removeToken();
|
||
uni.reLaunch({
|
||
url: "pages/index/index",
|
||
});
|
||
}
|
||
if (res.data.subCode === 331090010) {
|
||
uni.$u.toast("禁止访问");
|
||
} else {
|
||
let messageStr = "系统错误";
|
||
if (res.data.message) {
|
||
messageStr = res.data.message;
|
||
}
|
||
if (res.data.subMessage) {
|
||
messageStr = res.data.subMessage;
|
||
}
|
||
if (res.data.code == 330000013) {
|
||
messageStr = "请登录";
|
||
}
|
||
uni.$u.toast(messageStr);
|
||
}
|
||
},
|
||
fail(err) {
|
||
console.log("interceptor-fail", err);
|
||
if (err.errno == "600001") {
|
||
uni.$u.toast("请求超时");
|
||
} else {
|
||
uni.$u.toast(err.errMsg);
|
||
}
|
||
},
|
||
});
|
||
|
||
export default REQUEST;
|