193 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
| import $store from '@/sheep/store';
 | ||
| import { showAuthModal, showShareModal } from '@/sheep/hooks/useModal';
 | ||
| import { isNumber, isString, isEmpty, startsWith, isObject, isNil, clone } from 'lodash';
 | ||
| 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 getCur() {
 | ||
|   let a = getCurrentPages();
 | ||
|   let pages = clone(a);
 | ||
|   return pages;
 | ||
| }
 | ||
| 
 | ||
| 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,
 | ||
|   getCur,
 | ||
|   error,
 | ||
| };
 |