From 5ce0d76154bf4c1d70543476cdfad9a30195b0f8 Mon Sep 17 00:00:00 2001
From: shinnosuke <tantao@1hoper.com>
Date: 星期六, 10 十月 2026 16:44:38 +0800
Subject: [PATCH] fix(miniapp): 调整首页圆角布局并隐藏滚动条

---
 rencaika/pages/card/card.uvue                                               |    2 
 rencaika/pages/stay-benefits/stay-benefits.uvue                             |    2 
 rencaika/pages/merchant/merchant.uvue                                       |    2 
 rencaika/pages/free-benefit/free-benefit.uvue                               |    2 
 rencaika/pages/card-application-conditions/card-application-conditions.uvue |    2 
 rencaika/pages/policy/policy.uvue                                           |    2 
 rencaika/pages/travel-benefits/travel-benefits.uvue                         |    4 
 rencaika/pages/news-detail/news-detail.uvue                                 |    2 
 rencaika/pages/order/order.uvue                                             |    2 
 rencaika/pages/news/news.uvue                                               |    2 
 rencaika/pages/food-benefits/food-benefits.uvue                             |    2 
 rencaika/pages/index/index.uvue                                             |   81 ++++++++++++--------------
 rencaika/pages/premium-benefits/premium-benefits.uvue                       |    2 
 rencaika/pages/benefits/benefits.uvue                                       |    2 
 rencaika/pages/coupon-select/coupon-select.uvue                             |    2 
 rencaika/pages/family-card-unbind/family-card-unbind.uvue                   |    2 
 rencaika/pages/cinema-merchant/cinema-merchant.uvue                         |    2 
 rencaika/pages/medical-package/medical-package.uvue                         |    2 
 rencaika/pages/agreement/agreement.uvue                                     |    2 
 rencaika/pages/pending-use/pending-use.uvue                                 |    2 
 rencaika/pages/shopping-benefits/shopping-benefits.uvue                     |    2 
 rencaika/pages/card-upgrade/card-upgrade.uvue                               |    2 
 rencaika/pages/product-detail/product-detail.uvue                           |    2 
 rencaika/pages/policy-detail/policy-detail.uvue                             |    2 
 rencaika/App.uvue                                                           |    9 +++
 rencaika/pages/transport-benefits/transport-benefits.uvue                   |    2 
 rencaika/pages/entertainment-benefits/entertainment-benefits.uvue           |    4 
 27 files changed, 74 insertions(+), 70 deletions(-)

diff --git a/rencaika/App.uvue b/rencaika/App.uvue
index 07ea739..909386f 100644
--- a/rencaika/App.uvue
+++ b/rencaika/App.uvue
@@ -69,6 +69,15 @@
 </script>
 
 <style>
