Files
gym-manage/gym-manage-uniapp/common/constants/routes.js
T
2026-06-04 16:47:31 +08:00

120 lines
3.6 KiB
JavaScript

/** 与 pages.json 保持一致 */
export const PAGE = {
INDEX: '/pages/index/index',
COURSE: '/pages/course/index',
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)
}