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