import $store from "@/peach/store"; import { showShareModal } from "@/peach/hooks/useModal"; import { isNumber, isString, isEmpty, startsWith, isObject, isNil, clone, } from "lodash"; import throttle from "@/peach/helper/throttle"; const _go = ( path, params = {}, options = { redirect: false, } ) => { let page = ""; // 跳转页面 let query = ""; // 页面参数 let url = ""; // 跳转页面完整路径 if (isString(path)) { // 判断跳转类型是 path | 还是http if (startsWith(path, "http")) { // #ifdef H5 window.location = path; return; // #endif // #ifndef H5 page = `/pages/public/webview`; query = `url=${encodeURIComponent(path)}`; // #endif } else if (startsWith(path, "action:")) { handleAction(path); return; } else { [page, query] = path.split("?"); } if (!isEmpty(params)) { let query2 = paramsToQuery(params); if (isEmpty(query)) { query = query2; } else { query += "&" + query2; } } } if (isObject(path)) { page = path.url; if (!isNil(path.params)) { query = paramsToQuery(path.params); } } const nextRoute = ROUTES_MAP[page]; // 未找到指定跳转页面 // mark: 跳转404页 if (!nextRoute) { console.log( `%c跳转路径参数错误<${page || "EMPTY"}>`, "color:red;background:yellow" ); return; } // 页面登录拦截 if (nextRoute.meta?.auth && !$store("user").isLogin) { uni.redirectTo({ url: "/pages/index/login", }); return; } url = page; if (!isEmpty(query)) { url += `?${query}`; } // 跳转底部导航 if (TABBAR.includes(page)) { uni.switchTab({ url, }); return; } // 使用redirect跳转 if (options.redirect) { uni.redirectTo({ url, }); return; } uni.navigateTo({ url, }); }; // 限流 防止重复点击跳转 function go(...args) { throttle(() => { _go(...args); }); } function paramsToQuery(params) { if (isEmpty(params)) { return ""; } // return new URLSearchParams(Object.entries(params)).toString(); let query = []; for (let key in params) { query.push(key + "=" + params[key]); } return query.join("&"); } function back() { // #ifdef H5 history.back(); // #endif // #ifndef H5 uni.navigateBack(); // #endif } function redirect(path, params = {}) { go(path, params, { redirect: true, }); } // 检测是否有浏览器历史 function hasHistory() { // #ifndef H5 const pages = getCurrentPages(); if (pages.length > 1) { return true; } return false; // #endif // #ifdef H5 return !!history.back; // #endif } function getCurrentRoute(field = "") { let currentPage = getCurrentPage(); // #ifdef MP currentPage.$page["route"] = currentPage.route; currentPage.$page["options"] = currentPage.options; // #endif if (field !== "") { return currentPage.$page[field]; } else { return currentPage.$page; } } function getCurrentPage() { let pages = getCurrentPages(); return pages[pages.length - 1]; } function handleAction(path) { const action = path.split(":"); switch (action[1]) { case "showShareModal": showShareModal(); break; } } function error(errCode, errMsg = "") { redirect("/pages/public/error", { errCode, errMsg, }); } export default { go, back, hasHistory, redirect, getCurrentPage, getCurrentRoute, error, };