From 64ac69db93e2f1928fd00bda3807a27e632604c0 Mon Sep 17 00:00:00 2001 From: jacobxu666 Date: Fri, 4 Sep 2026 11:42:21 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E7=A7=BB=E9=99=A4=E9=A2=84?= =?UTF-8?q?=E7=BA=A6=E8=AE=B0=E5=BD=95/=E8=AF=A6=E6=83=85=E9=A1=B5?= =?UTF-8?q?=E9=98=B2=E6=88=AA=E5=B1=8F=E9=99=90=E5=88=B6=EF=BC=8C=E9=A2=84?= =?UTF-8?q?=E7=BA=A6=E6=97=A5=E6=9C=9F=E6=9D=A1=E6=94=AF=E6=8C=81=E7=BD=AE?= =?UTF-8?q?=E7=81=B0=E6=98=BE=E7=A4=BA=E5=B7=B2=E8=BF=87=E9=A2=84=E7=BA=A6?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- src/packages/user/pages/reserve/index.vue | 8 ++++++-- src/packages/user/pages/reserve/list.vue | 12 ------------ src/packages/user/pages/reserve/success.vue | 12 ------------ 3 files changed, 6 insertions(+), 26 deletions(-) diff --git a/src/packages/user/pages/reserve/index.vue b/src/packages/user/pages/reserve/index.vue index cfbd5f5..a74b16c 100644 --- a/src/packages/user/pages/reserve/index.vue +++ b/src/packages/user/pages/reserve/index.vue @@ -32,7 +32,7 @@ > {{ d.week }} {{ d.label }} - 不可约 + {{ d.expired ? '已过预约时间' : '不可约' }} 无限库存 可预约 余{{ d.stock }}位 @@ -155,6 +155,8 @@ interface DateOption { cards: CardOption[] disabled?: boolean reason?: string + // xuchao: 已过预约截止时间(后端置灰补显的日期,不可点) + expired?: boolean } const scenic = ref({ name: '', address: '', hours: '', image: '' }) @@ -269,7 +271,8 @@ onLoad(async (query: any) => { userIdCard.value = res.userIdCard || '' bookingNotice.value = Array.isArray(res.bookingNotice) ? res.bookingNotice.map((n: any) => (typeof n === 'string' ? n : n?.content || n?.text || '')).join('
') : (res.bookingNotice || '') cardModelName.value = res.cardModelName || '' - appointmentDays.value = (res.dates || []).length + // xuchao: 近N日提示不含过截止置灰补显的日期 + appointmentDays.value = (res.dates || []).filter((d: any) => !d.expired).length reserveParams.value = { scenicId: parseInt(resourceId), channel: 'Channel_SZH', @@ -287,6 +290,7 @@ onLoad(async (query: any) => { cards: d.cards || [], disabled: d.disabled, reason: d.reason, + expired: d.expired, })) const firstAvailable = dateOptions.value.find(d => d.stock == null || d.stock > 0) if (firstAvailable) selectedDate.value = firstAvailable.key diff --git a/src/packages/user/pages/reserve/list.vue b/src/packages/user/pages/reserve/list.vue index 0a82036..e9cbf82 100644 --- a/src/packages/user/pages/reserve/list.vue +++ b/src/packages/user/pages/reserve/list.vue @@ -244,9 +244,6 @@ let countdownTimer: ReturnType | null = null onUnmounted(() => { clearTimer() - // #ifdef MP-WEIXIN - wx.offUserCaptureScreen() - // #endif }) const records = ref([]) @@ -308,15 +305,6 @@ async function fetchRecords(append = false) { } onLoad(() => { - // #ifdef MP-WEIXIN - wx.setVisualEffectOnCapture({ visualEffect: 'hidden' }) - wx.onUserCaptureScreen(() => { - uni.showToast({ title: '该页面截图无效,请不要截图', icon: 'none' }) - if (currentRecord.value) { - fetchCode(currentRecord.value) - } - }) - // #endif fetchRecords() }) diff --git a/src/packages/user/pages/reserve/success.vue b/src/packages/user/pages/reserve/success.vue index eb026d9..5b80929 100644 --- a/src/packages/user/pages/reserve/success.vue +++ b/src/packages/user/pages/reserve/success.vue @@ -106,21 +106,9 @@ let countdownTimer: ReturnType | null = null onUnmounted(() => { clearTimer() - // #ifdef MP-WEIXIN - wx.offUserCaptureScreen() - // #endif }) onLoad(async (query: any) => { - // #ifdef MP-WEIXIN - wx.setVisualEffectOnCapture({ visualEffect: 'hidden' }) - wx.onUserCaptureScreen(() => { - uni.showToast({ title: '该页面截图无效,请不要截图', icon: 'none' }) - if (codePopup.value) { - fetchCode() - } - }) - // #endif const appointId = query?.appointId if (!appointId) return const phone = (uni.getStorageSync('phone') as string) || '' From e1801f1026dfbb496116f3c6b10d6e11ea14aab2 Mon Sep 17 00:00:00 2001 From: jacobxu666 Date: Fri, 4 Sep 2026 16:00:00 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=E4=B8=BB=E5=8C=85=E5=AD=A4=E5=84=BF?= =?UTF-8?q?=E6=96=87=E4=BB=B6=20api/order.ts=20=E8=BF=81=E5=85=A5=E5=88=86?= =?UTF-8?q?=E5=8C=85=EF=BC=88pingxiang-order=EF=BC=89=EF=BC=8C=E6=B6=88?= =?UTF-8?q?=E9=99=A4=E7=9C=9F=E6=9C=BA=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= =?UTF-8?q?=E5=91=8A=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- src/api/order.ts | 11 ----------- src/packages/user/api/pingxiang-order.ts | 13 +++++++++++++ src/packages/user/pages/buy.vue | 2 +- 3 files changed, 14 insertions(+), 12 deletions(-) delete mode 100644 src/api/order.ts create mode 100644 src/packages/user/api/pingxiang-order.ts diff --git a/src/api/order.ts b/src/api/order.ts deleted file mode 100644 index cda5d76..0000000 --- a/src/api/order.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { post } from './request' -import { BASE_URL } from '../config' -import type { CreateOrderParams, CreateOrderResult, PrepayParams, PrepayResult } from './types' - -export function createOrder(params: CreateOrderParams) { - return post(`${BASE_URL}/open-api/pingXiang/createOrder`, params) -} - -export function prepay(params: PrepayParams) { - return post(`${BASE_URL}/open-api/pingXiang/prepay`, params) -} diff --git a/src/packages/user/api/pingxiang-order.ts b/src/packages/user/api/pingxiang-order.ts new file mode 100644 index 0000000..fc6108a --- /dev/null +++ b/src/packages/user/api/pingxiang-order.ts @@ -0,0 +1,13 @@ +// xuchao: 萍乡超级玩家卡下单/预支付接口(open-api 渠道)。原为主包 api/order.ts, +// 因仅被本分包页面引用导致主包整包扫描告警,迁入分包;与本地 order.ts(/order/* 旧接口)不是同一组接口,勿混用。 +import { post } from '../../../api/request' +import { BASE_URL } from '../../../config' +import type { CreateOrderParams, CreateOrderResult, PrepayParams, PrepayResult } from '../../../api/types' + +export function createOrder(params: CreateOrderParams) { + return post(`${BASE_URL}/open-api/pingXiang/createOrder`, params) +} + +export function prepay(params: PrepayParams) { + return post(`${BASE_URL}/open-api/pingXiang/prepay`, params) +} diff --git a/src/packages/user/pages/buy.vue b/src/packages/user/pages/buy.vue index 44f6042..e56f2bf 100644 --- a/src/packages/user/pages/buy.vue +++ b/src/packages/user/pages/buy.vue @@ -50,7 +50,7 @@ import { onLoad, onShareAppMessage, onShareTimeline } from '@dcloudio/uni-app' import { post, getToken } from '../../../api/request' import { BASE_URL } from '../../../config' import { useUserStore } from '../../../store/user' -import { createOrder, prepay } from '../../../api/order' +import { createOrder, prepay } from '../api/pingxiang-order' import type { BannerItem } from '../../../api/types' const userStore = useUserStore() From 6cef231473609e66ef3ab2760b73dfdc461ae378 Mon Sep 17 00:00:00 2001 From: jacobxu666 Date: Fri, 4 Sep 2026 16:17:44 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E6=99=AF=E5=8C=BA=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E5=85=AC=E5=91=8A=E5=BC=B9=E7=AA=97=E5=86=85=E5=AE=B9=E4=BF=9D?= =?UTF-8?q?=E7=95=99=E6=8D=A2=E8=A1=8C=E6=A0=BC=E5=BC=8F=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=EF=BC=8C=E6=AD=A3=E6=96=87=E5=9B=BA=E5=AE=9A=E9=AB=98=E5=BA=A6?= =?UTF-8?q?45vh=E5=8F=AF=E6=BB=91=E5=8A=A8=E4=B8=8D=E8=A2=AB=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E9=81=AE=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/packages/content/pages/scenic-detail.vue | 25 +++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/packages/content/pages/scenic-detail.vue b/src/packages/content/pages/scenic-detail.vue index ab58a58..e3687a5 100644 --- a/src/packages/content/pages/scenic-detail.vue +++ b/src/packages/content/pages/scenic-detail.vue @@ -193,7 +193,25 @@ function fixRichHtml(html: string): string { const introductionHtml = computed(() => fixRichHtml(scenic.value.introduction)) const bookingNoticeHtml = computed(() => fixRichHtml(scenic.value.bookingNoticeHtml)) -const storeNoticeHtml = computed(() => fixRichHtml(storeNotice.value.content)) + +/** 富文本标签特征(管理端公告内容为 textarea 纯文本,含标签才视为 HTML) */ +// xuchao: 判断公告正文是否为编辑器产出的 HTML +const HTML_TAG_RE = /<(?:p|br|div|span|strong|em|i|b|u|h[1-6]|img|ul|ol|li|a|table|tr|td|video|section)[^>]*>/i + +// xuchao: 纯文本转 rich-text 可渲染的 HTML:转义特殊字符 + 换行转
,保留后台录入的段落格式 +function plainTextToHtml(text: string): string { + return text + .replace(/&(?!(?:#\d+|#x[0-9a-fA-F]+|[a-zA-Z][a-zA-Z0-9]*);)/g, '&') + .replace(//g, '>') + .replace(/\n/g, '
') +} + +const storeNoticeHtml = computed(() => { + const content = storeNotice.value.content + if (!content) return '' + return HTML_TAG_RE.test(content) ? fixRichHtml(content) : plainTextToHtml(content) +}) const activeTab = ref<'notice' | 'intro'>('notice') const currentSlide = ref(0) @@ -862,13 +880,14 @@ $icon-crown: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' w text-align: center; } +/* xuchao: 正文区固定 45vh 高度——微信要求 scroll-view 有确定高度才能竖向滚动;flex-shrink:0 防止被弹窗整体高度压缩 */ .notice-popup-body { + height: 45vh; + flex-shrink: 0; padding: $spacing-3 $spacing-5 $spacing-3; font-size: $font-size-sm; color: $uv-tips-color; line-height: 1.9; - max-height: 45vh; - overflow-y: auto; } .notice-popup-footer {