detail.vue 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837
  1. <template>
  2. <view class="container" :style="'overflow:' + (showPage ? 'hidden' : 'visible')" v-if="info">
  3. <!-- 顶部分段器区域 -->
  4. <view class="control">
  5. <uni-segmented-control :current="activeIndex" :values="headerList" style-type="text" active-color="#096562" @clickItem="onClickItem" />
  6. </view>
  7. <!-- 顶部民宿图片区域 -->
  8. <view class="banner">
  9. <swiper autoplay circular class="swiper">
  10. <swiper-item class="swiper_item" v-for="(item, current) in info.hotelFileInfoList" :key="item.id" @click="handleClickSwiper(info.hotelFileInfoList, current)">
  11. <img mode="aspectFill" class="img" :src="item.url" />
  12. </swiper-item>
  13. </swiper>
  14. <view class="slogan">
  15. <img src="../../static/index/slogan.png" />
  16. </view>
  17. <!-- 720°全景链接区域 -->
  18. <view class="full" v-if="info.linkProUrl" @click="handleGoPull(info.linkProUrl)">
  19. <img src="../../static/index/full.png" />
  20. 720°全景
  21. </view>
  22. <!-- 收藏按钮区域 -->
  23. <view class="collect">
  24. <uni-fav circle bgColorChecked="#096562" :checked="info.is_collect_hotel" @click="changeCollect(info.is_collect_hotel)" />
  25. </view>
  26. </view>
  27. <!-- 民宿详细信息区域 -->
  28. <view class="detail">
  29. <view class="detail_name">{{ info.hotel_name }}</view>
  30. <view class="detail_info">
  31. <view class="info_left">
  32. {{ info.fitupTime }}装修 | {{ info.openTime }}开业 &nbsp;&nbsp;
  33. <text class="level" v-if="info.type == 1">银宿级</text>
  34. <text class="level" v-if="info.type == 2">金宿级</text>
  35. <text class="level" v-if="info.type == 3">白金级</text>
  36. </view>
  37. <view class="info_right" @click="goPageDetailInfo">
  38. 设施/详情
  39. <img src="../../static/index/right.png" />
  40. </view>
  41. </view>
  42. <view class="detail_group">
  43. <view class="group_item" v-for="item in info.hconfigList" :key="item.id">
  44. <img :src="item.fileUrl" />
  45. {{ item.name }}
  46. </view>
  47. </view>
  48. <view class="address">
  49. <view class="address_left">{{ info.hposition }}</view>
  50. <view class="address_right">
  51. <view class="right_box" @click="handleMap(info)">
  52. <img src="../../static/index/map.png" />
  53. </view>
  54. <view class="right_box" @click="handlePhone(info.managerPhone)">
  55. <img src="../../static/index/phone.png" />
  56. </view>
  57. </view>
  58. </view>
  59. <view class="distance" v-if="distance">距离我{{ distance }}km</view>
  60. </view>
  61. <!-- 房型信息区域 -->
  62. <view class="body">
  63. <!-- 选择日期区域 -->
  64. <view class="body_header" @click="handleOpen()">
  65. <view class="header_start">
  66. <view class="header_top">{{ getWeek(startTime) }}入住</view>
  67. <view class="header_bottom">{{ startTime.slice(5, 7) }}月{{ startTime.slice(8, 10) }}日</view>
  68. </view>
  69. <view class="header_night">
  70. <view class="night_line"></view>
  71. <view class="night_box">{{ nightNum }}晚</view>
  72. <view class="night_line"></view>
  73. </view>
  74. <view class="header_end">
  75. <view class="header_top">{{ getWeek(endTime) }}离店</view>
  76. <view class="header_bottom">{{ endTime.slice(5, 7) }}月{{ endTime.slice(8, 10) }}日</view>
  77. </view>
  78. </view>
  79. <!-- 日历组件 -->
  80. <uv-calendars
  81. ref="calendar"
  82. range
  83. title="选择日期"
  84. start-text="住店"
  85. end-text="离店"
  86. color="#096562"
  87. confirmColor="#096562"
  88. :selected="selected"
  89. :startDate="earlyTime"
  90. :endDate="lateTime"
  91. @monthSwitch="monthSwitch"
  92. @confirm="handleConfirm"
  93. />
  94. <!-- 房型列表区域 -->
  95. <view class="body_content" v-if="list.length">
  96. <!-- 每一个房型盒子区域 -->
  97. <view class="body_box" v-for="item in list" :key="item.id" @click="handleLookDetail(item)">
  98. <view class="box_left">
  99. <img mode="aspectFill" :src="item.fileInfoList[0].url" />
  100. </view>
  101. <view class="box_center">
  102. <view class="center_top">{{ item.hName }}</view>
  103. <view class="center_center">
  104. <view class="center_item" v-if="item.hAreas">{{ item.hAreas }}㎡ 剩余{{ item.remainRooms }}间</view>
  105. </view>
  106. <view class="center_bottom">
  107. <img v-for="item2 in item.hConfigList" :key="item2.id" class="img" :src="item2.fileUrl" />
  108. </view>
  109. </view>
  110. <view class="box_right">
  111. <view class="right_price">
  112. <text>¥</text>
  113. {{ item.price }}
  114. </view>
  115. <view class="right_btn" :class="{ inactive: item.remainRooms * 1 <= 0 }" @click.stop="goPageAffOrder(item)">订</view>
  116. </view>
  117. </view>
  118. <!-- 点击房型弹窗区域 -->
  119. <uv-popup ref="popup" bgColor="none" :safeAreaInsetBottom="false">
  120. <view class="body_pop">
  121. <!-- 轮播图区域 -->
  122. <swiper indicator-dots circular indicator-color="#FFFFFF" indicator-active-color="#096562" class="pop_swiper">
  123. <swiper-item class="pop_swiper_item" v-for="item in roomInfo.fileInfoList" :key="item.id">
  124. <img class="img" :src="item.url" />
  125. </swiper-item>
  126. </swiper>
  127. <!-- 轮播图关闭图标区域 -->
  128. <img class="pop_icon" src="../../static/index/close.png" @click="handleClosePop" />
  129. <view class="pop_body">
  130. <view class="body_title">{{ roomInfo.hName }}</view>
  131. <view class="body_tags">
  132. <view class="tags_item">
  133. <img class="img" src="../../static/index/place.png" />
  134. {{ roomInfo.hAreas }}㎡
  135. </view>
  136. <view class="tags_item" v-for="item2 in roomInfo.hConfigList" :key="item2.id">
  137. <img class="img" :src="item2.fileUrl" />
  138. {{ item2.name }}
  139. </view>
  140. </view>
  141. <view class="body_title2">费用明细</view>
  142. <view class="body_detail">
  143. <!-- <view class="detail_old">¥{{ roomInfo.price }}</view> -->
  144. <!-- <view class="detail_box">
  145. 黄金会员9折
  146. <text>-¥25</text>
  147. </view>
  148. <view class="detail_box">
  149. 活动
  150. <text>-¥2.5</text>
  151. </view> -->
  152. <view class="detail_new">
  153. 每间每晚
  154. <view class="ml_10 color">¥</view>
  155. <view class="price color">{{ roomInfo.price }}</view>
  156. </view>
  157. </view>
  158. <view class="body_bottom">
  159. <view class="bottom_left" @click="handlePhone(info.managerPhone)">
  160. <img class="img" src="../../static/index/phone2.png" />
  161. 联系商家
  162. </view>
  163. <view class="bottom_right">
  164. <text>¥</text>
  165. {{ roomInfo.price }}
  166. <view class="btn" :class="{ inactive: roomInfo.remainRooms * 1 <= 0 }" @click="goPageAffOrder(roomInfo)">预定</view>
  167. </view>
  168. </view>
  169. </view>
  170. </view>
  171. </uv-popup>
  172. </view>
  173. <view class="noData" v-else>
  174. <img src="../../static/images/noData.png" />
  175. 暂无数据
  176. </view>
  177. </view>
  178. <!-- 评价区域 -->
  179. <view class="evaluate">
  180. <view class="evaluate_title">评价</view>
  181. <view class="evaluate_body">
  182. <!-- 评分区域 -->
  183. <view class="header" v-if="score">
  184. <view class="header_box">
  185. <!-- 总评分区域 -->
  186. <view class="box_left">{{ score }}</view>
  187. <view class="box_right">
  188. <!-- 位置评分区域 -->
  189. <view class="right_item">
  190. <view class="item_info">位置 {{ scoreWz }}</view>
  191. <view class="item_progress">
  192. <progress activeColor="#0BAD8B" backgroundColor="#CCCCCC" stroke-width="10" border-radius="92" :percent="((scoreWz * 1) / 5) * 100" />
  193. </view>
  194. </view>
  195. <!-- 设施评分区域 -->
  196. <view class="right_item">
  197. <view class="item_info">设施 {{ scoreSs }}</view>
  198. <view class="item_progress">
  199. <progress activeColor="#0BAD8B" backgroundColor="#CCCCCC" stroke-width="10" border-radius="92" :percent="((scoreSs * 1) / 5) * 100" />
  200. </view>
  201. </view>
  202. <!-- 服务评分区域 -->
  203. <view class="right_item">
  204. <view class="item_info">服务 {{ scoreFw }}</view>
  205. <view class="item_progress">
  206. <progress activeColor="#0BAD8B" backgroundColor="#CCCCCC" stroke-width="10" border-radius="92" :percent="((scoreFw * 1) / 5) * 100" />
  207. </view>
  208. </view>
  209. <!-- 卫生评分区域 -->
  210. <view class="right_item">
  211. <view class="item_info">卫生 {{ scoreWs }}</view>
  212. <view class="item_progress">
  213. <progress activeColor="#0BAD8B" backgroundColor="#CCCCCC" stroke-width="10" border-radius="92" :percent="((scoreWs * 1) / 5) * 100" />
  214. </view>
  215. </view>
  216. </view>
  217. </view>
  218. </view>
  219. <!-- 每一个评价区域 -->
  220. <view class="evaluate_box" v-for="item in commentList" :key="item.id" @click="handleGoDetail(item)">
  221. <!-- 用户信息区域 -->
  222. <view class="box_userInfo">
  223. <img mode="aspectFill" :src="item.headPhoto" />
  224. <view class="userInfo_msg">
  225. <view class="msg_name">{{ item.userName }}</view>
  226. <view class="msg_star">
  227. <uni-rate readonly activeColor="#FFC300" :size="16" :value="item.score" />
  228. </view>
  229. </view>
  230. </view>
  231. <!-- 入住时间区域 -->
  232. <view class="box_time" v-if="item.liveTime && item.commentTime">
  233. {{ item.liveTime.slice(0, 10) }}入住,{{ item.commentTime.slice(0, 10) }}发表 | {{ item.houseName }}
  234. </view>
  235. <!-- 评价内容区域 -->
  236. <uv-read-more show-height="85rpx" closeText="全文" color="#096663" fontSize="24rpx" textIndent="0" :toggle="true" :shadowStyle="shadowStyle">
  237. <view class="box_content">
  238. {{ item.content }}
  239. </view>
  240. </uv-read-more>
  241. <!-- 图片区域 -->
  242. <view class="box_img">
  243. <img
  244. v-for="(ele, index) in item.url"
  245. :key="index"
  246. mode="aspectFill"
  247. v-if="ele.indexOf('jpg') !== -1 || ele.indexOf('png') !== -1"
  248. :src="ele"
  249. @click.stop="handleClickImg(ele, index)"
  250. />
  251. <video
  252. :id="item.id + index2"
  253. class="video"
  254. :show-fullscreen-btn="false"
  255. :show-play-btn="false"
  256. v-for="(video, index2) in item.url"
  257. :key="index2"
  258. v-if="video.indexOf('mp4') !== -1"
  259. :src="video"
  260. @fullscreenchange="fullscreenchange"
  261. @click.stop="handleClickVideo(item.id + index2)"
  262. ></video>
  263. </view>
  264. </view>
  265. <view class="foot" @click="handleGoPage" v-if="commentList.length">
  266. 查看全部{{ total }}条评价
  267. <img src="../../static/index/right.png" />
  268. </view>
  269. <view class="noData" v-if="commentList.length === 0">
  270. <img src="../../static/images/noData.png" />
  271. 暂无评论
  272. </view>
  273. </view>
  274. </view>
  275. <!-- 周边区域 -->
  276. <view class="rim">
  277. <!-- 标题区域 -->
  278. <view class="rim_title">周边</view>
  279. <!-- 周边分段器区域 -->
  280. <view class="rim_control">
  281. <span class="control_box" v-for="(item, index) in rimHeaderList" :key="index" @click="onClickItemRim(index)">
  282. <text class="text" :class="{ active: rimActiveIndex === index }">{{ item }}</text>
  283. </span>
  284. </view>
  285. <!-- 周边列表区域 -->
  286. <view class="rim_body" v-if="rimList.length">
  287. <!-- 每一个盒子区域 -->
  288. <view class="rim_box" v-for="item in rimList" :key="item.id" @click="GoRimDetail(item)">
  289. <img mode="aspectFill" :src="item.first_img || item.coverImg" />
  290. <view class="box_info">
  291. <view class="info_top">{{ item.rname || item.hname }}</view>
  292. <view class="info_center" v-if="item.distance">距您{{ item.distance }}km</view>
  293. <!-- <view class="info_bottom">
  294. <view class="bottom_rate">4.8分</view>
  295. <view class="bottom_num">{{ item.num }}条评论</view>
  296. <view class="bottom_price">
  297. ¥220
  298. <text>起</text>
  299. </view>
  300. </view> -->
  301. </view>
  302. </view>
  303. </view>
  304. <view class="noData" v-else>
  305. <img src="../../static/images/noData.png" />
  306. 暂无数据
  307. </view>
  308. </view>
  309. </view>
  310. </template>
  311. <script>
  312. export default {
  313. data() {
  314. return {
  315. // 滚动穿透控制
  316. showPage: false,
  317. // 房型数据数组
  318. list: [],
  319. // 住几晚
  320. nightNum: 1,
  321. // 选择日期数组
  322. dayList: [],
  323. // 酒店信息
  324. info: null,
  325. // 房间信息
  326. roomInfo: {},
  327. // 民宿Id
  328. hotelId: '',
  329. // 是否有定位权限
  330. showLocation: false,
  331. // 是否展示距离
  332. distance: '',
  333. // 入住时间 YYYY-MM-DD
  334. startTime: '',
  335. // 离店时间 YYYY-MM-DD
  336. endTime: '',
  337. // 日历可以选择的最早日期
  338. earlyTime: '',
  339. // 日历可以选择的最晚日期
  340. lateTime: '',
  341. // 管理端设置的可以提前多少天预定
  342. setTime: '',
  343. activeIndex: 0,
  344. headerList: ['预定', '评价', '周边'],
  345. // 评价列表数据
  346. commentList: [],
  347. queryDom: null,
  348. // 评价Dom距离页面顶部的距离
  349. domTop: null,
  350. // 周边Dom距离页面顶部的距离
  351. domTopRim: null,
  352. selected: [],
  353. // 总评分
  354. score: '',
  355. // 服务评分
  356. scoreFw: '',
  357. // 设施评分
  358. scoreSs: '',
  359. // 卫生评分
  360. scoreWs: '',
  361. // 位置评分
  362. scoreWz: '',
  363. // 评论总条数
  364. total: null,
  365. // 是否收藏
  366. ischecked: false,
  367. // video 上下文 videoContext 对象
  368. videoContext: null,
  369. // 是否是全屏状态
  370. isFullScreen: false,
  371. // 周边列表数组
  372. rimList: [],
  373. // 周边分段器当前索引
  374. rimActiveIndex: 0,
  375. // 周边分段器数组
  376. rimHeaderList: ['民宿', '美食', '景点', '加油站'],
  377. // 周边列表当前页
  378. page: 1,
  379. // 周边列表每页多少条
  380. rows: 10,
  381. // 周边列表总条数
  382. rimTotal: null,
  383. // 用户定位经度
  384. myLng: 0,
  385. // 用户定位纬度
  386. myLat: 0,
  387. // 所属乡镇
  388. town: ''
  389. }
  390. },
  391. mounted() {
  392. // 开启转发功能
  393. uni.showShareMenu({
  394. withShareTicket: true,
  395. menus: ['shareAppMessage', 'shareTimeline']
  396. })
  397. },
  398. onLoad(options) {
  399. this.getTimes()
  400. this.hotelId = options.id
  401. this.distance = options.distance === 'undefined' ? false : options.distance
  402. this.town = options.town
  403. uni.getSetting({
  404. success: (res) => {
  405. this.showLocation = res.authSetting['scope.userLocation']
  406. this.getHotelInfo()
  407. this.getEvaData()
  408. this.getLateTime()
  409. }
  410. })
  411. uni.getLocation({
  412. type: 'gcj02',
  413. success: (res) => {
  414. this.myLat = res.latitude
  415. this.myLng = res.longitude
  416. },
  417. complete: () => {
  418. this.getRimList_hotel()
  419. }
  420. })
  421. },
  422. onPageScroll(e) {
  423. if (!this.queryDom) {
  424. this.queryDom = uni.createSelectorQuery().in(this)
  425. this.queryDom
  426. .select('.evaluate')
  427. .boundingClientRect((data) => {
  428. this.domTop = data.top
  429. })
  430. .exec()
  431. this.queryDom
  432. .select('.rim')
  433. .boundingClientRect((data) => {
  434. this.domTopRim = data.top
  435. })
  436. .exec()
  437. }
  438. if (e.scrollTop > this.domTopRim) {
  439. this.activeIndex = 2
  440. } else if (e.scrollTop > this.domTop) {
  441. this.activeIndex = 1
  442. } else {
  443. this.activeIndex = 0
  444. }
  445. },
  446. onReachBottom() {
  447. if (this.rimActiveIndex != 0) {
  448. if (this.rimList < this.rimTotal) {
  449. this.page++
  450. this.getRimList()
  451. } else {
  452. uni.showToast({
  453. title: '没有更多数据了',
  454. icon: 'none'
  455. })
  456. }
  457. }
  458. },
  459. methods: {
  460. async getLateTime() {
  461. const res = await this.$myRequest({
  462. url: '/mhotel/house/price/queryDate.action'
  463. })
  464. // console.log(res)
  465. if (res.code === 200) {
  466. this.setTime = res.data.dateTimes.length - 1
  467. let today = new Date()
  468. let late = new Date(today.getTime() + 24 * 60 * 60 * 1000 * this.setTime)
  469. this.earlyTime = this.startTime
  470. this.lateTime = `${late.getFullYear()}-${(late.getMonth() + 1).toString().padStart(2, 0)}-${late.getDate().toString().padStart(2, 0)}`
  471. }
  472. },
  473. async getRimList_hotel() {
  474. const res = await this.$myRequest({
  475. url: '/mhotel/appqueryMsByTown.action',
  476. data: {
  477. town: this.town
  478. }
  479. })
  480. // console.log(res)
  481. if (res.code === 200) {
  482. this.rimList = res.data
  483. const i = this.rimList.findIndex((el) => el.id == this.hotelId)
  484. this.rimList.splice(i, 1)
  485. if (this.rimList.length) {
  486. this.rimList.forEach((ele) => {
  487. if (ele.hpositionWens) {
  488. let lat = ele.hpositionWens.split(',')[0]
  489. let lng = ele.hpositionWens.split(',')[1]
  490. ele.distance = this.calculateDistance(lat, lng)
  491. }
  492. })
  493. }
  494. }
  495. },
  496. async getRimList() {
  497. const res = await this.$myRequest({
  498. url: '/mhotel/applistAround.action',
  499. data: {
  500. page: this.page,
  501. rows: this.rows,
  502. rtype: this.rimHeaderList[this.rimActiveIndex]
  503. }
  504. })
  505. // console.log(res)
  506. if (res.code === 200) {
  507. this.rimList = [...this.rimList, ...res.rows]
  508. this.rimTotal = res.total
  509. if (this.rimList.length) {
  510. this.rimList.forEach((ele) => {
  511. if (ele.jingwei) {
  512. let lat = ele.jingwei.split(',')[1]
  513. let lng = ele.jingwei.split(',')[0]
  514. ele.distance = this.calculateDistance(lat, lng)
  515. }
  516. })
  517. }
  518. }
  519. },
  520. GoRimDetail(item) {
  521. if (this.rimActiveIndex == 0) {
  522. this.getTimes()
  523. this.hotelId = item.id
  524. this.info = null
  525. this.list = []
  526. this.getHotelInfo()
  527. this.score = ''
  528. this.commentList = []
  529. this.getEvaData()
  530. this.setTime = ''
  531. this.getLateTime()
  532. uni.getLocation({
  533. type: 'gcj02',
  534. success: (res) => {
  535. this.myLat = res.latitude
  536. this.myLng = res.longitude
  537. },
  538. complete: () => {
  539. this.getRimList_hotel()
  540. }
  541. })
  542. uni.pageScrollTo({
  543. scrollTop: 0
  544. })
  545. } else {
  546. let info = encodeURIComponent(JSON.stringify(item))
  547. uni.navigateTo({
  548. url: `/pagesSub/rimDetail/rimDetail?info=${info}`
  549. })
  550. }
  551. },
  552. // 进入全屏和退出全屏时触发的回调
  553. fullscreenchange(e) {
  554. this.isFullScreen = e.detail.fullScreen
  555. },
  556. // 点击视频控件时触发的回调
  557. handleClickVideo(id) {
  558. this.videoContext = uni.createVideoContext(id)
  559. if (this.isFullScreen) {
  560. this.videoContext.stop()
  561. this.videoContext.exitFullScreen()
  562. } else {
  563. this.videoContext.requestFullScreen()
  564. this.videoContext.play()
  565. }
  566. },
  567. // 点击收藏按钮回调
  568. async changeCollect(is_collect_hotel) {
  569. let userInfo = uni.getStorageSync('userInfo')
  570. let openid = uni.getStorageSync('openid')
  571. if (userInfo && openid) {
  572. const res = await this.$myRequest({
  573. url: is_collect_hotel ? '/mhotel/ahpdelCollectHotel.action' : '/mhotel/ahpcollectHotel.action',
  574. data: {
  575. userId: uni.getStorageSync('userInfo').id,
  576. hotelId: this.hotelId
  577. }
  578. })
  579. // console.log(res)
  580. if (res.code === 200) {
  581. uni.showToast({
  582. title: is_collect_hotel ? '取消收藏成功' : '收藏成功',
  583. icon: 'success',
  584. mask: true
  585. })
  586. this.info.is_collect_hotel = !this.info.is_collect_hotel
  587. }
  588. } else {
  589. uni.showToast({
  590. title: '请先登录',
  591. icon: 'none',
  592. mask: true
  593. })
  594. setTimeout(() => {
  595. uni.navigateTo({
  596. url: '/pages/login/login'
  597. })
  598. }, 1500)
  599. }
  600. },
  601. // 获取评论数据
  602. async getEvaData(id) {
  603. const res = await this.$myRequest({
  604. url: '/mhotel/abcaevaluatePage.action',
  605. data: {
  606. hotelId: id ? id : this.hotelId,
  607. page: 1,
  608. rows: 5,
  609. status: 0
  610. }
  611. })
  612. // console.log(res);
  613. if (res.code === 200 && res.page.pageList) {
  614. this.score = res.score.score.toFixed(1)
  615. this.scoreFw = res.score.scoreFw.toFixed(1)
  616. this.scoreSs = res.score.scoreSs.toFixed(1)
  617. this.scoreWs = res.score.scoreWs.toFixed(1)
  618. this.scoreWz = res.score.scoreWz.toFixed(1)
  619. this.commentList = res.page.pageList
  620. this.total = res.page.total
  621. }
  622. },
  623. // 获取民宿信息
  624. async getHotelInfo(id) {
  625. const res = await this.$myRequest({
  626. url: '/mhotel/ahpgetHouseByHotelId.action',
  627. data: {
  628. hotelId: id ? id : this.hotelId,
  629. userId: uni.getStorageSync('userInfo').id,
  630. queryStartTime: this.startTime,
  631. queryEndTime: this.endTime
  632. }
  633. })
  634. // console.log(res)
  635. if (res.code === 200) {
  636. this.info = res.data.data
  637. this.list = res.data.data.houseList
  638. uni.setNavigationBarTitle({
  639. title: res.data.data.hotel_name
  640. })
  641. }
  642. },
  643. onClickItem(e) {
  644. this.activeIndex = e.currentIndex
  645. if (this.activeIndex === 1) {
  646. uni.pageScrollTo({
  647. selector: '.evaluate'
  648. })
  649. } else if (this.activeIndex === 0) {
  650. uni.pageScrollTo({
  651. scrollTop: 0
  652. })
  653. } else if (this.activeIndex === 2) {
  654. uni.pageScrollTo({
  655. selector: '.rim'
  656. })
  657. }
  658. },
  659. onClickItemRim(index) {
  660. this.rimActiveIndex = index
  661. this.pgae = 1
  662. this.rimList = []
  663. if (this.rimActiveIndex == 0) {
  664. this.getRimList_hotel()
  665. } else {
  666. this.getRimList()
  667. }
  668. },
  669. monthSwitch(e) {
  670. let time = e.year + '-' + e.month.toString().padStart(2, 0) + '-01'
  671. this.handleOpen(time)
  672. },
  673. // 选择日期确定回调
  674. handleConfirm(e) {
  675. this.startTime = e.range.before
  676. this.endTime = e.range.after
  677. this.dayList = e.range.data
  678. this.nightNum = e.range.data.length - 1
  679. this.getHotelInfo()
  680. },
  681. // 点击地图图标回调
  682. handleMap(item) {
  683. if (this.showLocation) {
  684. let lat = item.hpositionWens.split(',')[0] * 1
  685. let lng = item.hpositionWens.split(',')[1] * 1
  686. uni.openLocation({
  687. latitude: lat,
  688. longitude: lng,
  689. name: item.hname,
  690. address: item.hposition,
  691. success: () => {}
  692. })
  693. } else {
  694. uni.showModal({
  695. content: '当前没有定位权限,是否去设置打开?',
  696. confirmText: '确认',
  697. cancelText: '取消',
  698. success: (res) => {
  699. if (res.confirm) {
  700. uni.openSetting({
  701. success: (res) => {
  702. this.showLocation = true
  703. this.handleMap(item)
  704. }
  705. })
  706. } else {
  707. uni.showToast({
  708. title: '获取定位权限失败,无法使用地图功能',
  709. icon: 'none',
  710. mask: true
  711. })
  712. }
  713. }
  714. })
  715. }
  716. },
  717. // 点击电话图标回调
  718. handlePhone(phone) {
  719. uni.makePhoneCall({
  720. phoneNumber: phone
  721. })
  722. },
  723. // 点击弹窗关闭图标回调
  724. handleClosePop() {
  725. this.showPage = false
  726. this.$refs.popup.close()
  727. },
  728. // 点击每一个户型回调
  729. handleLookDetail(item) {
  730. this.roomInfo = item
  731. this.showPage = true
  732. this.$refs.popup.open('bottom')
  733. },
  734. // 点击设施详情回调
  735. goPageDetailInfo() {
  736. uni.navigateTo({
  737. url: `/pagesSub/detailInfo/detailInfo?hotelId=${this.hotelId}`
  738. })
  739. },
  740. // 点击 订 预定 按钮回调
  741. goPageAffOrder(item) {
  742. let flag = uni.getStorageSync('openid')
  743. let tokenId = uni.getStorageSync('tokenId')
  744. if (flag && tokenId) {
  745. if (!this.startTime) {
  746. uni.showToast({
  747. title: '请选择入住时间',
  748. icon: 'none'
  749. })
  750. return
  751. }
  752. if (!this.endTime) {
  753. uni.showToast({
  754. title: '请选择离店时间',
  755. icon: 'none'
  756. })
  757. return
  758. }
  759. if (item.remainRooms * 1 > 0) {
  760. this.$refs.popup.close()
  761. this.showPage = false
  762. let info = JSON.stringify({
  763. nightNum: this.nightNum,
  764. startTimeDay: this.startTime.slice(8, 10),
  765. startTimeMonth: this.startTime.slice(5, 7),
  766. startTimeWeek: this.getWeek(this.startTime),
  767. endTimeDay: this.endTime.slice(8, 10),
  768. endTimeMonth: this.endTime.slice(5, 7),
  769. endTimeWeek: this.getWeek(this.endTime),
  770. item: item,
  771. queryStartTime: this.startTime,
  772. queryEndTime: this.endTime,
  773. dayList: this.dayList,
  774. hTypeName: this.info.hTypeName,
  775. hotelName: this.info.hotel_name,
  776. hotelId: this.hotelId
  777. })
  778. uni.navigateTo({
  779. url: `/pages/affirmOrder/affirmOrder?info=${info}`
  780. })
  781. } else {
  782. uni.showToast({
  783. title: '该房间已售罄',
  784. icon: 'none',
  785. mask: true
  786. })
  787. }
  788. } else {
  789. uni.showToast({
  790. title: '请先登录',
  791. icon: 'none',
  792. mask: true
  793. })
  794. setTimeout(() => {
  795. uni.navigateTo({
  796. url: '/pages/login/login'
  797. })
  798. }, 1500)
  799. }
  800. },
  801. // 点击日期区域回调
  802. async handleOpen(time) {
  803. const res = await this.$myRequest({
  804. url: '/mhotel/house/price/priceCalendar.action',
  805. data: {
  806. merchantId: this.info.managerId,
  807. startTime: time ? time : this.startTime
  808. }
  809. })
  810. if (res.code === 200) {
  811. this.selected = res.data
  812. }
  813. if (!time) {
  814. this.$refs.calendar.open()
  815. }
  816. },
  817. // 传入参数获取当前是星期几
  818. getWeek(time) {
  819. let date = new Date(time)
  820. let week = date.getDay()
  821. let weekList = ['日', '一', '二', '三', '四', '五', '六']
  822. let res = '周' + weekList[week]
  823. return res
  824. },
  825. // 获取今明两天的日期 YYYY-MM-DD
  826. getTimes() {
  827. // 今天
  828. let today = new Date()
  829. // 明天
  830. let tomorrow = new Date(today.getTime() + 24 * 60 * 60 * 1000)
  831. this.startTime = `${today.getFullYear()}-${(today.getMonth() + 1).toString().padStart(2, 0)}-${today.getDate().toString().padStart(2, 0)}`
  832. this.endTime = `${tomorrow.getFullYear()}-${(tomorrow.getMonth() + 1).toString().padStart(2, 0)}-${tomorrow.getDate().toString().padStart(2, 0)}`
  833. this.dayList = [this.startTime, this.endTime]
  834. },
  835. handleGoPull(linkProUrl) {
  836. let temURL = linkProUrl.slice(22)
  837. let url = 'https://f10mfe54bri.720yun.com' + temURL
  838. uni.navigateTo({
  839. url: `/pagesSub/web/web?url=${url}`
  840. })
  841. },
  842. // 点击每一个评价回调
  843. handleGoDetail(item) {
  844. uni.navigateTo({
  845. url: `/pagesSub/appraiseDetail/appraiseDetail?id=${item.id}`
  846. })
  847. },
  848. // 点击评价图片回调
  849. handleClickImg(url, index) {
  850. if (this.videoContext) {
  851. this.videoContext.stop()
  852. }
  853. // 预览图片
  854. uni.previewImage({
  855. current: index,
  856. urls: [url]
  857. })
  858. },
  859. handleGoPage() {
  860. uni.navigateTo({
  861. url: `/pagesSub/appraise/appraise?hotelId=${this.hotelId}`
  862. })
  863. },
  864. handleClickSwiper(urls, current) {
  865. const temList = urls.map((ele) => ele.url)
  866. uni.previewImage({
  867. urls: temList,
  868. current
  869. })
  870. },
  871. // 计算两个点之间的距离
  872. calculateDistance(lat, lng) {
  873. let centerLat = lat
  874. let centerLng = lng
  875. let red1 = (this.myLat * Math.PI) / 180.0
  876. let red2 = (centerLat * Math.PI) / 180.0
  877. let a = red1 - red2
  878. let b = (this.myLng * Math.PI) / 180.0 - (centerLng * Math.PI) / 180.0
  879. let R = 6378137
  880. let distance = R * 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(red1) * Math.cos(red2) * Math.pow(Math.sin(b / 2), 2)))
  881. let res = (distance / 1000).toFixed(2) * 1
  882. return res
  883. }
  884. }
  885. }
  886. </script>
  887. <style lang="scss" scoped>
  888. .container {
  889. display: flex;
  890. flex-direction: column;
  891. align-items: center;
  892. position: relative;
  893. padding-bottom: 20rpx;
  894. min-height: 100vh;
  895. background-color: #f2f3f5;
  896. .control {
  897. z-index: 999;
  898. position: sticky;
  899. top: 0;
  900. width: 100%;
  901. height: 100rpx;
  902. background-color: #fff;
  903. }
  904. .banner {
  905. position: relative;
  906. width: 750rpx;
  907. height: 422rpx;
  908. .swiper {
  909. height: 422rpx;
  910. .swiper_item {
  911. width: 100%;
  912. height: 100%;
  913. .img {
  914. width: 100%;
  915. height: 100%;
  916. }
  917. }
  918. }
  919. .img {
  920. width: 100%;
  921. height: 100%;
  922. }
  923. .slogan {
  924. position: absolute;
  925. top: 0;
  926. left: 0;
  927. display: flex;
  928. justify-content: center;
  929. align-items: center;
  930. width: 163rpx;
  931. height: 60rpx;
  932. background-color: rgba(255, 255, 255, 0.4);
  933. img {
  934. width: 125rpx;
  935. height: 44rpx;
  936. }
  937. }
  938. .full {
  939. position: absolute;
  940. top: 13rpx;
  941. right: 20rpx;
  942. display: flex;
  943. align-items: center;
  944. justify-content: space-around;
  945. width: 173rpx;
  946. height: 60rpx;
  947. color: #fff;
  948. font-size: 24rpx;
  949. border-radius: 11rpx;
  950. background-color: rgba(0, 0, 0, 0.5);
  951. img {
  952. width: 40rpx;
  953. height: 40rpx;
  954. }
  955. }
  956. .collect {
  957. position: absolute;
  958. top: 68rpx;
  959. left: 8rpx;
  960. }
  961. }
  962. .detail {
  963. z-index: 1;
  964. float: left;
  965. margin-top: -177rpx;
  966. box-sizing: border-box;
  967. padding: 0 30rpx 30rpx;
  968. width: 710rpx;
  969. border-radius: 10rpx;
  970. background-color: #fff;
  971. .detail_name {
  972. margin-top: 25rpx;
  973. font-size: 34rpx;
  974. font-weight: bold;
  975. }
  976. .detail_info {
  977. display: flex;
  978. justify-content: space-between;
  979. margin-top: 10rpx;
  980. .info_left {
  981. color: #999999;
  982. font-size: 20rpx;
  983. .level {
  984. margin-left: 20rpx;
  985. }
  986. }
  987. .info_right {
  988. display: flex;
  989. align-items: center;
  990. color: #096562;
  991. font-size: 24rpx;
  992. img {
  993. margin-left: 6rpx;
  994. width: 10rpx;
  995. height: 20rpx;
  996. }
  997. }
  998. }
  999. .detail_group {
  1000. display: flex;
  1001. flex-wrap: wrap;
  1002. margin-top: 5rpx;
  1003. width: 450rpx;
  1004. .group_item {
  1005. display: flex;
  1006. align-items: center;
  1007. margin-right: 10rpx;
  1008. margin-bottom: 10rpx;
  1009. color: #999999;
  1010. font-size: 20rpx;
  1011. img {
  1012. margin-right: 5rpx;
  1013. width: 22rpx;
  1014. height: 22rpx;
  1015. }
  1016. }
  1017. }
  1018. .address {
  1019. display: flex;
  1020. justify-content: space-between;
  1021. margin-top: 8rpx;
  1022. font-size: 28rpx;
  1023. font-weight: bold;
  1024. .address_left {
  1025. width: 480rpx;
  1026. overflow: hidden;
  1027. text-overflow: ellipsis;
  1028. white-space: nowrap;
  1029. }
  1030. .address_right {
  1031. display: flex;
  1032. .right_box {
  1033. margin-left: 28rpx;
  1034. width: 50rpx;
  1035. height: 78rpx;
  1036. img {
  1037. width: 100%;
  1038. height: 100%;
  1039. }
  1040. }
  1041. }
  1042. }
  1043. .distance {
  1044. margin-top: -35rpx;
  1045. color: #999999;
  1046. font-size: 24rpx;
  1047. }
  1048. }
  1049. .body {
  1050. float: left;
  1051. margin-top: 20rpx;
  1052. // padding-bottom: 30rpx;
  1053. width: 710rpx;
  1054. border-radius: 10rpx;
  1055. background-color: #fff;
  1056. .body_header {
  1057. display: flex;
  1058. justify-content: space-around;
  1059. box-sizing: border-box;
  1060. padding: 0 30rpx;
  1061. height: 150rpx;
  1062. .header_start {
  1063. display: flex;
  1064. flex-direction: column;
  1065. justify-content: center;
  1066. align-items: center;
  1067. width: 213rpx;
  1068. height: 150rpx;
  1069. font-size: 30rpx;
  1070. .header_top {
  1071. margin-bottom: 10rpx;
  1072. color: #999999;
  1073. font-size: 24rpx;
  1074. }
  1075. .header_bottom {
  1076. font-size: 34rpx;
  1077. font-weight: bold;
  1078. }
  1079. }
  1080. .header_night {
  1081. display: flex;
  1082. justify-content: center;
  1083. align-items: center;
  1084. .night_line {
  1085. width: 17rpx;
  1086. height: 1rpx;
  1087. background-color: #296de3;
  1088. }
  1089. .night_box {
  1090. display: flex;
  1091. align-items: center;
  1092. justify-content: center;
  1093. width: 81rpx;
  1094. height: 46rpx;
  1095. font-size: 24rpx;
  1096. border-radius: 66rpx;
  1097. border: 1rpx solid #296de3;
  1098. }
  1099. }
  1100. .header_end {
  1101. display: flex;
  1102. flex-direction: column;
  1103. justify-content: center;
  1104. align-items: center;
  1105. width: 213rpx;
  1106. height: 150rpx;
  1107. font-size: 30rpx;
  1108. .header_top {
  1109. margin-bottom: 10rpx;
  1110. color: #999999;
  1111. font-size: 24rpx;
  1112. }
  1113. .header_bottom {
  1114. font-size: 34rpx;
  1115. font-weight: bold;
  1116. }
  1117. }
  1118. }
  1119. .body_content {
  1120. .body_box {
  1121. box-sizing: border-box;
  1122. padding: 0 30rpx;
  1123. margin-bottom: 30rpx;
  1124. display: flex;
  1125. height: 193rpx;
  1126. border-bottom: 1rpx solid #cccccc;
  1127. .box_left {
  1128. width: 213rpx;
  1129. height: 161rpx;
  1130. border-radius: 5rpx;
  1131. img {
  1132. width: 100%;
  1133. height: 100%;
  1134. }
  1135. }
  1136. .box_center {
  1137. margin-left: 16rpx;
  1138. .center_top {
  1139. font-size: 34rpx;
  1140. font-weight: bold;
  1141. }
  1142. .center_center {
  1143. display: flex;
  1144. flex-wrap: wrap;
  1145. margin-top: 10rpx;
  1146. color: #999999;
  1147. font-size: 24rpx;
  1148. .center_item {
  1149. margin-right: 15rpx;
  1150. }
  1151. }
  1152. .center_bottom {
  1153. margin-top: 25rpx;
  1154. .img {
  1155. margin-right: 15rpx;
  1156. width: 30rpx;
  1157. height: 30rpx;
  1158. }
  1159. }
  1160. }
  1161. .box_right {
  1162. display: flex;
  1163. flex-direction: column;
  1164. align-items: flex-end;
  1165. margin-left: auto;
  1166. margin-top: 20rpx;
  1167. .right_price {
  1168. color: #ff5733;
  1169. font-size: 42rpx;
  1170. text {
  1171. font-size: 24rpx;
  1172. }
  1173. }
  1174. .right_btn {
  1175. display: flex;
  1176. justify-content: center;
  1177. align-items: center;
  1178. margin-top: 10rpx;
  1179. width: 100rpx;
  1180. height: 66rpx;
  1181. color: #fff;
  1182. font-size: 36rpx;
  1183. border-radius: 11rpx;
  1184. background-color: #096562;
  1185. }
  1186. .inactive {
  1187. background-color: #cccccc;
  1188. }
  1189. }
  1190. }
  1191. .body_pop {
  1192. position: relative;
  1193. height: 955rpx;
  1194. border-radius: 22rpx 22rpx 0 0;
  1195. background-color: #fff;
  1196. overflow-y: auto;
  1197. .pop_swiper {
  1198. height: 422rpx;
  1199. border-radius: 22rpx 22rpx 0 0;
  1200. .pop_swiper_item {
  1201. width: 100%;
  1202. height: 100%;
  1203. .img {
  1204. width: 100%;
  1205. height: 100%;
  1206. border-radius: 22rpx 22rpx 0 0;
  1207. }
  1208. }
  1209. }
  1210. .pop_icon {
  1211. position: absolute;
  1212. top: 20rpx;
  1213. right: 30rpx;
  1214. width: 58rpx;
  1215. height: 58rpx;
  1216. }
  1217. .pop_body {
  1218. box-sizing: border-box;
  1219. padding: 0 20rpx 30rpx;
  1220. .body_title {
  1221. margin-top: 30rpx;
  1222. font-size: 32rpx;
  1223. font-weight: bold;
  1224. }
  1225. .body_tags {
  1226. display: flex;
  1227. flex-wrap: wrap;
  1228. margin-top: 20rpx;
  1229. .tags_item {
  1230. display: flex;
  1231. align-items: center;
  1232. margin-right: 76rpx;
  1233. margin-bottom: 20rpx;
  1234. color: #383838;
  1235. font-size: 24rpx;
  1236. .img {
  1237. margin-right: 5rpx;
  1238. width: 28rpx;
  1239. height: 28rpx;
  1240. }
  1241. }
  1242. }
  1243. .body_title2 {
  1244. margin-top: 20rpx;
  1245. font-size: 28rpx;
  1246. }
  1247. .body_detail {
  1248. display: flex;
  1249. flex-direction: column;
  1250. justify-content: space-between;
  1251. // align-items: flex-end;
  1252. box-sizing: border-box;
  1253. padding: 20rpx 30rpx;
  1254. margin-top: 18rpx;
  1255. width: 710rpx;
  1256. height: 266rpx;
  1257. font-size: 24rpx;
  1258. border-radius: 7rpx;
  1259. background-color: #f2f2f2;
  1260. .detail_old {
  1261. text-align: end;
  1262. text-decoration: line-through;
  1263. }
  1264. .detail_box {
  1265. display: flex;
  1266. justify-content: space-between;
  1267. color: #808080;
  1268. text {
  1269. color: #ff5733;
  1270. }
  1271. }
  1272. .detail_new {
  1273. display: flex;
  1274. justify-content: flex-end;
  1275. align-items: center;
  1276. font-size: 24rpx;
  1277. .color {
  1278. color: #ff5733;
  1279. }
  1280. .price {
  1281. font-size: 36rpx;
  1282. }
  1283. .ml_10 {
  1284. margin-left: 10rpx;
  1285. }
  1286. }
  1287. }
  1288. .body_bottom {
  1289. display: flex;
  1290. justify-content: space-between;
  1291. align-items: center;
  1292. margin-top: 250rpx;
  1293. height: 80rpx;
  1294. .bottom_left {
  1295. display: flex;
  1296. align-items: center;
  1297. color: #333333;
  1298. font-size: 24rpx;
  1299. .img {
  1300. margin-right: 10rpx;
  1301. width: 48rpx;
  1302. height: 48rpx;
  1303. }
  1304. }
  1305. .bottom_right {
  1306. display: flex;
  1307. align-items: center;
  1308. color: #ff5733;
  1309. font-size: 40rpx;
  1310. font-weight: bold;
  1311. text {
  1312. font-size: 24rpx;
  1313. }
  1314. .btn {
  1315. display: flex;
  1316. justify-content: center;
  1317. align-items: center;
  1318. margin-left: 30rpx;
  1319. width: 238rpx;
  1320. height: 80rpx;
  1321. color: #fff;
  1322. font-size: 32rpx;
  1323. font-weight: 400;
  1324. border-radius: 64rpx;
  1325. background-color: #096562;
  1326. }
  1327. .inactive {
  1328. background-color: #cccccc;
  1329. }
  1330. }
  1331. }
  1332. }
  1333. }
  1334. }
  1335. .noData {
  1336. display: flex;
  1337. flex-direction: column;
  1338. justify-content: center;
  1339. align-items: center;
  1340. padding-bottom: 20rpx;
  1341. img {
  1342. margin-top: 60rpx;
  1343. width: 600rpx;
  1344. height: 600rpx;
  1345. }
  1346. }
  1347. }
  1348. .evaluate {
  1349. width: 710rpx;
  1350. background-color: #f2f3f5;
  1351. .evaluate_title {
  1352. line-height: 83rpx;
  1353. font-size: 32rpx;
  1354. font-weight: bold;
  1355. }
  1356. .evaluate_body {
  1357. display: flex;
  1358. flex-direction: column;
  1359. // margin-bottom: 20rpx;
  1360. width: 710rpx;
  1361. border-radius: 11rpx;
  1362. background-color: #fff;
  1363. .header {
  1364. display: flex;
  1365. align-items: center;
  1366. margin: 25rpx 20rpx;
  1367. width: 670rpx;
  1368. height: 120rpx;
  1369. border-radius: 13rpx;
  1370. background-color: #e4f0ef;
  1371. .header_box {
  1372. display: flex;
  1373. height: 70rpx;
  1374. .box_left {
  1375. display: flex;
  1376. justify-content: center;
  1377. align-items: center;
  1378. width: 140rpx;
  1379. color: #096562;
  1380. font-size: 60rpx;
  1381. font-weight: 900;
  1382. border-right: 1rpx solid #cccccc;
  1383. }
  1384. .box_right {
  1385. flex: 1;
  1386. display: flex;
  1387. flex-wrap: wrap;
  1388. color: #808080;
  1389. font-size: 24rpx;
  1390. .right_item {
  1391. display: flex;
  1392. align-items: center;
  1393. width: 50%;
  1394. .item_info {
  1395. margin-left: 33rpx;
  1396. }
  1397. .item_progress {
  1398. margin-right: 20rpx;
  1399. padding: 0 13rpx;
  1400. flex: 1;
  1401. }
  1402. }
  1403. }
  1404. }
  1405. }
  1406. .evaluate_box {
  1407. box-sizing: border-box;
  1408. padding: 0 20rpx;
  1409. margin: 0 auto 20rpx;
  1410. width: 710rpx;
  1411. border-radius: 18rpx;
  1412. background-color: #fff;
  1413. .box_userInfo {
  1414. display: flex;
  1415. align-items: center;
  1416. height: 115rpx;
  1417. img {
  1418. width: 70rpx;
  1419. height: 70rpx;
  1420. border-radius: 50%;
  1421. }
  1422. .userInfo_msg {
  1423. margin-left: 18rpx;
  1424. .msg_name {
  1425. font-size: 28rpx;
  1426. }
  1427. .msg_star {
  1428. margin-left: -5rpx;
  1429. margin-top: 5rpx;
  1430. }
  1431. }
  1432. }
  1433. .box_time {
  1434. display: flex;
  1435. align-items: center;
  1436. color: #a6a6a6;
  1437. font-size: 24rpx;
  1438. }
  1439. .box_content {
  1440. margin-top: 15rpx;
  1441. font-size: 24rpx;
  1442. color: #000;
  1443. }
  1444. .box_img {
  1445. display: grid;
  1446. grid-template-columns: 1fr 1fr 1fr;
  1447. grid-auto-rows: auto;
  1448. gap: 10rpx;
  1449. margin-top: 20rpx;
  1450. img {
  1451. width: 216rpx;
  1452. height: 216rpx;
  1453. border-radius: 20rpx;
  1454. }
  1455. .video {
  1456. width: 216rpx;
  1457. height: 216rpx;
  1458. border-radius: 20rpx;
  1459. }
  1460. }
  1461. }
  1462. .foot {
  1463. display: flex;
  1464. justify-content: center;
  1465. align-items: center;
  1466. padding-bottom: 20rpx;
  1467. height: 68rpx;
  1468. font-size: 24rpx;
  1469. font-weight: bold;
  1470. color: #096663;
  1471. img {
  1472. margin-left: 10rpx;
  1473. width: 10rpx;
  1474. height: 18rpx;
  1475. }
  1476. }
  1477. .noData {
  1478. display: flex;
  1479. flex-direction: column;
  1480. justify-content: center;
  1481. align-items: center;
  1482. padding-bottom: 60rpx;
  1483. img {
  1484. margin-top: 160rpx;
  1485. width: 600rpx;
  1486. height: 600rpx;
  1487. }
  1488. }
  1489. }
  1490. }
  1491. .rim {
  1492. width: 710rpx;
  1493. background-color: #f2f3f5;
  1494. .rim_title {
  1495. line-height: 80rpx;
  1496. font-size: 32rpx;
  1497. font-weight: bold;
  1498. }
  1499. .rim_control {
  1500. margin-bottom: 10rpx;
  1501. line-height: 85rpx;
  1502. font-size: 28rpx;
  1503. color: #808080;
  1504. white-space: nowrap;
  1505. overflow-x: auto;
  1506. background-color: #fff;
  1507. .control_box {
  1508. padding: 0 15rpx 0 20rpx;
  1509. .text {
  1510. padding-bottom: 5rpx;
  1511. }
  1512. .active {
  1513. color: #096562;
  1514. border-bottom: 5rpx solid #096562;
  1515. }
  1516. }
  1517. }
  1518. .rim_body {
  1519. .rim_box {
  1520. display: flex;
  1521. margin-bottom: 20rpx;
  1522. width: 710rpx;
  1523. height: 150rpx;
  1524. background-color: #fff;
  1525. img {
  1526. width: 126rpx;
  1527. height: 150rpx;
  1528. }
  1529. .box_info {
  1530. display: flex;
  1531. flex-direction: column;
  1532. justify-content: space-evenly;
  1533. padding: 0 24rpx;
  1534. box-sizing: border-box;
  1535. width: 584rpx;
  1536. height: 150rpx;
  1537. .info_top {
  1538. font-size: 28rpx;
  1539. font-weight: bold;
  1540. }
  1541. .info_center {
  1542. font-size: 24rpx;
  1543. color: #808080;
  1544. }
  1545. .info_bottom {
  1546. display: flex;
  1547. align-items: center;
  1548. font-size: 24rpx;
  1549. .bottom_rate {
  1550. color: #ff5733;
  1551. }
  1552. .bottom_num {
  1553. margin-left: 15rpx;
  1554. color: #a6a6a6;
  1555. }
  1556. .bottom_price {
  1557. margin-left: auto;
  1558. font-size: 28rpx;
  1559. color: #ff5733;
  1560. text {
  1561. font-size: 20rpx;
  1562. color: #a6a6a6;
  1563. }
  1564. }
  1565. }
  1566. }
  1567. }
  1568. }
  1569. .noData {
  1570. display: flex;
  1571. flex-direction: column;
  1572. justify-content: center;
  1573. align-items: center;
  1574. padding-bottom: 60rpx;
  1575. img {
  1576. margin-top: 160rpx;
  1577. width: 500rpx;
  1578. height: 500rpx;
  1579. }
  1580. }
  1581. .rim_more {
  1582. display: flex;
  1583. justify-content: center;
  1584. align-items: center;
  1585. width: 710rpx;
  1586. height: 70rpx;
  1587. color: #096663;
  1588. font-size: 24rpx;
  1589. font-weight: bold;
  1590. background-color: #fff;
  1591. img {
  1592. margin-left: 10rpx;
  1593. margin-top: 2rpx;
  1594. width: 10rpx;
  1595. height: 18rpx;
  1596. }
  1597. }
  1598. }
  1599. .scenicSpot {
  1600. width: 710rpx;
  1601. background-color: #f2f3f5;
  1602. .scenicSpot_title {
  1603. line-height: 83rpx;
  1604. font-size: 32rpx;
  1605. font-weight: bold;
  1606. }
  1607. .scenicSpot_body {
  1608. .scenicSpot_box {
  1609. display: flex;
  1610. margin-bottom: 20rpx;
  1611. width: 710rpx;
  1612. height: 150rpx;
  1613. background-color: #fff;
  1614. img {
  1615. width: 126rpx;
  1616. height: 150rpx;
  1617. }
  1618. .box_info {
  1619. display: flex;
  1620. flex-direction: column;
  1621. justify-content: space-evenly;
  1622. padding: 0 24rpx;
  1623. box-sizing: border-box;
  1624. width: 584rpx;
  1625. height: 150rpx;
  1626. .info_top {
  1627. font-size: 28rpx;
  1628. font-weight: bold;
  1629. }
  1630. .info_center {
  1631. font-size: 24rpx;
  1632. color: #808080;
  1633. }
  1634. .info_bottom {
  1635. display: flex;
  1636. align-items: center;
  1637. font-size: 24rpx;
  1638. .bottom_rate {
  1639. color: #ff5733;
  1640. }
  1641. .bottom_num {
  1642. margin-left: 15rpx;
  1643. color: #a6a6a6;
  1644. }
  1645. .bottom_price {
  1646. margin-left: auto;
  1647. font-size: 28rpx;
  1648. color: #ff5733;
  1649. text {
  1650. font-size: 20rpx;
  1651. color: #a6a6a6;
  1652. }
  1653. }
  1654. }
  1655. }
  1656. }
  1657. }
  1658. .scenicSpot_more {
  1659. display: flex;
  1660. justify-content: center;
  1661. align-items: center;
  1662. width: 710rpx;
  1663. height: 70rpx;
  1664. color: #096663;
  1665. font-size: 24rpx;
  1666. font-weight: bold;
  1667. background-color: #fff;
  1668. img {
  1669. margin-left: 10rpx;
  1670. margin-top: 2rpx;
  1671. width: 10rpx;
  1672. height: 18rpx;
  1673. }
  1674. }
  1675. }
  1676. }
  1677. </style>