zhwl-miniapp/pages/hotel/hotelDetail.vue

279 lines
10 KiB
Vue
Raw Permalink Normal View History

2025-06-26 12:38:35 +08:00
<template>
<view class="waper">
<u-navbar :autoBack="true" :bgColor="scrollTop > 10 ? '#fff' : 'transparent'" :leftIconColor="scrollTop > 10 ? '#303133' : '#fff'">
<view slot='center' class="navbar_title" :style="'color:' + (scrollTop > 10 ? '#303133' : '#fff')">酒店详情</view>
</u-navbar>
<view class="banner">
<image src="../../static/image/hotel/hotel_banner.png" mode=""></image>
<view class="data">
<view class="name">{{detail.name}}</view>
<view class="row">
<view>
<text>开业时间{{detail.openingTime}}</text>
<text>装修时间{{detail.decorationTime}}</text>
</view>
<view>酒店地址{{detail.address}}</view>
</view>
<view class="tel_box" v-if="detail.phone">
<u-icon name="phone-fill" color="#FFFFFF" size="28rpx"></u-icon>
<text @click="callTel">酒店电话{{detail.phone}}</text>
</view>
</view>
</view>
<view class="content">
<view class="content_waper">
<view class="facilities">
<view class="active">
<text>设施服务</text>
<image src="../../static/home/title_bg.png" mode=""></image>
</view>
<view class="list_box">
<view class="item" v-for="(item, index) in detail.facilitiesList" :key="index">
<image :src="$utils.setImgUrl(item.logo)" mode=""></image>
<view>{{item.name}}</view>
</view>
</view>
</view>
<view class="notice">
<view class="active">
<text>入住须知</text>
<image src="../../static/home/title_bg.png" mode=""></image>
</view>
<view class="col">
<view class="top">
<image src="../../static/image/hotel/checkInTime.png" mode=""></image>
<view>入离时间</view>
</view>
<view class="bottom">
<view>入住时间{{detail.checkInTime}}之后 离店时间{{detail.leaveTime}}之前</view>
</view>
</view>
<view class="col">
<view class="top">
<image src="../../static/image/hotel/minLimitedAge.png" mode=""></image>
<view>年龄限制</view>
</view>
<view class="bottom">
<view>入住办理人需满{{detail.minLimitedAge}}</view>
</view>
</view>
<view class="col">
<view class="top">
<image src="../../static/image/hotel/invoice.png" mode=""></image>
<view>发票</view>
</view>
<view class="bottom">
<view>
<text>{{detail.invoice == 'N' ? '不' : ''}}</text>
可开具增值税普通/专用发票
</view>
</view>
</view>
<view class="col">
<view class="top">
<image src="../../static/image/hotel/pet.png" mode=""></image>
<view>宠物</view>
</view>
<view class="bottom">
<view>
<text>{{detail.pet == 'N' ? '不' : ''}}</text>
允许携带宠物
</view>
</view>
</view>
</view>
<view class="policy">
<view class="active">
<text>订房必读</text>
<image src="../../static/home/title_bg.png" mode=""></image>
</view>
<view class="row">
<view class="label">城市通知</view>
<u-parse :content="detail.importantNotice"></u-parse>
<view class="label">入住限制</view>
<view class="text">{{detail.checkInWay}}</view>
</view>
</view>
<view class="traffic">
<view class="active">
<text>周边景区</text>
<image src="../../static/home/title_bg.png" mode=""></image>
</view>
<view class="list">
<view class="item" v-for="(item, index) in list" :key="index" @click="goDetail(item.id)">
<view class="left">
<image :src="item.imagePage ? $utils.setImgUrl(item.imagePage.split(',')[0]) : ''" mode=""></image>
</view>
<view class="right">
<view class="title">
<view class="label" v-if="item.scenicLevelName">{{item.scenicLevelName}}</view>
<view class="name">{{item.scenicName}}</view>
</view>
<view class="tags_box" v-if="item.tagList.length > 0">
<view class="tag" v-for="(e, i) in item.tagList" :key="i" v-if="i < 3">{{e.name}}</view>
</view>
<view class="row mt15">
<u-icon name="clock" color="rgba(0,0,0,0.65)" size="32rpx"></u-icon>
<view class="text">{{item.adjust}}</view>
</view>
<view class="row">
<u-icon name="map" color="rgba(0,0,0,0.65)" size="32rpx"></u-icon>
<view class="text ads">{{item.address}}</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data () {
return {
scrollTop: 0,
id: '',
detail: {},
list: []
}
},
onPageScroll(e) {
this.scrollTop = e.scrollTop;
},
onLoad (options) {
this.id = options.id;
this.getDetail();
},
methods: {
async getDetail() {
let res=await this.$http.homestayId(this.id);
res.data.openingTime = res.data.openingTime.split('-')[0];
res.data.decorationTime = res.data.decorationTime.split('-')[0];
this.detail=res.data;
this.getList(this.detail.longitude, this.detail.latitude)
},
async getList (lo, la) {
let obj = { pageNum: 1, pageSize: 2, longitude: lo, latitude: la };
let info = await this.$http.getScenicList(obj);
this.list = info.rows;
},
callTel () {// 拨打电话
uni.makePhoneCall({ phoneNumber: this.detail.phone, fail: () => {} });
},
goDetail(id) {
uni.navigateTo({ url: '/pages/scenic/detail?id=' + id })
}
}
}
</script>
<style lang="scss">
.banner{
width: 100%; height: 560rpx; position: relative;
image { width: 100%; height: 100%; }
.data {
position: absolute; left: 0; top: 0; width: 100%; padding: 195rpx 32rpx 0; box-sizing: border-box;
.name { font-weight: 500; font-size: 36rpx; color: #fff; padding-bottom: 10rpx; line-height: 52rpx; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.row {
margin-top: 20rpx; width: 100%;
view{
width: 100%; color: #fff; font-size: 24rpx; margin-bottom: 12rpx; line-height: 34rpx; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
&:last-child{ margin-bottom: 0; }
text:last-child{ margin-left: 106rpx; }
}
}
.tel_box {
width: 100%; height: 90rpx; background: rgba(255,255,255,0.1); border-radius: 8rpx; display: flex; align-items: center; justify-content: center; margin-top: 34rpx;
text { margin-left: 8rpx; font-weight: 500; font-size: 26rpx; color: #FFFFFF; }
}
}
}
.content{
width: 100%; position: relative; z-index: 5; margin-top: -52rpx; background: #F6F6F6; border-radius: 40rpx 40rpx 0 0; overflow: hidden;
.content_waper{
width: 100%; box-sizing: border-box; padding: 32rpx 24rpx;
.active{
position: relative; display: inline-block; vertical-align: top; margin-bottom: 4rpx;
text{ font-weight: 500; font-size: 36rpx; color: rgba(0,0,0,0.85); }
image{ width: 72rpx; height: 37rpx; position: absolute; z-index: 2; top: 50%; transform: translateY(-50%); right: -46rpx; display: block; }
}
.facilities {
background: #FFFFFF; border-radius: 18rpx; padding: 32rpx 24rpx; box-sizing: border-box;
.list_box {
display: flex; align-items: center; flex-wrap: wrap;
.item {
margin-top: 20rpx; text-align: center; width: 25%;
image { width: 40rpx; height: 40rpx; }
view { margin-top: 8rpx; font-size: 24rpx; color: rgba(0,0,0,0.85); }
}
}
}
.notice {
margin-top: 22rpx; background: #FFFFFF; border-radius: 18rpx; padding: 32rpx 24rpx; box-sizing: border-box;
.col {
margin-top: 20rpx;
.top {
display: flex; align-items: center;
image {width: 24rpx; height: 24rpx; margin-right: 12rpx;}
view {font-size: 28rpx; color: rgba(0,0,0,0.85);}
}
.bottom {
margin: 12rpx 0 0 36rpx;
view { font-size: 26rpx; color: rgba(0,0,0,0.65); }
}
}
}
.policy {
margin-top: 22rpx; background: #FFFFFF; border-radius: 18rpx; padding: 32rpx 24rpx; box-sizing: border-box;
.title { font-weight: 500; font-size: 36rpx; color: rgba(0,0,0,0.85); padding-bottom: 4rpx; }
.row {
.label { font-size: 28rpx; color: rgba(0,0,0,0.85); margin: 20rpx 0 12rpx; }
.text { font-size: 26rpx; color: rgba(0,0,0,0.65); line-height: 30rpx; }
u-parse { font-size: 26rpx; color: rgba(0,0,0,0.65); line-height: 30rpx; }
}
}
.traffic {
margin-top: 22rpx; background: #FFFFFF; border-radius: 18rpx; padding: 32rpx 24rpx; box-sizing: border-box;
.list {
margin-top: 24rpx;
.item {
border-bottom: 1rpx solid #ECEAEA; padding: 0 0 32rpx; margin-bottom: 32rpx; display: flex; align-items: center;
&:last-child { border-bottom: none; margin-bottom: 0; padding-bottom: 0; }
.left {
width: 208rpx; height: 208rpx; margin-right: 20rpx;
image { width: 208rpx; height: 208rpx; }
}
.right {
flex: 1;
.title {
display: flex; align-items: center;
.label { height: 32rpx; padding: 0 12rpx; line-height: 32rpx; background: #03AE80; border-radius: 4rpx; font-weight: 500; font-size: 20rpx; color: #FFFFFF; margin-right: 10rpx; }
.name { font-weight: 500; font-size: 32rpx; color: rgba(0,0,0,0.85); line-height: 38rpx; width: 320rpx; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
}
.tags_box {
margin-top: 10rpx; display: flex; align-items: center;
.tag {
height: 36rpx; padding: 0 14rpx; line-height: 36rpx; margin-right: 16rpx; font-size: 20rpx;
&:last-child{ margin-right: 0; }
&:nth-child(1) { background: rgba(71,175,195,0.1); color: #03AE80; }
&:nth-child(2) { background: rgba(94,208,191,0.1); color: #5ED0BF; }
&:nth-child(3) { background: rgba(255,180,87,0.1); color: #FFB457; }
}
}
.row {
margin-top: 7rpx; display: flex; align-items: center; font-size: 28rpx; color: rgba(0,0,0,0.65); line-height: 33rpx;
.text { margin-left: 8rpx; }
.ads { width: 380rpx; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
}
.mt15 { margin-top: 15rpx; }
}
}
}
}
}
}
</style>