From c9650b0db15d7a3d494bf289898b69cd5810ee64 Mon Sep 17 00:00:00 2001 From: gqt <3217233537@qq.com> Date: Mon, 8 Jun 2026 20:48:01 +0800 Subject: [PATCH] feat: add venue selection shell --- miniprogram/src/pages.json | 27 ++++ miniprogram/src/pages/venue-select/index.vue | 130 +++++++++++++++++++ miniprogram/src/stores/venue.js | 26 ++++ miniprogram/src/utils/venue.js | 55 ++++++++ 4 files changed, 238 insertions(+) create mode 100644 miniprogram/src/pages.json create mode 100644 miniprogram/src/pages/venue-select/index.vue create mode 100644 miniprogram/src/stores/venue.js create mode 100644 miniprogram/src/utils/venue.js diff --git a/miniprogram/src/pages.json b/miniprogram/src/pages.json new file mode 100644 index 0000000..1abfe94 --- /dev/null +++ b/miniprogram/src/pages.json @@ -0,0 +1,27 @@ +{ + "easycom": { + "autoscan": true, + "custom": { + "^u--(.*)": "uview-plus/components/u-$1/u-$1.vue", + "^up-(.*)": "uview-plus/components/u-$1/u-$1.vue", + "^u-([^-].*)": "uview-plus/components/u-$1/u-$1.vue" + } + }, + "pages": [ + { + "path": "pages/venue-select/index", + "style": { + "navigationBarTitleText": "选择场馆", + "navigationBarBackgroundColor": "#FFFFFF", + "navigationBarTextStyle": "black" + } + } + ], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarBackgroundColor": "#FFFFFF", + "backgroundColor": "#F8FAFC", + "backgroundColorBottom": "#F8FAFC", + "backgroundColorTop": "#FFFFFF" + } +} diff --git a/miniprogram/src/pages/venue-select/index.vue b/miniprogram/src/pages/venue-select/index.vue new file mode 100644 index 0000000..1952baa --- /dev/null +++ b/miniprogram/src/pages/venue-select/index.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/miniprogram/src/stores/venue.js b/miniprogram/src/stores/venue.js new file mode 100644 index 0000000..440d52e --- /dev/null +++ b/miniprogram/src/stores/venue.js @@ -0,0 +1,26 @@ +import { defineStore } from 'pinia' +import { getStoredVenue, getVenueOption, navigateToVenueHome, setStoredVenue } from '@/utils/venue' + +export const useVenueStore = defineStore('currentVenue', { + state: () => ({ + currentVenue: '' + }), + getters: { + currentVenueOption: (state) => getVenueOption(state.currentVenue), + hasSelectedVenue: (state) => Boolean(getVenueOption(state.currentVenue)) + }, + actions: { + init() { + this.currentVenue = getStoredVenue() + return this.currentVenue + }, + selectVenue(venueKey) { + this.currentVenue = setStoredVenue(venueKey) + return this.currentVenue + }, + enterVenue(venueKey) { + const selectedVenue = this.selectVenue(venueKey) + navigateToVenueHome(selectedVenue) + } + } +}) diff --git a/miniprogram/src/utils/venue.js b/miniprogram/src/utils/venue.js new file mode 100644 index 0000000..6727b65 --- /dev/null +++ b/miniprogram/src/utils/venue.js @@ -0,0 +1,55 @@ +export const CURRENT_VENUE_KEY = 'CURRENT_VENUE' + +export const VENUE_KEYS = Object.freeze({ + ICE: 'ice', + COMPREHENSIVE: 'comprehensive' +}) + +export const VENUE_OPTIONS = Object.freeze([ + { + key: VENUE_KEYS.ICE, + name: '冰场馆', + description: '课程预约、会员卡与滑冰服务', + homePath: '/pages/ice/home/index' + }, + { + key: VENUE_KEYS.COMPREHENSIVE, + name: '综合场馆', + description: '课程、包场、门票、订单与余额', + homePath: '/pages/comprehensive/home/index' + } +]) + +export const isVenueKey = (value) => { + return value === VENUE_KEYS.ICE || value === VENUE_KEYS.COMPREHENSIVE +} + +export const getVenueOption = (venueKey) => { + return VENUE_OPTIONS.find((item) => item.key === venueKey) || null +} + +export const getStoredVenue = () => { + const venue = uni.getStorageSync(CURRENT_VENUE_KEY) + return isVenueKey(venue) ? venue : '' +} + +export const setStoredVenue = (venueKey) => { + if (!isVenueKey(venueKey)) { + uni.removeStorageSync(CURRENT_VENUE_KEY) + return '' + } + + uni.setStorageSync(CURRENT_VENUE_KEY, venueKey) + return venueKey +} + +export const navigateToVenueHome = (venueKey, options = {}) => { + const venue = getVenueOption(venueKey) + if (!venue) { + uni.reLaunch({ url: '/pages/venue-select/index' }) + return + } + + const navigate = options.redirect === true ? uni.redirectTo : uni.reLaunch + navigate({ url: venue.homePath }) +}