import $store from '@/sheep/store'; import { showAuthModal, showShareModal } from '@/sheep/hooks/useModal'; import { isNumber, isString, isEmpty, startsWith, isObject, isNil, clone } from 'lodash-es'; import throttle from '@/sheep/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) { showAuthModal(); 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.state.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, };