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