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.
267 lines
7.1 KiB
267 lines
7.1 KiB
import { config } from "@config/config";
|
|
import words from "@config/words";
|
|
import { nextTick } from "@utils/tools";
|
|
|
|
// 注意:curry化后的函数调用时必须补全参数,即便为空,否则返回的还是函数
|
|
|
|
// mock测试接口前缀
|
|
const apiMockUrl =
|
|
"https://nei.netease.com/api/apimock-v2/e3b1d0eb88e905f6c7ee559b2d6bb7ad/";
|
|
|
|
const promiseWxApi = (api: string, params: object) => {
|
|
return new Promise((reslove, reject) => {
|
|
if (typeof wx[api] === "function") {
|
|
wx[api]({
|
|
...params,
|
|
success(res) {
|
|
reslove({
|
|
msg: "success",
|
|
data: res,
|
|
});
|
|
},
|
|
fail(err) {
|
|
reslove({
|
|
msg: err.errMsg,
|
|
data: "",
|
|
});
|
|
},
|
|
});
|
|
} else {
|
|
reject({
|
|
msg: "非有效api接口",
|
|
data: "",
|
|
});
|
|
}
|
|
});
|
|
};
|
|
|
|
// 其实就是一层柯里化,但第二参数可以不写
|
|
const createWxApi = (api: string) => {
|
|
return (params = {}) => promiseWxApi(api, params);
|
|
};
|
|
|
|
export default createWxApi;
|
|
|
|
export const wxLogin = createWxApi("login");
|
|
export const wxShowModal = createWxApi("showModal");
|
|
export const wxShowToast = createWxApi("showToast");
|
|
export const wxChooseImage = createWxApi("chooseImage");
|
|
export const wxGetSetting = createWxApi("getSetting");
|
|
export const wxGetUserInfo = createWxApi("getUserInfo");
|
|
export const wxGetUserProfile = createWxApi("getUserProfile");
|
|
export const wxShowActionSheet = createWxApi("showActionSheet");
|
|
export const wxGetLocation = createWxApi("getLocation");
|
|
export const wxScanCode = createWxApi("scanCode");
|
|
export const wxChooseMessageFile = createWxApi("chooseMessageFile");
|
|
export const wxOpenDocument = createWxApi("openDocument");
|
|
export const wxChooseVideo = createWxApi("chooseVideo");
|
|
export const wxChooseMedia = createWxApi("chooseMedia");
|
|
export const wxPreviewMedia = createWxApi("previewMedia");
|
|
export const wxPreviewImage = createWxApi("previewImage");
|
|
export const wxDownloadFile = createWxApi("downloadFile");
|
|
export const wxOpenSetting = createWxApi("openSetting");
|
|
|
|
export const wxStartLocationUpdateBackground = createWxApi(
|
|
"startLocationUpdateBackground"
|
|
);
|
|
export const wxStartLocationUpdate = createWxApi("startLocationUpdate");
|
|
export const wxStopLocationUpdate = createWxApi("stopLocationUpdate");
|
|
export const wxAuthorize = createWxApi("authorize");
|
|
|
|
/**
|
|
* 上传文件
|
|
* @param url
|
|
* @param filePath
|
|
* @param name
|
|
* @param type
|
|
*/
|
|
export const wxUploadFile = async (
|
|
url,
|
|
filePath,
|
|
elseParams = {},
|
|
formDataParams = {}
|
|
) => {
|
|
const isMock =
|
|
typeof elseParams.isMock !== "undefined" ? elseParams.isMock : false;
|
|
const name =
|
|
typeof elseParams.name !== "undefined" ? elseParams.name : "file";
|
|
const type =
|
|
typeof elseParams.type !== "undefined" ? elseParams.type : "file";
|
|
const urlPremix =
|
|
url.indexOf("://") !== -1 ? "" : isMock ? apiMockUrl : config.apiUrl;
|
|
|
|
const ret = await promiseWxApi("uploadFile", {
|
|
url: urlPremix + url,
|
|
filePath,
|
|
name,
|
|
formData: {
|
|
type,
|
|
name,
|
|
...formDataParams,
|
|
},
|
|
// 不合理啊,上传文件还得设置这个东西
|
|
header: {
|
|
"content-type": "multipart/form-data",
|
|
Authorization: getApp().globalData.token,
|
|
},
|
|
});
|
|
|
|
// json化返回数据
|
|
if (ret.msg === "success") {
|
|
try {
|
|
ret.data.data = JSON.parse(ret.data.data);
|
|
console.log("上传成功", ret.data.data);
|
|
} catch (err) {
|
|
console.log("上传返回数据解析json失败", err, ret.data);
|
|
}
|
|
}
|
|
return ret;
|
|
};
|
|
|
|
export const wxRequest = async (
|
|
method,
|
|
url: string,
|
|
data = {},
|
|
elseParams = {}
|
|
) => {
|
|
const isMock =
|
|
typeof elseParams.isMock !== "undefined" ? elseParams.isMock : false;
|
|
const isQuiet =
|
|
typeof elseParams.isQuiet !== "undefined" ? elseParams.isQuiet : false;
|
|
const header =
|
|
typeof elseParams.header !== "undefined" ? elseParams.header : "file";
|
|
const extraCodes =
|
|
typeof elseParams.extraCodes !== "undefined"
|
|
? elseParams.extraCodes
|
|
: [];
|
|
const urlPremix =
|
|
url.indexOf("://") !== -1 ? "" : isMock ? apiMockUrl : config.apiUrl;
|
|
console.log("config.apiUrl", config.apiUrl);
|
|
const ret = await promiseWxApi("request", {
|
|
url: urlPremix + url,
|
|
method,
|
|
data,
|
|
header: {
|
|
...header,
|
|
Authorization: getApp().globalData.token,
|
|
},
|
|
dataType: "json",
|
|
});
|
|
|
|
console.log(url, ret);
|
|
if (ret.msg !== "success") {
|
|
ret.data = {
|
|
data: {
|
|
code: -1,
|
|
msg: words.common.networkError,
|
|
},
|
|
};
|
|
}
|
|
|
|
if (!isQuiet) {
|
|
// 下一次循环执行,规避hideLoading关闭toast问题
|
|
setTimeout(async () => {
|
|
if (ret.msg !== "success") {
|
|
wx.showToast({
|
|
title: words.common.networkError,
|
|
icon: "none",
|
|
duration: 1500,
|
|
});
|
|
} else {
|
|
const {
|
|
data: {
|
|
data: { code, msg },
|
|
},
|
|
} = ret;
|
|
if (extraCodes.indexOf(code) !== -1) {
|
|
console.log("特殊码,不做常规提示处理");
|
|
} else if (code == 10005 || code == 10006 || code == 10007) {
|
|
// 10005 token为空 10006登陆超时 10007别处登录
|
|
console.log("登录失效");
|
|
getApp().toGuidePageAfterHint();
|
|
} else if (code == 10086) {
|
|
wx.showModal({
|
|
title: "提示",
|
|
content: msg,
|
|
success(res) {
|
|
if (res.confirm) {
|
|
wx.reLaunch({
|
|
url: "/pages/main/index",
|
|
});
|
|
} else if (res.cancel) {
|
|
console.log("用户点击取消");
|
|
}
|
|
},
|
|
});
|
|
} else if (code < 10000 && code >= 8000) {
|
|
wx.showToast({
|
|
title: msg,
|
|
icon: "none",
|
|
duration: 3000,
|
|
});
|
|
} else if (code != 0) {
|
|
wx.showToast({
|
|
title: words.common.requestFail,
|
|
icon: "none",
|
|
duration: 1500,
|
|
});
|
|
}
|
|
}
|
|
}, 100);
|
|
}
|
|
// 置换图片前缀
|
|
if (ret.data.data.data) {
|
|
let str = JSON.stringify(ret.data.data.data);
|
|
|
|
ret.data.data.data = JSON.parse(
|
|
str.replaceAll(
|
|
"http://172.20.46.177/oss/",
|
|
"https://www.yantai1s.com/oss/"
|
|
)
|
|
);
|
|
}
|
|
return ret;
|
|
};
|
|
|
|
export const wxRequestGet = (url: string, data = {}, elseParams = {}) =>
|
|
wxRequest("get", url, data, elseParams);
|
|
|
|
export const wxRequestPost = (url: string, data = {}, elseParams = {}) =>
|
|
wxRequest("post", url, data, elseParams);
|
|
|
|
export const wxRouter = (api: string) => {
|
|
return (uri: string, params = {}) => {
|
|
let url = uri;
|
|
let paramsStr = Object.keys(params)
|
|
.map((k) => k + "=" + params[k])
|
|
.join("&");
|
|
if (paramsStr !== "") {
|
|
url += "?" + paramsStr;
|
|
}
|
|
let trueApi = api;
|
|
// 如果当前层级超过10,不跳转直接切换
|
|
if (trueApi == "navigateTo" && getCurrentPages().length >= 8) {
|
|
trueApi = "redirectTo";
|
|
}
|
|
|
|
const pages = getCurrentPages();
|
|
let index = pages.findIndex(
|
|
(item) =>
|
|
uri.startsWith("/") &&
|
|
"/" + item.route == uri &&
|
|
JSON.stringify(item.options) == JSON.stringify(params)
|
|
);
|
|
if (index !== -1 && index + 1 != pages.length) {
|
|
return wx.navigateBack({
|
|
delta: pages.length - index - 1,
|
|
});
|
|
} else {
|
|
return createWxApi(trueApi)({
|
|
url,
|
|
});
|
|
}
|
|
};
|
|
};
|
|
|
|
export const wxRedirectTo = wxRouter("redirectTo");
|
|
export const wxNavigateTo = wxRouter("navigateTo");
|
|
|