detail.vue 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843
  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: 0,
  383. // 用户定位经度
  384. myLng: 0,
  385. // 用户定位纬度
  386. myLat: 0,
  387. // 所属乡镇
  388. town: '',
  389. // 是否允许下拉刷新
  390. isReachBottom: true
  391. }
  392. },
  393. mounted() {
  394. // 开启转发功能
  395. uni.showShareMenu({
  396. withShareTicket: true,
  397. menus: ['shareAppMessage', 'shareTimeline']
  398. })
  399. },
  400. onLoad(options) {
  401. this.getTimes()
  402. this.hotelId = options.id
  403. this.distance = options.distance ? false : options.distance
  404. this.town = options.town
  405. uni.getSetting({
  406. success: (res) => {
  407. this.showLocation = res.authSetting['scope.userLocation']
  408. this.getHotelInfo()
  409. this.getEvaData()
  410. this.getLateTime()
  411. }
  412. })
  413. uni.getLocation({
  414. type: 'gcj02',
  415. success: (res) => {
  416. this.myLat = res.latitude
  417. this.myLng = res.longitude
  418. },
  419. complete: () => {
  420. this.getRimList_hotel()
  421. }
  422. })
  423. },
  424. onPageScroll(e) {
  425. if (!this.queryDom) {
  426. this.queryDom = uni.createSelectorQuery().in(this)
  427. this.queryDom
  428. .select('.evaluate')
  429. .boundingClientRect((data) => {
  430. this.domTop = data.top
  431. })
  432. .exec()
  433. this.queryDom
  434. .select('.rim')
  435. .boundingClientRect((data) => {
  436. this.domTopRim = data.top
  437. })
  438. .exec()
  439. }
  440. if (e.scrollTop > this.domTopRim) {
  441. this.activeIndex = 2
  442. } else if (e.scrollTop > this.domTop) {
  443. this.activeIndex = 1
  444. } else {
  445. this.activeIndex = 0
  446. }
  447. },
  448. onReachBottom() {
  449. if (!this.isReachBottom) return
  450. if (this.rimActiveIndex != 0) {
  451. if (this.rimList.length < this.rimTotal) {
  452. this.page++
  453. this.getRimList(this.page)
  454. } else {
  455. uni.showToast({
  456. title: '没有更多数据了',
  457. icon: 'none'
  458. })
  459. }
  460. }
  461. },
  462. methods: {
  463. async getLateTime() {
  464. const res = await this.$myRequest({
  465. url: '/mhotel/house/price/queryDate.action'
  466. })
  467. // console.log(res)
  468. if (res.code === 200) {
  469. this.setTime = res.data.dateTimes.length - 1
  470. let today = new Date()
  471. let late = new Date(today.getTime() + 24 * 60 * 60 * 1000 * this.setTime)
  472. this.earlyTime = this.startTime
  473. this.lateTime = `${late.getFullYear()}-${(late.getMonth() + 1).toString().padStart(2, 0)}-${late.getDate().toString().padStart(2, 0)}`
  474. }
  475. },
  476. async getRimList_hotel() {
  477. const res = await this.$myRequest({
  478. url: '/mhotel/appqueryMsByTown.action',
  479. data: {
  480. town: this.town
  481. }
  482. })
  483. // console.log(res)
  484. if (res.code === 200) {
  485. this.rimList = res.data
  486. const i = this.rimList.findIndex((el) => el.id == this.hotelId)
  487. this.rimList.splice(i, 1)
  488. if (this.rimList.length) {
  489. this.rimList.forEach((ele) => {
  490. if (ele.hpositionWens) {
  491. let lat = ele.hpositionWens.split(',')[0]
  492. let lng = ele.hpositionWens.split(',')[1]
  493. ele.distance = this.calculateDistance(lat, lng)
  494. }
  495. })
  496. }
  497. }
  498. this.isReachBottom = true
  499. },
  500. async getRimList(pageValue = 1) {
  501. const res = await this.$myRequest({
  502. url: '/mhotel/applistAround.action',
  503. data: {
  504. page: pageValue,
  505. rows: this.rows,
  506. rtype: this.rimHeaderList[this.rimActiveIndex]
  507. }
  508. })
  509. // console.log(res)
  510. if (res.code === 200) {
  511. this.rimList = [...this.rimList, ...res.rows]
  512. this.rimTotal = res.total
  513. if (this.rimList.length) {
  514. this.rimList.forEach((ele) => {
  515. if (ele.jingwei) {
  516. let lat = ele.jingwei.split(',')[1]
  517. let lng = ele.jingwei.split(',')[0]
  518. ele.distance = this.calculateDistance(lat, lng)
  519. }
  520. })
  521. }
  522. }
  523. this.isReachBottom = true
  524. },
  525. GoRimDetail(item) {
  526. if (this.rimActiveIndex == 0) {
  527. this.getTimes()
  528. this.hotelId = item.id
  529. this.info = null
  530. this.list = []
  531. this.getHotelInfo()
  532. this.score = ''
  533. this.commentList = []
  534. this.getEvaData()
  535. this.setTime = ''
  536. this.getLateTime()
  537. uni.getLocation({
  538. type: 'gcj02',
  539. success: (res) => {
  540. this.myLat = res.latitude
  541. this.myLng = res.longitude
  542. },
  543. complete: () => {
  544. this.getRimList_hotel()
  545. }
  546. })
  547. uni.pageScrollTo({
  548. scrollTop: 0
  549. })
  550. } else {
  551. let info = encodeURIComponent(JSON.stringify(item))
  552. uni.navigateTo({
  553. url: `/pagesSub/rimDetail/rimDetail?info=${info}`
  554. })
  555. }
  556. },
  557. // 进入全屏和退出全屏时触发的回调
  558. fullscreenchange(e) {
  559. this.isFullScreen = e.detail.fullScreen
  560. },
  561. // 点击视频控件时触发的回调
  562. handleClickVideo(id) {
  563. this.videoContext = uni.createVideoContext(id)
  564. if (this.isFullScreen) {
  565. this.videoContext.stop()
  566. this.videoContext.exitFullScreen()
  567. } else {
  568. this.videoContext.requestFullScreen()
  569. this.videoContext.play()
  570. }
  571. },
  572. // 点击收藏按钮回调
  573. async changeCollect(is_collect_hotel) {
  574. let userInfo = uni.getStorageSync('userInfo')
  575. let openid = uni.getStorageSync('openid')
  576. if (userInfo && openid) {
  577. const res = await this.$myRequest({
  578. url: is_collect_hotel ? '/mhotel/ahpdelCollectHotel.action' : '/mhotel/ahpcollectHotel.action',
  579. data: {
  580. userId: uni.getStorageSync('userInfo').id,
  581. hotelId: this.hotelId
  582. }
  583. })
  584. // console.log(res)
  585. if (res.code === 200) {
  586. uni.showToast({
  587. title: is_collect_hotel ? '取消收藏成功' : '收藏成功',
  588. icon: 'success',
  589. mask: true
  590. })
  591. this.info.is_collect_hotel = !this.info.is_collect_hotel
  592. }
  593. } else {
  594. uni.showToast({
  595. title: '请先登录',
  596. icon: 'none',
  597. mask: true
  598. })
  599. setTimeout(() => {
  600. uni.navigateTo({
  601. url: '/pages/login/login'
  602. })
  603. }, 1500)
  604. }
  605. },
  606. // 获取评论数据
  607. async getEvaData(id) {
  608. const res = await this.$myRequest({
  609. url: '/mhotel/abcaevaluatePage.action',
  610. data: {
  611. hotelId: id ? id : this.hotelId,
  612. page: 1,
  613. rows: 5,
  614. status: 0
  615. }
  616. })
  617. // console.log(res);
  618. if (res.code === 200 && res.page.pageList) {
  619. this.score = res.score.score.toFixed(1)
  620. this.scoreFw = res.score.scoreFw.toFixed(1)
  621. this.scoreSs = res.score.scoreSs.toFixed(1)
  622. this.scoreWs = res.score.scoreWs.toFixed(1)
  623. this.scoreWz = res.score.scoreWz.toFixed(1)
  624. this.commentList = res.page.pageList
  625. this.total = res.page.total
  626. }
  627. },
  628. // 获取民宿信息
  629. async getHotelInfo(id) {
  630. const res = await this.$myRequest({
  631. url: '/mhotel/ahpgetHouseByHotelId.action',
  632. data: {
  633. hotelId: id ? id : this.hotelId,
  634. userId: uni.getStorageSync('userInfo').id,
  635. queryStartTime: this.startTime,
  636. queryEndTime: this.endTime
  637. }
  638. })
  639. // console.log(res)
  640. if (res.code === 200) {
  641. this.info = res.data.data
  642. this.list = res.data.data.houseList
  643. uni.setNavigationBarTitle({
  644. title: res.data.data.hotel_name
  645. })
  646. }
  647. },
  648. onClickItem(e) {
  649. this.activeIndex = e.currentIndex
  650. if (this.activeIndex === 1) {
  651. uni.pageScrollTo({
  652. selector: '.evaluate'
  653. })
  654. } else if (this.activeIndex === 0) {
  655. uni.pageScrollTo({
  656. scrollTop: 0
  657. })
  658. } else if (this.activeIndex === 2) {
  659. uni.pageScrollTo({
  660. selector: '.rim'
  661. })
  662. }
  663. },
  664. onClickItemRim(index) {
  665. this.isReachBottom = false
  666. this.page = 1
  667. this.rimActiveIndex = index
  668. this.rimList = []
  669. if (this.rimActiveIndex == 0) {
  670. this.getRimList_hotel()
  671. } else {
  672. this.getRimList()
  673. }
  674. },
  675. monthSwitch(e) {
  676. let time = e.year + '-' + e.month.toString().padStart(2, 0) + '-01'
  677. this.handleOpen(time)
  678. },
  679. // 选择日期确定回调
  680. handleConfirm(e) {
  681. this.startTime = e.range.before
  682. this.endTime = e.range.after
  683. this.dayList = e.range.data
  684. this.nightNum = e.range.data.length - 1
  685. this.getHotelInfo()
  686. },
  687. // 点击地图图标回调
  688. handleMap(item) {
  689. if (this.showLocation) {
  690. let lat = item.hpositionWens.split(',')[0] * 1
  691. let lng = item.hpositionWens.split(',')[1] * 1
  692. uni.openLocation({
  693. latitude: lat,
  694. longitude: lng,
  695. name: item.hname,
  696. address: item.hposition,
  697. success: () => {}
  698. })
  699. } else {
  700. uni.showModal({
  701. content: '当前没有定位权限,是否去设置打开?',
  702. confirmText: '确认',
  703. cancelText: '取消',
  704. success: (res) => {
  705. if (res.confirm) {
  706. uni.openSetting({
  707. success: (res) => {
  708. this.showLocation = true
  709. this.handleMap(item)
  710. }
  711. })
  712. } else {
  713. uni.showToast({
  714. title: '获取定位权限失败,无法使用地图功能',
  715. icon: 'none',
  716. mask: true
  717. })
  718. }
  719. }
  720. })
  721. }
  722. },
  723. // 点击电话图标回调
  724. handlePhone(phone) {
  725. uni.makePhoneCall({
  726. phoneNumber: phone
  727. })
  728. },
  729. // 点击弹窗关闭图标回调
  730. handleClosePop() {
  731. this.showPage = false
  732. this.$refs.popup.close()
  733. },
  734. // 点击每一个户型回调
  735. handleLookDetail(item) {
  736. this.roomInfo = item
  737. this.showPage = true
  738. this.$refs.popup.open('bottom')
  739. },
  740. // 点击设施详情回调
  741. goPageDetailInfo() {
  742. uni.navigateTo({
  743. url: `/pagesSub/detailInfo/detailInfo?hotelId=${this.hotelId}`
  744. })
  745. },
  746. // 点击 订 预定 按钮回调
  747. goPageAffOrder(item) {
  748. let flag = uni.getStorageSync('openid')
  749. let tokenId = uni.getStorageSync('tokenId')
  750. if (flag && tokenId) {
  751. if (!this.startTime) {
  752. uni.showToast({
  753. title: '请选择入住时间',
  754. icon: 'none'
  755. })
  756. return
  757. }
  758. if (!this.endTime) {
  759. uni.showToast({
  760. title: '请选择离店时间',
  761. icon: 'none'
  762. })
  763. return
  764. }
  765. if (item.remainRooms * 1 > 0) {
  766. this.$refs.popup.close()
  767. this.showPage = false
  768. let info = JSON.stringify({
  769. nightNum: this.nightNum,
  770. startTimeDay: this.startTime.slice(8, 10),
  771. startTimeMonth: this.startTime.slice(5, 7),
  772. startTimeWeek: this.getWeek(this.startTime),
  773. endTimeDay: this.endTime.slice(8, 10),
  774. endTimeMonth: this.endTime.slice(5, 7),
  775. endTimeWeek: this.getWeek(this.endTime),
  776. item: item,
  777. queryStartTime: this.startTime,
  778. queryEndTime: this.endTime,
  779. dayList: this.dayList,
  780. hTypeName: this.info.hTypeName,
  781. hotelName: this.info.hotel_name,
  782. hotelId: this.hotelId
  783. })
  784. uni.navigateTo({
  785. url: `/pages/affirmOrder/affirmOrder?info=${info}`
  786. })
  787. } else {
  788. uni.showToast({
  789. title: '该房间已售罄',
  790. icon: 'none',
  791. mask: true
  792. })
  793. }
  794. } else {
  795. uni.showToast({
  796. title: '请先登录',
  797. icon: 'none',
  798. mask: true
  799. })
  800. setTimeout(() => {
  801. uni.navigateTo({
  802. url: '/pages/login/login'
  803. })
  804. }, 1500)
  805. }
  806. },
  807. // 点击日期区域回调
  808. async handleOpen(time) {
  809. const res = await this.$myRequest({
  810. url: '/mhotel/house/price/priceCalendar.action',
  811. data: {
  812. merchantId: this.info.managerId,
  813. startTime: time ? time : this.startTime
  814. }
  815. })
  816. if (res.code === 200) {
  817. this.selected = res.data
  818. }
  819. if (!time) {
  820. this.$refs.calendar.open()
  821. }
  822. },
  823. // 传入参数获取当前是星期几
  824. getWeek(time) {
  825. let date = new Date(time)
  826. let week = date.getDay()
  827. let weekList = ['日', '一', '二', '三', '四', '五', '六']
  828. let res = '周' + weekList[week]
  829. return res
  830. },
  831. // 获取今明两天的日期 YYYY-MM-DD
  832. getTimes() {
  833. // 今天
  834. let today = new Date()
  835. // 明天
  836. let tomorrow = new Date(today.getTime() + 24 * 60 * 60 * 1000)
  837. this.startTime = `${today.getFullYear()}-${(today.getMonth() + 1).toString().padStart(2, 0)}-${today.getDate().toString().padStart(2, 0)}`
  838. this.endTime = `${tomorrow.getFullYear()}-${(tomorrow.getMonth() + 1).toString().padStart(2, 0)}-${tomorrow.getDate().toString().padStart(2, 0)}`
  839. this.dayList = [this.startTime, this.endTime]
  840. },
  841. handleGoPull(linkProUrl) {
  842. let temURL = linkProUrl.slice(22)
  843. let url = 'https://f10mfe54bri.720yun.com' + temURL
  844. uni.navigateTo({
  845. url: `/pagesSub/web/web?url=${url}`
  846. })
  847. },
  848. // 点击每一个评价回调
  849. handleGoDetail(item) {
  850. uni.navigateTo({
  851. url: `/pagesSub/appraiseDetail/appraiseDetail?id=${item.id}`
  852. })
  853. },
  854. // 点击评价图片回调
  855. handleClickImg(url, index) {
  856. if (this.videoContext) {
  857. this.videoContext.stop()
  858. }
  859. // 预览图片
  860. uni.previewImage({
  861. current: index,
  862. urls: [url]
  863. })
  864. },
  865. handleGoPage() {
  866. uni.navigateTo({
  867. url: `/pagesSub/appraise/appraise?hotelId=${this.hotelId}`
  868. })
  869. },
  870. handleClickSwiper(urls, current) {
  871. const temList = urls.map((ele) => ele.url)
  872. uni.previewImage({
  873. urls: temList,
  874. current
  875. })
  876. },
  877. // 计算两个点之间的距离
  878. calculateDistance(lat, lng) {
  879. let centerLat = lat
  880. let centerLng = lng
  881. let red1 = (this.myLat * Math.PI) / 180.0
  882. let red2 = (centerLat * Math.PI) / 180.0
  883. let a = red1 - red2
  884. let b = (this.myLng * Math.PI) / 180.0 - (centerLng * Math.PI) / 180.0
  885. let R = 6378137
  886. 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)))
  887. let res = (distance / 1000).toFixed(2) * 1
  888. return res
  889. }
  890. }
  891. }
  892. </script>
  893. <style lang="scss" scoped>
  894. .container {
  895. display: flex;
  896. flex-direction: column;
  897. align-items: center;
  898. position: relative;
  899. padding-bottom: 20rpx;
  900. min-height: 100vh;
  901. background-color: #f2f3f5;
  902. .control {
  903. z-index: 999;
  904. position: sticky;
  905. top: 0;
  906. width: 100%;
  907. height: 100rpx;
  908. background-color: #fff;
  909. }
  910. .banner {
  911. position: relative;
  912. width: 750rpx;
  913. height: 422rpx;
  914. .swiper {
  915. height: 422rpx;
  916. .swiper_item {
  917. width: 100%;
  918. height: 100%;
  919. .img {
  920. width: 100%;
  921. height: 100%;
  922. }
  923. }
  924. }
  925. .img {
  926. width: 100%;
  927. height: 100%;
  928. }
  929. .slogan {
  930. position: absolute;
  931. top: 0;
  932. left: 0;
  933. display: flex;
  934. justify-content: center;
  935. align-items: center;
  936. width: 163rpx;
  937. height: 60rpx;
  938. background-color: rgba(255, 255, 255, 0.4);
  939. img {
  940. width: 125rpx;
  941. height: 44rpx;
  942. }
  943. }
  944. .full {
  945. position: absolute;
  946. top: 13rpx;
  947. right: 20rpx;
  948. display: flex;
  949. align-items: center;
  950. justify-content: space-around;
  951. width: 173rpx;
  952. height: 60rpx;
  953. color: #fff;
  954. font-size: 24rpx;
  955. border-radius: 11rpx;
  956. background-color: rgba(0, 0, 0, 0.5);
  957. img {
  958. width: 40rpx;
  959. height: 40rpx;
  960. }
  961. }
  962. .collect {
  963. position: absolute;
  964. top: 68rpx;
  965. left: 8rpx;
  966. }
  967. }
  968. .detail {
  969. z-index: 1;
  970. float: left;
  971. margin-top: -177rpx;
  972. box-sizing: border-box;
  973. padding: 0 30rpx 30rpx;
  974. width: 710rpx;
  975. border-radius: 10rpx;
  976. background-color: #fff;
  977. .detail_name {
  978. margin-top: 25rpx;
  979. font-size: 34rpx;
  980. font-weight: bold;
  981. }
  982. .detail_info {
  983. display: flex;
  984. justify-content: space-between;
  985. margin-top: 10rpx;
  986. .info_left {
  987. color: #999999;
  988. font-size: 20rpx;
  989. .level {
  990. margin-left: 20rpx;
  991. }
  992. }
  993. .info_right {
  994. display: flex;
  995. align-items: center;
  996. color: #096562;
  997. font-size: 24rpx;
  998. img {
  999. margin-left: 6rpx;
  1000. width: 10rpx;
  1001. height: 20rpx;
  1002. }
  1003. }
  1004. }
  1005. .detail_group {
  1006. display: flex;
  1007. flex-wrap: wrap;
  1008. margin-top: 5rpx;
  1009. width: 450rpx;
  1010. .group_item {
  1011. display: flex;
  1012. align-items: center;
  1013. margin-right: 10rpx;
  1014. margin-bottom: 10rpx;
  1015. color: #999999;
  1016. font-size: 20rpx;
  1017. img {
  1018. margin-right: 5rpx;
  1019. width: 22rpx;
  1020. height: 22rpx;
  1021. }
  1022. }
  1023. }
  1024. .address {
  1025. display: flex;
  1026. justify-content: space-between;
  1027. margin-top: 8rpx;
  1028. font-size: 28rpx;
  1029. font-weight: bold;
  1030. .address_left {
  1031. width: 480rpx;
  1032. overflow: hidden;
  1033. text-overflow: ellipsis;
  1034. white-space: nowrap;
  1035. }
  1036. .address_right {
  1037. display: flex;
  1038. .right_box {
  1039. margin-left: 28rpx;
  1040. width: 50rpx;
  1041. height: 78rpx;
  1042. img {
  1043. width: 100%;
  1044. height: 100%;
  1045. }
  1046. }
  1047. }
  1048. }
  1049. .distance {
  1050. margin-top: -35rpx;
  1051. color: #999999;
  1052. font-size: 24rpx;
  1053. }
  1054. }
  1055. .body {
  1056. float: left;
  1057. margin-top: 20rpx;
  1058. // padding-bottom: 30rpx;
  1059. width: 710rpx;
  1060. border-radius: 10rpx;
  1061. background-color: #fff;
  1062. .body_header {
  1063. display: flex;
  1064. justify-content: space-around;
  1065. box-sizing: border-box;
  1066. padding: 0 30rpx;
  1067. height: 150rpx;
  1068. .header_start {
  1069. display: flex;
  1070. flex-direction: column;
  1071. justify-content: center;
  1072. align-items: center;
  1073. width: 213rpx;
  1074. height: 150rpx;
  1075. font-size: 30rpx;
  1076. .header_top {
  1077. margin-bottom: 10rpx;
  1078. color: #999999;
  1079. font-size: 24rpx;
  1080. }
  1081. .header_bottom {
  1082. font-size: 34rpx;
  1083. font-weight: bold;
  1084. }
  1085. }
  1086. .header_night {
  1087. display: flex;
  1088. justify-content: center;
  1089. align-items: center;
  1090. .night_line {
  1091. width: 17rpx;
  1092. height: 1rpx;
  1093. background-color: #296de3;
  1094. }
  1095. .night_box {
  1096. display: flex;
  1097. align-items: center;
  1098. justify-content: center;
  1099. width: 81rpx;
  1100. height: 46rpx;
  1101. font-size: 24rpx;
  1102. border-radius: 66rpx;
  1103. border: 1rpx solid #296de3;
  1104. }
  1105. }
  1106. .header_end {
  1107. display: flex;
  1108. flex-direction: column;
  1109. justify-content: center;
  1110. align-items: center;
  1111. width: 213rpx;
  1112. height: 150rpx;
  1113. font-size: 30rpx;
  1114. .header_top {
  1115. margin-bottom: 10rpx;
  1116. color: #999999;
  1117. font-size: 24rpx;
  1118. }
  1119. .header_bottom {
  1120. font-size: 34rpx;
  1121. font-weight: bold;
  1122. }
  1123. }
  1124. }
  1125. .body_content {
  1126. .body_box {
  1127. box-sizing: border-box;
  1128. padding: 0 30rpx;
  1129. margin-bottom: 30rpx;
  1130. display: flex;
  1131. height: 193rpx;
  1132. border-bottom: 1rpx solid #cccccc;
  1133. .box_left {
  1134. width: 213rpx;
  1135. height: 161rpx;
  1136. border-radius: 5rpx;
  1137. img {
  1138. width: 100%;
  1139. height: 100%;
  1140. }
  1141. }
  1142. .box_center {
  1143. margin-left: 16rpx;
  1144. .center_top {
  1145. font-size: 34rpx;
  1146. font-weight: bold;
  1147. }
  1148. .center_center {
  1149. display: flex;
  1150. flex-wrap: wrap;
  1151. margin-top: 10rpx;
  1152. color: #999999;
  1153. font-size: 24rpx;
  1154. .center_item {
  1155. margin-right: 15rpx;
  1156. }
  1157. }
  1158. .center_bottom {
  1159. margin-top: 25rpx;
  1160. .img {
  1161. margin-right: 15rpx;
  1162. width: 30rpx;
  1163. height: 30rpx;
  1164. }
  1165. }
  1166. }
  1167. .box_right {
  1168. display: flex;
  1169. flex-direction: column;
  1170. align-items: flex-end;
  1171. margin-left: auto;
  1172. margin-top: 20rpx;
  1173. .right_price {
  1174. color: #ff5733;
  1175. font-size: 42rpx;
  1176. text {
  1177. font-size: 24rpx;
  1178. }
  1179. }
  1180. .right_btn {
  1181. display: flex;
  1182. justify-content: center;
  1183. align-items: center;
  1184. margin-top: 10rpx;
  1185. width: 100rpx;
  1186. height: 66rpx;
  1187. color: #fff;
  1188. font-size: 36rpx;
  1189. border-radius: 11rpx;
  1190. background-color: #096562;
  1191. }
  1192. .inactive {
  1193. background-color: #cccccc;
  1194. }
  1195. }
  1196. }
  1197. .body_pop {
  1198. position: relative;
  1199. height: 955rpx;
  1200. border-radius: 22rpx 22rpx 0 0;
  1201. background-color: #fff;
  1202. overflow-y: auto;
  1203. .pop_swiper {
  1204. height: 422rpx;
  1205. border-radius: 22rpx 22rpx 0 0;
  1206. .pop_swiper_item {
  1207. width: 100%;
  1208. height: 100%;
  1209. .img {
  1210. width: 100%;
  1211. height: 100%;
  1212. border-radius: 22rpx 22rpx 0 0;
  1213. }
  1214. }
  1215. }
  1216. .pop_icon {
  1217. position: absolute;
  1218. top: 20rpx;
  1219. right: 30rpx;
  1220. width: 58rpx;
  1221. height: 58rpx;
  1222. }
  1223. .pop_body {
  1224. box-sizing: border-box;
  1225. padding: 0 20rpx 30rpx;
  1226. .body_title {
  1227. margin-top: 30rpx;
  1228. font-size: 32rpx;
  1229. font-weight: bold;
  1230. }
  1231. .body_tags {
  1232. display: flex;
  1233. flex-wrap: wrap;
  1234. margin-top: 20rpx;
  1235. .tags_item {
  1236. display: flex;
  1237. align-items: center;
  1238. margin-right: 76rpx;
  1239. margin-bottom: 20rpx;
  1240. color: #383838;
  1241. font-size: 24rpx;
  1242. .img {
  1243. margin-right: 5rpx;
  1244. width: 28rpx;
  1245. height: 28rpx;
  1246. }
  1247. }
  1248. }
  1249. .body_title2 {
  1250. margin-top: 20rpx;
  1251. font-size: 28rpx;
  1252. }
  1253. .body_detail {
  1254. display: flex;
  1255. flex-direction: column;
  1256. justify-content: space-between;
  1257. // align-items: flex-end;
  1258. box-sizing: border-box;
  1259. padding: 20rpx 30rpx;
  1260. margin-top: 18rpx;
  1261. width: 710rpx;
  1262. height: 266rpx;
  1263. font-size: 24rpx;
  1264. border-radius: 7rpx;
  1265. background-color: #f2f2f2;
  1266. .detail_old {
  1267. text-align: end;
  1268. text-decoration: line-through;
  1269. }
  1270. .detail_box {
  1271. display: flex;
  1272. justify-content: space-between;
  1273. color: #808080;
  1274. text {
  1275. color: #ff5733;
  1276. }
  1277. }
  1278. .detail_new {
  1279. display: flex;
  1280. justify-content: flex-end;
  1281. align-items: center;
  1282. font-size: 24rpx;
  1283. .color {
  1284. color: #ff5733;
  1285. }
  1286. .price {
  1287. font-size: 36rpx;
  1288. }
  1289. .ml_10 {
  1290. margin-left: 10rpx;
  1291. }
  1292. }
  1293. }
  1294. .body_bottom {
  1295. display: flex;
  1296. justify-content: space-between;
  1297. align-items: center;
  1298. margin-top: 250rpx;
  1299. height: 80rpx;
  1300. .bottom_left {
  1301. display: flex;
  1302. align-items: center;
  1303. color: #333333;
  1304. font-size: 24rpx;
  1305. .img {
  1306. margin-right: 10rpx;
  1307. width: 48rpx;
  1308. height: 48rpx;
  1309. }
  1310. }
  1311. .bottom_right {
  1312. display: flex;
  1313. align-items: center;
  1314. color: #ff5733;
  1315. font-size: 40rpx;
  1316. font-weight: bold;
  1317. text {
  1318. font-size: 24rpx;
  1319. }
  1320. .btn {
  1321. display: flex;
  1322. justify-content: center;
  1323. align-items: center;
  1324. margin-left: 30rpx;
  1325. width: 238rpx;
  1326. height: 80rpx;
  1327. color: #fff;
  1328. font-size: 32rpx;
  1329. font-weight: 400;
  1330. border-radius: 64rpx;
  1331. background-color: #096562;
  1332. }
  1333. .inactive {
  1334. background-color: #cccccc;
  1335. }
  1336. }
  1337. }
  1338. }
  1339. }
  1340. }
  1341. .noData {
  1342. display: flex;
  1343. flex-direction: column;
  1344. justify-content: center;
  1345. align-items: center;
  1346. padding-bottom: 20rpx;
  1347. img {
  1348. margin-top: 60rpx;
  1349. width: 600rpx;
  1350. height: 600rpx;
  1351. }
  1352. }
  1353. }
  1354. .evaluate {
  1355. width: 710rpx;
  1356. background-color: #f2f3f5;
  1357. .evaluate_title {
  1358. line-height: 83rpx;
  1359. font-size: 32rpx;
  1360. font-weight: bold;
  1361. }
  1362. .evaluate_body {
  1363. display: flex;
  1364. flex-direction: column;
  1365. // margin-bottom: 20rpx;
  1366. width: 710rpx;
  1367. border-radius: 11rpx;
  1368. background-color: #fff;
  1369. .header {
  1370. display: flex;
  1371. align-items: center;
  1372. margin: 25rpx 20rpx;
  1373. width: 670rpx;
  1374. height: 120rpx;
  1375. border-radius: 13rpx;
  1376. background-color: #e4f0ef;
  1377. .header_box {
  1378. display: flex;
  1379. height: 70rpx;
  1380. .box_left {
  1381. display: flex;
  1382. justify-content: center;
  1383. align-items: center;
  1384. width: 140rpx;
  1385. color: #096562;
  1386. font-size: 60rpx;
  1387. font-weight: 900;
  1388. border-right: 1rpx solid #cccccc;
  1389. }
  1390. .box_right {
  1391. flex: 1;
  1392. display: flex;
  1393. flex-wrap: wrap;
  1394. color: #808080;
  1395. font-size: 24rpx;
  1396. .right_item {
  1397. display: flex;
  1398. align-items: center;
  1399. width: 50%;
  1400. .item_info {
  1401. margin-left: 33rpx;
  1402. }
  1403. .item_progress {
  1404. margin-right: 20rpx;
  1405. padding: 0 13rpx;
  1406. flex: 1;
  1407. }
  1408. }
  1409. }
  1410. }
  1411. }
  1412. .evaluate_box {
  1413. box-sizing: border-box;
  1414. padding: 0 20rpx;
  1415. margin: 0 auto 20rpx;
  1416. width: 710rpx;
  1417. border-radius: 18rpx;
  1418. background-color: #fff;
  1419. .box_userInfo {
  1420. display: flex;
  1421. align-items: center;
  1422. height: 115rpx;
  1423. img {
  1424. width: 70rpx;
  1425. height: 70rpx;
  1426. border-radius: 50%;
  1427. }
  1428. .userInfo_msg {
  1429. margin-left: 18rpx;
  1430. .msg_name {
  1431. font-size: 28rpx;
  1432. }
  1433. .msg_star {
  1434. margin-left: -5rpx;
  1435. margin-top: 5rpx;
  1436. }
  1437. }
  1438. }
  1439. .box_time {
  1440. display: flex;
  1441. align-items: center;
  1442. color: #a6a6a6;
  1443. font-size: 24rpx;
  1444. }
  1445. .box_content {
  1446. margin-top: 15rpx;
  1447. font-size: 24rpx;
  1448. color: #000;
  1449. }
  1450. .box_img {
  1451. display: grid;
  1452. grid-template-columns: 1fr 1fr 1fr;
  1453. grid-auto-rows: auto;
  1454. gap: 10rpx;
  1455. margin-top: 20rpx;
  1456. img {
  1457. width: 216rpx;
  1458. height: 216rpx;
  1459. border-radius: 20rpx;
  1460. }
  1461. .video {
  1462. width: 216rpx;
  1463. height: 216rpx;
  1464. border-radius: 20rpx;
  1465. }
  1466. }
  1467. }
  1468. .foot {
  1469. display: flex;
  1470. justify-content: center;
  1471. align-items: center;
  1472. padding-bottom: 20rpx;
  1473. height: 68rpx;
  1474. font-size: 24rpx;
  1475. font-weight: bold;
  1476. color: #096663;
  1477. img {
  1478. margin-left: 10rpx;
  1479. width: 10rpx;
  1480. height: 18rpx;
  1481. }
  1482. }
  1483. .noData {
  1484. display: flex;
  1485. flex-direction: column;
  1486. justify-content: center;
  1487. align-items: center;
  1488. padding-bottom: 60rpx;
  1489. img {
  1490. margin-top: 160rpx;
  1491. width: 600rpx;
  1492. height: 600rpx;
  1493. }
  1494. }
  1495. }
  1496. }
  1497. .rim {
  1498. width: 710rpx;
  1499. background-color: #f2f3f5;
  1500. .rim_title {
  1501. line-height: 80rpx;
  1502. font-size: 32rpx;
  1503. font-weight: bold;
  1504. }
  1505. .rim_control {
  1506. margin-bottom: 10rpx;
  1507. line-height: 85rpx;
  1508. font-size: 28rpx;
  1509. color: #808080;
  1510. white-space: nowrap;
  1511. overflow-x: auto;
  1512. background-color: #fff;
  1513. .control_box {
  1514. padding: 0 15rpx 0 20rpx;
  1515. .text {
  1516. padding-bottom: 5rpx;
  1517. }
  1518. .active {
  1519. color: #096562;
  1520. border-bottom: 5rpx solid #096562;
  1521. }
  1522. }
  1523. }
  1524. .rim_body {
  1525. .rim_box {
  1526. display: flex;
  1527. margin-bottom: 20rpx;
  1528. width: 710rpx;
  1529. height: 150rpx;
  1530. background-color: #fff;
  1531. img {
  1532. width: 126rpx;
  1533. height: 150rpx;
  1534. }
  1535. .box_info {
  1536. display: flex;
  1537. flex-direction: column;
  1538. justify-content: space-evenly;
  1539. padding: 0 24rpx;
  1540. box-sizing: border-box;
  1541. width: 584rpx;
  1542. height: 150rpx;
  1543. .info_top {
  1544. font-size: 28rpx;
  1545. font-weight: bold;
  1546. }
  1547. .info_center {
  1548. font-size: 24rpx;
  1549. color: #808080;
  1550. }
  1551. .info_bottom {
  1552. display: flex;
  1553. align-items: center;
  1554. font-size: 24rpx;
  1555. .bottom_rate {
  1556. color: #ff5733;
  1557. }
  1558. .bottom_num {
  1559. margin-left: 15rpx;
  1560. color: #a6a6a6;
  1561. }
  1562. .bottom_price {
  1563. margin-left: auto;
  1564. font-size: 28rpx;
  1565. color: #ff5733;
  1566. text {
  1567. font-size: 20rpx;
  1568. color: #a6a6a6;
  1569. }
  1570. }
  1571. }
  1572. }
  1573. }
  1574. }
  1575. .noData {
  1576. display: flex;
  1577. flex-direction: column;
  1578. justify-content: center;
  1579. align-items: center;
  1580. padding-bottom: 60rpx;
  1581. img {
  1582. margin-top: 160rpx;
  1583. width: 500rpx;
  1584. height: 500rpx;
  1585. }
  1586. }
  1587. .rim_more {
  1588. display: flex;
  1589. justify-content: center;
  1590. align-items: center;
  1591. width: 710rpx;
  1592. height: 70rpx;
  1593. color: #096663;
  1594. font-size: 24rpx;
  1595. font-weight: bold;
  1596. background-color: #fff;
  1597. img {
  1598. margin-left: 10rpx;
  1599. margin-top: 2rpx;
  1600. width: 10rpx;
  1601. height: 18rpx;
  1602. }
  1603. }
  1604. }
  1605. .scenicSpot {
  1606. width: 710rpx;
  1607. background-color: #f2f3f5;
  1608. .scenicSpot_title {
  1609. line-height: 83rpx;
  1610. font-size: 32rpx;
  1611. font-weight: bold;
  1612. }
  1613. .scenicSpot_body {
  1614. .scenicSpot_box {
  1615. display: flex;
  1616. margin-bottom: 20rpx;
  1617. width: 710rpx;
  1618. height: 150rpx;
  1619. background-color: #fff;
  1620. img {
  1621. width: 126rpx;
  1622. height: 150rpx;
  1623. }
  1624. .box_info {
  1625. display: flex;
  1626. flex-direction: column;
  1627. justify-content: space-evenly;
  1628. padding: 0 24rpx;
  1629. box-sizing: border-box;
  1630. width: 584rpx;
  1631. height: 150rpx;
  1632. .info_top {
  1633. font-size: 28rpx;
  1634. font-weight: bold;
  1635. }
  1636. .info_center {
  1637. font-size: 24rpx;
  1638. color: #808080;
  1639. }
  1640. .info_bottom {
  1641. display: flex;
  1642. align-items: center;
  1643. font-size: 24rpx;
  1644. .bottom_rate {
  1645. color: #ff5733;
  1646. }
  1647. .bottom_num {
  1648. margin-left: 15rpx;
  1649. color: #a6a6a6;
  1650. }
  1651. .bottom_price {
  1652. margin-left: auto;
  1653. font-size: 28rpx;
  1654. color: #ff5733;
  1655. text {
  1656. font-size: 20rpx;
  1657. color: #a6a6a6;
  1658. }
  1659. }
  1660. }
  1661. }
  1662. }
  1663. }
  1664. .scenicSpot_more {
  1665. display: flex;
  1666. justify-content: center;
  1667. align-items: center;
  1668. width: 710rpx;
  1669. height: 70rpx;
  1670. color: #096663;
  1671. font-size: 24rpx;
  1672. font-weight: bold;
  1673. background-color: #fff;
  1674. img {
  1675. margin-left: 10rpx;
  1676. margin-top: 2rpx;
  1677. width: 10rpx;
  1678. height: 18rpx;
  1679. }
  1680. }
  1681. }
  1682. }
  1683. </style>