| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 | 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,};
 |