hotelDetail.vue 21 KB

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