hotelDetail.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996
  1. <template>
  2. <view class="hotelDetail">
  3. <zs-skeleton :loading="loading" type="hotelDetail"></zs-skeleton>
  4. <zs-header :background="background"></zs-header>
  5. <view class="img-box" @click="goImgList">
  6. <image class="top-banner" :src="info.pictures[0].path" mode=""></image>
  7. <view class="num-box">
  8. {{info.pictures.length}}张
  9. </view>
  10. </view>
  11. <view class="container">
  12. <view class="title-box">
  13. <view class="title">
  14. {{info.chineseName}}
  15. <view :class="[getTag(info.star).tag]">
  16. {{info.starName}}
  17. </view>
  18. </view>
  19. <view class="star-box">
  20. <image class="star" v-for="i in getTag(info.star).num" src="../static/star.png" mode=""></image>
  21. </view>
  22. </view>
  23. <view class="desc-box">
  24. <view class="text" v-if="info.debutYear">
  25. {{info.debutYear}}年开业
  26. </view>
  27. <view class="text" v-if="info.decorateDate">
  28. {{info.decorateDate}}年装修
  29. </view>
  30. <!-- <view class="text">
  31. {{info.roomCount}}间房
  32. </view> -->
  33. </view>
  34. <view class="address-box">
  35. <view class="address">
  36. {{info.address}}
  37. </view>
  38. <view class="btn-box">
  39. <view class="btn" @click="handleNavigation">
  40. 导航
  41. </view>
  42. <!-- <view class="btn" @click="handleCall">
  43. 电话
  44. </view> -->
  45. </view>
  46. </view>
  47. <view class="choose-box">
  48. <view class="start-box" @click="show = true">
  49. <view class="label">
  50. 入住
  51. </view>
  52. <view class="time-box">
  53. <view class="time">
  54. {{query.checkIn | filterDate('time')}}
  55. </view>
  56. <view class="date">
  57. {{query.checkIn | filterDate('day')}}
  58. </view>
  59. <view class="day">
  60. {{day}}晚
  61. </view>
  62. </view>
  63. </view>
  64. <view class="end-box" @click="show = true">
  65. <view class="label">
  66. 离店
  67. </view>
  68. <view class="time-box">
  69. <view class="time">
  70. {{query.checkOut | filterDate('time')}}
  71. </view>
  72. <view class="date">
  73. {{query.checkOut | filterDate('day')}}
  74. </view>
  75. </view>
  76. </view>
  77. <view class="people-box">
  78. <view class="people" @click="showNum1 = true">
  79. {{query.manNum}}成人
  80. </view>
  81. <view class="child" @click="showNum2 = true">
  82. {{query.childNum}}儿童
  83. </view>
  84. </view>
  85. <image class="jiantou" src="@/static/right.png" mode=""></image>
  86. </view>
  87. <!-- 列表 -->
  88. <zs-list class="store-box" mt="0" @load="loadMore" :status="status" :contentText="contentText">
  89. <view class="hotel-item" v-for="(item,index) in roomList" :key="index">
  90. <template v-if="item.roomId">
  91. <view class="box">
  92. <zs-img :src="item.pictures[0].path" width="200rpx" height="200rpx" radius="full" mode="widthFix"></zs-img>
  93. <view class="info">
  94. <view class="title">
  95. {{item.roomNameCn}}
  96. </view>
  97. <view class="desc">
  98. <view class="item" v-if="item.area">
  99. {{item.area}}
  100. </view>
  101. <view class="item" v-if="item.window">
  102. {{item.window |filterWindow}}
  103. </view>
  104. </view>
  105. <!-- <view class="notice">
  106. 早餐不可取消
  107. </view> -->
  108. </view>
  109. <view class="price-box">
  110. <view class="price">
  111. ¥{{item.ratePlanInfo[0].averagePrice}}
  112. </view>
  113. <view class="label">
  114. </view>
  115. </view>
  116. </view>
  117. <view class="type-box">
  118. <view class="type-item" v-for="(i,d) in item.ratePlanInfo" :key="i.id" @click.native="handleImg(item,d)">
  119. <view class="left">
  120. <view class="name-box">
  121. <view class="name">
  122. {{i.meal.breakfast.desc || i.mealInfo.substr(3)}}
  123. </view>
  124. <view class="name">
  125. {{i.cancel.name}}
  126. </view>
  127. </view>
  128. <view class="residue">
  129. 还剩{{i.counts}}间
  130. </view>
  131. </view>
  132. <view class="right">
  133. <view class="price">
  134. ¥{{i.averagePrice}}
  135. </view>
  136. <image class="buy-btn" src="../static/hotel-buy-btn.png" mode="" @click.stop="handleBuy(i,item)"></image>
  137. </view>
  138. </view>
  139. </view>
  140. </template>
  141. </view>
  142. </zs-list>
  143. </view>
  144. <view class="intro-box" @click="goIntroduce">
  145. <image class="icon" src="@/static/hotel.png" mode=""></image> 酒店介绍
  146. </view>
  147. <u-popup :show="show1" round="16rpx" mode="bottom" @close="show1 = false">
  148. <view class="content">
  149. <image class="img" :src="roomInfo.pictures[0].path" mode=""></image>
  150. <view class="title">
  151. {{roomInfo.roomNameCn}}
  152. </view>
  153. <view class="desc-box">
  154. <view class="item" v-if="roomInfo.area">
  155. {{roomInfo.area}}
  156. </view>
  157. <view class="item">
  158. {{roomInfo.floor}}
  159. </view>
  160. <view class="item" v-if="roomInfo.window.toString() == 'null'">
  161. {{roomInfo.window |filterWindow}}
  162. </view>
  163. </view>
  164. <view class="box">
  165. <view class="menu-item">
  166. <view class="title">
  167. <image class="icon" src="../static/hotel-icon1.png" mode=""></image>
  168. {{roomInfo.ratePlanInfo[roomIndex].bedInfo || ''}}(加床:{{roomInfo.isExtraBed}})
  169. </view>
  170. <view class="title">
  171. <image class="icon" src="../static/hotel-icon2.png" mode=""></image>
  172. {{roomInfo.ratePlanInfo[roomIndex].mealInfo}}
  173. </view>
  174. </view>
  175. <view class="menu-item" v-for="item in roomFacilities" :key="item.name">
  176. <view class="title">
  177. <image class="icon" src="../static/hotel-icon5.png" mode=""></image>
  178. {{item.name}}
  179. </view>
  180. <view class="item-box">
  181. <view class="item" v-for="i in item.list" :key="i">
  182. {{i}}
  183. </view>
  184. </view>
  185. </view>
  186. <!-- <view class="menu-item">
  187. <view class="title">
  188. <image class="icon" src="../static/hotel-icon4.png" mode=""></image>
  189. 家具设施
  190. </view>
  191. <view class="item-box">
  192. <view class="item">
  193. 书桌
  194. </view>
  195. <view class="item">
  196. 坐卧两用沙发
  197. </view>
  198. <view class="item">
  199. 沙发
  200. </view>
  201. </view>
  202. </view>
  203. <view class="menu-item">
  204. <view class="title">
  205. <image class="icon" src="../static/hotel-icon5.png" mode=""></image>
  206. 便利设施
  207. </view>
  208. <view class="item-box">
  209. <view class="item">
  210. 书桌
  211. </view>
  212. <view class="item">
  213. 坐卧两用沙发
  214. </view>
  215. <view class="item">
  216. 沙发
  217. </view>
  218. </view>
  219. </view> -->
  220. </view>
  221. </view>
  222. </u-popup>
  223. <u-calendar
  224. startText="住店"
  225. endText="离店"
  226. :monthNum="5"
  227. confirmDisabledText="请选择离店日期"
  228. :show="show"
  229. mode="range"
  230. @confirm="confirm"
  231. @close="show = false"
  232. ref="calendar"
  233. :rowHeight="100"
  234. closeOnClickOverlay
  235. color="#EE4320"
  236. :defaultDate="[query.checkIn,query.checkOut]"
  237. >
  238. </u-calendar>
  239. <!-- 选择成人 -->
  240. <u-picker title="成人人数" :show="showNum1" closeOnClickOverlay :columns="columns" @close="showNum1 = false" @cancel="showNum1 = false" @confirm="confirmMan"></u-picker>
  241. <!-- 选择儿童 -->
  242. <u-picker title="儿童人数" :show="showNum2" closeOnClickOverlay :columns="columns" @close="showNum2 = false" @cancel="showNum2 = false" @confirm="confirmChild"></u-picker>
  243. </view>
  244. </template>
  245. <script>
  246. import {getHotelDetail,getRoomList} from '@/api/hotel.js'
  247. import {transformFromWGSToGCJ} from '@/utils/tool.js'
  248. import {
  249. getShareInfo
  250. } from '@/api/common.js'
  251. export default {
  252. data() {
  253. return {
  254. shareInfo:{
  255. shareDescribe:'慧研学惠生活',
  256. shareImg:'https://hyxhsh.oss-cn-chengdu.aliyuncs.com/63b7c68b71a69169d1b33f92/store/bdb/user/avatar/XHBjBiMRhVYG8f1a30bbbd80c2346197b81470444c9a.png/1.png',
  257. shareTitle:'慧研学惠生活',
  258. },
  259. background: false,
  260. status:'noMore',
  261. loading : true,
  262. list:10,
  263. show:false,
  264. show1:false,
  265. showNum1:false,
  266. showNum2:false,
  267. contentText:{contentdown: "上拉显示更多",contentrefresh: "正在加载...",contentnomore: "没有更多数据了"},
  268. info:{pictures:[]},
  269. columns:[
  270. [
  271. 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
  272. ]
  273. ],
  274. query:{
  275. "checkIn": uni.$u.timeFormat(new Date().getTime(), 'yyyy-mm-dd'),
  276. "checkOut": uni.$u.timeFormat(new Date().getTime()+1000*60*60*24, 'yyyy-mm-dd'),
  277. "childAges": [],
  278. "childNum": 0,
  279. "excludeOta": true,
  280. "hotelId": 0,
  281. "manNum": 1,
  282. "roomNum": 1
  283. },
  284. day:1,
  285. pictures:[],
  286. roomList:[],
  287. roomIndex:0,//当前的房型index
  288. roomFacilities:[],
  289. roomInfo:{
  290. area:'',
  291. bedDescription:'',
  292. broadband:'',
  293. facilities:'',
  294. floor:'',
  295. isExtraBed:'',
  296. noSmoking:'',
  297. pictures:'',
  298. ratePlanInfo:'',
  299. roomId:'',
  300. roomNameCn:'',
  301. wifi:'',
  302. window: 4
  303. }
  304. }
  305. },
  306. filters: {
  307. filterDate: function(value,type) {
  308. let timestamp = new Date(value).getTime()
  309. if(type == 'time'){
  310. return uni.$u.timeFormat(timestamp, 'mm月dd日');
  311. }else if(type == 'day'){
  312. let arr = ['日','一','二','三','四','五','六']
  313. let num = new Date(timestamp).getDay()
  314. return `周${arr[num]}`
  315. }
  316. },
  317. filterWindow:function(val){
  318. if(val === 0){
  319. return '无窗'
  320. }else if(val === 1){
  321. return '部分有窗'
  322. }else if(val === 2){
  323. return '有窗'
  324. }else if(val === 3){
  325. return '不确定'
  326. }else if(val === 4){
  327. return '内窗'
  328. }else if(val === 5){
  329. return '天窗'
  330. }else if(val === 6){
  331. return '封闭窗'
  332. }else if(val === 7){
  333. return '飘窗'
  334. }else if(val === 11){
  335. return '不确定'
  336. }else{
  337. return ''
  338. }
  339. },
  340. filterWifi:function(val){
  341. if(val === 1){
  342. return '免费提供'
  343. }else if(val === 2){
  344. return '不提供此服务'
  345. }else if(val === 3){
  346. return '收费提供'
  347. }else if(val === 4){
  348. return '部分收费'
  349. }else if(val === 5){
  350. return '部分提供并收费'
  351. }else if(val === 6){
  352. return '部分能提供并免费'
  353. }else if(val === 7){
  354. return '部分提供并只有部分和收费'
  355. }else if(val === 8){
  356. return '有'
  357. }else if(val === 9){
  358. return '不确定'
  359. }
  360. }
  361. },
  362. methods: {
  363. getTag(star){
  364. if(star == 0 ||star == 1){
  365. return {tag:'tag1',num:1}
  366. }else if(star == 2 ||star == 6){
  367. return {tag:'tag2',num:2}
  368. }if(star == 3 ||star == 7){
  369. return {tag:'tag2',num:3}
  370. }if(star == 4 ||star == 8){
  371. return {tag:'tag3',num:4}
  372. }if(star == 5 ||star == 9){
  373. return {tag:'tag3',num:5}
  374. }
  375. },
  376. confirm(e) {
  377. this.show = false
  378. if(e){
  379. this.day = e.length - 1
  380. this.query.checkIn = e[0]
  381. this.query.checkOut = e[this.day]
  382. this.getRoomList()
  383. }
  384. },
  385. confirmMan(val){
  386. console.log(val);
  387. this.showNum1 = false
  388. this.query.manNum = val.value[0]
  389. this.query.roomNum = val.value[0]
  390. this.getRoomList()
  391. },
  392. confirmChild(val){
  393. console.log(val);
  394. this.showNum2 = false
  395. this.query.childNum = val.value[0]
  396. this.getRoomList()
  397. },
  398. goImgList(){
  399. uni.navigateTo({
  400. url:`./hotelImgList?id=${this.query.hotelId}`
  401. })
  402. uni.setStorageSync('hotelImgList',JSON.stringify(this.pictures))
  403. },
  404. handleBuy(i,item){
  405. if(JSON.parse(uni.getStorageSync('userInfo')).setMealCode != 0&&JSON.parse(uni.getStorageSync('userInfo')).setMealCode){
  406. let that = this
  407. uni.navigateTo({
  408. url:`./makeOut?checkInDate=${this.query.checkIn}&checkOutDate=${this.query.checkOut}&day=${this.day}`,
  409. success: function(res) {
  410. // 通过eventChannel向被打开页面传送数据
  411. let obj = {
  412. manNum:that.query.manNum,
  413. childNum:that.query.childNum,
  414. hotelId:that.query.hotelId,
  415. ratePlanId:i.id,
  416. averagePrice:i.averagePrice,
  417. roomPic:item.pictures[0].path,
  418. hotelPic:that.info.pictures[0].path,
  419. roomNameCn:item.roomNameCn,
  420. area:item.area,
  421. window:item.window,
  422. meal:i.meal.breakfast.desc || i.mealInfo.substr(3),
  423. cancel:i.cancel.name,
  424. }
  425. res.eventChannel.emit('pay', obj)
  426. }
  427. })
  428. }else{
  429. uni.showModal({
  430. title:'此商品需要开通会员才能购买',
  431. cancelText:'下次再说',
  432. confirmText:'立即开通',
  433. success(res) {
  434. if(res.confirm){
  435. uni.navigateTo({
  436. url:'/my/memberCenter/index'
  437. })
  438. }
  439. }
  440. })
  441. }
  442. },
  443. goIntroduce(){
  444. uni.navigateTo({
  445. url:`./introduce?id=${this.query.hotelId}`
  446. })
  447. },
  448. handleImg(item,index){
  449. this.show1 = true
  450. this.roomInfo = item
  451. this.roomIndex = index
  452. console.log(this.roomInfo);
  453. let obj = {}
  454. item.facilities.map(i=>{
  455. if(obj[i.name]){
  456. obj[i.name].push(i.tmpSubFacilities[0].subName)
  457. }else{
  458. obj[i.name] = [i.tmpSubFacilities[0].subName]
  459. }
  460. })
  461. let list = []
  462. for (let key in obj) {
  463. list.push({name:key,list:obj[key]})
  464. }
  465. console.log(111111111,list);
  466. this.roomFacilities = list
  467. },
  468. handleNavigation() {
  469. let {latitude,longitude} = transformFromWGSToGCJ(this.info.latitudeGoogle,this.info.longitudeGoogle)
  470. uni.openLocation({
  471. latitude,
  472. longitude,
  473. name:this.info.storeName,
  474. address:this.info.address,
  475. success: function () {
  476. console.log('success');
  477. }
  478. });
  479. // this.map.openMapApp({
  480. // longitude:this.info.lon,
  481. // latitude:this.info.lat,
  482. // destination:this.info.storeName,
  483. // success(res){
  484. // console.log(res);
  485. // }
  486. // })
  487. },
  488. handleCall() {
  489. if(this.info.tel){
  490. uni.makePhoneCall({
  491. phoneNumber: this.info.tel //仅为示例
  492. });
  493. }else{
  494. uni.showToast({
  495. title:'商家没有预留电话',
  496. icon:'none'
  497. })
  498. }
  499. },
  500. getHotelDetail(hotelId){
  501. this.loading = true
  502. getHotelDetail({hotelId}).then(res=>{
  503. if(res.state == 'Success'){
  504. this.loading = false
  505. this.info = res.content.data
  506. let obj = {}
  507. this.info.pictures.map(item=>{
  508. if(obj[item.name]){
  509. obj[item.name].push(item.path)
  510. }else{
  511. obj[item.name] = [item.path]
  512. }
  513. })
  514. let list = []
  515. for (let key in obj) {
  516. list.push({name:key,list:obj[key]})
  517. }
  518. this.pictures = list
  519. }
  520. })
  521. },
  522. getRoomList(){
  523. uni.showLoading({
  524. title:'加载中'
  525. })
  526. getRoomList(this.query).then(res=>{
  527. uni.hideLoading()
  528. if(res.state == 'Success'){
  529. this.roomList = res.content.data.roomInfo
  530. if(!this.roomList.length){
  531. this.contentText.contentnomore = '酒店可能太抢手,暂无符合条件的报价。请搜索其他酒店或调整入住时间'
  532. }
  533. }
  534. })
  535. },
  536. getShareInfo(){
  537. getShareInfo({id:1}).then(res=>{
  538. if(res.state == 'Success'){
  539. this.shareInfo = {
  540. shareDescribe:res.content.shareDescribe,
  541. shareImg:res.content.shareImg,
  542. shareTitle:res.content.shareTitle,
  543. }
  544. }
  545. })
  546. }
  547. },
  548. onPageScroll(e) {
  549. if (e.scrollTop >= 50) {
  550. this.background = true
  551. } else {
  552. this.background = false
  553. }
  554. },
  555. onLoad(options) {
  556. this.getShareInfo()
  557. this.query.hotelId = options.id
  558. this.day = options.day || 1
  559. if(options.checkInDate){
  560. this.query.checkIn = options.checkInDate
  561. }
  562. if(options.checkOutDate){
  563. this.query.checkOut = options.checkOutDate
  564. }
  565. this.getHotelDetail(options.id)
  566. this.getRoomList()
  567. },
  568. onShareTimeline() {
  569. return {
  570. title: this.shareInfo.shareDescribe,
  571. query: "id=1",
  572. imageUrl: this.shareInfo.shareImg,
  573. };
  574. },
  575. onShareAppMessage() {
  576. return {
  577. title: this.shareInfo.shareDescribe,
  578. path: "/hotel/hotelDetail?"+this.query.hotelId,
  579. imageUrl: this.shareInfo.shareImg,
  580. };
  581. },
  582. }
  583. </script>
  584. <style lang="scss" >
  585. .hotelDetail{
  586. padding-bottom: 150rpx;
  587. .img-box{
  588. position: relative;
  589. .top-banner{
  590. width: 750rpx;
  591. height: 382rpx;
  592. vertical-align: bottom;
  593. }
  594. .num-box{
  595. position: absolute;
  596. right: 24rpx;
  597. bottom: 50rpx;
  598. width: 104rpx;
  599. height: 40rpx;
  600. line-height: 40rpx;
  601. text-align: center;
  602. background: rgba(255,255,255,0.5);
  603. border-radius: 26rpx 26rpx 26rpx 26rpx;
  604. font-size: 24rpx;
  605. color: #FFFFFF;
  606. }
  607. }
  608. .container{
  609. position: relative;
  610. z-index: 2;
  611. margin-top: -20rpx;
  612. background: #fff;
  613. border-radius: 16rpx 16rpx 0 0;
  614. padding: 20rpx 24rpx;
  615. .title-box{
  616. display: flex;
  617. align-items: center;
  618. justify-content: space-between;
  619. .title{
  620. font-weight: 600;
  621. font-size: 32rpx;
  622. color: #222222;
  623. width: 550rpx;
  624. white-space: nowrap;
  625. overflow: hidden;
  626. text-overflow: ellipsis;
  627. margin-top: 20rpx;
  628. display: flex;
  629. align-items: center;
  630. }
  631. .star-box{
  632. display: flex;
  633. align-items: center;
  634. .star{
  635. width: 21rpx;
  636. height: 17rpx;
  637. margin-left: 3rpx;
  638. }
  639. }
  640. }
  641. .desc-box{
  642. display: flex;
  643. align-items: center;
  644. font-size: 24rpx;
  645. color: #AAAAAA;
  646. margin-top: 20rpx;
  647. .text{
  648. padding-right: 10rpx;
  649. }
  650. .text+.text{
  651. border-left: 2rpx solid #F0F0F0;
  652. padding-left: 10rpx;
  653. }
  654. }
  655. .address-box{
  656. display: flex;
  657. align-items: center;
  658. justify-content: space-between;
  659. width: 702rpx;
  660. height: 140rpx;
  661. background-image: url('@/static/white-map.png');
  662. background-repeat: repeat;
  663. background-size: 100% 140rpx;
  664. box-sizing: border-box;
  665. padding: 36rpx 24rpx;
  666. margin-top: 20rpx;
  667. .address{
  668. font-weight: 600;
  669. font-size: 24rpx;
  670. color: #222222;
  671. line-height: 40rpx;
  672. overflow: hidden;
  673. padding-right: 20rpx;
  674. text-overflow: ellipsis;
  675. /* 弹性伸缩盒子模型显示 */
  676. display: -webkit-box;
  677. /* 限制在一个块元素显示的文本的行数 */
  678. -webkit-line-clamp: 2;
  679. /* 设置或检索伸缩盒对象的子元素的排列方式 */
  680. -webkit-box-orient: vertical;
  681. }
  682. .btn-box{
  683. display: flex;
  684. .btn+.btn{
  685. margin-left: 16rpx;
  686. }
  687. .btn{
  688. width: 120rpx;
  689. height: 52rpx;
  690. line-height: 52rpx;
  691. text-align: center;
  692. background: #E2ECFF;
  693. border-radius: 26rpx 26rpx 26rpx 26rpx;
  694. font-weight: 300;
  695. font-size: 28rpx;
  696. color: #3879F9;
  697. }
  698. }
  699. }
  700. .choose-box{
  701. background: #F9F9F9;
  702. border-radius: 16rpx 16rpx 16rpx 16rpx;
  703. padding: 24rpx;
  704. display: flex;
  705. align-items: center;
  706. position: relative;
  707. margin-top: 20rpx;
  708. .start-box,.end-box{
  709. padding-right: 24rpx;
  710. .label{
  711. font-size: 24rpx;
  712. color: #222222;
  713. }
  714. .time-box{
  715. display: flex;
  716. align-items: center;
  717. margin-top: 16rpx;
  718. .time{
  719. font-weight: 600;
  720. font-size: 28rpx;
  721. color: #222222;
  722. }
  723. .date{
  724. font-size: 24rpx;
  725. color: #222222;
  726. margin-left: 16rpx;
  727. }
  728. .day{
  729. width: 80rpx;
  730. height: 36rpx;
  731. line-height: 36rpx;
  732. text-align: center;
  733. background: #F0F0F0;
  734. border-radius: 18rpx 18rpx 18rpx 18rpx;
  735. font-size: 20rpx;
  736. color: #222222;
  737. margin-left: 24rpx;
  738. }
  739. }
  740. }
  741. .people-box{
  742. padding-left: 24rpx;
  743. border-left: 2rpx solid #F0F0F0;
  744. .people,.child{
  745. font-size: 24rpx;
  746. color: #222222;
  747. }
  748. .child{
  749. margin-top: 16rpx;
  750. }
  751. }
  752. .jiantou{
  753. width: 48rpx;
  754. height: 48rpx;
  755. position: absolute;
  756. top: 50%;
  757. right: 0%;
  758. margin-top: -24rpx;
  759. }
  760. }
  761. .zs-list {
  762. margin-top: 20rpx;
  763. .hotel-item {
  764. .box{
  765. display: flex;
  766. align-items: center;
  767. background: #fff;
  768. border-bottom: 1rpx solid #F0F0F0;
  769. padding: 24rpx 0;
  770. .info{
  771. padding-left: 20rpx;
  772. flex: 1;
  773. .title{
  774. font-weight: 600;
  775. font-size: 36rpx;
  776. color: #222222;
  777. width: 300rpx;
  778. white-space: nowrap;
  779. overflow: hidden;
  780. text-overflow: ellipsis;
  781. margin-top: 20rpx;
  782. }
  783. .desc{
  784. display: flex;
  785. align-items: center;
  786. font-size: 24rpx;
  787. color: #AAAAAA;
  788. margin-top: 20rpx;
  789. .item{
  790. padding-right: 10rpx;
  791. }
  792. .item+.item{
  793. padding-left: 10rpx;
  794. border-left: 2rpx solid #F0F0F0;
  795. }
  796. }
  797. .notice{
  798. font-size: 24rpx;
  799. color: #AAAAAA;
  800. margin-top: 20rpx;
  801. }
  802. }
  803. .price-box{
  804. display: flex;
  805. align-items: center;
  806. .price{
  807. font-weight: 600;
  808. font-size: 36rpx;
  809. color: #FF4D3A;
  810. }
  811. .label{
  812. font-size: 24rpx;
  813. color: #AAAAAA;
  814. }
  815. }
  816. }
  817. }
  818. .type-box{
  819. .type-item+.type-item{
  820. border-top: 1rpx solid #F0F0F0;
  821. }
  822. .type-item{
  823. display: flex;
  824. justify-content: space-between;
  825. align-items: center;
  826. padding: 28rpx 24rpx;
  827. background: #F9F9F9;
  828. .left{
  829. .name-box{
  830. display: flex;
  831. align-items: center;
  832. font-size: 28rpx;
  833. color: #222222;
  834. .name{
  835. padding-right: 20rpx;
  836. }
  837. .name+.name{
  838. padding-left: 20rpx;
  839. border-left: 1rpx solid #222222;
  840. }
  841. }
  842. .residue{
  843. font-size: 24rpx;
  844. color: #FF4D3A;
  845. margin-top: 16rpx;
  846. }
  847. }
  848. .right{
  849. display: flex;
  850. align-items: center;
  851. .price{
  852. font-weight: 600;
  853. font-size: 36rpx;
  854. color: #FF4D3A;
  855. }
  856. .buy-btn{
  857. width: 76rpx;
  858. height: 84rpx;
  859. margin-left: 20rpx;
  860. }
  861. }
  862. }
  863. }
  864. }
  865. }
  866. .intro-box{
  867. position: fixed;
  868. bottom: 0;
  869. left: 0%;
  870. width: 100%;
  871. height: 98rpx;
  872. line-height: 98rpx;
  873. text-align: center;
  874. border-top: 1rpx solid #EEEEEE;
  875. font-size: 28rpx;
  876. color: #222222;
  877. background: #fff;
  878. z-index: 2;
  879. padding-bottom: env(safe-area-inset-bottom);
  880. .icon{
  881. width: 30rpx;
  882. height: 30rpx;
  883. }
  884. }
  885. .content{
  886. max-height: calc(100vh - 362rpx);
  887. overflow: auto;
  888. border-radius: 16rpx;
  889. padding: 24rpx;
  890. box-sizing: border-box;
  891. .img{
  892. width: 100%;
  893. height: 376rpx;
  894. border-radius: 16rpx;
  895. }
  896. .title{
  897. font-weight: 600;
  898. font-size: 32rpx;
  899. color: #222222;
  900. width: 650rpx;
  901. white-space: nowrap;
  902. overflow: hidden;
  903. text-overflow: ellipsis;
  904. margin-top: 24rpx;
  905. }
  906. .desc-box{
  907. display: flex;
  908. flex-wrap: wrap;
  909. margin-top: 24rpx;
  910. .item{
  911. width: 120rpx;
  912. height: 36rpx;
  913. line-height: 36rpx;
  914. text-align: center;
  915. background: #F0F0F0;
  916. border-radius: 8rpx 8rpx 8rpx 8rpx;
  917. font-size: 24rpx;
  918. color: #AAAAAA;
  919. margin-bottom: 20rpx;
  920. }
  921. .item+.item{
  922. margin-left: 12rpx;
  923. }
  924. }
  925. .box{
  926. .menu-item+.menu-item{
  927. border-top: 1rpx solid #F0F0F0;
  928. }
  929. .menu-item{
  930. margin-bottom: 20rpx;
  931. .title{
  932. display: flex;
  933. align-items: center;
  934. .icon{
  935. width: 30rpx;
  936. height: 30rpx;
  937. margin-right: 12rpx;
  938. }
  939. }
  940. .item-box{
  941. display: flex;
  942. flex-wrap: wrap;
  943. margin-top: 20rpx;
  944. .item{
  945. width: 33%;
  946. text-align: center;
  947. font-size: 24rpx;
  948. color: #AAAAAA;
  949. margin-bottom: 20rpx;
  950. }
  951. }
  952. }
  953. }
  954. }
  955. }
  956. </style>