diff --git a/.env.local b/.env.local index 9905706..e3a81e1 100644 --- a/.env.local +++ b/.env.local @@ -1,3 +1,3 @@ -VITE_API_BASE_URL=https://dscp-dev.hn12301.net +VITE_API_BASE_URL=https://dscp-uat.hn12301.net VITE_APP_TITLE=湖南12301文旅专区 VITE_USE_MOCK=true diff --git a/src/packages/content/pages/faq.vue b/src/packages/content/pages/faq.vue index 5936961..85d2228 100644 --- a/src/packages/content/pages/faq.vue +++ b/src/packages/content/pages/faq.vue @@ -49,7 +49,7 @@ const loading = ref(true) onMounted(async () => { try { - const data = await post('/mp-api/mpContent/queryList', { channel: 'aspx', type: 'FAQ' }) + const data = await post('/mp-api/mpContent/queryList', { channel: 'pingxiang', type: 'FAQ' }) faqList.value = (data || []).map(n => ({ id: n.id, title: n.title, diff --git a/src/packages/content/pages/notice-list.vue b/src/packages/content/pages/notice-list.vue index 6bf2edb..6ca31ee 100644 --- a/src/packages/content/pages/notice-list.vue +++ b/src/packages/content/pages/notice-list.vue @@ -49,7 +49,7 @@ const notices = ref([]) onMounted(async () => { try { - const data = await post('/mp-api/mpContent/queryList', { channel: 'aspx', type: 'NOTICE' }) + const data = await post('/mp-api/mpContent/queryList', { channel: 'pingxiang', type: 'NOTICE' }) notices.value = (data || []).map(n => ({ id: n.id, title: n.title, diff --git a/src/packages/content/pages/scenic-detail.vue b/src/packages/content/pages/scenic-detail.vue index 7941351..efed6d6 100644 --- a/src/packages/content/pages/scenic-detail.vue +++ b/src/packages/content/pages/scenic-detail.vue @@ -129,11 +129,7 @@ - - {{ item.title }} - - {{ item.content }} - + {{ scenic.introduction }} @@ -156,7 +152,7 @@ interface ScenicDetail { id: number; name: string; price: number; freeCount: number; level: string hours: string; needReservation: boolean; bookingDeadline: string phone: string; address: string; tags: string[]; images: string[] - introduction: string; bookingNotice: NoticeItem[]; cards: CardBenefit[] + introduction: string; bookingNotice: NoticeItem[]; bookingNoticeHtml: string; cards: CardBenefit[] scenicId: number; shopId: number; mainPic: string; status: number } @@ -208,6 +204,7 @@ async function fetchDetail(shopId: string) { images: res.images || (res.mainPic ? [res.mainPic] : []), introduction: res.introduction || '', bookingNotice: res.bookingNotice || [], + bookingNoticeHtml: res.bookingNoticeHtml || '', cards: res.cards || [], scenicId: res.scenicId || res.id || shopId, shopId: res.shopId || shopId, @@ -593,8 +590,7 @@ $icon-crown: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' w align-items: center; justify-content: center; padding: $spacing-3; - margin: 0 $spacing-3; - margin-bottom: $spacing-3; + margin: $spacing-3 $spacing-3; background: $uv-primary-light; border-radius: $radius-full; @@ -702,6 +698,13 @@ $icon-crown: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' w display: block; } +.notice-html { + font-size: $font-size-sm; + color: $uv-tips-color; + line-height: 1.8; + display: block; +} + /* ====== 底部安全区 ====== */ .safe-bottom { height: calc(40rpx + env(safe-area-inset-bottom)); diff --git a/src/packages/content/pages/scenic-list.vue b/src/packages/content/pages/scenic-list.vue index 2fe20ae..bd642d8 100644 --- a/src/packages/content/pages/scenic-list.vue +++ b/src/packages/content/pages/scenic-list.vue @@ -8,7 +8,7 @@ - 全部合作景区 + {{ navTitle }} @@ -44,7 +44,7 @@ {{ selectedLevel || '景区等级' }} - + {{ selectedCardTypeLabel }} @@ -255,6 +255,8 @@ stickyHeaderHeight.value = 100 // ========== URL 参数 ========== const cardNumber = ref('') const cardModelId = ref('') +const fromQrcode = computed(() => !!cardModelId.value) +const navTitle = computed(() => fromQrcode.value ? '旅游卡景区预约' : '全部合作景区') // ========== 分页 ========== const pageNo = ref(1) @@ -761,6 +763,11 @@ function onCardClick(scenic: ScenicItem) { &:active { background: $color-muted; } + + &--disabled { + opacity: 0.5; + pointer-events: none; + } } .dropdown-label { diff --git a/src/packages/content/pages/usage-guide.vue b/src/packages/content/pages/usage-guide.vue index bc7ae7e..a9d8191 100644 --- a/src/packages/content/pages/usage-guide.vue +++ b/src/packages/content/pages/usage-guide.vue @@ -17,7 +17,7 @@ const loading = ref(true) onMounted(async () => { try { - const data = await post('/mp-api/mpContent/queryList', { channel: 'aspx', type: 'GUIDE' }) + const data = await post('/mp-api/mpContent/queryList', { channel: 'pingxiang', type: 'GUIDE' }) if (data && data.length > 0) { imageUrl.value = data[0].imageUrl || '' } diff --git a/src/packages/user/pages/bind.vue b/src/packages/user/pages/bind.vue index 19b6422..1e5d596 100644 --- a/src/packages/user/pages/bind.vue +++ b/src/packages/user/pages/bind.vue @@ -97,7 +97,7 @@ 我已阅读并知晓 - 《用卡须知》 + 《用卡须知》 @@ -117,7 +117,7 @@ - + 选择证件类型 @@ -140,21 +140,6 @@ - - - - - 用卡须知 - - - - - - 1. 年卡仅限本人使用,不得转借他人。\n2. 入园时需出示有效身份证件及年卡二维码。\n3. 年卡有效期内可不限次数游览合作景区。\n4. 部分景区节假日需提前预约,请以景区公告为准。\n5. 年卡一经激活,不予退换。 - - - - + + diff --git a/src/packages/user/pages/reserve/index.vue b/src/packages/user/pages/reserve/index.vue index 2380b1c..b9e9177 100644 --- a/src/packages/user/pages/reserve/index.vue +++ b/src/packages/user/pages/reserve/index.vue @@ -718,7 +718,7 @@ $bar-height: 120rpx; display: flex; align-items: center; justify-content: center; - padding: 0 48rpx; + padding: 20rpx 48rpx; padding-bottom: env(safe-area-inset-bottom); box-shadow: 0 -4rpx 16rpx rgba(0, 0, 0, 0.06); z-index: 100; diff --git a/src/packages/user/pages/reserve/list.vue b/src/packages/user/pages/reserve/list.vue index 3ae1ae7..c93cb39 100644 --- a/src/packages/user/pages/reserve/list.vue +++ b/src/packages/user/pages/reserve/list.vue @@ -94,13 +94,14 @@ - + 入园码 入园时请出示此二维码+本人身份证 + {{ countdown }}秒后自动刷新 @@ -191,7 +192,7 @@ + diff --git a/src/pages/login/login.vue b/src/pages/login/login.vue index b683c62..7b31e9b 100644 --- a/src/pages/login/login.vue +++ b/src/pages/login/login.vue @@ -73,8 +73,15 @@ const userStore = useUserStore() const agreed = ref(false) const loading = ref(false) const showContent = ref(false) +const preLoginCode = ref('') -onMounted(() => { +onMounted(async () => { + try { + const res = await uni.login({ provider: 'weixin' }) + preLoginCode.value = (res as any)?.code || '' + } catch { + // silent — fallback in handleLogin + } setTimeout(() => { showContent.value = true }, 80) @@ -109,17 +116,21 @@ async function handleLogin(e: AnyObject) { return } - const loginRes = await new Promise((resolve, reject) => { - uni.login({ provider: 'weixin', success: resolve, fail: reject }) - }) + let code = preLoginCode.value + if (!code) { + const loginRes = await new Promise((resolve, reject) => { + uni.login({ provider: 'weixin', success: resolve, fail: reject }) + }) + code = loginRes.code || '' + } - if (!loginRes?.code) { + if (!code) { showToast('微信登录失败') return } await userStore.wxLogin({ - code: loginRes.code, + code, encryptedData, iv }) @@ -225,6 +236,11 @@ $icon-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' w .btn-primary--disabled { opacity: 0.6; + background: $uv-primary; +} + +.btn-primary[disabled] { + background: $uv-primary; } .btn-primary:active:not(.btn-primary--disabled) { diff --git a/src/pages/login/privacy.vue b/src/pages/login/privacy.vue index ec9b2ae..891a8d8 100644 --- a/src/pages/login/privacy.vue +++ b/src/pages/login/privacy.vue @@ -1,98 +1,96 @@ + + diff --git a/src/pages/qrcode/index.vue b/src/pages/qrcode/index.vue index f385b3a..3a9c123 100644 --- a/src/pages/qrcode/index.vue +++ b/src/pages/qrcode/index.vue @@ -44,8 +44,8 @@ :current="currentCardIndex" @change="onCardChange" circular - previous-margin="60rpx" - next-margin="60rpx" + previous-margin="120rpx" + next-margin="120rpx" > allowedIds.includes(String(c.cardModelId))) - const firstCard = list[0] + const firstCard = userCards.value[0] if (firstCard?.needFaceImgFlag) { showFaceModal.value = true } @@ -218,9 +219,10 @@ async function refreshNeedFace() { if (!mobile) return try { const list = (await getUserCardList({ mobile, saleChannel: 'xgh' })) || [] - userCards.value = list + const allowedIds = ['820093340659013', '820093438328133'] + userCards.value = list.filter((c: any) => allowedIds.includes(String(c.cardModelId))) - const current = list[currentCardIndex.value] + const current = userCards.value[currentCardIndex.value] if (current) { fetchUserInfo(current) if (current.needFaceImgFlag) { @@ -290,7 +292,7 @@ function goLogin() { } function goBuyCard() { - uni.navigateTo({ url: '/packages/user/pages/card/list' }) + uni.navigateTo({ url: '/packages/user/pages/buy' }) } function copyCardNo() { diff --git a/src/static/logo.png b/src/static/logo.png index ceb468a..d8f0f2b 100644 Binary files a/src/static/logo.png and b/src/static/logo.png differ