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

1743 lines
42 KiB

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