+	/* #ifdef WEB || MP-WEIXIN */
+	/* 统一隐藏页面和滚动容器的滚动条,保留滑动、下拉刷新与触底加载。 */
+	::-webkit-scrollbar {
+		display: none;
+		width: 0;
+		height: 0;
+	}
+	/* #endif */
+
 	page {
 		background-color: #F6F7FB;
 		color: #1E293B;
diff --git a/rencaika/pages/agreement/agreement.uvue b/rencaika/pages/agreement/agreement.uvue
index f5cd0bd..838ceb2 100644
--- a/rencaika/pages/agreement/agreement.uvue
+++ b/rencaika/pages/agreement/agreement.uvue
@@ -9,7 +9,7 @@
 			</view>
 		</view>
 
-		<scroll-view class="content" scroll-y="true" show-scrollbar="false">
+		<scroll-view class="content" scroll-y="true" :show-scrollbar="false">
 			<view v-if="loading" class="page-state"><view class="loading-spinner"></view><text>正在加载协议内容</text></view>
 			<view v-else-if="loadError" class="page-state error-state"><text>协议内容加载失败</text><text class="retry-text" @tap="loadAgreement">重新加载</text></view>
 			<view v-else-if="agreementState != 'ACTIVE'" class="page-state error-state"><text>{{stateMessage}}</text><text class="retry-text" @tap="loadAgreement">重新加载</text></view>
diff --git a/rencaika/pages/benefits/benefits.uvue b/rencaika/pages/benefits/benefits.uvue
index d91f3e9..e70cc6c 100644
--- a/rencaika/pages/benefits/benefits.uvue
+++ b/rencaika/pages/benefits/benefits.uvue
@@ -9,7 +9,7 @@
 			</view>
 		</view>
 
-		<scroll-view class="content" scroll-y lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMoreBenefits">
+		<scroll-view :show-scrollbar="false" class="content" scroll-y lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMoreBenefits">
 			<view class="hero">
 				<image class="hero-image" src="/static/benefits-assets/benefits-hero.jpg" mode="aspectFill"></image>
 				<view class="hero-shade"></view>
diff --git a/rencaika/pages/card-application-conditions/card-application-conditions.uvue b/rencaika/pages/card-application-conditions/card-application-conditions.uvue
index 8afe922..4b0d691 100644
--- a/rencaika/pages/card-application-conditions/card-application-conditions.uvue
+++ b/rencaika/pages/card-application-conditions/card-application-conditions.uvue
@@ -1,7 +1,7 @@
 <template>
 	<view class="page">
 		<view class="custom-nav"><view class="safe-space" :style="'height:' + navTop + 'px'"></view><view class="nav-row" :style="'height:' + navHeight + 'px;padding-right:' + navRight + 'px'"><view class="back-button" hover-class="back-button-active" @tap="goBack"><image src="/static/news-assets/arrow-left.svg"></image></view><text class="nav-title">申请条件</text><view class="capsule-space" :style="'width:' + navWidth + 'px'"></view></view></view>
-		<scroll-view class="content" scroll-y="true" show-scrollbar="false">
+		<scroll-view class="content" scroll-y="true" :show-scrollbar="false">
 			<view class="hero"><text class="hero-title">{{cardType}}</text><text class="hero-subtitle">东区人才卡申请条件</text></view>
 			<view class="summary-card"><text class="summary-title">发放对象</text><text class="summary-text">{{recipient}}</text></view>
 			<view class="conditions-card">
diff --git a/rencaika/pages/card-upgrade/card-upgrade.uvue b/rencaika/pages/card-upgrade/card-upgrade.uvue
index 3dae6ab..93247d1 100644
--- a/rencaika/pages/card-upgrade/card-upgrade.uvue
+++ b/rencaika/pages/card-upgrade/card-upgrade.uvue
@@ -12,7 +12,7 @@
 		<view v-if="pageLoading" class="page-state"><view class="loading-spinner"></view><text>正在加载申请资料</text></view>
 		<view v-else-if="pageLoadFailed" class="page-state error-state"><text>申请资料加载失败</text><text class="retry-text" @tap="loadUpgrade">重新加载</text></view>
 		<template v-else-if="!isSubmitted">
-			<scroll-view class="form-scroll" scroll-y="true" show-scrollbar="false">
+			<scroll-view class="form-scroll" scroll-y="true" :show-scrollbar="false">
 				<view class="form-list">
 					<view v-if="rejectReason.length > 0" class="reject-hint"><text>驳回原因:{{rejectReason}}</text></view>
 					<view class="form-group target-group">
diff --git a/rencaika/pages/card/card.uvue b/rencaika/pages/card/card.uvue
index e8a83d9..a6523c1 100644
--- a/rencaika/pages/card/card.uvue
+++ b/rencaika/pages/card/card.uvue
@@ -8,7 +8,7 @@
 			</view>
 		</view>
 
-		<scroll-view class="content" scroll-y="true" show-scrollbar="false">
+		<scroll-view class="content" scroll-y="true" :show-scrollbar="false">
 			<view v-if="isGuest" class="guest-content">
 				<view class="guest-intro"><text class="guest-intro-title">东区人才卡</text><text class="guest-intro-copy">面向区内不同层次人才推出的一二三类人才卡,提供消费优惠、便捷政务、安家补助、子女教育、创业支持等优质服务,增强人才归属感,提升人才引育用留质效,加快建设区域人才集聚高地。</text><view class="apply-button" hover-class="apply-button-active" @tap="openApplyNotice"><text>立即申请</text></view></view>
 				<view class="guest-card-item" v-for="item in guestCardTypes" :key="item.title">
diff --git a/rencaika/pages/cinema-merchant/cinema-merchant.uvue b/rencaika/pages/cinema-merchant/cinema-merchant.uvue
index 8e8b05d..73dfd4d 100644
--- a/rencaika/pages/cinema-merchant/cinema-merchant.uvue
+++ b/rencaika/pages/cinema-merchant/cinema-merchant.uvue
@@ -1,7 +1,7 @@
 <template>
 	<view class="page">
 		<view class="custom-nav" :class="isSolidNav ? 'is-solid' : ''"><view class="nav-bg"></view><view class="safe-space" :style="'height:' + navTop + 'px'"></view><view class="nav-row" :style="'height:' + navHeight + 'px;padding-right:' + navRight + 'px'"><view class="back-button" @tap="goBack"><image src="/static/food-assets/arrow-left-white.svg" mode="aspectFit"></image></view><text class="nav-title">{{cinemaName}}</text><view class="capsule-space" :style="'width:' + navWidth + 'px'"></view></view></view>
-		<scroll-view class="content" scroll-y @scroll="handleScroll">
+		<scroll-view :show-scrollbar="false" class="content" scroll-y @scroll="handleScroll">
 			<view class="hero"><image class="hero-image" :src="cinemaHero" mode="aspectFill" @error="replaceHeroImage"></image><view class="hero-shade"></view></view>
 			<view class="merchant-shell">
 				<view v-if="detailLoading" class="detail-state"><view class="loading-spinner"></view><text>正在加载影城信息</text></view>
diff --git a/rencaika/pages/coupon-select/coupon-select.uvue b/rencaika/pages/coupon-select/coupon-select.uvue
index a53ab2e..2a4cf4f 100644
--- a/rencaika/pages/coupon-select/coupon-select.uvue
+++ b/rencaika/pages/coupon-select/coupon-select.uvue
@@ -11,7 +11,7 @@
 			</view>
 		</view>
 
-		<scroll-view class="coupon-scroll" scroll-y>
+		<scroll-view :show-scrollbar="false" class="coupon-scroll" scroll-y>
 			<view v-if="loading" class="page-state">
 				<view class="loading-spinner"></view>
 				<text>正在加载优惠券</text>
diff --git a/rencaika/pages/entertainment-benefits/entertainment-benefits.uvue b/rencaika/pages/entertainment-benefits/entertainment-benefits.uvue
index 22813c3..ecd92aa 100644
--- a/rencaika/pages/entertainment-benefits/entertainment-benefits.uvue
+++ b/rencaika/pages/entertainment-benefits/entertainment-benefits.uvue
@@ -10,7 +10,7 @@
 			</view>
 		</view>
 
-		<scroll-view class="page-scroll" scroll-y lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMore">
+		<scroll-view :show-scrollbar="false" class="page-scroll" scroll-y lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMore">
 			<view class="hero">
 				<swiper v-if="scenes.length > 0" class="hero-swiper" :current="activeIndex < 0 ? 0 : activeIndex" :circular="scenes.length > 1" :duration="240" @change="handleHeroChange">
 					<swiper-item v-for="(item, index) in scenes" :key="item.id">
@@ -21,7 +21,7 @@
 				<view class="hero-shade"></view>
 				<text v-if="currentScene.name != ''" class="scene-name">{{currentScene.name}}</text>
 				<text v-if="scenes.length == 0" class="no-gallery">暂无图册内容</text>
-				<scroll-view v-else class="scene-scroll" scroll-x scroll-with-animation :scroll-left="sceneScrollLeft" @scrollend="handleSceneScrollEnd">
+				<scroll-view :show-scrollbar="false" v-else class="scene-scroll" scroll-x scroll-with-animation :scroll-left="sceneScrollLeft" @scrollend="handleSceneScrollEnd">
 					<view class="scene-row" :style="'width:' + sceneTrackWidth + 'rpx'"><view class="scene-pad"></view><view v-for="(item, index) in scenes" :key="item.id" class="scene-item" :class="index == activeIndex ? 'active' : ''" @tap="selectScene(index)"><image :src="item.image" mode="aspectFill" @error="replaceSceneImage(index)"></image></view><view class="scene-pad"></view></view>
 				</scroll-view>
 			</view>
diff --git a/rencaika/pages/family-card-unbind/family-card-unbind.uvue b/rencaika/pages/family-card-unbind/family-card-unbind.uvue
index cfb1397..8465d21 100644
--- a/rencaika/pages/family-card-unbind/family-card-unbind.uvue
+++ b/rencaika/pages/family-card-unbind/family-card-unbind.uvue
@@ -9,7 +9,7 @@
 			</view>
 		</view>
 
-		<scroll-view class="content" scroll-y="true" show-scrollbar="false">
+		<scroll-view class="content" scroll-y="true" :show-scrollbar="false">
 			<view class="content-inner">
 				<view v-if="listLoading" class="list-state"><view class="loading-spinner"></view><text>正在加载已绑定家属</text></view>
 				<view v-else-if="listError" class="list-state error-state"><text>家属列表加载失败</text><text class="retry-text" @tap="loadMembers">重新加载</text></view>
diff --git a/rencaika/pages/food-benefits/food-benefits.uvue b/rencaika/pages/food-benefits/food-benefits.uvue
index 537c9f8..1b55d5e 100644
--- a/rencaika/pages/food-benefits/food-benefits.uvue
+++ b/rencaika/pages/food-benefits/food-benefits.uvue
@@ -10,7 +10,7 @@
 			</view>
 		</view>
 
-		<scroll-view class="page-scroll" scroll-y lower-threshold="80" @scroll="handlePageScroll" @scrolltolower="loadMoreMerchants">
+		<scroll-view :show-scrollbar="false" class="page-scroll" scroll-y lower-threshold="80" @scroll="handlePageScroll" @scrolltolower="loadMoreMerchants">
 			<view class="hero">
 				<!-- 主图跟着图册左右滑:滑动的主图与下方缩略图互相联动(点缩略图 = 主图滑过去)。 -->
 				<swiper v-if="gallery.length > 0" class="hero-swiper" :current="activeIndex < 0 ? 0 : activeIndex" :circular="gallery.length > 1" :duration="240" @change="handleHeroChange">
diff --git a/rencaika/pages/free-benefit/free-benefit.uvue b/rencaika/pages/free-benefit/free-benefit.uvue
index c1d53d5..29df27c 100644
--- a/rencaika/pages/free-benefit/free-benefit.uvue
+++ b/rencaika/pages/free-benefit/free-benefit.uvue
@@ -10,7 +10,7 @@
 			</view>
 		</view>
 
-		<scroll-view class="content" scroll-y="true" show-scrollbar="false">
+		<scroll-view class="content" scroll-y="true" :show-scrollbar="false">
 			<view v-if="loading" class="page-state"><view class="loading-spinner"></view><text>正在加载免费权益</text></view>
 			<view v-else-if="loadFailed" class="page-state"><text>免费权益加载失败</text><text class="retry-text" @tap="loadBenefit">重新加载</text></view>
 			<view v-else-if="!available" class="page-state empty-state"><text class="empty-title">暂无可用免费券</text><text class="empty-copy">{{unavailableReason}}</text><text class="retry-text" @tap="loadBenefit">重新加载</text></view>
diff --git a/rencaika/pages/index/index.uvue b/rencaika/pages/index/index.uvue
index 0190815..d600f7b 100644
--- a/rencaika/pages/index/index.uvue
+++ b/rencaika/pages/index/index.uvue
@@ -1,22 +1,27 @@
 <template>
 	<view class="page">
-		<scroll-view class="scroll-page" scroll-y @scroll="handleScroll">
-			<view class="hero">
-				<image class="hero-image" :src="homeImage('home-top.png')" mode="aspectFill"></image>
-				<view class="hero-gradient"></view>
-				<view v-if="homeVideoUrl != ''" class="play-button" @tap="playVideo"><text>向东看</text></view>
-			</view>
-
-			<view class="city-panel">
-				<image class="city-stand" src="/static/home-assets/mascot-stand.png" mode="aspectFit"></image>
-				<view class="city-heading"><text>才聚东区,共富未来</text><view class="city-label" @tap="openIntro"><text>幸福东区</text><image src="/static/home-assets/arrow-right.svg"></image></view></view>
-				<view class="city-grid">
-					<view class="city-card city-intro" @tap="openIntro"><image class="city-bg" :src="homeImage('city-intro.jpg')" mode="aspectFill"></image><text class="intro-name">东区简介</text><view class="intro-button"><text>查看更多</text><image src="/static/home-assets/arrow-right.svg"></image></view></view>
-					<view class="city-side"><view class="city-card city-potential"><image class="city-bg" :src="homeImage('city-potential.jpg')" mode="aspectFill"></image><text>潜力城</text></view><view class="city-card city-golden"><image class="city-bg" :src="homeImage('city-golden.jpg')" mode="aspectFill"></image><text>黄金城</text></view></view>
-					<view class="city-side"><view class="city-card city-industry"><image class="city-bg" :src="homeImage('city-industry.jpg')" mode="aspectFill"></image><text>兴业城</text></view><view class="city-card city-livable"><image class="city-bg" :src="homeImage('city-livable.png')" mode="aspectFill"></image><text>宜居城</text></view></view>
+		<scroll-view :show-scrollbar="false" class="scroll-page" scroll-y @scroll="handleScroll">
+			<view class="home-overview">
+				<view class="hero">
+					<view class="hero-surface">
+						<image class="hero-image" :src="homeImage('home-top.png')" mode="aspectFit"></image>
+						<view class="hero-gradient"></view>
+						<view class="play-button" @tap="playVideo"><text>向东看</text></view>
+					</view>
 				</view>
-				<!-- 放在 .city-grid 之后:DOM 顺序保证它画在橙色城市区之上,不依赖 z-index 是否被小程序忽略。 -->
-				<image class="city-mascot" src="/static/home-assets/mascot-rest.png" mode="aspectFit"></image>
+
+				<view class="city-panel">
+					<view class="city-panel-content">
+						<view class="city-heading"><text>才聚东区,共富未来</text><view class="city-label" @tap="openIntro"><text>幸福东区</text><image src="/static/home-assets/arrow-right.svg"></image></view></view>
+						<view class="city-grid">
+							<view class="city-card city-intro" @tap="openIntro"><image class="city-bg" :src="homeImage('city-intro.jpg')" mode="aspectFill"></image><text class="intro-name">东区简介</text><view class="intro-button"><text>查看更多</text><image src="/static/home-assets/arrow-right.svg"></image></view></view>
+							<view class="city-side"><view class="city-card city-potential"><image class="city-bg" :src="homeImage('city-potential.jpg')" mode="aspectFill"></image><text>潜力城</text></view><view class="city-card city-golden"><image class="city-bg" :src="homeImage('city-golden.jpg')" mode="aspectFill"></image><text>黄金城</text></view></view>
+							<view class="city-side"><view class="city-card city-industry"><image class="city-bg" :src="homeImage('city-industry.jpg')" mode="aspectFill"></image><text>兴业城</text></view><view class="city-card city-livable"><image class="city-bg" :src="homeImage('city-livable.png')" mode="aspectFill"></image><text>宜居城</text></view></view>
+						</view>
+					</view>
+					<image class="city-mascot" src="/static/home-assets/mascot-rest.png" mode="aspectFit"></image>
+				</view>
+				<image class="city-stand" src="/static/home-assets/mascot-stand.png" mode="aspectFit"></image>
 			</view>
 
 			<view class="section-head"><view class="section-title"><image class="section-icon" src="/static/home-assets/mascot-leap.png" mode="aspectFit"></image><text>人才资讯</text></view><text class="more" @tap="goNews">查看更多</text></view>
@@ -165,8 +170,10 @@
 <style>
 	.page { height: 100%; background-color: #FFFFFF; }
 	.scroll-page { height: calc(100% - 126rpx); height: calc(100% - 126rpx - env(safe-area-inset-bottom)); background-color: #FFFFFF; }
-	.hero { height: 468rpx; background-color: #FFFFFF; position: relative; overflow: hidden; border-bottom-left-radius: 48rpx; border-bottom-right-radius: 48rpx; }
-	.hero-image { position: absolute; left: 0; top: 0; width: 100%; height: 468rpx; }
+	.home-overview { position: relative; overflow: visible; flex-shrink: 0; }
+	.hero { height: 462rpx; min-height: 462rpx; flex-shrink: 0; position: relative; z-index: 1; overflow: visible; }
+	.hero-surface { position: relative; width: 100%; height: 462rpx; flex-shrink: 0; overflow: hidden; border-bottom-left-radius: 72rpx; border-bottom-right-radius: 72rpx; }
+	.hero-image { position: absolute; left: 0; top: 0; width: 100%; height: 462rpx; }
 	.hero-gradient { position: absolute; z-index: 1; top: 0; left: 0; right: 0; height: 300rpx; background-image: linear-gradient(180deg, rgba(244,90,42,.88) 0%, rgba(255,130,60,.42) 62%, rgba(255,166,80,0) 100%); }
 	.safe-space { height: 28px; position: relative; z-index: 2; }
 	.nav-row { height: 32px; padding: 0 32rpx; position: relative; z-index: 2; flex-direction: row; align-items: center; justify-content: space-between; }
@@ -176,40 +183,28 @@
 	.nav-title { position: absolute; z-index: 1; left: 30rpx; top: 10rpx; height: 100%; flex-direction: row; align-items: center; justify-content: flex-start; }
 	.nav-title text { color: #FFFFFF; font-family: 'FoodCalligraphyFull', 'FoodCalligraphy'; font-size: 38rpx; font-weight: 700; opacity: .95; }
 	.capsule-reserve { width: 88px; height: 100%; flex-shrink: 0; }
-	.play-button { position: absolute; z-index: 2; bottom: 20rpx; left: 50%; margin-left: -78rpx; width: 156rpx; height: 56rpx; border-radius: 28rpx; background-image: linear-gradient(180deg, #FFB75A 0%, #FF6A24 100%); border-width: 2rpx; border-color: rgba(255,255,255,.82); box-shadow: 0 7rpx 14rpx rgba(234,92,26,.26); flex-direction: row; justify-content: center; align-items: center; }
+	.play-button { position: absolute; z-index: 2; bottom: 52rpx; left: 50%; margin-left: -78rpx; width: 156rpx; height: 56rpx; border-radius: 28rpx; background-image: linear-gradient(180deg, #FFB75A 0%, #FF6A24 100%); border-width: 2rpx; border-color: rgba(255,255,255,.82); box-shadow: 0 7rpx 14rpx rgba(234,92,26,.26); flex-direction: row; justify-content: center; align-items: center; }
 	.play-button text { color: #FFFFFF; font-size: 23rpx; }
 
 	/*
-	 * 顶部图下方的衔接:原型里白色区是「通版」(左右不留边、上沿不圆角、没有橙色投影),
-	 * 主图只把底部两个角做圆角,让白色自然接上来;橙色城市区自己再左右内缩 16rpx。
-	 * 所以这里把面板改成通版(margin 左右 0、去掉圆角和投影),内缩交给 .city-grid。
+	 * 顶图按素材原比例显示透明圆角,城市模块置于前面并上移重叠。
+	 * 外层渐变与内层白色卡片相差 2rpx,形成沿圆角延伸的橙色渐变边框。
 	 */
-	.city-panel { margin: 0 0 38rpx; padding: 22rpx 0 0; overflow: visible; background-color: #FFFFFF; position: relative; }
-	/* 面板改通版后,标题的绝对位置保持不变:原来 16(面板内缩)+22(自身边距)=38rpx,现在直接给 38rpx。 */
-	.city-heading { height: 58rpx; margin: 0 38rpx; position: relative; flex-direction: row; justify-content: space-between; align-items: center; }
-	/*
-	 * 站立吉祥物:贴在面板右上角,跨在白色面板上沿之上(身体压在城市主图上),和原型一致。
-	 * 原型量出来可见轮廓是 58×100rpx(右边缘正好贴面板右边缘、顶端高出面板上沿约 57rpx);
-	 * 素材 PNG 画布 68×198、可见内容只有 68×118(上下各 40px 透明留白),所以盒子要按画布比例放大到
-	 * 58×168rpx,再把盒子上沿抬到 -91rpx,可见部分才落在原型的位置上。
-	 */
-	.city-stand { position: absolute; right: 0rpx; top: -91rpx; width: 58rpx; height: 168rpx; z-index: 4; }
-	/*
-	 * 趴着的吉祥物:在「才聚东区,共富未来」和「幸福东区」之间,草坪底边压在橙色城市区上沿。
-	 * 原型量出来是 51×28px(素材无透明留白、比例 1.815 与原型一致)→ 128×70rpx;
-	 * 右边缘距面板右边缘 64px→160rpx;顶端距面板上沿 21px→52rpx(它现在挂在 .city-panel 上,
-	 * 所以 right/top 直接按面板算:right 160rpx、top 52rpx 减去画布上留白对应的 12rpx → 40rpx)。
-	 * 素材底部补了 8px 透明留白,所以盒子高度要按画布比例放大到 75rpx(可见部分仍是 128×70rpx)。
-	 * top 取 40rpx:草地底边落在橙色城市区上沿之内、但不压到下方卡片(原型里草地底边距卡片上沿还有 4px)。
-	 */
-	.city-mascot { position: absolute; right: 160rpx; top: 40rpx; width: 128rpx; height: 75rpx; z-index: 3; }
+	.city-panel { margin: -32rpx 16rpx 38rpx; padding: 2rpx; border-radius: 40rpx; overflow: visible; position: relative; z-index: 2; background-image: linear-gradient(150deg, #FFDDC9 0%, #FF9C5A 52%, #FFD5B7 100%); }
+	.city-panel-content { padding-top: 22rpx; border-radius: 38rpx; overflow: hidden; position: relative; background-color: #FFFFFF; }
+	.city-heading { height: 58rpx; margin: 0 22rpx; position: relative; flex-direction: row; justify-content: space-between; align-items: center; }
+	/* Keep the mascot above both cards; the image canvas includes transparent padding. */
+	.city-stand { position: absolute; right: 18rpx; top: 341rpx; width: 58rpx; height: 168rpx; z-index: 3; }
+	/* 吉祥物随标题恢复位置,草坪底边保持在橙色城市区上沿。 */
+	.city-mascot { position: absolute; right: 162rpx; top: 42rpx; width: 128rpx; height: 75rpx; z-index: 3; }
 	.city-heading > text { color: #F16624; font-size: 35rpx; font-weight: 700; letter-spacing: 1rpx; background-image: linear-gradient(180deg, #F45A2A 0%, #FFB257 100%); background-clip: text; -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
 	/*
 	 * 「幸福东区」按钮:原型里按钮右边缘距面板右边缘 18px(面板 287px)→ 45rpx;
-	 * .city-heading 自身左右各留 38rpx,所以这里 margin-right 取 7rpx(38+7=45rpx),和原型一致。
+	 * 面板内缩 16rpx、边框 2rpx、标题边距 22rpx,再留 7rpx 对齐右侧按钮。
 	 */
 	.city-label { margin-right: 7rpx; padding: 10rpx 13rpx; border-radius: 18rpx; background-image: linear-gradient(180deg, #FFB85E 0%, #FF6726 100%); box-shadow: 0 5rpx 10rpx rgba(239,101,34,.22); flex-direction: row; align-items: center; } .city-label text { color: #FFFFFF; font-size: 20rpx; } .city-label image { width: 20rpx; height: 20rpx; margin-left: 7rpx; }
-	.city-grid { box-sizing: border-box; height: 292rpx; margin: 18rpx 16rpx 0; padding: 22rpx; overflow: visible; background-image: linear-gradient(180deg, #FF5F2D 0%, #FFB36B 100%); border-bottom-left-radius: 26rpx; border-bottom-right-radius: 26rpx; flex-direction: row; } .city-card { overflow: hidden; border-radius: 17rpx; position: relative; justify-content: flex-end; background-image: linear-gradient(135deg, #E96C3D 0%, #F8AA56 100%); }
+	/* 308rpx cards plus 22rpx padding on each side fit inside the rounded background. */
+	.city-grid { box-sizing: border-box; height: 352rpx; min-height: 352rpx; margin: 18rpx 0 0; padding: 22rpx; background-image: linear-gradient(180deg, #FF5F2D 0%, #FFB36B 100%); flex-direction: row; } .city-card { overflow: hidden; border-radius: 17rpx; position: relative; justify-content: flex-end; background-image: linear-gradient(135deg, #E96C3D 0%, #F8AA56 100%); }
 	.city-bg { position: absolute; left: 0; top: 0; width: 100%; height: 100%; }
 	.city-intro { width: 242rpx; height: 308rpx; box-sizing: border-box; margin-right: 14rpx; padding: 22rpx; } .intro-name { position: absolute; z-index: 1; top: 50%; left: 0; right: 0; transform: translateY(-50%); color: #FFFFFF; font-size: 37rpx; font-weight: 700; text-align: center; } .intro-button { position: relative; z-index: 1; align-self: center; box-sizing: border-box; width: 146rpx; height: 42rpx; margin-top: 13rpx; padding: 0 12rpx; border-radius: 21rpx; background-image: linear-gradient(90deg, rgba(255,207,138,.92) 0%, rgba(255,101,36,.68) 100%); border-width: 1rpx; border-color: rgba(255,255,255,.42); flex-direction: row; align-items: center; justify-content: space-between; } .intro-button text { color: #FFFFFF; font-size: 19rpx; } .intro-button image { width: 19rpx; height: 19rpx; margin-left: 8rpx; }
 	.city-side { height: 308rpx; flex: 1; margin-right: 14rpx; justify-content: space-between; } .city-side:last-child { margin-right: 0; } .city-side .city-card { height: 147rpx; padding: 0; } .city-side .city-card > text { position: absolute; z-index: 1; left: 0; right: 0; bottom: 0; padding: 10rpx 12rpx; color: #FFFFFF; font-size: 22rpx; font-weight: 700; text-shadow: 0 2rpx 8rpx rgba(0,0,0,.5); }
diff --git a/rencaika/pages/medical-package/medical-package.uvue b/rencaika/pages/medical-package/medical-package.uvue
index 692c129..c4187d1 100644
--- a/rencaika/pages/medical-package/medical-package.uvue
+++ b/rencaika/pages/medical-package/medical-package.uvue
@@ -1,7 +1,7 @@
 <template>
 	<view class="page">
 		<view class="custom-nav" :class="isSolidNav ? 'is-solid' : ''"><view class="custom-nav-bg"></view><view class="safe-space" :style="'height:' + navTop + 'px'"></view><view class="nav-row" :style="'height:' + navHeight + 'px;padding-right:' + navRight + 'px'"><view class="back-button" @tap="goBack"><image src="/static/food-assets/arrow-left-white.svg"></image></view><text class="nav-title">{{packageName}}</text><view class="capsule-space" :style="'width:' + navWidth + 'px'"></view></view></view>
-		<scroll-view class="content" scroll-y @scroll="handleScroll"><view class="hero"><image class="hero-image" :src="heroImage" mode="aspectFill" @error="replaceHero"></image><view class="hero-shade"></view></view><view class="package-panel">
+		<scroll-view :show-scrollbar="false" class="content" scroll-y @scroll="handleScroll"><view class="hero"><image class="hero-image" :src="heroImage" mode="aspectFill" @error="replaceHero"></image><view class="hero-shade"></view></view><view class="package-panel">
 			<view v-if="detailLoading" class="detail-state"><view class="loading-spinner"></view><text>正在加载体检套餐</text></view>
 			<view v-else-if="detailError" class="detail-state error-state"><text>体检套餐加载失败</text><text class="retry-text" @tap="loadDetail">重新加载</text></view>
 			<view v-else>
diff --git a/rencaika/pages/merchant/merchant.uvue b/rencaika/pages/merchant/merchant.uvue
index 07856c9..6509135 100644
--- a/rencaika/pages/merchant/merchant.uvue
+++ b/rencaika/pages/merchant/merchant.uvue
@@ -10,7 +10,7 @@
 			</view>
 		</view>
 
-		<scroll-view :class="'content' + (isMedicalMerchant ? ' content-full' : '')" scroll-y @scroll="handleScroll">
+		<scroll-view :show-scrollbar="false" :class="'content' + (isMedicalMerchant ? ' content-full' : '')" scroll-y @scroll="handleScroll">
 			<view class="hero">
 				<swiper class="hero-swiper" :indicator-dots="displayedHeroImages.length > 1" indicator-color="rgba(255,255,255,.55)" indicator-active-color="#FFFFFF" circular="true">
 					<swiper-item v-for="(imageUrl, index) in displayedHeroImages" :key="index"><image class="hero-image" :src="imageUrl" mode="aspectFill" @error="replaceHeroImage(index)"></image></swiper-item>
diff --git a/rencaika/pages/news-detail/news-detail.uvue b/rencaika/pages/news-detail/news-detail.uvue
index 305dc2b..749512a 100644
--- a/rencaika/pages/news-detail/news-detail.uvue
+++ b/rencaika/pages/news-detail/news-detail.uvue
@@ -10,7 +10,7 @@
 			<view class="nav-bottom-space"></view>
 		</view>
 
-		<scroll-view class="article-scroll" scroll-y>
+		<scroll-view :show-scrollbar="false" class="article-scroll" scroll-y>
 			<view v-if="isLoading" class="state-panel">
 				<view class="loading-spinner"></view>
 				<text class="state-title">正在加载资讯</text>
diff --git a/rencaika/pages/news/news.uvue b/rencaika/pages/news/news.uvue
index eb21eb6..ad776cf 100644
--- a/rencaika/pages/news/news.uvue
+++ b/rencaika/pages/news/news.uvue
@@ -10,7 +10,7 @@
 			<view class="nav-bottom-space"></view>
 		</view>
 
-		<scroll-view class="news-scroll" scroll-y lower-threshold="80" @scrolltolower="loadMoreNews">
+		<scroll-view :show-scrollbar="false" class="news-scroll" scroll-y lower-threshold="80" @scrolltolower="loadMoreNews">
 			<view v-if="initialLoading" class="list-state"><view class="loading-spinner"></view><text>正在加载人才资讯</text></view>
 			<view v-else-if="initialError" class="list-state error-state"><text>人才资讯加载失败</text><text class="retry-text" @tap="retryInitialLoad">重新加载</text></view>
 			<view v-else-if="hasLoaded && visibleNews.length == 0" class="list-state"><text>暂无人才资讯</text></view>
diff --git a/rencaika/pages/order/order.uvue b/rencaika/pages/order/order.uvue
index 5ac88ed..c103f38 100644
--- a/rencaika/pages/order/order.uvue
+++ b/rencaika/pages/order/order.uvue
@@ -12,7 +12,7 @@
 			</view>
 		</view>
 
-		<scroll-view class="record-scroll" scroll-y="true" show-scrollbar="false" lower-threshold="80"
+		<scroll-view class="record-scroll" scroll-y="true" :show-scrollbar="false" lower-threshold="80"
 			refresher-enabled="true" :refresher-triggered="refreshing" refresher-background="#F4F6F9"
 			@refresherrefresh="handlePullDownRefresh" @refresherabort="finishPullRefresh" @scrolltolower="loadMoreRecords">
 			<view v-if="initialLoading" class="empty-state"><view class="loading-spinner"></view><text class="empty-title">正在加载使用记录</text></view>
diff --git a/rencaika/pages/pending-use/pending-use.uvue b/rencaika/pages/pending-use/pending-use.uvue
index bd1436a..f0317a5 100644
--- a/rencaika/pages/pending-use/pending-use.uvue
+++ b/rencaika/pages/pending-use/pending-use.uvue
@@ -9,7 +9,7 @@
 			</view>
 		</view>
 
-		<scroll-view class="content" scroll-y="true" show-scrollbar="false">
+		<scroll-view class="content" scroll-y="true" :show-scrollbar="false">
 			<view class="content-inner">
 				<view class="qr-card">
 					<image v-if="codeImage != ''" class="code-image" :src="codeImage" mode="aspectFit" @error="handleCodeImageError"></image><text v-else class="dynamic-code-placeholder" @tap="refreshCode">{{codeError ? '核销码加载失败,点击重试' : '正在生成核销码'}}</text>
diff --git a/rencaika/pages/policy-detail/policy-detail.uvue b/rencaika/pages/policy-detail/policy-detail.uvue
index 84e88a2..8d27ba2 100644
--- a/rencaika/pages/policy-detail/policy-detail.uvue
+++ b/rencaika/pages/policy-detail/policy-detail.uvue
@@ -1,7 +1,7 @@
 <template>
 	<view class="page">
 		<view class="custom-nav"><view class="safe-space" :style="'height:' + navTop + 'px'"></view><view class="nav-row" :style="'height:' + navHeight + 'px;padding-right:' + navRight + 'px'"><view class="back-button" hover-class="back-button-active" @tap="goBack"><image src="/static/news-assets/arrow-left.svg"></image></view><text class="nav-title">人才政策</text><view class="capsule-space" :style="'width:' + navWidth + 'px'"></view></view></view>
-		<scroll-view class="content" scroll-y>
+		<scroll-view :show-scrollbar="false" class="content" scroll-y>
 			<view v-if="initialLoading" class="detail-state"><view class="loading-spinner"></view><text>正在加载政策详情</text></view>
 			<view v-else-if="policyUnavailable" class="detail-state error-state"><text>政策已失效</text><text class="retry-text" @tap="goBack">返回政策列表</text></view>
 			<view v-else-if="initialError" class="detail-state error-state"><text>政策详情加载失败</text><text class="retry-text" @tap="loadPolicy">重新加载</text></view>
diff --git a/rencaika/pages/policy/policy.uvue b/rencaika/pages/policy/policy.uvue
index 6c4ebc9..dad8409 100644
--- a/rencaika/pages/policy/policy.uvue
+++ b/rencaika/pages/policy/policy.uvue
@@ -9,7 +9,7 @@
 			</view>
 		</view>
 
-		<scroll-view class="content" scroll-y="true" show-scrollbar="false" lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMorePolicies">
+		<scroll-view class="content" scroll-y="true" :show-scrollbar="false" lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMorePolicies">
 			<view class="policy-hero"><image src="/static/policy-assets/policy-hero.jpg" mode="aspectFill"></image><view class="hero-shade"></view><view class="hero-bottom-fade"></view></view>
 			<view class="list-section">
 				<view v-if="initialLoading" class="policy-empty"><view class="loading-spinner"></view><text>正在加载人才政策</text></view>
diff --git a/rencaika/pages/premium-benefits/premium-benefits.uvue b/rencaika/pages/premium-benefits/premium-benefits.uvue
index 017dc3d..b634ef3 100644
--- a/rencaika/pages/premium-benefits/premium-benefits.uvue
+++ b/rencaika/pages/premium-benefits/premium-benefits.uvue
@@ -1,7 +1,7 @@
 <template>
 	<view class="page">
 		<view class="custom-nav" :class="isSolidNav ? 'is-solid' : ''"><view class="nav-bg"></view><view class="safe-space" :style="'height:' + navTop + 'px'"></view><view class="nav-row" :style="'height:' + navHeight + 'px;padding-right:' + navRight + 'px'"><view class="back-button" @tap="goBack"><image src="/static/food-assets/arrow-left-white.svg" mode="aspectFit"></image></view><text class="nav-title">享—{{topicTitle}}</text><view class="capsule-space" :style="'width:' + navWidth + 'px'"></view></view></view>
-		<scroll-view class="page-scroll" scroll-y lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMore">
+		<scroll-view :show-scrollbar="false" class="page-scroll" scroll-y lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMore">
 			<view class="hero"><swiper v-if="scenes.length > 0" class="hero-swiper" :current="activeIndex < 0 ? 0 : activeIndex" :circular="scenes.length > 1" :duration="240" @change="handleHeroChange"><swiper-item v-for="(item, index) in scenes" :key="item.id"><image class="hero-image" :src="item.image" mode="aspectFill" @error="replaceImage(item)"></image></swiper-item></swiper><image v-else class="hero-image" :src="activeScene.image" mode="aspectFill" @error="replaceImage(activeScene)"></image><view class="hero-top-shade"></view><view class="hero-bottom-shade"></view><text class="scene-name">{{activeScene.name}}</text><scroll-view class="scene-scroll" scroll-x :show-scrollbar="false" scroll-with-animation :scroll-left="sceneScrollLeft" @scroll="handleSceneScroll"><view class="scene-row" :style="'width:' + sceneTrackWidth + 'rpx'"><view class="scene-pad"></view><view v-for="(item, index) in scenes" :key="item.id" class="scene-item" :class="index == activeIndex ? 'active' : ''" @tap="selectScene(index)"><image :src="item.image" mode="aspectFill" @error="replaceImage(item)"></image></view><view class="scene-pad"></view></view></scroll-view></view>
 			<view v-if="topicError" class="topic-error"><text>专题配置加载失败</text><text @tap="loadPremiumTopic">重新加载</text></view>
 			<view v-if="topicDescription != ''" class="topic-summary"><view class="intro-card"><text>{{topicDescription}}</text></view></view>
diff --git a/rencaika/pages/product-detail/product-detail.uvue b/rencaika/pages/product-detail/product-detail.uvue
index 4ee0e83..7ccf641 100644
--- a/rencaika/pages/product-detail/product-detail.uvue
+++ b/rencaika/pages/product-detail/product-detail.uvue
@@ -10,7 +10,7 @@
 			</view>
 		</view>
 
-		<scroll-view class="content" scroll-y @scroll="handleScroll">
+		<scroll-view :show-scrollbar="false" class="content" scroll-y @scroll="handleScroll">
 			<view class="hero">
 				<image class="hero-image" :src="productImage" mode="aspectFill" @error="replaceProductImage"></image>
 				<view class="hero-shade"></view>
diff --git a/rencaika/pages/shopping-benefits/shopping-benefits.uvue b/rencaika/pages/shopping-benefits/shopping-benefits.uvue
index 46a3e1c..0921fef 100644
--- a/rencaika/pages/shopping-benefits/shopping-benefits.uvue
+++ b/rencaika/pages/shopping-benefits/shopping-benefits.uvue
@@ -1,7 +1,7 @@
 <template>
 	<view class="page">
 		<view class="custom-nav" :class="isSolidNav ? 'is-solid' : ''"><view class="nav-bg"></view><view class="safe-space" :style="'height:' + navTop + 'px'"></view><view class="nav-row" :style="'height:' + navHeight + 'px;padding-right:' + navRight + 'px'"><view class="back-button" @tap="goBack"><image src="/static/food-assets/arrow-left-white.svg" mode="aspectFit"></image></view><text class="nav-title">购—{{topicTitle}}</text><view class="capsule-space" :style="'width:' + navWidth + 'px'"></view></view></view>
-		<scroll-view class="page-scroll" scroll-y lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMore">
+		<scroll-view :show-scrollbar="false" class="page-scroll" scroll-y lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMore">
 			<view class="hero"><swiper v-if="scenes.length > 0" class="hero-swiper" :current="activeIndex < 0 ? 0 : activeIndex" :circular="scenes.length > 1" :duration="240" @change="handleHeroChange"><swiper-item v-for="(item, index) in scenes" :key="item.id"><image class="hero-image" :src="item.image" mode="aspectFill" @error="replaceImage(item)"></image></swiper-item></swiper><image v-else class="hero-image" :src="activeScene.image" mode="aspectFill" @error="replaceImage(activeScene)"></image><view class="hero-top-shade"></view><view class="hero-bottom-shade"></view><text class="scene-name">{{activeScene.name}}</text><scroll-view class="scene-scroll" scroll-x :show-scrollbar="false" scroll-with-animation :scroll-left="sceneScrollLeft" @scrollend="handleSceneScrollEnd"><view class="scene-row" :style="'width:' + sceneTrackWidth + 'rpx'"><view class="scene-pad"></view><view v-for="(item, index) in scenes" :key="item.id" class="scene-item" :class="index == activeIndex ? 'active' : ''" @tap="selectScene(index)"><image :src="item.image" mode="aspectFill" @error="replaceImage(item)"></image></view><view class="scene-pad"></view></view></scroll-view></view>
 			<view v-if="topicError" class="topic-error"><text>专题配置加载失败</text><text @tap="loadShoppingTopic">重新加载</text></view>
 			<view v-if="topicDescription != ''" class="topic-summary"><view class="intro-card"><text>{{topicDescription}}</text></view></view>
diff --git a/rencaika/pages/stay-benefits/stay-benefits.uvue b/rencaika/pages/stay-benefits/stay-benefits.uvue
index 5ea6c0a..37093b3 100644
--- a/rencaika/pages/stay-benefits/stay-benefits.uvue
+++ b/rencaika/pages/stay-benefits/stay-benefits.uvue
@@ -10,7 +10,7 @@
 				<view class="capsule-space" :style="'width:' + navWidth + 'px'"></view>
 			</view>
 		</view>
-		<scroll-view class="page-scroll" scroll-y lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMore">
+		<scroll-view :show-scrollbar="false" class="page-scroll" scroll-y lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMore">
 			<view class="hero">
 				<swiper v-if="scenes.length > 0" class="hero-swiper" :current="activeIndex < 0 ? 0 : activeIndex" :circular="scenes.length > 1" :duration="240" @change="handleHeroChange">
 					<swiper-item v-for="(item, index) in scenes" :key="item.id">
diff --git a/rencaika/pages/transport-benefits/transport-benefits.uvue b/rencaika/pages/transport-benefits/transport-benefits.uvue
index a91b992..c92dee8 100644
--- a/rencaika/pages/transport-benefits/transport-benefits.uvue
+++ b/rencaika/pages/transport-benefits/transport-benefits.uvue
@@ -10,7 +10,7 @@
 			</view>
 		</view>
 
-		<scroll-view class="page-scroll" scroll-y lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMoreServices">
+		<scroll-view :show-scrollbar="false" class="page-scroll" scroll-y lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMoreServices">
 			<view class="hero">
 				<swiper v-if="scenes.length > 0" class="hero-swiper" :current="activeIndex < 0 ? 0 : activeIndex" :circular="scenes.length > 1" :duration="240" @change="handleHeroChange">
 					<swiper-item v-for="(item, index) in scenes" :key="item.id">
diff --git a/rencaika/pages/travel-benefits/travel-benefits.uvue b/rencaika/pages/travel-benefits/travel-benefits.uvue
index e61ce42..c5aff37 100644
--- a/rencaika/pages/travel-benefits/travel-benefits.uvue
+++ b/rencaika/pages/travel-benefits/travel-benefits.uvue
@@ -1,8 +1,8 @@
 <template>
 	<view class="page">
 		<view class="custom-nav" :class="isSolidNav ? 'is-solid' : ''"><view class="nav-bg"></view><view class="safe-space" :style="'height:' + navTop + 'px'"></view><view class="nav-row" :style="'height:' + navHeight + 'px;padding-right:' + navRight + 'px'"><view class="back-button" hover-class="back-button-active" @tap.stop="goBack"><image src="/static/food-assets/arrow-left-white.svg" mode="aspectFit"></image></view><text class="nav-title">游--悦览花城</text><view class="capsule-space" :style="'width:' + navWidth + 'px'"></view></view></view>
-		<scroll-view class="page-scroll" scroll-y lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMore">
-			<view class="hero"><swiper v-if="scenes.length > 0" class="hero-swiper" :current="activeIndex < 0 ? 0 : activeIndex" :circular="scenes.length > 1" :duration="240" @change="handleHeroChange"><swiper-item v-for="(item, index) in scenes" :key="item.id"><image class="hero-image" :src="item.image" mode="aspectFill" @error="replaceSceneImage(index)"></image></swiper-item></swiper><image v-else class="hero-image" :src="currentScene.image" mode="aspectFill" @error="replaceHeroImage"></image><view class="hero-shade"></view><text v-if="currentScene.name != ''" class="scene-name">{{currentScene.name}}</text><text v-if="scenes.length == 0" class="no-gallery">暂无图册内容</text><scroll-view v-else class="scene-scroll" scroll-x scroll-with-animation :scroll-left="sceneScrollLeft" @scrollend="handleSceneScrollEnd"><view class="scene-row" :style="'width:' + sceneTrackWidth + 'rpx'"><view class="scene-pad"></view><view v-for="(item, index) in scenes" :key="item.id" class="scene-item" :class="index == activeIndex ? 'active' : ''" @tap="selectScene(index)"><image :src="item.image" mode="aspectFill" @error="replaceSceneImage(index)"></image></view><view class="scene-pad"></view></view></scroll-view></view>
+		<scroll-view :show-scrollbar="false" class="page-scroll" scroll-y lower-threshold="80" @scroll="handleScroll" @scrolltolower="loadMore">
+			<view class="hero"><swiper v-if="scenes.length > 0" class="hero-swiper" :current="activeIndex < 0 ? 0 : activeIndex" :circular="scenes.length > 1" :duration="240" @change="handleHeroChange"><swiper-item v-for="(item, index) in scenes" :key="item.id"><image class="hero-image" :src="item.image" mode="aspectFill" @error="replaceSceneImage(index)"></image></swiper-item></swiper><image v-else class="hero-image" :src="currentScene.image" mode="aspectFill" @error="replaceHeroImage"></image><view class="hero-shade"></view><text v-if="currentScene.name != ''" class="scene-name">{{currentScene.name}}</text><text v-if="scenes.length == 0" class="no-gallery">暂无图册内容</text><scroll-view :show-scrollbar="false" v-else class="scene-scroll" scroll-x scroll-with-animation :scroll-left="sceneScrollLeft" @scrollend="handleSceneScrollEnd"><view class="scene-row" :style="'width:' + sceneTrackWidth + 'rpx'"><view class="scene-pad"></view><view v-for="(item, index) in scenes" :key="item.id" class="scene-item" :class="index == activeIndex ? 'active' : ''" @tap="selectScene(index)"><image :src="item.image" mode="aspectFill" @error="replaceSceneImage(index)"></image></view><view class="scene-pad"></view></view></scroll-view></view>
 			<view v-if="topicDescription != ''" class="topic-summary"><view class="intro-card"><text>{{topicDescription}}</text></view></view>
 			<view class="service-section"><view class="section-heading"><text>景区服务</text><view></view></view><view v-if="initialLoading" class="list-state"><view class="loading-spinner"></view><text>正在加载景区服务</text></view><view v-else-if="initialError" class="list-state error-state"><text>景区服务加载失败</text><text class="retry-text" @tap="retryInitialLoad">重新加载</text></view><view v-else-if="hasLoaded && visibleServices.length == 0" class="list-state"><text>暂无相关景区服务</text></view><view v-else-if="hasLoaded"><view class="service-item" :class="item.available ? '' : 'is-unavailable'" v-for="item in visibleServices" :key="item.id" @tap="openService(item)"><image class="service-image" :src="item.image" mode="aspectFill" @error="replaceServiceImage(item)"></image><view class="service-info"><text class="service-name">{{item.name}}</text><view v-if="!item.available" class="service-tags"><text class="service-discount">已下架</text></view><view v-else-if="item.tags.length > 0" class="service-tags"><text v-for="tag in item.tags" :key="tag" :class="tag == '券' ? 'coupon-tag' : 'service-discount'">{{tag}}</text></view><view class="address"><image src="/static/benefits-assets/map-pin.svg"></image><text>{{item.address}}</text></view></view></view></view><view v-if="loadingMore" class="list-state compact"><view class="loading-spinner"></view><text>正在加载</text></view><view v-else-if="loadMoreError" class="list-state compact load-error" @tap="retryLoadMore"><text>加载失败,点击重试</text></view><view v-else-if="hasLoaded && !hasMore && visibleServices.length > 0" class="no-more"><text>已经到底了</text></view></view><view class="bottom-space"></view>
 		</scroll-view>

--
Gitblit v1.7.1