/** 与 pages.json 保持一致 */ export const PAGE = { INDEX: '/pages/index/index', COURSE: '/pages/groupCourse/list', TRAIN: '/pages/train/index', DISCOVER: '/pages/discover/index', MEMBER: '/pages/memberInfo/memberInfo', BOOKING: '/pages/memberInfo/booking', MEMBER_CARD: '/pages/memberInfo/memberCard', USER_INFO: '/pages/memberInfo/userInfo', BODY_TEST_HOME: '/pages/memberInfo/bodyTestHome', BODY_TEST_CONNECT: '/pages/memberInfo/bodyTestConnect', BODY_TEST_MEASURING: '/pages/memberInfo/bodyTestMeasuring', BODY_TEST_REPORT: '/pages/memberInfo/bodyTestReport', BODY_TEST_HISTORY: '/pages/memberInfo/bodyTestHistory', BODY_TEST_COMPARE: '/pages/memberInfo/bodyTestCompare', BODY_TEST_SETTINGS: '/pages/memberInfo/bodyTestSettings', BODY_TEST_TREND: '/pages/memberInfo/bodyTestTrend', COURSE_LIST: '/pages/groupCourse/list', COURSE_DETAIL: '/pages/memberInfo/courseDetail', COUPON_DETAIL: '/pages/memberInfo/couponDetail', COUPON_CENTER: '/pages/memberInfo/couponCenter', POINTS_MALL: '/pages/memberInfo/pointsMall', POINTS_HISTORY: '/pages/memberInfo/pointsHistory', ONLINE_COURSE: '/pages/memberInfo/onlineCourseDetail', COURSE_EVALUATE: '/pages/memberInfo/courseEvaluate', TRAIN_SESSION: '/pages/memberInfo/trainSessionDetail', TRAIN_REPORT: '/pages/memberInfo/trainReport', COUPONS: '/pages/memberInfo/coupons', POINTS: '/pages/memberInfo/points', REFERRAL: '/pages/memberInfo/referral', MY_COURSES: '/pages/memberInfo/myCourses', CHECK_IN_HISTORY: '/pages/memberInfo/checkInHistory' } /** 底部 TabBar 页面路径,顺序与 TabBar.vue 一致 */ export const TAB_ROUTES = [ PAGE.INDEX, PAGE.COURSE, PAGE.TRAIN, PAGE.DISCOVER, PAGE.MEMBER ] const TAB_PAGES = new Set(TAB_ROUTES) /** 防止 Tab 连点触发并发路由 */ let tabNavigating = false function normalizePath(url) { if (!url) return '' const path = url.split('?')[0] return path.startsWith('/') ? path : `/${path}` } export function getTabIndexByRoute(route) { const path = normalizePath(route) const idx = TAB_ROUTES.indexOf(path) return idx >= 0 ? idx : 0 } export function getCurrentRoutePath() { const pages = getCurrentPages() if (!pages.length) return PAGE.INDEX const page = pages[pages.length - 1] const route = page.route || page.$page?.fullPath || '' return normalizePath(route ? `/${route}` : PAGE.INDEX) } export function navigateToPage(url) { const path = normalizePath(url) if (TAB_PAGES.has(path)) { switchToTab(path) return } uni.navigateTo({ url, fail: (err) => { console.error('[navigateTo]', url, err) uni.showToast({ title: '页面跳转失败', icon: 'none' }) } }) } export function switchToTab(url) { const path = normalizePath(url) if (getCurrentRoutePath() === path || tabNavigating) return tabNavigating = true uni.reLaunch({ url: path, complete: () => { setTimeout(() => { tabNavigating = false }, 320) }, fail: (err) => { console.error('[reLaunch]', path, err) tabNavigating = false uni.showToast({ title: '页面跳转失败', icon: 'none' }) } }) } export function goToMemberCenter() { switchToTab(PAGE.MEMBER) } export function goBackOrTab(fallbackUrl = PAGE.MEMBER) { uni.navigateBack({ delta: 1, fail: () => switchToTab(fallbackUrl) }) } /** 子页面返回:统一回到 tab 页「个人中心」 */ export function backToMemberCenter() { switchToTab(PAGE.MEMBER) }