海南旅游项目 前端仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1143 lines
44 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago
5 years ago
4 years ago
4 years ago
  1. <template>
  2. <view>
  3. <skeleton :loading="skeletonLoading" :row="12" :showAvatar="false" :showTitle="true">
  4. <block v-if="isRight(goods_detail)">
  5. <!-- 商品图片轮播 -->
  6. <swiper :current="current" :autoplay="false" :interval="2500" :indicator-dots="goods_detail.pictures.length > 1 ? true : false" :circular="true" class="swiper-box" indicator-active-color="#1998FE">
  7. <swiper-item v-for="(item, index) in goods_detail.pictures" :key="index">
  8. <image mode="aspectFill" :src="item" style="width: 100%; height: 100%;" @click="lookImg(index)"></image>
  9. </swiper-item>
  10. </swiper>
  11. <!-- 商品主要信息 -->
  12. <view class="head-info">
  13. <view class="lf-font-32 lf-color-333 lf-font-bold">{{ goods_detail.title }}</view>
  14. <view class="lf-row-between lf-font-24 lf-m-t-30 lf-p-b-20">
  15. <view class="lf-flex price">
  16. <lf-price :price="goods_detail.price"></lf-price>
  17. <view class="lf-m-l-20">¥{{ goods_detail.original_price }}</view>
  18. <view v-if="goods_detail.cost">{{ goods_detail.cost }}</view>
  19. </view>
  20. <view class="lf-font-24 lf-text-right">
  21. <view class="lf-color-gray">已售 {{ goods_detail.sale }}</view>
  22. <view class="lf-color-gray">库存 {{ goods_detail.stock }}</view>
  23. <!-- <view class="lf-color-primary">{{ goods_detail.specs[0].stock_text }}</view> -->
  24. </view>
  25. </view>
  26. <view class="label-box" v-if="goods_detail.coupon && goods_detail.coupon.length">
  27. <view class="label-item" v-for="(item, index) in goods_detail.coupon" :key="index">{{ item.tag }}</view>
  28. </view>
  29. </view>
  30. <view class="lf-row-between list-item lf-m-t-20" @click="changePop(goods_detail.product.type)">
  31. <view class="lf-row-center">
  32. <text class="lf-font-28 lf-color-gray">操作</text>
  33. <text class="lf-text-vertical lf-m-l-40 lf-font-28 lf-color-black">套餐/类型</text>
  34. </view>
  35. <view>
  36. <text class="lf-iconfont lf-icon-xiangyou lf-text-vertical"></text>
  37. </view>
  38. </view>
  39. <!-- 景区类型 -->
  40. <view v-if="goods_detail.product.extends && goods_detail.product && goods_detail.product.type == 2">
  41. <view class="goods-detail" v-if="goods_detail.product.extends.field_2_name && goods_detail.product.extends.field_2_address" @click="openMap(goods_detail.product.extends.field_2_address,goods_detail.product.extends.field_2_latitude,goods_detail.product.extends.field_2_longitude)">
  42. <view class="lf-font-32 lf-font-bold lf-m-b-20">{{goods_detail.product.extends.field_2_name}}</view>
  43. <view class="lf-row-between">
  44. <view class="lf-line-2 lf-font-28 lf-color-333">{{goods_detail.product.extends.field_2_address}}</view>
  45. <view class="lf-iconfont lf-icon-dizhi lf-color-blue"></view>
  46. </view>
  47. </view>
  48. <view class="goods-detail" v-if="goods_detail.product.extends.field_2_open_time">
  49. <view class="lf-font-32 lf-font-bold lf-m-b-20">景区开放时间</view>
  50. <view>
  51. <u-table>
  52. <u-tr v-for="(item,index) in goods_detail.product.extends.field_2_open_time" :key="index">
  53. <u-th>{{item.node}}</u-th>
  54. <u-th>{{item.summer}}</u-th>
  55. <u-th>{{item.winter}}</u-th>
  56. </u-tr>
  57. </u-table>
  58. </view>
  59. </view>
  60. <view class="goods-detail" v-if="goods_detail.product.extends.field_2_project">
  61. <view class="lf-font-32 lf-font-bold lf-m-b-20">包含项目</view>
  62. <view class="lf-flex-column">
  63. <!-- <view class="lf-row-between lf-m-b-20">
  64. <view class="lf-color-gray lf-font-28">项目名称</view>
  65. <view class="lf-color-gray lf-font-28">数量</view>
  66. <view class="lf-color-gray lf-font-28">额外费用</view>
  67. </view> -->
  68. <view v-for="(item,index) in goods_detail.product.extends.field_2_project" :key="index" class="lf-row-between child-tag">
  69. <view class="lf-font-28 lf-color-black lf-flex-1">{{item.name}}</view>
  70. <view class="lf-font-28 lf-color-black lf-flex-1" style="text-align: center;">{{item.num}}</view>
  71. <view class="lf-font-28 lf-color-black lf-flex-1" style="text-align: right;">{{item.price}}</view>
  72. </view>
  73. </view>
  74. </view>
  75. </view>
  76. <!-- 景区类型弹窗 -->
  77. <u-calendar v-model="show" mode="date" zIndex="100000" :monthPrice="goods_detail.spec[type_index].list" :min-date='goods_detail.spec[type_index].date_start' :max-date="goods_detail.spec[type_index].date_end" @change="change" z-index="9999"></u-calendar>
  78. <u-popup class="pop-self" v-model="scenic_spot" mode="bottom" :closeable="true" border-radius="20">
  79. <view class="lf-p-32">
  80. <view class="price lf-flex">
  81. <lf-price :price="choose_date_price || goods_detail.spec[type_index].price"></lf-price>
  82. <view class="pop-price lf-m-l-20 lf-font-24">¥{{ choose_date_orangilprice || goods_detail.spec[type_index].original_price }}</view>
  83. </view>
  84. <view class="lf-font-24 lf-m-t-20 lf-color-555">
  85. 使用时间{{ go_date }}
  86. </view>
  87. <view style="margin-top: 60rpx;">
  88. <text class="lf-font-32 lf-font-bold" style="color: #131315;">套餐类型</text>
  89. <view class="lf-m-t-30 choose-father">
  90. <view class="choose-span" :class="type_index==index?'choose-active':''" v-for="(item,index) of goods_detail.spec" :key="index" @click="chooseType(index)">{{item.name}}</view>
  91. </view>
  92. </view>
  93. <view class="lf-m-t-30">
  94. <text class="lf-font-32 lf-font-bold" style="color: #131315;">使用时间</text>
  95. <view class="lf-row-between list-item lf-m-t-20" style="padding: 0!important;">
  96. <view class="lf-row-center">
  97. <text class="lf-font-28 lf-color-gray" @click="show = true">使用时间</text>
  98. </view>
  99. <view class="lf-flex">
  100. <!-- <picker mode="date" :end="goods_detail.spec[type_index].date_end" :start="goods_detail.spec[type_index].date_start" :value="go_date" @change="goChange">
  101. <view class="lf-color-333 lf-text-right lf-font-28" style="width: 400rpx;">{{ go_date }}</view>
  102. </picker> -->
  103. <text @click="show = true">{{go_date}}</text>
  104. <text class="lf-iconfont lf-icon-xiangyou lf-text-vertical lf-m-l-10"></text>
  105. </view>
  106. </view>
  107. </view>
  108. <view style="margin-top: 60rpx;">
  109. <button class="choose_btn" @click="toAddOrder()">立即购买</button>
  110. </view>
  111. </view>
  112. </u-popup>
  113. <!-- 餐厅类型 -->
  114. <view v-if="goods_detail.product.extends && goods_detail.product && goods_detail.product.type == 3">
  115. <view class="goods-detail" @click="openMap(goods_detail.product.extends.field_3_address,goods_detail.product.extends.field_3_latitude,goods_detail.product.extends.field_3_longitude)">
  116. <view class="lf-font-32 lf-font-bold lf-m-b-20">{{goods_detail.product.extends.field_3_name}}</view>
  117. <view class="lf-row-between">
  118. <view class="lf-line-2 lf-font-28 lf-color-333">{{goods_detail.product.extends.field_3_address}}</view>
  119. <view class="lf-iconfont lf-icon-dizhi lf-color-blue"></view>
  120. </view>
  121. </view>
  122. <view class="goods-detail">
  123. <view class="lf-font-32 lf-font-bold lf-m-b-20">餐厅开放时间</view>
  124. <view >
  125. <u-table>
  126. <u-tr v-for="(item,index) in goods_detail.product.extends.field_3_open_time" :key="index">
  127. <u-th>{{item.section}}</u-th>
  128. <u-th>{{item.time}}</u-th>
  129. <u-th>{{item.week}}</u-th>
  130. </u-tr>
  131. </u-table>
  132. </view>
  133. </view>
  134. <view class="goods-detail">
  135. <view class="lf-font-32 lf-font-bold lf-m-b-20">包含套餐</view>
  136. <view class="lf-flex-column">
  137. <view class="lf-row-between child-tag" v-for="(item,index) in goods_detail.product.extends.field_3_package" :key="index">
  138. <view class="lf-color-333 lf-font-28">{{item.name}} {{item.num}}</view>
  139. <view class="lf-color-333 lf-font-28">{{item.price}}</view>
  140. </view>
  141. </view>
  142. </view>
  143. </view>
  144. <!-- 酒店类型 -->
  145. <view v-if="goods_detail.product && goods_detail.product.extends && goods_detail.product.type == 1">
  146. <view class="goods-detail" v-if="goods_detail.product.extends.field_1_name" @click="openMap(goods_detail.product.extends.field_1_address,goods_detail.product.extends.field_1_latitude,goods_detail.product.extends.field_1_longitude)">
  147. <view class="lf-font-32 lf-font-bold lf-m-b-20" v-if="goods_detail.product.extends.field_1_name">{{goods_detail.product.extends.field_1_name}}</view>
  148. <view class="lf-row-between" v-if="goods_detail.product.extends.field_1_address">
  149. <view class="lf-line-2 lf-font-28 lf-color-333">{{goods_detail.product.extends.field_1_address}}</view>
  150. <view class="lf-iconfont lf-icon-dizhi lf-color-blue"></view>
  151. </view>
  152. </view>
  153. <!-- <zwyCalendar class="lf-m-t-20" type="sign" :startTime="'2021-10-01'" :endTime="'2021-11-01'"/> -->
  154. <view class="goods-detail" style="padding-bottom: 0;">
  155. <view class="lf-font-32 lf-font-bold lf-m-b-20">酒店设施</view>
  156. <view>
  157. <view class="label-box1">
  158. <view class="label-item" v-for="(item,index) in goods_detail.product.extends.field_1_tags" :key="index">
  159. {{item.tag}}
  160. </view>
  161. </view>
  162. </view>
  163. </view>
  164. </view>
  165. <!-- 酒店类型弹窗 -->
  166. <u-popup v-model="hotel" mode="bottom" :closeable="true" border-radius="20">
  167. <view class="lf-p-32">
  168. <view class="price lf-flex">
  169. <lf-price :price="total_hotel_price || goods_detail.spec[type_index].price"></lf-price>
  170. <view class="pop-price lf-m-l-20 lf-font-24">¥{{ total_hotel_orginalprice || goods_detail.spec[type_index].original_price }}</view>
  171. </view>
  172. <view class="lf-font-24 lf-m-t-20 lf-color-555">
  173. 酒店住房日期{{live_date}}~{{leave_date}}
  174. </view>
  175. <view style="margin-top: 60rpx;">
  176. <text class="lf-font-32 lf-font-bold" style="color: #131315;">套餐类型</text>
  177. <view class="lf-m-t-30 choose-father">
  178. <view class="choose-span" :class="type_index==index?'choose-active':''" v-for="(item,index) of goods_detail.spec" :key="index" @click="chooseTypehotel(index)">{{item.name}}</view>
  179. </view>
  180. </view>
  181. <view class="lf-m-t-30">
  182. <view class="lf-row-between list-item lf-m-t-20" style="padding: 0!important;">
  183. <view class="lf-row-center">
  184. <text class="lf-font-28 lf-color-gray">入住时间</text>
  185. </view>
  186. <view class="lf-flex">
  187. <picker mode="date" :end="goods_detail.spec[type_index].date_end" :start="goods_detail.spec[type_index].date_start" :value="live_date" @change="liveChange">
  188. <!-- <view class="lf-color-555 lf-text-right" style="width: 400rpx;">{{ '请选择收货时间...' }}</view> -->
  189. <view class="lf-color-333 lf-text-right lf-font-28" style="width: 400rpx;">{{ live_date }}</view>
  190. </picker>
  191. <text class="lf-iconfont lf-icon-xiangyou lf-text-vertical lf-m-l-10"></text>
  192. </view>
  193. </view>
  194. <view class="lf-row-between list-item" style="padding: 0!important;">
  195. <view class="lf-row-center">
  196. <text class="lf-font-28 lf-color-gray">离店时间</text>
  197. </view>
  198. <view class="lf-flex">
  199. <picker mode="date" :end="goods_detail.spec[type_index].date_end" :start="goods_detail.spec[type_index].date_start" :value="leave_date" @change="leaveChange">
  200. <!-- <view class="lf-color-555 lf-text-right" style="width: 400rpx;">{{ '请选择收货时间...' }}</view> -->
  201. <view class="lf-color-333 lf-text-right lf-font-28" style="width: 400rpx;">{{ leave_date }}</view>
  202. </picker>
  203. <text class="lf-iconfont lf-icon-xiangyou lf-text-vertical lf-m-l-10"></text>
  204. </view>
  205. </view>
  206. <view class="lf-row-between list-item" style="padding: 0!important;">
  207. <view class="lf-row-center">
  208. <text class="lf-font-28 lf-color-gray">到店日期</text>
  209. </view>
  210. <view class="lf-flex">
  211. <picker mode="date" :end="goods_detail.spec[type_index].date_end" :start="goods_detail.spec[type_index].date_start" :value="arrive_date" @change="arriveChange">
  212. <!-- <view class="lf-color-555 lf-text-right" style="width: 400rpx;">{{ '请选择收货时间...' }}</view> -->
  213. <view class="lf-color-333 lf-text-right lf-font-28" style="width: 400rpx;">{{ arrive_date }}</view>
  214. </picker>
  215. <text class="lf-iconfont lf-icon-xiangyou lf-text-vertical lf-m-l-10"></text>
  216. </view>
  217. </view>
  218. <view class="lf-row-between list-item" style="padding: 0!important;">
  219. <view class="lf-row-center">
  220. <text class="lf-font-28 lf-color-gray">到店时间</text>
  221. </view>
  222. <view class="lf-flex">
  223. <picker mode="time" :value="arrive_time" @change="arriveTimeChange">
  224. <!-- <view class="lf-color-555 lf-text-right" style="width: 400rpx;">{{ '请选择收货时间...' }}</view> -->
  225. <view class="lf-color-333 lf-text-right lf-font-28" style="width: 400rpx;">{{ arrive_time }}</view>
  226. </picker>
  227. <text class="lf-iconfont lf-icon-xiangyou lf-text-vertical lf-m-l-10"></text>
  228. </view>
  229. </view>
  230. </view>
  231. <view style="margin-top: 60rpx;">
  232. <button class="choose_btn" @click="toAddOrder()">立即购买</button>
  233. </view>
  234. </view>
  235. </u-popup>
  236. <!-- 旅游路线类型 -->
  237. <view v-if="goods_detail.product && goods_detail.product.type == 0 && goods_detail.product.extends.field_0_project">
  238. <view class="goods-detail">
  239. <view class="lf-font-32 lf-font-bold lf-m-b-20">包含项目</view>
  240. <view class="lf-flex-column">
  241. <!-- <view class="lf-row-between lf-m-b-20">
  242. <view class="lf-color-gray lf-font-28">项目名称</view>
  243. <view class="lf-color-gray lf-font-28">数量</view>
  244. <view class="lf-color-gray lf-font-28">额外费用</view>
  245. </view> -->
  246. <view class="lf-row-between child-tag" v-for="(item,index) in goods_detail.product.extends.field_0_project" :key="index" >
  247. <view class="lf-font-28 lf-color-black lf-flex-1">{{item.name}}</view>
  248. <view class="lf-font-28 lf-color-black lf-flex-1" style="text-align: center;">{{item.num}}</view>
  249. <view class="lf-font-28 lf-color-black lf-flex-1" style="text-align: right;">{{item.price}}</view>
  250. </view>
  251. </view>
  252. </view>
  253. <view class="goods-detail" v-if="goods_detail.product.extends.field_0_date.end && goods_detail.product.extends.field_0_date.start">
  254. <view class="lf-row-between">
  255. <view class="lf-font-32 lf-font-bold">
  256. 行程时间
  257. </view>
  258. <view class="lf-font-28 lf-color-black">
  259. <view>{{goods_detail.product.extends.field_0_date.start}}~{{goods_detail.product.extends.field_0_date.end}}</view>
  260. </view>
  261. </view>
  262. <!-- <zwyCalendar class="lf-m-t-20" type="sign" :startTime="'2021-10-01'" :endTime="'2021-11-01'"/> -->
  263. </view>
  264. </view>
  265. <!-- 旅游路线类型弹窗 -->
  266. <u-popup v-model="travel_route" mode="bottom" :closeable="true" border-radius="20">
  267. <view class="lf-p-32">
  268. <view class="price lf-flex">
  269. <lf-price :price="choose_date_price || goods_detail.spec[type_index].price"></lf-price>
  270. <view class="pop-price lf-m-l-20 lf-font-24">¥{{ choose_date_orangilprice || goods_detail.spec[type_index].original_price }}</view>
  271. </view>
  272. <view class="lf-font-24 lf-m-t-20 lf-color-555">
  273. 套餐类型{{goods_detail.spec[type_index].name}}
  274. </view>
  275. <view style="margin-top: 60rpx;">
  276. <text class="lf-font-32 lf-font-bold" style="color: #131315;">套餐类型</text>
  277. <view class="lf-m-t-30 choose-father">
  278. <view class="choose-span" :class="type_index==index?'choose-active':''" v-for="(item,index) of goods_detail.spec" @click="chooseType(index)" :key="index">{{item.name}}</view>
  279. </view>
  280. </view>
  281. <view class="lf-m-t-30">
  282. <view class="lf-row-between list-item lf-m-t-20" style="padding: 0!important;">
  283. <view class="lf-row-center">
  284. <text class="lf-font-28 lf-color-gray">使用时间</text>
  285. </view>
  286. <view class="lf-flex">
  287. <picker mode="date" :end="goods_detail.spec[type_index].date_end" :start="goods_detail.spec[type_index].date_start" :value="go_date" @change="goChange">
  288. <!-- <view class="lf-color-555 lf-text-right" style="width: 400rpx;">{{ '请选择收货时间...' }}</view> -->
  289. <view class="lf-color-333 lf-text-right lf-font-28" style="width: 400rpx;">{{ go_date }}</view>
  290. </picker>
  291. <text class="lf-iconfont lf-icon-xiangyou lf-text-vertical lf-m-l-10"></text>
  292. </view>
  293. </view>
  294. </view>
  295. <view style="margin-top: 60rpx;">
  296. <button class="choose_btn" @click="toAddOrder()">立即购买</button>
  297. </view>
  298. </view>
  299. </u-popup>
  300. <!-- 车队 -->
  301. <u-popup v-model="car" mode="bottom" :closeable="true" border-radius="20">
  302. <view class="lf-p-32">
  303. <view class="price lf-flex">
  304. <lf-price :price="choose_date_price || goods_detail.spec[type_index].price"></lf-price>
  305. <view class="pop-price lf-m-l-20 lf-font-24">¥{{ choose_date_orangilprice || goods_detail.spec[type_index].original_price }}</view>
  306. </view>
  307. <view class="lf-font-24 lf-m-t-20 lf-color-555">
  308. 套餐类型{{goods_detail.spec[type_index].name}}
  309. </view>
  310. <view style="margin-top: 60rpx;">
  311. <text class="lf-font-32 lf-font-bold" style="color: #131315;">套餐类型</text>
  312. <view class="lf-m-t-30 choose-father">
  313. <view class="choose-span" :class="type_index==index?'choose-active':''" v-for="(item,index) of goods_detail.spec" @click="chooseType(index)" :key="index">{{item.name}}</view>
  314. </view>
  315. </view>
  316. <view class="lf-m-t-30">
  317. <view class="lf-row-between list-item lf-m-t-20" style="padding: 0!important;">
  318. <view class="lf-row-center">
  319. <text class="lf-font-28 lf-color-gray">使用时间</text>
  320. </view>
  321. <view class="lf-flex">
  322. <picker mode="date" :end="goods_detail.spec[type_index].date_end" :start="goods_detail.spec[type_index].date_start" :value="go_date" @change="goChange">
  323. <!-- <view class="lf-color-555 lf-text-right" style="width: 400rpx;">{{ '请选择收货时间...' }}</view> -->
  324. <view class="lf-color-333 lf-text-right lf-font-28" style="width: 400rpx;">{{ go_date }}</view>
  325. </picker>
  326. <text class="lf-iconfont lf-icon-xiangyou lf-text-vertical lf-m-l-10"></text>
  327. </view>
  328. </view>
  329. </view>
  330. <view style="margin-top: 60rpx;">
  331. <button class="choose_btn" @click="toAddOrder()">立即购买</button>
  332. </view>
  333. </view>
  334. </u-popup>
  335. <!-- 单项 -->
  336. <u-popup v-model="single" mode="bottom" :closeable="true" border-radius="20">
  337. <view class="lf-p-32">
  338. <view class="price lf-flex">
  339. <lf-price :price="choose_date_price || goods_detail.spec[type_index].price"></lf-price>
  340. <view class="pop-price lf-m-l-20 lf-font-24">¥{{ choose_date_orangilprice || goods_detail.spec[type_index].original_price }}</view>
  341. </view>
  342. <view class="lf-font-24 lf-m-t-20 lf-color-555">
  343. 套餐类型{{goods_detail.spec[type_index].name}}
  344. </view>
  345. <view style="margin-top: 60rpx;">
  346. <text class="lf-font-32 lf-font-bold" style="color: #131315;">套餐类型</text>
  347. <view class="lf-m-t-30 choose-father">
  348. <view class="choose-span" :class="type_index==index?'choose-active':''" v-for="(item,index) of goods_detail.spec" @click="chooseType(index)" :key="index">{{item.name}}</view>
  349. </view>
  350. </view>
  351. <view class="lf-m-t-30">
  352. <view class="lf-row-between">
  353. <text class="lf-font-32 lf-font-bold" style="color: #131315;">出行日期</text>
  354. </view>
  355. <view class="lf-row-between list-item lf-m-t-20" style="padding: 0!important;">
  356. <view class="lf-row-center">
  357. <text class="lf-font-28 lf-color-gray">使用时间</text>
  358. </view>
  359. <view class="lf-flex">
  360. <picker mode="date" :end="goods_detail.spec[type_index].date_end" :start="goods_detail.spec[type_index].date_start" :value="go_date" @change="goChange">
  361. <!-- <view class="lf-color-555 lf-text-right" style="width: 400rpx;">{{ '请选择收货时间...' }}</view> -->
  362. <view class="lf-color-333 lf-text-right lf-font-28" style="width: 400rpx;">{{ go_date }}</view>
  363. </picker>
  364. <text class="lf-iconfont lf-icon-xiangyou lf-text-vertical lf-m-l-10"></text>
  365. </view>
  366. </view>
  367. </view>
  368. <view style="margin-top: 60rpx;">
  369. <button class="choose_btn" @click="toAddOrder()">立即购买</button>
  370. </view>
  371. </view>
  372. </u-popup>
  373. <!-- 公共部分 -->
  374. <!-- 商品详情 -->
  375. <view class="goods-detail" v-if="goods_detail.know">
  376. <view class="lf-font-32 lf-font-bold lf-m-b-20">购买须知</view>
  377. <rich-text :nodes="formatRichText(goods_detail.know)"></rich-text>
  378. </view>
  379. <view class="goods-detail" v-if="goods_detail.content">
  380. <view class="lf-font-32 lf-font-bold lf-m-b-20">商品详情</view>
  381. <rich-text :nodes="formatRichText(goods_detail.content)"></rich-text>
  382. </view>
  383. <!-- 修饰专用 -->
  384. <view class="extra"></view>
  385. <!-- 吸底操作按钮 -->
  386. <view class="lf-row-between fixed-bottom">
  387. <view class="lf-flex lf-p-t-10 lf-p-b-10">
  388. <view class="lf-flex-column lf-row-center icon-item" @click="$url('/pages/index/index', {type: 'switch'})">
  389. <image class="icon-img" src="../../static/tabbar/home1.png"></image>
  390. <view class="lf-m-t-1">首页</view>
  391. </view>
  392. <button class="lf-flex-column lf-row-center icon-item" open-type="contact">
  393. <image class="icon-img" src="../../static/center/service.png"></image>
  394. <view class="lf-m-t-1">客服</view>
  395. </button>
  396. <view class="lf-flex-column lf-row-center icon-item" @click="switchCollect">
  397. <image class="icon-img" src="../../static/center/collect-active.png" v-if="is_collect"></image>
  398. <image class="icon-img" src="../../static/center/collect.png" v-else></image>
  399. <view class="lf-m-t-1">{{ is_collect ? '已收藏' : '收藏' }}</view>
  400. </view>
  401. <button class="lf-flex-column lf-row-center icon-item" open-type="share">
  402. <image class="icon-img" src="../../static/center/share.png"></image>
  403. <view class="lf-m-t-1">分享</view>
  404. </button>
  405. </view>
  406. <button class="btn" @click="changePop(goods_detail.product.type)">立即购买</button>
  407. </view>
  408. <!-- 回到顶部 -->
  409. <!-- <u-back-top :scroll-top="pageScrollTop" :custom-style="{background: 'rgba(51, 51 51, 0.3)'}" :icon-style="{color: '#ffffff'}"></u-back-top> -->
  410. <u-back-top :scroll-top="pageScrollTop" :custom-style="{background: 'rgba(51, 51 51, 0.3)'}"></u-back-top>
  411. </block>
  412. </skeleton>
  413. </view>
  414. </template>
  415. <script>
  416. import zwyCalendar from '@/components/zwy-calendar/zwy-calendar.vue'
  417. export default {
  418. data(){
  419. return {
  420. year: new Date().getFullYear(), // 当前年
  421. month: new Date().getMonth() + 1, // 当前月
  422. now_time: '',
  423. current: 0, // 轮播下标
  424. goods_id: 0,
  425. goods_detail: {},
  426. is_collect: false, // 1为当前收藏商品了,0为否
  427. skeletonLoading: true,
  428. //景区类型相关
  429. scenic_spot: false,
  430. type_index: 0,
  431. choose_date: '请选择使用时间',
  432. //酒店相关
  433. hotel: false,
  434. live_date: '请选择入住日期',
  435. leave_date: '请选择离店日期',
  436. arrive_date: '请选择到店日期',
  437. arrive_time: '请选择到店时间',
  438. totalLive: '',//住宿时间
  439. //旅游路线相关
  440. travel_route: false,
  441. go_date: '请选择使用时间',
  442. back_date: '请选择回程日期',
  443. //餐厅
  444. canteen: false,
  445. car: false,
  446. single:false,
  447. choose_date_price: '',
  448. choose_date_orangilprice: '',
  449. choose_date_specid: '',
  450. //酒店
  451. total_hotel_price: 0,
  452. total_hotel_orginalprice: 0,
  453. live_index: 0,
  454. leave_index: 0,
  455. hotel_specid: [],
  456. //uview picker
  457. show: false,
  458. }
  459. },
  460. components: {zwyCalendar},
  461. onLoad(options){
  462. this.goods_id = options.goods_id || options.id;
  463. console.log('商品',this.goods_id)
  464. this.getGoodsDetail();
  465. },
  466. computed: {
  467. isRight() {
  468. return function(val) {
  469. return this.$shared.isRight(val);
  470. }
  471. }
  472. },
  473. methods: {
  474. change(e) {
  475. console.log(e);
  476. this.go_date = e.result
  477. },
  478. compareDate(val) {
  479. var nowTime = new Date(new Date().toLocaleDateString()).getTime();
  480. let oldTime = new Date(new Date(val).toLocaleDateString()).getTime();
  481. if(nowTime>oldTime) {
  482. return false;
  483. }else {
  484. return true;
  485. }
  486. },
  487. pickerChange(e) {
  488. var nowTime = new Date(new Date().toLocaleDateString()).getTime();
  489. let oldTime = new Date(new Date(e.detail.value).toLocaleDateString()).getTime();
  490. if(oldTime<nowTime) {
  491. this.$msg('请选择正确的使用时间!');
  492. var date1 = new Date();
  493. var date2 = new Date(date1);
  494. date2.setDate(date1.getDate());
  495. this.choose_date = this.$shared.recordTime(date2, '-', 'date')
  496. let differrentList = this.goods_detail.spec[this.type_index].list;
  497. console.log(differrentList)
  498. differrentList.forEach((item,index) => {
  499. if(item.date == this.choose_date) {
  500. this.choose_date_price = this.goods_detail.spec[this.type_index].list[index].price;
  501. this.choose_date_orangilprice = this.goods_detail.spec[this.type_index].list[index].original_price;
  502. this.choose_date_specid = this.goods_detail.spec[this.type_index].list[index].id;
  503. }
  504. })
  505. return
  506. }else {
  507. this.choose_date = e.detail.value;
  508. let differrentList = this.goods_detail.spec[this.type_index].list;
  509. console.log(differrentList)
  510. differrentList.forEach((item,index) => {
  511. if(item.date == this.choose_date) {
  512. this.choose_date_price = this.goods_detail.spec[this.type_index].list[index].price;
  513. this.choose_date_orangilprice = this.goods_detail.spec[this.type_index].list[index].original_price;
  514. this.choose_date_specid = this.goods_detail.spec[this.type_index].list[index].id;
  515. }
  516. })
  517. }
  518. },
  519. arriveChange(e) {
  520. let live_date = new Date(new Date(this.live_date).toLocaleDateString()).getTime();
  521. let leave_date = new Date(new Date(this.leave_date).toLocaleDateString()).getTime();
  522. let arrive_date = new Date(new Date(e.detail.value).toLocaleDateString()).getTime();
  523. if(arrive_date>=live_date && arrive_date<=leave_date) {
  524. this.arrive_date = e.detail.value;
  525. }else {
  526. this.$msg('请选择正确的到店日期!');
  527. this.arrive_date = this.live_date;
  528. return
  529. }
  530. },
  531. arriveTimeChange(e) {
  532. this.arrive_time = e.detail.value;
  533. },
  534. goChange(e) {
  535. var nowTime = new Date(new Date().toLocaleDateString()).getTime();
  536. let oldTime = new Date(new Date(e.detail.value).toLocaleDateString()).getTime();
  537. if(oldTime<nowTime) {
  538. this.$msg('请选择正确的使用时间!');
  539. var date1 = new Date();
  540. var date2 = new Date(date1);
  541. date2.setDate(date1.getDate());
  542. this.go_date = this.$shared.recordTime(date2, '-', 'date')
  543. let differrentList = this.goods_detail.spec[this.type_index].list;
  544. console.log(differrentList)
  545. differrentList.forEach((item,index) => {
  546. if(item.date == this.go_date) {
  547. this.choose_date_price = this.goods_detail.spec[this.type_index].list[index].price;
  548. this.choose_date_orangilprice = this.goods_detail.spec[this.type_index].list[index].original_price;
  549. this.choose_date_specid = this.goods_detail.spec[this.type_index].list[index].id;
  550. }
  551. })
  552. return
  553. }else {
  554. this.go_date = e.detail.value;
  555. let differrentList = this.goods_detail.spec[this.type_index].list;
  556. console.log(differrentList)
  557. differrentList.forEach((item,index) => {
  558. if(item.date == this.go_date) {
  559. this.choose_date_price = this.goods_detail.spec[this.type_index].list[index].price;
  560. this.choose_date_orangilprice = this.goods_detail.spec[this.type_index].list[index].original_price;
  561. this.choose_date_specid = this.goods_detail.spec[this.type_index].list[index].id;
  562. }
  563. })
  564. }
  565. },
  566. backChange(e) {
  567. this.back_date = e.detail.value;
  568. },
  569. liveChange(e) {
  570. this.total_hotel_price = 0;
  571. this.total_hotel_orginalprice = 0;
  572. let compateDate = this.compareDate(e.detail.value);
  573. let live_date_compare = new Date(new Date(e.detail.value).toLocaleDateString()).getTime();
  574. let leave_date_compare = new Date(new Date(this.leave_date).toLocaleDateString()).getTime();
  575. if(live_date_compare>leave_date_compare) {
  576. this.$msg('入住时间要早于离店时间!')
  577. var date1 = new Date();
  578. var date2 = new Date(date1);
  579. date2.setDate(date1.getDate());
  580. this.live_date = this.$shared.recordTime(date2, '-', 'date')
  581. let differrentList = this.goods_detail.spec[this.type_index].list;
  582. differrentList.forEach((item,index) => {
  583. if(item.date == this.live_date) {
  584. this.live_index = index;
  585. }else if(item.date == this.leave_date) {
  586. this.leave_index = index;
  587. }
  588. })
  589. let total_date = differrentList.slice(this.live_index,this.leave_index);
  590. this.hotel_specid = [];
  591. total_date.reduce((list, item)=>{
  592. this.total_hotel_price += parseInt(item.price);
  593. this.total_hotel_orginalprice += parseInt(item.original_price);
  594. this.hotel_specid.push(item.id);
  595. console.log(this.hotel_specid);
  596. }, []);
  597. return
  598. }
  599. if(compateDate) {
  600. this.live_date = e.detail.value;
  601. let live_date = new Date(new Date(e.detail.value).toLocaleDateString()).getTime();
  602. let leave_date = new Date(new Date(this.leave_date).toLocaleDateString()).getTime();
  603. this.totalLive = parseInt(Math.abs(leave_date - live_date) / 1000 / 60 / 60 / 24);
  604. }else {
  605. this.$msg('入住时间要大于当前时间!');
  606. }
  607. let differrentList = this.goods_detail.spec[this.type_index].list;
  608. differrentList.forEach((item,index) => {
  609. if(item.date == e.detail.value) {
  610. this.live_index = index;
  611. }else if(item.date == this.leave_date) {
  612. this.leave_index = index;
  613. }
  614. })
  615. let total_date = differrentList.slice(this.live_index,this.leave_index);
  616. this.hotel_specid = [];
  617. total_date.reduce((list, item)=>{
  618. this.total_hotel_price += parseInt(item.price);
  619. this.total_hotel_orginalprice += parseInt(item.original_price);
  620. this.hotel_specid.push(item.id);
  621. console.log(this.hotel_specid);
  622. }, []);
  623. },
  624. leaveChange(e) {
  625. this.total_hotel_price = 0;
  626. this.total_hotel_orginalprice = 0;
  627. let live_date = new Date(new Date(this.live_date).toLocaleDateString()).getTime();
  628. let leave_date = new Date(new Date(e.detail.value).toLocaleDateString()).getTime();
  629. if(leave_date>live_date || leave_date==live_date) {
  630. this.leave_date = e.detail.value;
  631. }else {
  632. this.$msg('离店日期要大于入住日期!');
  633. var date1 = new Date();
  634. var date2 = new Date(date1);
  635. date2.setDate(date1.getDate() + 1);
  636. this.leave_date = this.$shared.recordTime(date2, '-', 'date')
  637. return
  638. }
  639. this.totalLive = parseInt(Math.abs(leave_date - live_date) / 1000 / 60 / 60 / 24);
  640. let differrentList = this.goods_detail.spec[this.type_index].list;
  641. console.log(differrentList)
  642. differrentList.forEach((item,index) => {
  643. if(item.date == this.live_date) {
  644. this.live_index = index;
  645. }else if(item.date == e.detail.value) {
  646. this.leave_index = index;
  647. }
  648. })
  649. let total_date = differrentList.slice(this.live_index,this.leave_index);
  650. this.hotel_specid = [];
  651. total_date.reduce((list, item)=>{
  652. this.total_hotel_price += parseInt(item.price);
  653. this.total_hotel_orginalprice += parseInt(item.original_price);
  654. this.hotel_specid.push(item.id);
  655. console.log(this.hotel_specid);
  656. }, []);
  657. },
  658. chooseType(index) {
  659. this.type_index = index;
  660. this.choose_date_price = 0;
  661. this.choose_date_orangilprice = 0;
  662. let differrentList = this.goods_detail.spec[this.type_index].list;
  663. differrentList.forEach((item,index) => {
  664. if(item.date == this.go_date) {
  665. this.choose_date_price = this.goods_detail.spec[this.type_index].list[index].price;
  666. this.choose_date_orangilprice = this.goods_detail.spec[this.type_index].list[index].original_price;
  667. this.choose_date_specid = this.goods_detail.spec[this.type_index].list[index].id;
  668. }
  669. })
  670. },
  671. chooseTypehotel(index) {
  672. this.type_index = index;
  673. this.total_hotel_price = 0;
  674. this.total_hotel_orginalprice = 0;
  675. let differrentList = this.goods_detail.spec[this.type_index].list;
  676. console.log(differrentList)
  677. differrentList.forEach((item,index) => {
  678. if(item.date == this.live_date) {
  679. this.live_index = index;
  680. }else if(item.date == this.leave_date) {
  681. this.leave_index = index;
  682. }
  683. })
  684. let total_date = differrentList.slice(this.live_index,this.leave_index);
  685. this.hotel_specid = [];
  686. total_date.reduce((list, item)=>{
  687. this.total_hotel_price += parseInt(item.price);
  688. this.total_hotel_orginalprice += parseInt(item.original_price);
  689. this.hotel_specid.push(item.id);
  690. console.log(this.hotel_specid);
  691. }, []);
  692. },
  693. changePop(type) {
  694. if(type == 2) {
  695. //景区
  696. this.scenic_spot = true;
  697. }else if(type == 1) {
  698. //酒店
  699. this.hotel = true;
  700. }else if(type == 0) {
  701. //旅游路线
  702. this.travel_route = true;
  703. }else if(type == 3) {
  704. //餐厅
  705. this.canteen = true;
  706. }else if(type == 4) {
  707. //车队
  708. this.car = true;
  709. }else if(type == 5) {
  710. //单项
  711. this.single = true;
  712. }
  713. },
  714. // 打开地图
  715. openMap(address,lat,lng){
  716. // let { address, lat, lng } = this.goods_detail?.store || {};
  717. uni.openLocation({
  718. longitude: Number(lng),
  719. latitude: Number(lat),
  720. scale: 20,
  721. name: address
  722. });
  723. },
  724. getGoodsDetail(){
  725. this.$http(this.API.API_ADVICEDETAILS, {id: this.goods_id}).then(res => {
  726. this.skeletonLoading = false;
  727. this.goods_detail = res.data;
  728. this.is_collect = Boolean(res.data.is_collect) || false;
  729. }).catch(err => {
  730. this.skeletonLoading = false;
  731. setTimeout(() => {
  732. this.$toBack();
  733. }, 1000);
  734. })
  735. },
  736. // 切换商品收藏
  737. switchCollect(){
  738. let userInfo = uni.getStorageSync('userinfo') || {};
  739. if(!userInfo.id || !userInfo.nickname || !userInfo.avatar){
  740. this.$url('/pages/login/index?type=userinfo');
  741. return;
  742. }
  743. if(this.is_collect) {
  744. this.$http(this.API.API_DELCOLLECT, {agent_product_id:this.goods_id}).then(res => {
  745. this.$msg('取消收藏成功!')
  746. this.is_collect = false
  747. console.log(res)
  748. })
  749. }else {
  750. this.$http(this.API.API_ADDCOLLECT, {agent_product_id:this.goods_id}).then(res => {
  751. this.$msg('添加收藏成功!')
  752. this.is_collect = true
  753. console.log(res)
  754. })
  755. }
  756. },
  757. // 拨打电话
  758. makePhoneCall(phoneStr){
  759. uni.makePhoneCall({
  760. phoneNumber: String(phoneStr)
  761. })
  762. },
  763. // 跳转到确认下单页面
  764. toAddOrder(){
  765. //0旅游路线1酒店2景区3餐厅
  766. if(this.goods_detail.product.type == 2) {
  767. //景区
  768. if(this.go_date != '请选择使用时间') {
  769. let date_compare = this.compareDate(this.go_date);
  770. console.log(date_compare)
  771. if(date_compare){
  772. let goods_id = this.goods_detail.id;
  773. let godds_type = this.goods_detail.product.type;
  774. let enter_time = this.go_date;
  775. let spec_id = this.choose_date_specid;
  776. let type_text = this.goods_detail.spec[this.type_index].name;
  777. this.$url('/pages/order/confirm_order?goods_id='+ goods_id+ '&spec_id='+ spec_id +'&goods_type='+godds_type+'&departure_time='+enter_time+'&goods_typetext='+type_text);
  778. }else {
  779. this.$msg('请选择正确的使用时间!');
  780. }
  781. }else {
  782. this.$msg('请选择使用时间!');
  783. }
  784. }else if(this.goods_detail.product.type == 1) {
  785. let date1 = false;
  786. let date2 = false;
  787. let date3 = false;
  788. if(this.live_date != '请选择入住日期') {
  789. let date_compare = this.compareDate(this.live_date);
  790. if(date_compare){
  791. date1 = true;
  792. }else {
  793. this.$msg('请选择正确的入住日期!');
  794. return
  795. }
  796. }else {
  797. this.$msg('请选择入住日期!');
  798. return
  799. }
  800. if(this.leave_date != '请选择离店日期') {
  801. let date_compare = this.compareDate(this.leave_date);
  802. if(date_compare){
  803. date2 = true;
  804. }else {
  805. this.$msg('请选择正确的离店日期!');
  806. return
  807. }
  808. }else {
  809. this.$msg('请选择离店日期!');
  810. return
  811. }
  812. if(this.arrive_date != '请选择到店日期') {
  813. let date_compare = this.compareDate(this.arrive_date);
  814. if(date_compare){
  815. date3 = true;
  816. }else {
  817. this.$msg('请选择正确的到店日期!');
  818. return
  819. }
  820. }else {
  821. this.$msg('请选择到店日期!');
  822. return
  823. }
  824. if(this.arrive_time == '请选择到店时间') {
  825. this.$msg('请选择到店时间!');
  826. return
  827. }
  828. if(date1&&date2&&date3) {
  829. let arrival_timedate = this.arrive_date + ' ' + this.arrive_time
  830. console.log(arrival_time)
  831. let goods_id = this.goods_detail.id;
  832. let godds_type = this.goods_detail.product.type;
  833. let spec_id = this.hotel_specid;
  834. let type_text = this.goods_detail.spec[this.type_index].name;
  835. //酒店
  836. let check_in_time = this.live_date;
  837. let check_out_time = this.leave_date;
  838. let totalLive = this.totalLive;
  839. let arrival_time = arrival_timedate;
  840. this.$url('/pages/order/confirm_order?goods_id='+ goods_id+ '&spec_id='+ spec_id +'&goods_type='+godds_type+'&check_in_time='+check_in_time+'&goods_typetext='+type_text+'&check_out_time='+check_out_time+'&arrival_time='+arrival_time+'&totalLive='+totalLive);
  841. }
  842. }else if(this.goods_detail.product.type == 0 || this.goods_detail.product.type == 4 || this.goods_detail.product.type == 5) {
  843. if(this.go_date != '请选择使用时间') {
  844. let date_compare = this.compareDate(this.go_date);
  845. console.log(date_compare)
  846. if(date_compare){
  847. let goods_id = this.goods_detail.id;
  848. let godds_type = this.goods_detail.product.type;
  849. let departure_time = this.go_date;
  850. let spec_id = this.choose_date_specid;
  851. let type_text = this.goods_detail.spec[this.type_index].name;
  852. this.$url('/pages/order/confirm_order?goods_id='+ goods_id+ '&spec_id='+ spec_id +'&goods_type='+godds_type+'&departure_time='+departure_time+'&goods_typetext='+type_text);
  853. }else {
  854. this.$msg('请选择正确的使用时间!');
  855. }
  856. }else {
  857. this.$msg('请选择使用时间!');
  858. }
  859. }
  860. },
  861. // 预览图片
  862. lookImg(index){
  863. this.$u.throttle(() => {
  864. let goods_banner = this.goods_detail.banners || [];
  865. let banners = goods_banner.map(item => item.cover);
  866. uni.previewImage({
  867. urls: banners,
  868. current: index
  869. })
  870. }, 200);
  871. },
  872. // 富文本处理
  873. formatRichText(richText){
  874. if(richText != null){
  875. let newRichText= richText.replace(/<img[^>]*>/gi, function(match, capture){
  876. match = match.replace(/style="[^"]+"/gi, '').replace(/style='[^']+'/gi, '');
  877. match = match.replace(/width="[^"]+"/gi, '').replace(/width='[^']+'/gi, '');
  878. match = match.replace(/height="[^"]+"/gi, '').replace(/height='[^']+'/gi, '');
  879. return match;
  880. });
  881. newRichText = newRichText.replace(/style="[^"]+"/gi,function(match, capture){
  882. match = match.replace(/width:[^;]+;/gi, 'width:100%;').replace(/width:[^;]+;/gi, 'width:100%;');
  883. return match;
  884. });
  885. newRichText = newRichText.replace(/<br[^>]*\/>/gi, '');
  886. newRichText = newRichText.replace(/\<img/gi, '<img style="width:100%;height:auto;display:block;margin:10px 0;"');
  887. return newRichText;
  888. }else{
  889. return null;
  890. }
  891. }
  892. },
  893. onShareAppMessage(){
  894. let goods = this.goods_detail;
  895. let title = goods.title;
  896. let imageUrl = goods.pictures[0] || goods.picture;
  897. let path = '/pages/route/index?route=goods_detail&id='+ goods.id;
  898. console.log("path", path);
  899. return {
  900. title,
  901. path,
  902. imageUrl
  903. }
  904. }
  905. }
  906. </script>
  907. <style>
  908. page{
  909. background-color: #f5f5f5;
  910. overflow-x: hidden;
  911. }
  912. </style>
  913. <style lang="scss" scoped="scoped">
  914. /deep/.pop-self .u-drawer .u-mask{
  915. z-index: 99!important;
  916. }
  917. .choose_btn {
  918. width: 686rpx;
  919. height: 100rpx;
  920. background: #1998FE;
  921. border-radius: 10rpx;
  922. font-size: 32rpx;
  923. color: white;
  924. display: flex;
  925. justify-content: center;
  926. align-items: center;
  927. }
  928. .choose-father {
  929. display: flex;
  930. width: 700rpx;
  931. flex-wrap: wrap;
  932. }
  933. .choose-active {
  934. background: #1998FE!important;
  935. font-size: 24rpx;
  936. color: white!important;
  937. }
  938. .choose-span {
  939. width: max-content;
  940. margin: 0 30rpx 30rpx 0;
  941. height: 64rpx;
  942. background: #F5F5F5;
  943. border-radius: 32rpx;
  944. font-size: 24rpx;
  945. color: #333333;
  946. padding: 0 32rpx;
  947. display: flex;
  948. justify-content: center;
  949. align-items: center;
  950. }
  951. .pop-price {
  952. text-decoration: line-through;
  953. color: #777777;
  954. margin-right: 22rpx;
  955. }
  956. .list-item{
  957. height: 80rpx;
  958. background-color: white;
  959. box-sizing: border-box;
  960. padding: 0 32rpx;
  961. position: relative;
  962. .feedback-btn{
  963. position: absolute;
  964. width: 100%;
  965. height: 100%;
  966. z-index: 1;
  967. background: transparent;
  968. }
  969. }
  970. .child-tag {
  971. margin-bottom: 20rpx;
  972. &:last-child {
  973. margin-bottom: 0;
  974. }
  975. }
  976. .swiper-box{
  977. width: 750rpx;
  978. height: 490rpx;
  979. background-color: #FFFFFF;
  980. }
  981. .head-info{
  982. width: 750rpx;
  983. height: auto;
  984. box-sizing: border-box;
  985. padding: 0 32rpx;
  986. padding-top: 20rpx;
  987. background-color: #FFFFFF;
  988. // .price>view:nth-of-type(1){
  989. // color: #FF0000;
  990. // margin-right: 22rpx;
  991. // font-weight: bold;
  992. // }
  993. .price>view:nth-of-type(1){
  994. text-decoration: line-through;
  995. color: #777777;
  996. margin-right: 22rpx;
  997. }
  998. .price>view:nth-of-type(2){
  999. width: max-content;
  1000. padding: 0 18rpx;
  1001. height: 46rpx;
  1002. background-color: #1998FE;
  1003. border-radius: 10rpx;
  1004. display: flex;
  1005. justify-content: center;
  1006. align-items: center;
  1007. color: #FFFFFF;
  1008. }
  1009. }
  1010. .label-box{
  1011. min-height: 130rpx;
  1012. width: 100%;
  1013. border-top: 1rpx solid #E5E5E5;
  1014. display: flex;
  1015. flex-wrap: wrap;
  1016. padding: 30rpx 0 10rpx 0;
  1017. .label-item{
  1018. width: max-content;
  1019. padding: 20rpx;
  1020. height: 70rpx;
  1021. border-radius: 10rpx;
  1022. border: 2rpx solid #1998FE;
  1023. display: flex;
  1024. justify-content: center;
  1025. align-items: center;
  1026. font-size: 28rpx;
  1027. color: #1998FE;
  1028. margin-right: 20rpx;
  1029. margin-bottom: 20rpx;
  1030. }
  1031. }
  1032. .label-box1{
  1033. min-height: 130rpx;
  1034. width: 100%;
  1035. border-top: 1rpx solid #E5E5E5;
  1036. display: flex;
  1037. flex-wrap: wrap;
  1038. padding: 30rpx 0 10rpx 0;
  1039. .label-item{
  1040. width: max-content;
  1041. padding: 0 10rpx;
  1042. height: 54rpx;
  1043. border-radius: 10rpx;
  1044. border: 2rpx solid #1998FE;
  1045. display: flex;
  1046. justify-content: center;
  1047. align-items: center;
  1048. font-size: 24rpx;
  1049. color: #1998FE;
  1050. background: rgba(25, 152, 254, 0.05);
  1051. margin-right: 20rpx;
  1052. margin-bottom: 20rpx;
  1053. }
  1054. }
  1055. .address-box{
  1056. width: 750rpx;
  1057. height: auto;
  1058. box-sizing: border-box;
  1059. background-color: #FFFFFF;
  1060. padding: 32rpx;
  1061. margin-top: 20rpx;
  1062. .shop-img{
  1063. width: 60rpx;
  1064. height: 60rpx;
  1065. border-radius: 50%;
  1066. }
  1067. }
  1068. .goods-detail{
  1069. width: 750rpx;
  1070. height: auto;
  1071. background-color: #FFFFFF;
  1072. padding: 32rpx;
  1073. box-sizing: border-box;
  1074. margin-top: 20rpx;
  1075. .goods-img{
  1076. width: 100%;
  1077. }
  1078. }
  1079. .extra{
  1080. width: 100%;
  1081. height: 120rpx;
  1082. padding-bottom: constant(safe-area-inset-bottom);
  1083. padding-bottom: env(safe-area-inset-bottom);
  1084. box-sizing: content-box;
  1085. }
  1086. .fixed-bottom{
  1087. position: fixed;
  1088. bottom: 0;
  1089. left: 0;
  1090. background-color: #FFFFFF;
  1091. width: 100%;
  1092. height: auto;
  1093. padding: 0 32rpx;
  1094. border-top: 1rpx solid #e5e5e5;
  1095. padding-bottom: constant(safe-area-inset-bottom);
  1096. padding-bottom: env(safe-area-inset-bottom);
  1097. .icon-item{
  1098. margin-right: 16rpx;
  1099. background-color: transparent;
  1100. margin: 0;
  1101. line-height: initial;
  1102. font-size: 28rpx;
  1103. font-weight: inherit;
  1104. margin-right: 10rpx;
  1105. padding: 0;
  1106. width: 88rpx;
  1107. position: relative;
  1108. &:first-child{
  1109. padding-left: 0;
  1110. }
  1111. .icon-img{
  1112. height: 50rpx;
  1113. width: 50rpx;
  1114. }
  1115. }
  1116. .btn{
  1117. margin: 0;
  1118. padding: 0;
  1119. width: 208rpx;
  1120. height: 80rpx;
  1121. background-color: #1998FE;
  1122. color: #FFFFFF;
  1123. line-height: 80rpx;
  1124. font-size: 32rpx;
  1125. border-radius: 42rpx;
  1126. }
  1127. }
  1128. </style>