hotelDetail.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958
  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">
  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. export default {
  249. data() {
  250. return {
  251. background: false,
  252. status:'noMore',
  253. loading : true,
  254. list:10,
  255. show:false,
  256. show1:false,
  257. showNum1:false,
  258. showNum2:false,
  259. info:{pictures:[]},
  260. columns:[
  261. [
  262. 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
  263. ]
  264. ],
  265. query:{
  266. "checkIn": uni.$u.timeFormat(new Date().getTime(), 'yyyy-mm-dd'),
  267. "checkOut": uni.$u.timeFormat(new Date().getTime()+1000*60*60*24, 'yyyy-mm-dd'),
  268. "childAges": [],
  269. "childNum": 0,
  270. "excludeOta": true,
  271. "hotelId": 0,
  272. "manNum": 1,
  273. "roomNum": 1
  274. },
  275. day:1,
  276. pictures:[],
  277. roomList:[],
  278. roomIndex:0,//当前的房型index
  279. roomFacilities:[],
  280. roomInfo:{
  281. area:'',
  282. bedDescription:'',
  283. broadband:'',
  284. facilities:'',
  285. floor:'',
  286. isExtraBed:'',
  287. noSmoking:'',
  288. pictures:'',
  289. ratePlanInfo:'',
  290. roomId:'',
  291. roomNameCn:'',
  292. wifi:'',
  293. window: 4
  294. }
  295. }
  296. },
  297. filters: {
  298. filterDate: function(value,type) {
  299. let timestamp = new Date(value).getTime()
  300. if(type == 'time'){
  301. return uni.$u.timeFormat(timestamp, 'mm月dd日');
  302. }else if(type == 'day'){
  303. let arr = ['日','一','二','三','四','五','六']
  304. let num = new Date(timestamp).getDay()
  305. return `周${arr[num]}`
  306. }
  307. },
  308. filterWindow:function(val){
  309. if(val === 0){
  310. return '无窗'
  311. }else if(val === 1){
  312. return '部分有窗'
  313. }else if(val === 2){
  314. return '有窗'
  315. }else if(val === 3){
  316. return '不确定'
  317. }else if(val === 4){
  318. return '内窗'
  319. }else if(val === 5){
  320. return '天窗'
  321. }else if(val === 6){
  322. return '封闭窗'
  323. }else if(val === 7){
  324. return '飘窗'
  325. }else if(val === 11){
  326. return '不确定'
  327. }else{
  328. return ''
  329. }
  330. },
  331. filterWifi:function(val){
  332. if(val === 1){
  333. return '免费提供'
  334. }else if(val === 2){
  335. return '不提供此服务'
  336. }else if(val === 3){
  337. return '收费提供'
  338. }else if(val === 4){
  339. return '部分收费'
  340. }else if(val === 5){
  341. return '部分提供并收费'
  342. }else if(val === 6){
  343. return '部分能提供并免费'
  344. }else if(val === 7){
  345. return '部分提供并只有部分和收费'
  346. }else if(val === 8){
  347. return '有'
  348. }else if(val === 9){
  349. return '不确定'
  350. }
  351. }
  352. },
  353. methods: {
  354. getTag(star){
  355. if(star == 0 ||star == 1){
  356. return {tag:'tag1',num:1}
  357. }else if(star == 2 ||star == 6){
  358. return {tag:'tag2',num:2}
  359. }if(star == 3 ||star == 7){
  360. return {tag:'tag2',num:3}
  361. }if(star == 4 ||star == 8){
  362. return {tag:'tag3',num:4}
  363. }if(star == 5 ||star == 9){
  364. return {tag:'tag3',num:5}
  365. }
  366. },
  367. confirm(e) {
  368. this.show = false
  369. if(e){
  370. this.day = e.length - 1
  371. this.query.checkIn = e[0]
  372. this.query.checkOut = e[this.day]
  373. this.getRoomList()
  374. }
  375. },
  376. confirmMan(val){
  377. console.log(val);
  378. this.showNum1 = false
  379. this.query.manNum = val.value[0]
  380. this.query.roomNum = val.value[0]
  381. this.getRoomList()
  382. },
  383. confirmChild(val){
  384. console.log(val);
  385. this.showNum2 = false
  386. this.query.childNum = val.value[0]
  387. this.getRoomList()
  388. },
  389. goImgList(){
  390. uni.navigateTo({
  391. url:`./hotelImgList?id=${this.query.hotelId}`
  392. })
  393. uni.setStorageSync('hotelImgList',JSON.stringify(this.pictures))
  394. },
  395. handleBuy(i,item){
  396. let that = this
  397. uni.navigateTo({
  398. url:`./makeOut?checkInDate=${this.query.checkIn}&checkOutDate=${this.query.checkOut}&day=${this.day}`,
  399. success: function(res) {
  400. // 通过eventChannel向被打开页面传送数据
  401. let obj = {
  402. manNum:that.query.manNum,
  403. childNum:that.query.childNum,
  404. hotelId:that.query.hotelId,
  405. ratePlanId:i.id,
  406. averagePrice:i.averagePrice,
  407. roomPic:item.pictures[0].path,
  408. hotelPic:that.info.pictures[0].path,
  409. roomNameCn:item.roomNameCn,
  410. area:item.area,
  411. window:item.window,
  412. meal:i.meal.breakfast.desc || i.mealInfo.substr(3),
  413. cancel:i.cancel.name,
  414. }
  415. res.eventChannel.emit('pay', obj)
  416. }
  417. })
  418. },
  419. goIntroduce(){
  420. uni.navigateTo({
  421. url:`./introduce?id=${this.query.hotelId}`
  422. })
  423. },
  424. handleImg(item,index){
  425. this.show1 = true
  426. this.roomInfo = item
  427. this.roomIndex = index
  428. console.log(this.roomInfo);
  429. let obj = {}
  430. item.facilities.map(i=>{
  431. if(obj[i.name]){
  432. obj[i.name].push(i.tmpSubFacilities[0].subName)
  433. }else{
  434. obj[i.name] = [i.tmpSubFacilities[0].subName]
  435. }
  436. })
  437. let list = []
  438. for (let key in obj) {
  439. list.push({name:key,list:obj[key]})
  440. }
  441. console.log(111111111,list);
  442. this.roomFacilities = list
  443. },
  444. loadMore(){},
  445. handleNavigation() {
  446. let {latitude,longitude} = transformFromWGSToGCJ(this.info.latitudeGoogle,this.info.longitudeGoogle)
  447. uni.openLocation({
  448. latitude,
  449. longitude,
  450. name:this.info.storeName,
  451. address:this.info.address,
  452. success: function () {
  453. console.log('success');
  454. }
  455. });
  456. // this.map.openMapApp({
  457. // longitude:this.info.lon,
  458. // latitude:this.info.lat,
  459. // destination:this.info.storeName,
  460. // success(res){
  461. // console.log(res);
  462. // }
  463. // })
  464. },
  465. handleCall() {
  466. if(this.info.tel){
  467. uni.makePhoneCall({
  468. phoneNumber: this.info.tel //仅为示例
  469. });
  470. }else{
  471. uni.showToast({
  472. title:'商家没有预留电话',
  473. icon:'none'
  474. })
  475. }
  476. },
  477. getHotelDetail(hotelId){
  478. this.loading = true
  479. getHotelDetail({hotelId}).then(res=>{
  480. if(res.state == 'Success'){
  481. this.loading = false
  482. this.info = res.content.data
  483. let obj = {}
  484. this.info.pictures.map(item=>{
  485. if(obj[item.name]){
  486. obj[item.name].push(item.path)
  487. }else{
  488. obj[item.name] = [item.path]
  489. }
  490. })
  491. let list = []
  492. for (let key in obj) {
  493. list.push({name:key,list:obj[key]})
  494. }
  495. this.pictures = list
  496. }
  497. })
  498. },
  499. getRoomList(){
  500. uni.showLoading({
  501. title:'加载中'
  502. })
  503. getRoomList(this.query).then(res=>{
  504. uni.hideLoading()
  505. if(res.state == 'Success'){
  506. this.roomList = res.content.data.roomInfo
  507. console.log(this.roomList);
  508. }
  509. })
  510. }
  511. },
  512. onPageScroll(e) {
  513. if (e.scrollTop >= 50) {
  514. this.background = true
  515. } else {
  516. this.background = false
  517. }
  518. },
  519. onLoad(options) {
  520. this.query.hotelId = options.id
  521. this.day = options.day || 1
  522. if(options.checkInDate){
  523. this.query.checkIn = options.checkInDate
  524. }
  525. if(options.checkOutDate){
  526. this.query.checkOut = options.checkOutDate
  527. }
  528. this.getHotelDetail(options.id)
  529. this.getRoomList()
  530. },
  531. onShareTimeline() {
  532. return {
  533. title: "慧研学惠生活-"+this.info.chineseName,
  534. query: "id="+this.id,
  535. };
  536. },
  537. onShareAppMessage() {
  538. return {
  539. title: "慧研学惠生活-"+this.info.chineseName,
  540. path: "/pages/signUp/index?id="+this.id,
  541. };
  542. },
  543. }
  544. </script>
  545. <style lang="scss" >
  546. .hotelDetail{
  547. padding-bottom: 150rpx;
  548. .img-box{
  549. position: relative;
  550. .top-banner{
  551. width: 750rpx;
  552. height: 382rpx;
  553. vertical-align: bottom;
  554. }
  555. .num-box{
  556. position: absolute;
  557. right: 24rpx;
  558. bottom: 50rpx;
  559. width: 104rpx;
  560. height: 40rpx;
  561. line-height: 40rpx;
  562. text-align: center;
  563. background: rgba(255,255,255,0.5);
  564. border-radius: 26rpx 26rpx 26rpx 26rpx;
  565. font-size: 24rpx;
  566. color: #FFFFFF;
  567. }
  568. }
  569. .container{
  570. position: relative;
  571. z-index: 2;
  572. margin-top: -20rpx;
  573. background: #fff;
  574. border-radius: 16rpx 16rpx 0 0;
  575. padding: 20rpx 24rpx;
  576. .title-box{
  577. display: flex;
  578. align-items: center;
  579. justify-content: space-between;
  580. .title{
  581. font-weight: 600;
  582. font-size: 32rpx;
  583. color: #222222;
  584. width: 550rpx;
  585. white-space: nowrap;
  586. overflow: hidden;
  587. text-overflow: ellipsis;
  588. margin-top: 20rpx;
  589. display: flex;
  590. align-items: center;
  591. }
  592. .star-box{
  593. display: flex;
  594. align-items: center;
  595. .star{
  596. width: 21rpx;
  597. height: 17rpx;
  598. margin-left: 3rpx;
  599. }
  600. }
  601. }
  602. .desc-box{
  603. display: flex;
  604. align-items: center;
  605. font-size: 24rpx;
  606. color: #AAAAAA;
  607. margin-top: 20rpx;
  608. .text{
  609. padding-right: 10rpx;
  610. }
  611. .text+.text{
  612. border-left: 2rpx solid #F0F0F0;
  613. padding-left: 10rpx;
  614. }
  615. }
  616. .address-box{
  617. display: flex;
  618. align-items: center;
  619. justify-content: space-between;
  620. width: 702rpx;
  621. height: 140rpx;
  622. background-image: url('@/static/white-map.png');
  623. background-repeat: repeat;
  624. background-size: 100% 140rpx;
  625. box-sizing: border-box;
  626. padding: 36rpx 24rpx;
  627. margin-top: 20rpx;
  628. .address{
  629. font-weight: 600;
  630. font-size: 24rpx;
  631. color: #222222;
  632. line-height: 40rpx;
  633. overflow: hidden;
  634. padding-right: 20rpx;
  635. text-overflow: ellipsis;
  636. /* 弹性伸缩盒子模型显示 */
  637. display: -webkit-box;
  638. /* 限制在一个块元素显示的文本的行数 */
  639. -webkit-line-clamp: 2;
  640. /* 设置或检索伸缩盒对象的子元素的排列方式 */
  641. -webkit-box-orient: vertical;
  642. }
  643. .btn-box{
  644. display: flex;
  645. .btn+.btn{
  646. margin-left: 16rpx;
  647. }
  648. .btn{
  649. width: 120rpx;
  650. height: 52rpx;
  651. line-height: 52rpx;
  652. text-align: center;
  653. background: #E2ECFF;
  654. border-radius: 26rpx 26rpx 26rpx 26rpx;
  655. font-weight: 300;
  656. font-size: 28rpx;
  657. color: #3879F9;
  658. }
  659. }
  660. }
  661. .choose-box{
  662. background: #F9F9F9;
  663. border-radius: 16rpx 16rpx 16rpx 16rpx;
  664. padding: 24rpx;
  665. display: flex;
  666. align-items: center;
  667. position: relative;
  668. margin-top: 20rpx;
  669. .start-box,.end-box{
  670. padding-right: 24rpx;
  671. .label{
  672. font-size: 24rpx;
  673. color: #222222;
  674. }
  675. .time-box{
  676. display: flex;
  677. align-items: center;
  678. margin-top: 16rpx;
  679. .time{
  680. font-weight: 600;
  681. font-size: 28rpx;
  682. color: #222222;
  683. }
  684. .date{
  685. font-size: 24rpx;
  686. color: #222222;
  687. margin-left: 16rpx;
  688. }
  689. .day{
  690. width: 80rpx;
  691. height: 36rpx;
  692. line-height: 36rpx;
  693. text-align: center;
  694. background: #F0F0F0;
  695. border-radius: 18rpx 18rpx 18rpx 18rpx;
  696. font-size: 20rpx;
  697. color: #222222;
  698. margin-left: 24rpx;
  699. }
  700. }
  701. }
  702. .people-box{
  703. padding-left: 24rpx;
  704. border-left: 2rpx solid #F0F0F0;
  705. .people,.child{
  706. font-size: 24rpx;
  707. color: #222222;
  708. }
  709. .child{
  710. margin-top: 16rpx;
  711. }
  712. }
  713. .jiantou{
  714. width: 48rpx;
  715. height: 48rpx;
  716. position: absolute;
  717. top: 50%;
  718. right: 0%;
  719. margin-top: -24rpx;
  720. }
  721. }
  722. .zs-list {
  723. margin-top: 20rpx;
  724. .hotel-item {
  725. .box{
  726. display: flex;
  727. align-items: center;
  728. background: #fff;
  729. border-bottom: 1rpx solid #F0F0F0;
  730. padding: 24rpx 0;
  731. .info{
  732. padding-left: 20rpx;
  733. flex: 1;
  734. .title{
  735. font-weight: 600;
  736. font-size: 36rpx;
  737. color: #222222;
  738. width: 300rpx;
  739. white-space: nowrap;
  740. overflow: hidden;
  741. text-overflow: ellipsis;
  742. margin-top: 20rpx;
  743. }
  744. .desc{
  745. display: flex;
  746. align-items: center;
  747. font-size: 24rpx;
  748. color: #AAAAAA;
  749. margin-top: 20rpx;
  750. .item{
  751. padding-right: 10rpx;
  752. }
  753. .item+.item{
  754. padding-left: 10rpx;
  755. border-left: 2rpx solid #F0F0F0;
  756. }
  757. }
  758. .notice{
  759. font-size: 24rpx;
  760. color: #AAAAAA;
  761. margin-top: 20rpx;
  762. }
  763. }
  764. .price-box{
  765. display: flex;
  766. align-items: center;
  767. .price{
  768. font-weight: 600;
  769. font-size: 36rpx;
  770. color: #FF4D3A;
  771. }
  772. .label{
  773. font-size: 24rpx;
  774. color: #AAAAAA;
  775. }
  776. }
  777. }
  778. }
  779. .type-box{
  780. .type-item+.type-item{
  781. border-top: 1rpx solid #F0F0F0;
  782. }
  783. .type-item{
  784. display: flex;
  785. justify-content: space-between;
  786. align-items: center;
  787. padding: 28rpx 24rpx;
  788. background: #F9F9F9;
  789. .left{
  790. .name-box{
  791. display: flex;
  792. align-items: center;
  793. font-size: 28rpx;
  794. color: #222222;
  795. .name{
  796. padding-right: 20rpx;
  797. }
  798. .name+.name{
  799. padding-left: 20rpx;
  800. border-left: 1rpx solid #222222;
  801. }
  802. }
  803. .residue{
  804. font-size: 24rpx;
  805. color: #FF4D3A;
  806. margin-top: 16rpx;
  807. }
  808. }
  809. .right{
  810. display: flex;
  811. align-items: center;
  812. .price{
  813. font-weight: 600;
  814. font-size: 36rpx;
  815. color: #FF4D3A;
  816. }
  817. .buy-btn{
  818. width: 76rpx;
  819. height: 84rpx;
  820. margin-left: 20rpx;
  821. }
  822. }
  823. }
  824. }
  825. }
  826. }
  827. .intro-box{
  828. position: fixed;
  829. bottom: 0;
  830. left: 0%;
  831. width: 100%;
  832. height: 98rpx;
  833. line-height: 98rpx;
  834. text-align: center;
  835. border-top: 1rpx solid #EEEEEE;
  836. font-size: 28rpx;
  837. color: #222222;
  838. background: #fff;
  839. z-index: 2;
  840. padding-bottom: env(safe-area-inset-bottom);
  841. .icon{
  842. width: 30rpx;
  843. height: 30rpx;
  844. }
  845. }
  846. .content{
  847. max-height: calc(100vh - 362rpx);
  848. overflow: auto;
  849. border-radius: 16rpx;
  850. padding: 24rpx;
  851. box-sizing: border-box;
  852. .img{
  853. width: 100%;
  854. height: 376rpx;
  855. border-radius: 16rpx;
  856. }
  857. .title{
  858. font-weight: 600;
  859. font-size: 32rpx;
  860. color: #222222;
  861. width: 650rpx;
  862. white-space: nowrap;
  863. overflow: hidden;
  864. text-overflow: ellipsis;
  865. margin-top: 24rpx;
  866. }
  867. .desc-box{
  868. display: flex;
  869. flex-wrap: wrap;
  870. margin-top: 24rpx;
  871. .item{
  872. width: 120rpx;
  873. height: 36rpx;
  874. line-height: 36rpx;
  875. text-align: center;
  876. background: #F0F0F0;
  877. border-radius: 8rpx 8rpx 8rpx 8rpx;
  878. font-size: 24rpx;
  879. color: #AAAAAA;
  880. margin-bottom: 20rpx;
  881. }
  882. .item+.item{
  883. margin-left: 12rpx;
  884. }
  885. }
  886. .box{
  887. .menu-item+.menu-item{
  888. border-top: 1rpx solid #F0F0F0;
  889. }
  890. .menu-item{
  891. margin-bottom: 20rpx;
  892. .title{
  893. display: flex;
  894. align-items: center;
  895. .icon{
  896. width: 30rpx;
  897. height: 30rpx;
  898. margin-right: 12rpx;
  899. }
  900. }
  901. .item-box{
  902. display: flex;
  903. flex-wrap: wrap;
  904. margin-top: 20rpx;
  905. .item{
  906. width: 33%;
  907. text-align: center;
  908. font-size: 24rpx;
  909. color: #AAAAAA;
  910. margin-bottom: 20rpx;
  911. }
  912. }
  913. }
  914. }
  915. }
  916. }
  917. </style>