日照项目的居民端小程序
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

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");