Files
zhwl-miniapp/pages/hotel/condition.vue
2025-06-26 12:38:35 +08:00

206 lines
6.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="uni-container">
<u-navbar :autoBack="true" :placeholder="true" bgColor="#fff">
<view slot='center' style="font-size: 36rpx; font-weight: bold;">
入住条件
</view>
</u-navbar>
<scroll-view scroll-y class="scroll">
<view class="form-box">
<view class="form-item">
<view class="label">间数</view>
<u-number-box v-model="detData.room" :min="1" :max="10" integer :disabledInput="true" @change="roomChange"></u-number-box>
</view>
<view class="form-item">
<view class="label">成人数</view>
<u-number-box v-model="detData.adult" :min="adultMin" :max="adultMax" integer :disabledInput="true" @change="adultChange"></u-number-box>
</view>
<view class="form-item">
<view class="label">儿童数</view>
<u-number-box v-model="detData.children" :min="0" :max="childrenMax" integer :disabledInput="true" @change="childrenChange"></u-number-box>
</view>
</view>
<view class="tips">选择儿童年龄我们为您精准筛选可入住房型</view>
<view class="form-box">
<view class="form-item" v-for="(item, index) in childrenList" :key="index">
<view class="label">儿童{{index + 1}}</view>
<view class="value" @click="ageDetail(index)">
<view class="age">{{item}}</view>
<u-icon name="arrow-right" color="rgba(0, 0, 0, 0.45)" size="28rpx"></u-icon>
</view>
</view>
</view>
</scroll-view>
<view class="footer">
<view class="btn" @click="save">确定</view>
</view>
<u-popup :show="showPopupAge" :round="10" mode="bottom">
<view class="age_con">
<view class="head">
<view class="title">儿童年龄</view>
</view>
<view class="age_box">
<view :class="['age', isAge == item ? 'activeAge' : '']" v-for="(item, index) in ageList" :key="index" @click="changeAge(item)">{{item}}</view>
</view>
</view>
</u-popup>
</view>
</template>
<script>
import _config from '../../common/http/config.js'
export default {
data() {
return {
detData: {
room: 1,
adult: 2,
children: 0,
},
adultMin: 1,
adultMax: 8,
childrenMax: 3,
childrenList: [],
ageList: ['<1岁', '1岁', '2岁', '3岁', '4岁', '5岁', '6岁', '7岁', '8岁', '9岁', '10岁', '11岁', '12岁', '13岁', '14岁', '15岁', '16岁', '17岁'],
showPopupAge: false,
isAge: '<1岁',
detAgeIndex: null
};
},
onLoad(options) {
if (uni.getStorageSync('hotel_room')) {
this.detData = uni.getStorageSync('hotel_room');
}
if (uni.getStorageSync('hotel_children')) {
this.childrenList = uni.getStorageSync('hotel_children');
}
this.adultMin = this.detData.room;
this.adultMax = this.detData.room * 8;
this.childrenMax = this.detData.room * 3;
},
methods: {
roomChange(e) {
this.detData.room = e.value;
this.adultMin = this.detData.room;
this.adultMax = this.detData.room * 8;
this.childrenMax = this.detData.room * 3;
if (this.detData.adult < this.detData.room) {
this.detData.adult = this.detData.room;
}
if (this.detData.adult > this.detData.room * 8) {
this.detData.adult = this.detData.room * 8;
}
if (this.detData.children > this.detData.room * 3) {
this.detData.children = this.detData.room * 3;
this.childrenList = this.childrenList.slice(0, this.detData.children);
}
},
adultChange(e) {
this.detData.adult = e.value;
},
childrenChange(e) {
this.detData.children = e.value;
if (this.childrenList.length > this.detData.children) {
this.childrenList = this.childrenList.slice(0, this.detData.children);
}
if (this.childrenList.length < this.detData.children) {
let num = this.detData.children - this.childrenList.length;
for (var i = 0; i < num; i ++) {
this.childrenList.push('<1岁')
};
}
},
ageDetail(i) {
this.isAge = this.childrenList[i];
this.detAgeIndex = i;
this.showPopupAge = true;
},
changeAge(i) {
this.isAge = i;
this.childrenList[this.detAgeIndex] = i;
this.showPopupAge = false;
},
save() {
uni.setStorageSync('hotel_room', this.detData);
uni.setStorageSync('hotel_children', this.childrenList);
uni.navigateBack();
}
}
}
</script>
<style lang="scss" scoped>
page{ background: #F6F6F6; }
.uni-container {
width: 100%;
padding-bottom: 48rpx;
min-height: 100vh;
box-sizing: border-box;
.scroll {padding-bottom: 120rpx;}
.form-box {
background: #FFFFFF;
padding: 0 24rpx;
margin: 24rpx 24rpx 0;
.form-item {
display: flex;
align-items: center;
justify-content: space-between;
height: 96rpx;
border-bottom: 1rpx solid #ECEAEA;
&:last-child {
border: none;
}
.label {
font-size: 28rpx;
color: rgba(0,0,0,0.65);
}
.value {
display: flex; align-items: center;
.age {font-size: 28rpx; color: rgba(0,0,0,0.85); margin-right: 6rpx;}
}
/deep/.u-number-box {
.u-number-box__minus, .u-number-box__plus {
width: 48rpx !important; height: 48rpx !important; border-radius: 4rpx !important; border: 1rpx solid #03AE80 !important; background: rgba(71,175,195,0.1) !important;
.u-icon__icon {color: #03AE80 !important; font-size: 22rpx !important;}
}
.u-number-box__minus--disabled {
border: 1rpx solid rgba(0,0,0,0.25) !important; background: #FFFFFF !important;
.u-icon__icon {color: rgba(0,0,0,0.45) !important;}
}
.u-number-box__input {background: #FFFFFF !important; font-size: 28rpx !important; color: #333333 !important;}
}
}
}
.tips {margin: 24rpx 24rpx 0; font-size: 28rpx; color: rgba(0,0,0,0.65);}
.footer {
position: fixed; left: 0; bottom: 0; width: 100%; padding: 13rpx 0; box-sizing: border-box; background-color: #FFFFFF;
.btn {
margin: 0 auto;
width: 654rpx;
height: 90rpx;
background: #03AE80;
border-radius: 49rpx;
line-height: 90rpx;
text-align: center;
font-weight: 500;
font-size: 32rpx;
color: #FFFFFF;
}
}
.age_con {
padding: 32rpx 32rpx 0;
.head {
margin-bottom: 44rpx;
.title { font-weight: 500; font-size: 34rpx; color: rgba(0,0,0,0.85); }
.text { margin-top: 8rpx; font-size: 28rpx; color: rgba(0,0,0,0.25); }
}
.age_box {
display: flex; align-items: center; flex-wrap: wrap;
.age {
width: 120rpx; height: 64rpx; background: #F6F7F9; border-radius: 4rpx; line-height: 64rpx; text-align: center; margin: 0 21rpx 16rpx 0; font-size: 26rpx; color: rgba(0,0,0,0.65);
&:nth-child(5n) { margin-right: 0; }
}
.activeAge { background: rgba(71,175,195,0.1); border: 1rpx solid #03AE80; color: #03AE80; }
}
}
}
</style>