diff --git a/src/pages-service/tickets/components/ProductDetail.vue b/src/pages-service/tickets/components/ProductDetail.vue
index 6f6a3be..c5e9944 100644
--- a/src/pages-service/tickets/components/ProductDetail.vue
+++ b/src/pages-service/tickets/components/ProductDetail.vue
@@ -1,28 +1,40 @@
-
-
-
+
-
+
+
+ 1 / {{ productImages.length }}
+
-
- {{ product.shortTitle }}
- {{ product.name }}
-
- {{ highlight }}
+
+
+
+
+
+
+ {{ highlight }}
+ 尚未配置销售标签
-
- 已售 {{ product.sold || 0 }}
-
- ¥{{ product.marketPrice }}
- ¥{{ product.salePrice }}
-
+ {{ product.name }}
+ {{ product.description || product.shortTitle || '暂无商品简介' }}
+
+ 年龄限制:{{ ageRuleText }}
+ 下单时仅对门票游客按使用日和身份证校验。
+
+
+ 免费预约
+
+ ¥
+ {{ product.salePrice }}
+
+
@@ -43,13 +55,23 @@
{{ product.detail || product.description || '暂无商品详情' }}
-
+
购买须知
{{ product.purchaseNotice || '请以实际预约规则为准。' }}
+
+
+ 使用说明
+ {{ product.useRule || '请按预约日期和场次使用,具体以出票凭证及现场指引为准。' }}
+
+
+
+ 退款说明
+ {{ product.refundRule || '未使用且符合商品退改规则时可申请退款,最终结果以订单审核为准。' }}
+
-
+
优惠价
@@ -64,11 +86,19 @@
diff --git a/src/pages-service/tickets/data.js b/src/pages-service/tickets/data.js
index 57d613a..d6bc919 100644
--- a/src/pages-service/tickets/data.js
+++ b/src/pages-service/tickets/data.js
@@ -80,6 +80,8 @@ const createProduct = ({
excluded,
detail,
purchaseNotice,
+ useRule = '请按预约日期和场次使用;实名商品需携带下单时填写的有效证件,具体核验方式以出票凭证及现场指引为准。',
+ refundRule = '未使用且符合商品退改规则时可申请退款;已使用、已过有效期或超过退改时间的权益不可退款,审核结果以订单页面为准。',
reservation,
entitlements,
status = 'on_sale',
@@ -102,6 +104,8 @@ const createProduct = ({
excluded: [...excluded],
detail,
purchaseNotice,
+ useRule,
+ refundRule,
images: [PLACEHOLDER_IMAGE],
reservation: createReservation(reservation),
entitlements: entitlements.map((entitlement) => ({ ...entitlement })),
@@ -142,7 +146,7 @@ export const PRODUCTS = [
}),
createProduct({
id: 'classic', name: '小七孔经典畅游套餐', shortTitle: '门票 + 观光车 + 鸳鸯湖游船(成人套餐)', category: '组合套餐', description: '门票 + 观光车 + 鸳鸯湖游船,一次购买,两类凭证独立履约。', salePrice: 188, marketPrice: 210, stock: 480, sold: 184,
- highlights: ['官方', '实名预约', '整包退', '双凭证'], included: ['成人门票 1 张、观光车票 1 张、鸳鸯湖游船 1 次。'], excluded: ['不含景区保险、餐饮及套餐外个人消费。'], detail: '一个订单包含两类凭证:第三方票务凭证包含景区门票和观光车票;自营权益码包含鸳鸯湖游船,由工作人员扫码核销。', purchaseNotice: '套餐统一选择使用日期和入园时段。全部权益未使用可整单全额退;任一权益使用后整单不可退,不支持拆项退款。',
+ highlights: ['官方', '实名预约', '整包退', '双凭证'], included: ['成人门票 1 张、观光车票 1 张、鸳鸯湖游船 1 次。'], excluded: ['不含景区保险、餐饮及套餐外个人消费。'], detail: '一个订单包含两类凭证:第三方票务凭证包含景区门票和观光车票;自营权益码包含鸳鸯湖游船,由工作人员扫码核销。', purchaseNotice: '套餐统一选择使用日期和入园时段。全部权益未使用可整单全额退;任一权益使用后整单不可退,不支持拆项退款。', refundRule: '套餐内全部权益均未使用时支持整单全额退款;任一权益使用后整单不可退款,不支持拆项退款。',
reservation: { advanceDays: 30 }, entitlements: [ticketEntitlement('classic-ticket', '小七孔成人门票', 'third_party', 120), ticketEntitlement('classic-shuttle', '观光车票', 'third_party', 40), ticketEntitlement('classic-boat', '鸳鸯湖游船', 'self', 28, '次')],
}),
createProduct({
diff --git a/src/pages-service/tickets/index.vue b/src/pages-service/tickets/index.vue
index e63852a..7240d02 100644
--- a/src/pages-service/tickets/index.vue
+++ b/src/pages-service/tickets/index.vue
@@ -1,7 +1,6 @@
-
diff --git a/src/pages-service/tickets/view-contract.test.mjs b/src/pages-service/tickets/view-contract.test.mjs
index a9788ac..fd02aa2 100644
--- a/src/pages-service/tickets/view-contract.test.mjs
+++ b/src/pages-service/tickets/view-contract.test.mjs
@@ -6,6 +6,7 @@ const ticketRoot = new URL("./", import.meta.url);
const readTicketFile = (path) => readFile(new URL(path, ticketRoot), "utf8");
const pageNames = [
+ "product-detail",
"booking",
"travelers",
"orders",
@@ -62,6 +63,31 @@ test("storefront synchronizes the left category from right-column scrolling", as
assert.match(source, /TopNavBar/);
});
+test("product detail is an independent prototype-aligned page", async () => {
+ const indexPage = await readTicketFile("index.vue");
+ const detailPage = await readTicketFile("product-detail.vue");
+ const component = await readTicketFile("components/ProductDetail.vue");
+ const data = await readTicketFile("data.js");
+
+ assert.match(indexPage, /uni\.navigateTo\(\{\s*url: `\/pages-service\/tickets\/product-detail\?productId=\$\{productId\}`/);
+ assert.doesNotMatch(indexPage, /detailProduct| {
const component = await readTicketFile("components/BookingFlow.vue");
const page = await readTicketFile("booking.vue");
diff --git a/src/pages.json b/src/pages.json
index a52ed7a..fcbb562 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -149,6 +149,12 @@
"navigationStyle": "custom"
}
},
+ {
+ "path": "tickets/product-detail",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
{
"path": "tickets/booking",
"style": {