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.
		
		
		
		
		
			
		
			
				
					
					
						
							185 lines
						
					
					
						
							3.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							185 lines
						
					
					
						
							3.4 KiB
						
					
					
				
								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,
							 | 
						|
								};
							 |