多租户商城-商户小程序端
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.

1857 lines
46 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. <template>
  2. <view
  3. class="container u-skeleton"
  4. @scroll="handlePageScroll"
  5. >
  6. <global-loading/>
  7. <view style="background-color: #FAFAFA">
  8. <!-- 拼团滚动-->
  9. <view class="news-box">
  10. <view class="news-bg">
  11. <swiper
  12. class="goodsImgswiper-box"
  13. :vertical="true"
  14. :circular="true"
  15. interval="8000"
  16. duration="2000"
  17. :autoplay="true"
  18. >
  19. <swiper-item
  20. v-for="(item, index) of broadCastList"
  21. :key="index"
  22. >
  23. <view class="news-item flex-items">
  24. <image
  25. class="item-avatar"
  26. :src="item.headImage"
  27. ></image>
  28. <view class="news-item-user">{{ item.name }}</view>
  29. <view class="news-item-info">{{ item.timeStr }}</view>
  30. <view
  31. class="news-item-info"
  32. v-if="item.type === 1"
  33. >给了好评
  34. </view>
  35. <view
  36. class="news-item-info"
  37. v-if="item.type === 2"
  38. >正在拼单
  39. </view>
  40. <view
  41. class="news-item-info"
  42. v-if="item.type === 3"
  43. >拼单成功
  44. </view>
  45. <view
  46. class="news-item-info"
  47. v-if="item.type === 4"
  48. >下单
  49. </view>
  50. </view>
  51. </swiper-item>
  52. </swiper>
  53. </view>
  54. </view>
  55. <!-- 轮播图+分享+价格名称+活动倒计时+优惠券 -->
  56. <GoodActivityDetail
  57. ref="goodActivityDetail"
  58. :sku-select="selectedSku"
  59. :product-info="productData"
  60. :time-active-type="timeActiveType"
  61. :mark-tools="markTools"
  62. :shop-mark-tools="shopMarkTools"
  63. @activityEnd="handleActivityEnd"
  64. @couponClick="handleShowCoupon"
  65. />
  66. <view class="prod-descr-title">产品描述</view>
  67. <view class="prod-descr-content">POÄNG 波昂扶手椅设计经典舒适耐用推出40多年来一直深受大众喜爱延续了摇椅经典的弯曲造型舒适的弹性达到全新高度</view>
  68. <view class="border-line"/>
  69. <!-- 选择SKU -->
  70. <view
  71. class="fs24 chooseSize-box flex-start"
  72. @click=" handleShowGoodsSkuSelect(6)">
  73. <view class="chooseSize-content flex-items flex-row flex-sp-between u-skeleton-fillet">
  74. <view class="flex-row-plus ">
  75. <label class="fs28 font-color-252744 fs-bold mar-left-30 font-color-999">{{$t('product.specification')}}</label>
  76. <view class="fs28 font-color-595B6B mar-left-30 flex-items">
  77. <view
  78. class="mar-right-10"
  79. v-for="(item, index) of currentSuk"
  80. :key="index"
  81. >{{ item.skuText || '-' }}
  82. </view>
  83. </view>
  84. </view>
  85. <image
  86. class="arrow-icon"
  87. src="http://36.138.125.206:8081/ceres-local-file/image/icon_common_grey_forward.png"
  88. ></image>
  89. </view>
  90. </view>
  91. <view class="sku-image-box">
  92. <!--规格图片遍历处理最大只显示4个-->
  93. <block v-for="(skuImgItem,skuImgIndex) in productData.names[0].values" :key="skuImgIndex">
  94. <image class="sku-image" :class="{'sku-image-select' : skuImgItem.valueCode === selectedAttr[productData.names[0].nameCode]}" @click="handleClickSku(productData.names[0].nameCode, skuImgItem.valueCode, 0, skuImgIndex)"
  95. :src="skuImgItem.image ? skuImgItem.image: defaultImageUrl" @error="onImageError"/>
  96. </block>
  97. <image class="sku-image-more" @click=" handleShowGoodsSkuSelect(6)" src="http://36.138.125.206:8081/ceres-local-file/image/prod_detail_sku_more.png"/>
  98. </view>
  99. <view class="border-line"/>
  100. <!-- 发货 -->
  101. <view class="express-box flex-items flex-row fs24 u-skeleton-fillet">
  102. <label class="fs28 font-color-252744 fs-bold mar-right-20 ">{{$t('order.send')}}</label>
  103. <!-- <image
  104. src="http://36.138.125.206:8081/ceres-local-file/static/images/mapIcon.png"
  105. v-if="productData.receive && productData.receive.receiveAdress"
  106. ></image>-->
  107. <label
  108. class="fs28 font-color-595B6B mar-left-10 mapName mar-right-30"
  109. v-if="productData.receive && productData.receive.receiveAdress"
  110. >{{
  111. productData.receive.receiveAdress
  112. }}</label>
  113. <label class="fs28 font-color-595B6B">{{$t('common.express')}}¥ {{ productData.logisticsPrice || 0 }}</label>
  114. </view>
  115. <view class="border-line-wide"/>
  116. <!--结合销售-->
  117. <combined-sales
  118. :pid="productId"
  119. :productData="productData"
  120. ></combined-sales>
  121. <!--拼团-->
  122. <view
  123. v-if="selectedSku.activityType === 1"
  124. class="borRig-line-20"
  125. ></view>
  126. <!-- 拼单列表 -->
  127. <view
  128. v-if="selectedSku.activityType === 1&&topThreeCollageOrders.length > 0"
  129. class="goodsDiscount"
  130. >
  131. <view class="questionTit mar-left-30 flex-items flex-row flex-sp-between">
  132. <label class="">这些人正在拼单</label>
  133. <view class="allMoreBox">
  134. <view
  135. class="allMore"
  136. @click="handleOpenGroupBookingList"
  137. >查看全部
  138. </view>
  139. <image
  140. class="evaluateAllArrow-icon mar-left-10"
  141. src="http://36.138.125.206:8081/ceres-local-file/static/img/user/arrow.png"
  142. ></image>
  143. </view>
  144. </view>
  145. <view
  146. class="groupBuy"
  147. v-for="(Gitem, index) in topThreeCollageOrders"
  148. :key="index"
  149. >
  150. <view
  151. class="groupBuyList"
  152. v-if="Gitem.time > 0"
  153. >
  154. <view class="groupBuyItem">
  155. <view class="leftAvatar">
  156. <img
  157. :src="Gitem.headImage"
  158. alt=""
  159. >
  160. <span>{{ Gitem.name }}</span>
  161. </view>
  162. <view class="rightInfo">
  163. <view
  164. class="groupBuyTime"
  165. style="width: 70%;"
  166. >
  167. <view class="needPeople flex-row-plus">还差<b>{{ Gitem.person }}</b>拼成</view>
  168. <view class="endDate">剩余{{ handleGetDownTime(Gitem.time) }}</view>
  169. </view>
  170. <view
  171. class="groupBuyBtn"
  172. @click="handleGoGroupBooking(Gitem.collageId)"
  173. >和Ta拼
  174. </view>
  175. </view>
  176. </view>
  177. </view>
  178. </view>
  179. </view>
  180. <!-- 评价 -->
  181. <GoodEvaluateAndQuestion
  182. ref="goodEvaluateAndQuestion"
  183. class=" u-skeleton-fillet"
  184. :product-info="productData"
  185. :comment-list="commentList"
  186. />
  187. <!-- 店铺 -->
  188. <view class="inStore-box flex-items flex-row flex-sp-between u-skeleton-fillet">
  189. <view class="flex-display flex-row">
  190. <view>
  191. <image
  192. @click="handleJumpToStore"
  193. class="inStore-logo default-img"
  194. onerror="this.src='url(http://36.138.125.206:8081/ceres-local-file/image/default.png) no-repeat center';this.οnerrοr=null"
  195. :src="productData.shopLogo"
  196. ></image>
  197. </view>
  198. <view class="flex-display flex-column mar-left-20">
  199. <label @click="handleJumpToStore" class="fs32 fs-bold font-color-252744">{{ productData.shopName }}</label>
  200. <view class="flex-display flex-row fs24 font-color-252744 mar-top-5">
  201. <label>{{$t('common.classifynum')}}{{ productData.classifyNumber }}</label>
  202. <label class="mar-left-30">{{$t('common.soldnum',{number:productData.number})}}</label>
  203. </view>
  204. </view>
  205. </view>
  206. <view
  207. class="inStore-but"
  208. @click="handleJumpToStore"
  209. >去逛逛
  210. </view>
  211. </view>
  212. <!-- 详细信息 -->
  213. <view class="goodsDetails-box u-skeleton-fillet">
  214. <view class="goodsDetails-title">
  215. <view class="goodsDetails-Line"></view>
  216. <label class="goodsDetails-text">{{$t('common.goodsdetail')}}</label>
  217. <view class="goodsDetails-Line"></view>
  218. </view>
  219. <view class="goodsDetailsimg-box">
  220. <view class="">
  221. <rich-text :nodes="sellDescList"></rich-text>
  222. </view>
  223. </view>
  224. </view>
  225. </view>
  226. <!-- 底部购买 -->
  227. <view class="buygoods-box">
  228. <!-- <view
  229. class="buygoodsBut-box flex-row-plus"
  230. :style="{'height':(isIphone === true? 160:130)+'rpx'}"
  231. >-->
  232. <view
  233. class="buygoodsBut-box flex-row-plus"
  234. >
  235. <view class="btns_container">
  236. <view
  237. class="btns flex-column-plus"
  238. @click="handleJumpToStore"
  239. >
  240. <image
  241. class="store-icon"
  242. src="http://36.138.125.206:8081/ceres-local-file/image/prod_detail_shop.png"
  243. ></image>
  244. <!-- <label class="fs20 font-color-252744">{{$t('common.beautishop')}}</label>-->
  245. </view>
  246. <!-- #ifdef MP-WEIXIN || APP-PLUS || H5 -->
  247. <!-- <view
  248. class="btns flex-column-plus mar-left-10"
  249. @click="flyToService"
  250. >
  251. <image
  252. class="store-icon"
  253. src="http://36.138.125.206:8081/ceres-local-file/static/images/service-product-detail.png"
  254. ></image>
  255. <label class="fs22">{{$t('common.service')}}</label>
  256. </view>-->
  257. <!-- #endif -->
  258. <view
  259. class="btns flex-column-plus mar-left-10 flex-items Cart"
  260. @click="handleJumpToShopCart"
  261. >
  262. <view
  263. class="cartAllNum"
  264. v-if="allCartNum>0"
  265. >{{ allCartNum }}
  266. </view>
  267. <image
  268. class="store-icon"
  269. src="http://36.138.125.206:8081/ceres-local-file/image/prod_detail_cart.png"
  270. ></image>
  271. <!-- <label class="fs20 font-color-252744">{{$t('page.shoppingcart')}}</label>-->
  272. </view>
  273. </view>
  274. <view class="btns_container">
  275. <view
  276. class="flex-row-plus offShelf"
  277. v-if="productData.shelveState === 0"
  278. >
  279. {{$t('common.spyxj')}}
  280. </view>
  281. <view
  282. class="flex-row-plus flex-items"
  283. v-else-if="selectedSku.activityType === 1"
  284. >
  285. <view
  286. class="joinShopCartBut"
  287. @click=" handleShowGoodsSkuSelect(4)"
  288. >{{$t('common.ddgm')}}
  289. </view>
  290. <view
  291. class="buyNowBut"
  292. @click=" handleShowGoodsSkuSelect(3)"
  293. >{{$t('common.wykt')}}
  294. </view>
  295. </view>
  296. <view
  297. class="flex-row-plus flex-items"
  298. v-else
  299. >
  300. <view
  301. class="joinShopCartBut"
  302. @click=" handleShowGoodsSkuSelect(1)"
  303. >{{$t('common.addtocart')}}
  304. </view>
  305. <view
  306. class="buyNowBut"
  307. @click=" handleShowGoodsSkuSelect(2)"
  308. >{{$t('common.buynow')}}
  309. </view>
  310. </view>
  311. </view>
  312. </view>
  313. </view>
  314. <!-- 回到顶部 -->
  315. <view class="returnTopService-box">
  316. <view
  317. class="returnTop-box flex-items-plus flex-column"
  318. @click="handleReturnTop"
  319. :style="{'display':(returnTopFlag===true? 'flex':'none')}"
  320. >
  321. <image
  322. class="returnTopImg"
  323. src="http://36.138.125.206:8081/ceres-local-file/image/scroll_top.png"
  324. ></image>
  325. </view>
  326. </view>
  327. <!-- SKU选择器 -->
  328. <GoodSkuSelect
  329. ref="skuSelect"
  330. :product-data="productData"
  331. :selected-sku="selectedSku"
  332. :collage-id="collageId"
  333. @postSelectSku="selectSkuPostProcessor"
  334. @getCurrentSku="handleSelectSku"
  335. @changeCartNum="(num)=>allCartNum = num"
  336. @skuImageSelect="switchSkuImage"
  337. />
  338. <!-- 优惠券选择器 -->
  339. <coupon-popup
  340. ref="couponPopup"
  341. :markTools="markTools"
  342. :shopMarkTools="shopMarkTools"
  343. :setTop="topLeft"
  344. :currentActive="currentActive"
  345. ></coupon-popup>
  346. <!-- 拼单弹框 -->
  347. <u-popup
  348. class="popupDiscount"
  349. v-model="showGroupBuyList"
  350. mode="center"
  351. border-radius="14"
  352. close-icon-pos="top-right"
  353. close-icon-size="20"
  354. >
  355. <view class="popupDiscountTit">这些人正在拼单</view>
  356. <view class="groupBuy">
  357. <view class="groupBuyList">
  358. <scroll-view
  359. style="height: 480upx;"
  360. scroll-y
  361. >
  362. <view
  363. class="groupBuyItem1"
  364. v-for="(aitem,index) in selectedSku.collageOrders"
  365. :key="index"
  366. >
  367. <view
  368. class="leftAvatar"
  369. v-if="aitem.time > 0"
  370. >
  371. <img
  372. :src="aitem.headImage"
  373. alt=""
  374. >
  375. <view class="groupBuyTime">
  376. <view class="needPeople"><span>{{ aitem.name }}</span>还差<b>{{ aitem.person }}</b>
  377. </view>
  378. <view class="endDate">剩余{{ handleGetDownTime(aitem.time) }}</view>
  379. </view>
  380. </view>
  381. <view
  382. class="rightInfo"
  383. v-if="aitem.time > 0"
  384. >
  385. <view
  386. class="groupBuyBtn"
  387. @click="handleGoGroupBooking(aitem.collageId)"
  388. >和Ta拼
  389. </view>
  390. </view>
  391. </view>
  392. </scroll-view>
  393. </view>
  394. </view>
  395. </u-popup>
  396. <!-- 骨架屏 -->
  397. <Skeleton
  398. el-color="#efefef"
  399. bg-color="#fff"
  400. :loading="isFirstComeIn&&loading"
  401. :animation="true"
  402. ></Skeleton>
  403. </view>
  404. </template>
  405. <script>
  406. import Skeleton from "../../components/Skeleton";
  407. import UButton from "../../uview-ui/components/u-button/u-button";
  408. import CombinedSales from "@/components/activities/combinedSales";
  409. import CouponPopup from "../../components/goodsDetalils/coupon-popup";
  410. import { Services } from "../../utils/services";
  411. import GoodEvaluateAndQuestion from "./components/GoodEvaluateAndQuestion";
  412. import GoodActivityDetail from "./components/GoodActivityDetail";
  413. import GoodSkuSelect from "./components/GoodSkuSelect";
  414. import { TimeFormatting } from "../../utils/timeUtil";
  415. import USkeleton from "../../uview-ui/components/u-skeleton/u-skeleton";
  416. const NET = require('../../utils/request')
  417. const API = require('../../config/api')
  418. export default {
  419. components: {
  420. USkeleton,
  421. Skeleton,
  422. CouponPopup,
  423. CombinedSales,
  424. UButton,
  425. GoodEvaluateAndQuestion, GoodActivityDetail, GoodSkuSelect
  426. },
  427. data() {
  428. return {
  429. isFirstComeIn: true,
  430. loading: true,
  431. isIphone: "",
  432. returnTopFlag: false, // 回到顶部
  433. productId: '', // 商品ID,有可能屎缓存数据
  434. shopGroupWorkId: null,// 拼团数据ID
  435. topThreeCollageOrders: {}, //当前商品拼单数据
  436. collageId: 0, // 去拼团时的拼单ID
  437. broadCastList: [], // 拼团滚动数据
  438. showGroupBuyList: false, // 是否展示拼单弹窗
  439. shopGroupWorkTicker: null, // 拼团倒计时定时器
  440. paramSkuId: null, // 秒杀商品ID
  441. // 商品详情
  442. productData: {},
  443. // 当前选中SKU
  444. selectedSku: {},
  445. currentSuk: [], // 选中的SKU(子组件给当前页面做数据渲染)
  446. buyNum: 1,// 当前选取的SKU购买数量
  447. storeId: '',// 店铺ID
  448. commentList: [], // 商品评价列表
  449. sellDescList: '', // 商品详情长图(富文本)
  450. timeActiveType: true,// 是否开启活动(非则预热)
  451. btnType: 1, // 拉起SKU窗口的按钮类型 1加入购物车 2立即购买 3开团 4单独购买 6选择SKU
  452. allCartNum: 0, // 购物车数量
  453. markTools: [], //平台优惠券
  454. shopMarkTools: [], //店铺优惠券
  455. currentActive: 0, // 优惠券选项卡类型
  456. topLeft: 0, // 距离顶部(返回顶部使用)
  457. // 埋点对象
  458. pointOption: {
  459. inTime: null,
  460. data: {
  461. eventType: 1,
  462. productIds: '',
  463. }
  464. },
  465. defaultImageUrl: 'http://36.138.125.206:8081/ceres-local-file/image/sku_default.png',
  466. selectedAttr: {},
  467. skuImages: []
  468. }
  469. },
  470. created() {
  471. if (this.ticker) { //这一段是防止进入页面出去后再进来计时器重复启动
  472. clearInterval(this.ticker);
  473. }
  474. if (this.allCartNum > 99) {
  475. this.allCartNum = '...'
  476. }
  477. },
  478. beforeDestroy() {
  479. },
  480. onShow() {
  481. },
  482. onLoad(options) {
  483. // 页面滚动条归0,不然骨架屏有问题
  484. uni.pageScrollTo({
  485. scrollTop:0,
  486. duration:0
  487. })
  488. this.productData = {
  489. logisticsPrice: 0,
  490. images: ['123', '123', '123'],
  491. productName: '....',
  492. ifCollect: 1,
  493. }
  494. this.selectedSku = {
  495. activityType: 0,
  496. originalPrice: 0
  497. }
  498. if(options.detail){
  499. options = this.$getJumpParam(options)
  500. }
  501. this.isFirstComeIn = true
  502. this.loading = true
  503. let salesId = null
  504. this.pointOption.inTime = new Date().getTime()
  505. this.isIphone = getApp().globalData.isIphone;
  506. let item = getApp().globalData.productShareItem
  507. if (item) {
  508. const item = getApp().globalData.productShareItem
  509. this.shopId = parseInt(item.shopId)
  510. this.productId = item.productId
  511. this.paramSkuId = item.skuId
  512. salesId = parseInt(item.salesId)
  513. getApp().globalData.productShareItem = undefined
  514. } else {
  515. this.shopId = parseInt(options.shopId)
  516. this.productId = options.productId
  517. this.paramSkuId = options.skuId
  518. salesId = parseInt(options.salesId)
  519. }
  520. // 判断是否是拼团
  521. if (options.shopGroupWorkId) {
  522. this.shopGroupWorkId = options.shopGroupWorkId
  523. }
  524. this.handleGetProductDetail()
  525. // 绑定分销关系
  526. salesId && this.shopId ? this.bindSalesCustomer(salesId, this.shopId) : ''
  527. this.allCartNum = uni.getStorageSync('allCartNum')
  528. },
  529. onUnload() {
  530. // 判断是否要埋点
  531. const nowTime = new Date().getTime()
  532. if (nowTime - this.pointOption.inTime >= 5000) {
  533. // 埋点
  534. this.pointOption.data.productIds = this.productId
  535. this.$store.dispatch('doPointer', this.pointOption.data)
  536. }
  537. // 销毁平团倒计时计时器
  538. if (this.shopGroupWorkTicker) {
  539. clearInterval(this.shopGroupWorkTicker)
  540. this.shopGroupWorkTicker = null
  541. }
  542. },
  543. mounted() {
  544. },
  545. onPageScroll(e) {
  546. this.returnTopFlag = e.scrollTop > 600;
  547. this.topLeft = e.scrollTop
  548. },
  549. methods: {
  550. /**
  551. * 页面滚动事件
  552. * @param e
  553. */
  554. handlePageScroll(e) {
  555. this.topLeft = e.scrollTop
  556. },
  557. /**
  558. * 选取sku
  559. * @param skuObj:{currentSuk:object,selectedSku:object,buyNum:number}
  560. */
  561. handleSelectSku(skuObj) {
  562. this.currentSuk = skuObj.currentSku
  563. this.selectedSku = skuObj.skuItem
  564. this.buyNum = skuObj.buyNum
  565. },
  566. /**
  567. * 选择sku后置方法
  568. * 判断有无活动等操作
  569. */
  570. selectSkuPostProcessor() {
  571. const ifEnable = this.selectedSku['ifEnable']
  572. if (this.selectedSku.activityType === 1 && ifEnable === 0) {
  573. this.topThreeCollageOrders = this.selectedSku.collageOrders.slice(0, 3)
  574. }
  575. if ([1, 2, 3, 4, 5].includes(this.selectedSku.activityType) && ifEnable === 0) {
  576. this.$refs.goodActivityDetail.handleGetCountDownNumber(this.selectedSku.endTime)
  577. }
  578. this.timeActiveType = ifEnable === 0;
  579. },
  580. /**
  581. * 获取拼团滚动数据
  582. */
  583. async handleGetGroupBookingRollList() {
  584. let param = {
  585. productId: this.productId,
  586. shopGroupWorkId: this.shopGroupWorkId ?? undefined,
  587. }
  588. const res = await NET.request(API.GetBroadCastList, param, 'GET')
  589. this.broadCastList = res.data
  590. },
  591. /**
  592. * 和他人拼单
  593. * @param collageId 已存在的拼团订单ID
  594. */
  595. handleGoGroupBooking(collageId) {
  596. this.showGroupBuyList = false
  597. this.collageId = collageId
  598. this.$refs.skuSelect.goodsDetailShowFlag = true
  599. },
  600. /**
  601. * 设置拼团倒计时
  602. */
  603. handleSetDownTime() { //这个计时器是每秒减去数组中指定字段的时间
  604. let productHaveCollageOrder = false
  605. // 判断sku组合中是否存在拼单
  606. const skuCollects = this.productData.map
  607. for (const skuCollectItemKey in skuCollects) {
  608. const collageOrders = skuCollects[skuCollectItemKey]['collageOrders']
  609. if (collageOrders && collageOrders.length > 0) {
  610. productHaveCollageOrder = true
  611. break
  612. }
  613. }
  614. if (!productHaveCollageOrder) return
  615. this.shopGroupWorkTicker = setInterval(() => {
  616. for (const skuCollectItemKey in skuCollects) {
  617. const collageOrders = skuCollects[skuCollectItemKey]['collageOrders']
  618. if (collageOrders && collageOrders.length > 0) {
  619. collageOrders.forEach(collageItem => {
  620. collageItem.time > 0 ? collageItem.time -= 1000 : ''
  621. })
  622. }
  623. }
  624. }, 1000);
  625. },
  626. /**
  627. * 根据时间戳获取格式化时间处理计时器
  628. * @param remainMillSecs 毫秒还有多久结束
  629. * @return {string}
  630. */
  631. handleGetDownTime(remainMillSecs) {
  632. if (remainMillSecs <= 0) {
  633. clearInterval(this.shopGroupWorkTicker)
  634. this.shopGroupWorkTicker = null
  635. this.handleGetProductDetail()
  636. }
  637. const timeFormatting = TimeFormatting(remainMillSecs / 1000);
  638. return `${ timeFormatting.hour }:${ timeFormatting.min }:${ timeFormatting.sec }`;
  639. },
  640. /**
  641. * 跳转到购物车
  642. */
  643. handleJumpToShopCart() {
  644. this.$jumpToTabbar('../../pages/tabbar/cart/index')
  645. },
  646. /**
  647. * 跳转到店铺
  648. */
  649. handleJumpToStore() {
  650. this.$jump(`../store/index?storeId=${ this.shopId }`)
  651. },
  652. /**
  653. * 返回头部
  654. */
  655. handleReturnTop() {
  656. uni.pageScrollTo({
  657. scrollTop: 0,
  658. duration: 300
  659. });
  660. },
  661. /**
  662. * 打开SKU弹窗
  663. * @param type 1加入购物车 2立即购买 3开团 4单独购买 6选择SKU
  664. */
  665. handleShowGoodsSkuSelect(type) {
  666. // 为type情况时,绝不可能为和他人拼单
  667. this.collageId = 0
  668. this.$refs.skuSelect.btnType = type
  669. this.$refs.skuSelect.goodsDetailShowFlag = true
  670. },
  671. /**
  672. * 打开优惠券弹窗
  673. */
  674. handleShowCoupon() {
  675. this.$refs.couponPopup.showActivity = true
  676. },
  677. /**
  678. * 活动商品时间到后置方法
  679. * 供GoodActivityDetail组件调用
  680. */
  681. handleActivityEnd() {
  682. this.selectedSku.activityType = 0
  683. location.reload()
  684. },
  685. /**
  686. * 获取商品详情
  687. */
  688. async handleGetProductDetail() {
  689. this.loading = true
  690. // uni.showLoading({
  691. // title: '加载中...',
  692. // mask: true
  693. // })
  694. try {
  695. let postData = {
  696. shopId: this.shopId,
  697. productId: this.productId,
  698. skuId: this.paramSkuId,
  699. terminal: 1
  700. }
  701. const res = await NET.request(API.QueryProductDetail, postData, "GET")
  702. this.isFirstComeIn = false
  703. this.loading = false
  704. this.productData = res.data
  705. this.markTools = res.data.markTools //平台优惠券
  706. this.shopMarkTools = res.data.shopMarkTools //店铺优惠券
  707. this.currentActive = this.markTools.length === 0 && this.shopMarkTools.length > 0 ? 1 : 0
  708. //处理单规格商品,如果是单款式商品,需要特殊处理productData.names
  709. const skuCollectionList = this.productData.map
  710. const skuCollectionListKeys = Object.keys(skuCollectionList)
  711. if (skuCollectionListKeys.length === 1 && skuCollectionListKeys[0] === '单款项') {
  712. this.productData.names[0].values.push({
  713. skuValue: this.productData.names[0].skuName,
  714. valueCode: '单款项'
  715. })
  716. }
  717. //如果sku的图像为空,设置为商品的图像
  718. for (const key in skuCollectionList) {
  719. if (!skuCollectionList[key].image) {
  720. skuCollectionList[key].image = this.productData.images[0]
  721. }
  722. }
  723. for (const valueCode of this.productData.names[0].values){
  724. if (valueCode.image) {
  725. this.skuImages.push(valueCode.image)
  726. }
  727. }
  728. if (this.skuImages.length > 0) {
  729. //若规格有图片,则商品轮播图改为规格图片
  730. this.productData.images = this.skuImages
  731. }
  732. // 评价
  733. this.commentList = res.data.comments
  734. // 宝贝详情
  735. this.sellDescList = res.data.text.replace(/\<img class=\"wscnph\"/gi,
  736. '<img')
  737. .replace(/\<img style=\"display: block; margin-left: auto; margin-right: auto;\"/gi,
  738. '<img')
  739. .replace(/\<img/gi,
  740. '<img style="display:block;float: none;margin: 0;padding: 0;width:100%;max-width:100%;height:auto" ')
  741. //渲染商详之后,如果参数传了skuId,则选中该skuId,否则选中第一个规格
  742. this.$nextTick(async () => {
  743. if (this.paramSkuId) {
  744. this.$refs.skuSelect.handleSelectBySkuId(this.paramSkuId)
  745. this.selectedAttr = this.$refs.skuSelect.selectedAttr
  746. } else {
  747. // 默认选中第0个
  748. for (const skuRowItem of this.productData.names) {
  749. this.$refs.skuSelect.handleClickSkuItem(skuRowItem.nameCode, skuRowItem.values[0].valueCode)
  750. }
  751. this.selectedAttr = this.$refs.skuSelect.selectedAttr
  752. }
  753. //如果是拼团,设置拼团id
  754. if (this.productData.activityType === 1) {
  755. this.shopGroupWorkId = this.productData.shopGroupWorkId
  756. await this.handleGetGroupBookingRollList()
  757. this.handleSetDownTime();
  758. }
  759. await this.$refs.goodEvaluateAndQuestion.handleGetProblemList()
  760. })
  761. } finally {
  762. uni.hideLoading()
  763. // this.loading = false
  764. }
  765. },
  766. /**
  767. * 绑定分销关系
  768. * @param salesId 分销员ID
  769. * @param storeId 店铺ID
  770. */
  771. bindSalesCustomer(salesId, storeId) {
  772. //如果已登录,静默绑定客户关系,否则跳转到登录页面
  773. if (!uni.getStorageSync('storage_key')) {
  774. uni.setStorageSync('salesId', salesId)
  775. uni.setStorageSync("shopId", storeId)
  776. uni.navigateTo({
  777. url: '../../pages_category_page2/userModule/login'
  778. })
  779. return
  780. }
  781. NET.request(API.BindSalesCustomer, {
  782. shopId: storeId,
  783. distributorId: salesId
  784. }, 'POST').then(res => {
  785. })
  786. }
  787. ,
  788. /**
  789. * 打开拼团列表
  790. */
  791. handleOpenGroupBookingList() {
  792. if (this.topThreeCollageOrders.length > 0) {
  793. this.showGroupBuyList = true
  794. } else {
  795. uni.showToast({
  796. title: "还没有人拼单,快去拼单吧!",
  797. icon: "none"
  798. })
  799. }
  800. }
  801. ,
  802. /**
  803. * 打开客服
  804. * @return {Promise<void>}
  805. */
  806. async flyToService() {
  807. (await Services(this.shopId)).flyToService()
  808. },
  809. handleClickSku(nameCode, valueCode, rowIndex, colIndex) {
  810. this.$refs.skuSelect.handleClickSkuItem(nameCode, valueCode, rowIndex, colIndex)
  811. this.selectedAttr = this.$refs.skuSelect.selectedAttr
  812. },
  813. switchSkuImage(rowIndex, colIndex) {
  814. if (this.skuImages.length > 0 && rowIndex === 0) {
  815. this.$refs.goodActivityDetail.switchSkuImage(colIndex)
  816. }
  817. },
  818. onImageError(e) {
  819. e.target.src = 'http://36.138.125.206:8081/ceres-local-file/image/sku_default.png';
  820. }
  821. }
  822. }
  823. </script>
  824. <style>
  825. .page {
  826. background-color: #F7F7F7;
  827. }
  828. </style>
  829. <style
  830. scoped
  831. lang="scss"
  832. >
  833. .page {
  834. background-color: #F7F7F7;
  835. }
  836. .news-box {
  837. position: fixed;
  838. left: 20rpx;
  839. top: 200rpx;
  840. z-index: 9999;
  841. .news-bg {
  842. width: 450rpx;
  843. height: 70rpx;
  844. overflow: hidden;
  845. .news-item {
  846. background: rgba(0, 0, 0, 0.75);
  847. border-radius: 16rpx;
  848. height: 70rpx;
  849. color: #FFFFFF;
  850. font-size: 24rpx;
  851. padding: 0 20rpx;
  852. width: 450rpx;
  853. .item-avatar {
  854. width: 50rpx;
  855. height: 50rpx;
  856. border-radius: 50%;
  857. margin-right: 20rpx;
  858. }
  859. }
  860. }
  861. }
  862. .tabsbox {
  863. width: 100%;
  864. margin-top: 20rpx;
  865. background-color: #FFFFFF;
  866. }
  867. .checkimg {
  868. width: 40rpx;
  869. height: 40rpx;
  870. margin-right: 30rpx;
  871. }
  872. .container {
  873. padding-bottom: 180upx;
  874. .arrow-icon {
  875. width: 16rpx;
  876. height: 28rpx;
  877. }
  878. .goodgDes-box {
  879. background-color: #FFFFFF;
  880. width: 100%;
  881. padding-bottom: 25rpx;
  882. .priceBuyNum-box {
  883. width: 677rpx;
  884. margin-top: 30rpx;
  885. }
  886. .nameContainer {
  887. display: flex;
  888. .goodsName-box {
  889. width: 677rpx;
  890. height: 85rpx;
  891. .img618-cion {
  892. width: 70rpx;
  893. height: 36rpx;
  894. }
  895. }
  896. .collectBox {
  897. width: 80rpx;
  898. margin: 0 30rpx 0 15rpx;
  899. display: flex;
  900. flex-direction: column;
  901. justify-content: center;
  902. align-items: center;
  903. }
  904. .store-icon {
  905. width: 48rpx;
  906. height: 48rpx;
  907. }
  908. }
  909. .discounts-box {
  910. margin-top: 20rpx;
  911. .discounts-text {
  912. margin-left: 10rpx;
  913. color: #FF7800;
  914. background-color: #FFE4CC;
  915. padding: 6rpx 12rpx;
  916. border-radius: 4rpx;
  917. }
  918. }
  919. .activity-box {
  920. display: flex;
  921. flex-direction: row;
  922. justify-content: center;
  923. align-items: flex-end;
  924. border-top: 1upx solid #EDEDED;
  925. .activity-content {
  926. width: 614rpx;
  927. padding-top: 20rpx;
  928. .activity-text {
  929. color: #FF7700;
  930. border: 1rpx solid #FF7700;
  931. padding: 6rpx 23rpx;
  932. }
  933. .coupon-arrow {
  934. width: 16rpx;
  935. height: 24rpx;
  936. margin-left: 15rpx;
  937. }
  938. }
  939. }
  940. }
  941. .express-box {
  942. height: 100rpx;
  943. padding-left: 30rpx;
  944. border-top: 12rpx solid #F8F8F8;
  945. border-bottom: 12rpx solid #F8F8F8;
  946. image {
  947. width: 21rpx;
  948. height: 27rpx;
  949. }
  950. .expressSite-icon {
  951. width: 30rpx;
  952. height: 30rpx;
  953. }
  954. .mapName {
  955. position: relative;
  956. &:before {
  957. content: '';
  958. width: 2rpx;
  959. height: 30rpx;
  960. background: #CCCCCC;
  961. display: block;
  962. position: absolute;
  963. right: -16rpx;
  964. top: 5rpx;
  965. }
  966. }
  967. }
  968. .chooseSize-box {
  969. height: 90rpx;
  970. margin: 10rpx 0;
  971. margin-right: 30rpx;
  972. .chooseSize-content {
  973. width: 100%;
  974. }
  975. }
  976. .questionTit {
  977. height: 90rpx;
  978. border-bottom: 1rpx solid #EEEEEE;
  979. margin-right: 35rpx;
  980. color: #333333;
  981. font-size: 30rpx;
  982. .allMoreBox {
  983. display: flex;
  984. align-items: center;
  985. color: #999999;
  986. font-size: 24rpx;
  987. .evaluateAllArrow-icon {
  988. width: 18rpx;
  989. height: 24rpx;
  990. }
  991. }
  992. }
  993. .shopEvaList {
  994. display: flex;
  995. padding: 30rpx;
  996. flex-wrap: wrap;
  997. border-bottom: 20rpx solid #EEEEEE;
  998. .shopEvaItem {
  999. padding: 0 14rpx;
  1000. height: 60rpx;
  1001. background: #ffe4cc;
  1002. border-radius: 6rpx;
  1003. line-height: 60rpx;
  1004. text-align: center;
  1005. font-size: 28rpx;
  1006. color: #666666;
  1007. margin: 0 20rpx 20rpx 0;
  1008. }
  1009. }
  1010. .storeEvaluate-box {
  1011. background-color: #FFFFFF;
  1012. margin-top: 20rpx;
  1013. .storeEvaluate {
  1014. width: 690rpx;
  1015. padding: 20rpx 0;
  1016. border-bottom: 1rpx solid #EDEDED;
  1017. }
  1018. .storeEvaluateTag-box {
  1019. margin-top: 10rpx;
  1020. margin-left: 10rpx;
  1021. padding-bottom: 30rpx;
  1022. display: flex;
  1023. flex-wrap: wrap;
  1024. .storeEvaluateTag-text {
  1025. background-color: #FFE4CC;
  1026. border-radius: 6rpx;
  1027. padding: 16rpx 14rpx;
  1028. color: #656565;
  1029. margin-left: 20rpx;
  1030. margin-top: 20rpx;
  1031. }
  1032. }
  1033. }
  1034. .inStore-box {
  1035. background-color: #FFFFFF;
  1036. padding: 30rpx 30rpx;
  1037. .inStore-logo {
  1038. width: 74rpx;
  1039. height: 74rpx;
  1040. border-radius: 20rpx;
  1041. }
  1042. .inStore-but {
  1043. width: 155rpx;
  1044. height: 68rpx;
  1045. line-height: 68rpx;
  1046. text-align: center;
  1047. font-size: 24rpx;
  1048. color: #FAFAFA;
  1049. background: #333333;
  1050. border-radius: 35rpx;
  1051. /* &:before {
  1052. content: '';
  1053. width: 60rpx;
  1054. height: 60rpx;
  1055. background: url("http://36.138.125.206:8081/ceres-local-file/static/images/arrow.png") no-repeat center center;
  1056. background-size: contain;
  1057. display: block;
  1058. position: absolute;
  1059. right: 0;
  1060. }*/
  1061. }
  1062. }
  1063. .goodsDetails-box {
  1064. background-color: #FFFFFF;
  1065. //margin-top: 20rpx;
  1066. padding: 20rpx 30rpx;
  1067. .goodsDetails-title {
  1068. display: flex;
  1069. flex-direction: row;
  1070. align-items: center;
  1071. margin-bottom: 30rpx;
  1072. color: #252744;
  1073. font-weight: bold;
  1074. font-size: 32rpx;
  1075. .goodsDetails-Line {
  1076. width: 252rpx;
  1077. border-bottom: 1rpx solid #D3D4DE;
  1078. }
  1079. .goodsDetails-text {
  1080. padding: 0 22rpx;
  1081. }
  1082. }
  1083. .goodsDetailsimg-box {
  1084. }
  1085. }
  1086. .priceExplain-box {
  1087. background-color: #FFFFFF;
  1088. margin-top: 20rpx;
  1089. padding: 20rpx 30rpx;
  1090. .priceExplain-title {
  1091. display: flex;
  1092. flex-direction: row;
  1093. align-items: center;
  1094. .priceExplain-Line {
  1095. width: 265rpx;
  1096. border-bottom: 1rpx solid #EDEDED;
  1097. }
  1098. .priceExplain-text {
  1099. padding: 0 22rpx;
  1100. }
  1101. }
  1102. .priceExplain-dot {
  1103. width: 9rpx;
  1104. height: 9rpx;
  1105. border: 1rpx solid #FF7700;
  1106. border-radius: 50%;
  1107. background-color: #FF7700;
  1108. }
  1109. }
  1110. .buygoods-box {
  1111. position: fixed;
  1112. bottom: 0rpx;
  1113. box-sizing: border-box;
  1114. z-index: 999;
  1115. .groupByInfo {
  1116. background: #fffbe9;
  1117. padding: 0 30rpx;
  1118. height: 80rpx;
  1119. .groupByInfoBox {
  1120. height: 80rpx;
  1121. }
  1122. .groupByLeft {
  1123. .groupByAvatar {
  1124. margin-right: 15rpx;
  1125. }
  1126. img {
  1127. width: 50rpx;
  1128. height: 50rpx;
  1129. }
  1130. .name {
  1131. font-size: 24rpx;
  1132. }
  1133. .groupByNum {
  1134. margin-right: 10rpx;
  1135. }
  1136. .groupByTime {
  1137. color: #333333;
  1138. }
  1139. }
  1140. .groupByBtn {
  1141. height: 60rpx;
  1142. background: #333333;
  1143. color: #FFEBC4;
  1144. font-size: 14rpx;
  1145. line-height: 60rpx;
  1146. text-align: center;
  1147. padding: 0 20rpx;
  1148. }
  1149. }
  1150. .buygoodsBut-box {
  1151. width: 750rpx;
  1152. height: 180rpx;
  1153. padding: 20rpx 32rpx;
  1154. background-color: #FFFFFF;
  1155. border-top-right-radius: 60rpx;
  1156. border-top-left-radius: 60rpx;
  1157. //box-shadow: 0rpx 0rpx 10rpx 1rpx #EDEDED;
  1158. box-sizing: border-box;
  1159. display: flex;
  1160. justify-content: space-between;
  1161. .btns_container {
  1162. display: flex;
  1163. align-items: center;
  1164. }
  1165. .btns {
  1166. width: 80rpx;
  1167. }
  1168. .Cart {
  1169. position: relative;
  1170. .cartAllNum {
  1171. position: absolute;
  1172. width: 30rpx;
  1173. height: 30rpx;
  1174. line-height: 30rpx;
  1175. text-align: center;
  1176. font-size: 17rpx;
  1177. color: #FFFFFF;
  1178. background: #F54639;
  1179. border-radius: 50%;
  1180. opacity: 1;
  1181. z-index: 999;
  1182. }
  1183. // #ifdef APP-PLUS
  1184. .cartAllNum {
  1185. right: -6rpx;
  1186. top: -6rpx;
  1187. }
  1188. // #endif
  1189. /* #ifdef H5 */
  1190. .cartAllNum {
  1191. right: -10rpx;
  1192. top: -6rpx;
  1193. }
  1194. /* #endif */
  1195. /* #ifdef MP-WEIXIN */
  1196. .cartAllNum {
  1197. right: -3rpx;
  1198. top: 0;
  1199. }
  1200. /* #endif */
  1201. }
  1202. .store-icon {
  1203. width: 48rpx;
  1204. height: 48rpx;
  1205. }
  1206. .joinShopCartBut {
  1207. width: 235rpx;
  1208. height: 88rpx;
  1209. background-color: #FFFFFF;
  1210. color: #333333;
  1211. font-size: 32rpx;
  1212. line-height: 85rpx;
  1213. border: 1px solid #252744;
  1214. border-radius: 49rpx;
  1215. text-align: center;
  1216. margin-left: 40rpx;
  1217. box-sizing: border-box;
  1218. }
  1219. .buyNowBut {
  1220. width: 235rpx;
  1221. height: 88rpx;
  1222. //background: #333333;
  1223. background: linear-gradient(-10deg, #252744, #484A66);
  1224. border-radius: 49rpx;
  1225. color: #FFFFFF;
  1226. font-size: 32rpx;
  1227. line-height: 85rpx;
  1228. text-align: center;
  1229. margin-left: 16rpx;
  1230. }
  1231. .offShelf {
  1232. background: #b7b7b7;
  1233. border-radius: 50rpx;
  1234. width: 360rpx;
  1235. margin-left: 50rpx;
  1236. line-height: 80rpx;
  1237. height: 80rpx;
  1238. justify-content: center;
  1239. color: #333333;
  1240. }
  1241. }
  1242. }
  1243. .returnTopService-box {
  1244. position: fixed;
  1245. bottom: 200rpx;
  1246. right: 30rpx;
  1247. .fs16 {
  1248. font-size: 16rpx;
  1249. }
  1250. .returnTop-box {
  1251. width: 98rpx;
  1252. height: 98rpx;
  1253. //border-radius: 50%;
  1254. //background: #FFFFFF;
  1255. //opacity: 0.8;
  1256. .returnTopImg {
  1257. width: 98rpx;
  1258. height: 98rpx;
  1259. }
  1260. }
  1261. .serviceImg-box {
  1262. width: 90rpx;
  1263. height: 90rpx;
  1264. border-radius: 50%;
  1265. background-color: #FFFFFF;
  1266. box-shadow: 0rpx 0rpx 5rpx 3rpx #999999;
  1267. .serviceImg {
  1268. width: 36rpx;
  1269. height: 36rpx;
  1270. display: block;
  1271. background: url("http://36.138.125.206:8081/ceres-local-file/static/images/serviceImg.png") no-repeat center center;
  1272. background-size: contain;
  1273. }
  1274. }
  1275. }
  1276. .parameterShow-box {
  1277. .parameter-title {
  1278. width: 100%;
  1279. text-align: center;
  1280. padding-bottom: 36rpx;
  1281. }
  1282. .parameter-modle {
  1283. width: 690rpx;
  1284. padding-bottom: 36rpx;
  1285. font-size: 26rpx;
  1286. }
  1287. .parameterTruebut-box {
  1288. background-color: #FFFFFF;
  1289. padding: 20rpx 0;
  1290. .parameterTruebut {
  1291. width: 690rpx;
  1292. height: 80rpx;
  1293. background-image: linear-gradient(135deg, #FFA100 10%, #FF7911 100%);
  1294. color: #FFFFFF;
  1295. border-radius: 40rpx;
  1296. line-height: 80rpx;
  1297. text-align: center;
  1298. font-size: 26rpx;
  1299. }
  1300. }
  1301. }
  1302. .couponShow-box {
  1303. .couponShow {
  1304. z-index: 333;
  1305. height: 1000rpx;
  1306. .couponTitle-box {
  1307. width: 100%;
  1308. }
  1309. .coupon-title-active {
  1310. color: #FF7700;
  1311. border-bottom: 2rpx solid #FF7700;
  1312. padding-bottom: 30rpx;
  1313. }
  1314. .usableCoupon-content {
  1315. padding: 30rpx 0;
  1316. .usableCoupon-box {
  1317. width: 690rpx;
  1318. height: 140rpx;
  1319. border-radius: 10rpx;
  1320. background-color: #FFE9D8;
  1321. .immediateUse-but {
  1322. color: #FF7800;
  1323. border-radius: 30rpx;
  1324. padding: 0 40rpx;
  1325. border-left: 3rpx solid #EBD7C7;
  1326. height: 140rpx;
  1327. border-radius: 60rpx;
  1328. line-height: 140rpx;
  1329. font-weight: bold;
  1330. }
  1331. }
  1332. }
  1333. }
  1334. }
  1335. .succeedShow-box {
  1336. position: absolute;
  1337. top: 220rpx;
  1338. left: 185rpx;
  1339. .succeedShow {
  1340. background-color: #7F7F7F;
  1341. width: 380rpx;
  1342. height: 280rpx;
  1343. border-radius: 10rpx;
  1344. opacity: 0.8;
  1345. .couponSucceedImg {
  1346. width: 200rpx;
  1347. height: 130rpx;
  1348. }
  1349. }
  1350. }
  1351. }
  1352. .activity-box {
  1353. display: flex;
  1354. flex-direction: column;
  1355. width: 100%;
  1356. height: 100%;
  1357. .title-box {
  1358. width: 100%;
  1359. height: 100upx;
  1360. display: flex;
  1361. flex-direction: row;
  1362. align-items: center;
  1363. justify-content: center;
  1364. position: relative;
  1365. border-bottom: solid 1px #EEEEEE;
  1366. }
  1367. }
  1368. .activity-coupon-box {
  1369. display: flex;
  1370. flex-direction: column;
  1371. width: 100%;
  1372. overflow: auto;
  1373. flex: 1;
  1374. }
  1375. .content-box {
  1376. width: 100%;
  1377. box-sizing: border-box;
  1378. display: flex;
  1379. flex-direction: column;
  1380. padding: 30rpx;
  1381. }
  1382. .tag-box {
  1383. width: 100%;
  1384. box-sizing: border-box;
  1385. height: 80rpx;
  1386. line-height: 80rpx;
  1387. font-size: 28rpx;
  1388. font-weight: 500;
  1389. color: #FF7911;
  1390. }
  1391. .label-lingqu {
  1392. width: 100%;
  1393. font-weight: 500;
  1394. color: rgba(51, 51, 51, 1);
  1395. }
  1396. .coupon-item {
  1397. width: 690rpx;
  1398. height: 120rpx;
  1399. border-radius: 10rpx;
  1400. display: flex;
  1401. flex-direction: row;
  1402. justify-content: space-between;
  1403. align-items: center;
  1404. margin-top: 20rpx;
  1405. flex-shrink: 0;
  1406. background-color: #FFE9D8;
  1407. }
  1408. .money-box {
  1409. width: 160rpx;
  1410. box-sizing: border-box;
  1411. padding-left: 30rpx;
  1412. font-weight: 500;
  1413. color: #FF7911;
  1414. }
  1415. .info-box {
  1416. display: flex;
  1417. flex-direction: column;
  1418. align-items: flex-start;
  1419. color: rgba(255, 121, 17, 1);
  1420. }
  1421. .receive-btn {
  1422. width: 200rpx;
  1423. height: 120rpx;
  1424. background: rgba(255, 233, 216, 1);
  1425. box-shadow: 0px 0px 5rpx 0px rgba(102, 102, 102, 0.35);
  1426. line-height: 120rpx;
  1427. text-align: center;
  1428. font-size: 28rpx;
  1429. font-weight: bold;
  1430. color: rgba(255, 121, 17, 1);
  1431. border-bottom-right-radius: 10rpx;
  1432. border-top-right-radius: 10rpx;
  1433. border-top-left-radius: 120rpx;
  1434. border-bottom-left-radius: 120rpx;
  1435. }
  1436. .received {
  1437. background: #f1f1f1;
  1438. color: #999;
  1439. }
  1440. .canvas-box {
  1441. display: block;
  1442. position: absolute;
  1443. top: 100rpx;
  1444. }
  1445. .sceneMarketingBox {
  1446. width: 100%;
  1447. background: url("https://zk-cereshop.oss-cn-shenzhen.aliyuncs.com/zkthink/2022-02-15/5f85fe4782e34c10b15b04f76c571d12_sceneMarketingDetailsIcon.png"
  1448. ) no-repeat center;
  1449. padding: 20rpx 30rpx;
  1450. background-size: cover;
  1451. display: flex;
  1452. justify-content: space-between;
  1453. align-items: center;
  1454. .sceneNameBox {
  1455. width: 220rpx;
  1456. text-align: center;
  1457. color: #C83732;
  1458. font-size: 20rpx;
  1459. }
  1460. }
  1461. .goodsDiscount {
  1462. .groupBuy {
  1463. .groupBuyList {
  1464. .groupBuyItem {
  1465. padding: 0 30rpx;
  1466. height: 116rpx;
  1467. display: flex;
  1468. align-items: center;
  1469. justify-content: space-between;
  1470. border-bottom: 1rpx solid #EEEEEE;
  1471. .leftAvatar {
  1472. display: flex;
  1473. align-items: center;
  1474. width: 50%;
  1475. img {
  1476. width: 72rpx;
  1477. height: 72rpx;
  1478. margin-right: 10rpx;
  1479. border-radius: 50%;
  1480. }
  1481. }
  1482. .rightInfo {
  1483. display: flex;
  1484. align-items: center;
  1485. width: 50%;
  1486. .groupBuyTime {
  1487. .needPeople {
  1488. font-size: 28rpx;
  1489. color: #333333;
  1490. margin-bottom: 10rpx;
  1491. font-weight: 400;
  1492. b {
  1493. color: #C5AA7B;
  1494. font-weight: 400;
  1495. }
  1496. }
  1497. .endDate {
  1498. color: #666666;
  1499. }
  1500. }
  1501. .groupBuyBtn {
  1502. width: 140rpx;
  1503. height: 60rpx;
  1504. line-height: 60rpx;
  1505. background: #333333;
  1506. text-align: center;
  1507. color: #FFEBC4;
  1508. font-size: 24rpx;
  1509. }
  1510. }
  1511. }
  1512. }
  1513. }
  1514. }
  1515. .popupDiscount {
  1516. padding-bottom: 70rpx;
  1517. .popupDiscountTit {
  1518. font-size: 36rpx;
  1519. color: #333333;
  1520. height: 105rpx;
  1521. line-height: 105rpx;
  1522. text-align: center;
  1523. border-bottom: 1rpx solid #EEEEEE;
  1524. }
  1525. .groupBuy {
  1526. padding-bottom: 80rpx;
  1527. .groupBuyList {
  1528. .groupBuyItem1 {
  1529. padding: 0 30rpx;
  1530. height: 116rpx;
  1531. display: flex;
  1532. align-items: center;
  1533. justify-content: space-between;
  1534. border-bottom: 1rpx solid #EEEEEE;
  1535. .leftAvatar {
  1536. display: flex;
  1537. align-items: center;
  1538. img {
  1539. width: 72rpx;
  1540. height: 72rpx;
  1541. margin-right: 10rpx;
  1542. border-radius: 50%;
  1543. }
  1544. .groupBuyTime {
  1545. margin-right: 80rpx;
  1546. margin-bottom: 10rpx;
  1547. width: 320rpx;
  1548. .needPeople {
  1549. font-size: 26rpx;
  1550. color: #333333;
  1551. span {
  1552. color: #333333;
  1553. padding-right: 10rpx;
  1554. }
  1555. b {
  1556. color: #C5AA7B;
  1557. font-weight: 400;
  1558. }
  1559. }
  1560. .endDate {
  1561. color: #333333;
  1562. opacity: 0.7;
  1563. font-size: 24rpx;
  1564. }
  1565. }
  1566. }
  1567. .rightInfo {
  1568. display: flex;
  1569. align-items: center;
  1570. .groupBuyBtn {
  1571. width: 140rpx;
  1572. height: 70rpx;
  1573. line-height: 70rpx;
  1574. background: #333333;
  1575. text-align: center;
  1576. color: #FFEBC4;
  1577. font-weight: 400;
  1578. }
  1579. }
  1580. }
  1581. }
  1582. }
  1583. }
  1584. .combination {
  1585. padding: 0 20rpx;
  1586. .combinationList {
  1587. width: 100%;
  1588. height: 680rpx;
  1589. background: #333333;
  1590. box-shadow: 0 20rpx 30rpx rgba(0, 0, 0, 0.3);
  1591. border-radius: 20rpx;
  1592. .combinationTitle {
  1593. padding: 32rpx 20rpx 0 30rpx;
  1594. image {
  1595. width: 211rpx;
  1596. height: 33rpx;
  1597. }
  1598. .combinationPrice {
  1599. padding: 0 20px;
  1600. height: 50rpx;
  1601. background: linear-gradient(90deg, #C83732 0%, #E25C44 100%);
  1602. box-shadow: 0 6rpx 12rpx rgba(233, 0, 0, 0.3);
  1603. border-radius: 26rpx;
  1604. line-height: 50rpx;
  1605. text-align: center;
  1606. color: #FFFFFF;
  1607. opacity: 0.8;
  1608. }
  1609. }
  1610. .buyBtn {
  1611. width: 96%;
  1612. height: 84rpx;
  1613. line-height: 84rpx;
  1614. border: 2rpx solid rgba(0, 0, 0, 0);
  1615. background: linear-gradient(88deg, #C5AA7B 0%, #FFEBC4 100%);
  1616. text-align: center;
  1617. color: #333333;
  1618. margin: 0 auto;
  1619. }
  1620. }
  1621. }
  1622. .prod-descr-title{
  1623. font-size: 28rpx;
  1624. font-weight: bold;
  1625. color: #252744;;
  1626. margin-left: 30rpx;
  1627. margin-top: 50rpx;
  1628. }
  1629. .prod-descr-content{
  1630. font-size: 28rpx;
  1631. font-weight: 400;
  1632. color: #595B6B;
  1633. margin-left: 30rpx;
  1634. margin-right: 30rpx;
  1635. margin-top: 20rpx;
  1636. }
  1637. .border-line{
  1638. box-sizing: border-box;
  1639. margin-right: 30rpx;
  1640. margin-left: 30rpx;
  1641. margin-top: 40rpx;
  1642. border: 1rpx solid #D3D4DE;
  1643. }
  1644. .sku-image-box{
  1645. display: flex;
  1646. flex-direction: row;
  1647. justify-content: flex-end;
  1648. margin-left: 30rpx;
  1649. }
  1650. .sku-image{
  1651. width: 86rpx;
  1652. height: 86rpx;
  1653. border: 2px solid #D3D4DE;
  1654. border-radius: 20rpx;
  1655. margin-right: 30rpx;
  1656. }
  1657. .sku-image-select{
  1658. width: 86rpx;
  1659. height: 86rpx;
  1660. border: 2px solid #252744;
  1661. border-radius: 20rpx;
  1662. margin-right: 30rpx;
  1663. }
  1664. .sku-image-more{
  1665. width: 92rpx;
  1666. height: 92rpx;
  1667. margin-right: 30rpx;
  1668. }
  1669. .border-line-wide{
  1670. width: 100%;
  1671. border: 10rpx solid #D3D4DE;
  1672. }
  1673. </style>