product.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <template>
  2. <v-header title="商品详情" async @fetch="fetch" backgroundColor="#fff">
  3. <view class="container overflow flex screen_all">
  4. <view class="flex-all-1 overflow">
  5. <scroll-view
  6. scroll-y
  7. class="screen_all"
  8. >
  9. <view>
  10. <view class="banner" >
  11. <swiper duration="400">
  12. <swiper-item class="swiper-item" v-for="(item,index) in item.images" :key="index">
  13. <image :src="item" @click="previewImage(index)" mode="aspectFill"></image>
  14. </swiper-item>
  15. </swiper>
  16. </view>
  17. <view class="shop-info overflow">
  18. <view class="shop-price-warp">
  19. <text class="shop-price"><text>¥</text><text class="shop-price-target">{{item.sales_price || '0.00'}}</text></text>
  20. </view>
  21. <view class="row">
  22. <view class="flex-all-1 shop-title">{{item.title}}</view>
  23. <view @click="openShareModal" class="shop-share-warp shop-share row aCenter">
  24. <image src="/static/images/share.png" class="shop-share-icon"></image>
  25. <text>分享</text>
  26. </view>
  27. </view>
  28. </view>
  29. <view class="shop-padding">
  30. <!-- 排行榜 -->
  31. <view class="ranking row aCenter" @click.stop="routerRanking">
  32. <image src="/static/images/ranking.png" class="ranking-icon"></image>
  33. <view class="ranking-title">排行榜</view>
  34. <view class="flex-all-1 row ranking-introduce line-1">商品热榜<text v-if="item.rankTexts" :class="{'ranking-prominent':cItem.active}" v-for="(cItem,index) in item.rankTexts" :key="index">{{cItem.label}}</text></view>
  35. <text class="iconfont iconfont-more ranking-more"></text>
  36. </view>
  37. <!-- 服务类型 -->
  38. <view class="service">
  39. <view
  40. v-for="(cItem,index) in productData"
  41. :key="index"
  42. class="row aCenter service-aside"
  43. v-if="cItem.where&&!loadingStatus?item[cItem.where]:true"
  44. >
  45. <view>{{cItem.label}}</view>
  46. <view class="flex-all-1 service-content">
  47. <view v-if="cItem.type==='coupon'" @click="openCoupon" class="row aCenter">
  48. <view class="service-coupon-label center">领券</view>
  49. <view class="flex-all-1"></view>
  50. <text class="iconfont iconfont-more ranking-more"></text>
  51. </view>
  52. <view v-else class="service-title line-1">{{service[cItem.key]}}</view>
  53. </view>
  54. </view>
  55. </view>
  56. <!-- 商品评论 -->
  57. <view class="comment">
  58. <view class="comment-header row aCenter">
  59. <view class="flex-all-1 row">商品评论<text v-if="item.evaluate && item.evaluate.count >0" class="comment-header-margin">({{item.evaluate.count}})</text></view>
  60. <view v-if="loadingStatus || item.evaluate.count>0" @click="routerRankingList" class="row aCenter">
  61. <text class="comment-more-title">查看全部</text>
  62. <text class="iconfont iconfont-more ranking-more"></text>
  63. </view>
  64. </view>
  65. <view class="comment-content">
  66. <layout-comment
  67. v-for="(item,index) in comment"
  68. :key="index"
  69. :item="item"
  70. goDetail
  71. ></layout-comment>
  72. <view v-if="!loadingStatus && item.evaluate.count<=0" class="comment-content-empty">此商品暂无评论</view>
  73. </view>
  74. </view>
  75. <!-- 店铺 -->
  76. <view @click="goHome" class="shop-store row aCenter">
  77. <image src="/static/images/logo.jpg" class="shop-store-image"></image>
  78. <view class="flex-all-1">
  79. <view class="shop-store-title">{{config.name}}</view>
  80. <view class="shop-store-comment center">
  81. <uni-rate class="store-comment-target" :margin="1" :disabled="true" :value="5"></uni-rate>
  82. </view>
  83. </view>
  84. <view class="row aCenter">
  85. <text class="comment-more-title store-more-title">进入店铺</text>
  86. <text class="iconfont iconfont-more ranking-more"></text>
  87. </view>
  88. </view>
  89. </view>
  90. </view>
  91. </scroll-view>
  92. </view>
  93. <!-- 底部控件 -->
  94. <view class="control-footer row aCenter">
  95. <view
  96. v-for="(item,index) in productControl"
  97. :key="index"
  98. class="flex-all-1 center relative"
  99. @click="trigger(item)"
  100. >
  101. <button v-if="item.type" :open-type="item.type" class="flex-all-1 clear-button flex center">
  102. <image :src="item.icon" mode="aspectFit" class="control-icon"></image>
  103. <view class="control-label">{{item.label}}</view>
  104. </button>
  105. <template v-else>
  106. <image :src="item.icon" mode="aspectFit" class="control-icon"></image>
  107. <view class="control-label">{{item.label}}</view>
  108. <dot v-if="item.carDot" class="control-label-dot absolute" :value="car.carNumber"></dot>
  109. </template>
  110. </view>
  111. <view v-if="failMessage" class="control-button-group center control-fail-button overflow"><view class="line-1">{{failMessage}}</view></view>
  112. <view class="control-button-group row overflow" v-else-if="isLogin">
  113. <view @click="triggerBuyType(2)" v-if="!item.is_datebuy" class="control-button control-button-car center">加入购物车</view>
  114. <view @click="triggerBuyType(1)" :class="{'flex-1': item.is_datebuy}" class="control-button center">立即购买</view>
  115. </view>
  116. <view @click="routerLogin" class="control-button-group control-button-group-login center" v-else>授权登录</view>
  117. </view>
  118. <!-- 选择分享方式 -->
  119. <modal-select v-model="productShareModal" @trigger="triggerProduct" :data="productShare"></modal-select>
  120. <!-- 选择领取优惠券 -->
  121. <modal v-model="couponModal" animateContent="translateYR">
  122. <view class="screen_all flex">
  123. <view class="flex-all-1" @click="cancelCoupon"></view>
  124. <view class="coupon-modal flex">
  125. <view class="coupon-title center">优惠</view>
  126. <view class="coupon-sub-title">领取以下优惠券</view>
  127. <view class="flex-all-1 overflow coupon-screen">
  128. <scroll-view class="screen_all overflow" scroll-y>
  129. <view>
  130. <layout-use-coupon
  131. v-for="(cItem,index) in couponData"
  132. :key="index"
  133. :item="cItem"
  134. @receive="receiveCoupon($event,index)"
  135. :receiveStatus="couponReceiveIds[cItem.id]"
  136. ></layout-use-coupon>
  137. <view class="coupon-info">最终已购买价格为准</view>
  138. </view>
  139. </scroll-view>
  140. </view>
  141. <view @click="cancelCoupon" class="coupon-button center">我知道了</view>
  142. </view>
  143. </view>
  144. </modal>
  145. <!-- 商品规格购买模块 -->
  146. <modal v-model="ruleModal" animateContent="translateYR">
  147. <view class="screen_all flex">
  148. <view class="flex-all-1" @click="cancelRuleModal"></view>
  149. <view class="shop-buy-modal flex">
  150. <view class="shop-buy-header row aCenter">
  151. <v-image :src="item.image" class="shop-buy-image"></v-image>
  152. <view class="flex-all-1 shop-buy-content">
  153. <view class="shop-buy-title line-2 overflow">{{item.title}}</view>
  154. <text class="shop-buy-price-group"><text>¥</text><text>{{buyType===1 && item.is_datebuy?rulesPriceNumber:priceNumber}}</text></text>
  155. </view>
  156. <view class="shop-buy-close">
  157. <view @click="cancelRuleModal" class="iconfont iconfont-close shop-buy-close-icon"></view>
  158. </view>
  159. </view>
  160. <!-- 规格 -->
  161. <view v-show="buyType===1" v-if="item.is_datebuy" class="flex-all-1 overflow">
  162. <scroll-view
  163. scroll-y
  164. class="screen_all"
  165. >
  166. <view class="shop-rules-container">
  167. <view class="shop-rules-item"
  168. v-for="(item,index) in rulesOption"
  169. :key="index"
  170. >
  171. <view class="shop-rules-title row aCenter wrap">
  172. <view class="shop-rules-title-target line-1">{{item.label}}</view>
  173. <view class="flex-all-1 shop-rules-info" v-if="item.info">{{item.info}}</view>
  174. </view>
  175. <view class="shop-rules-group row wrap">
  176. <view class="shop-rules-label jCenter"
  177. v-for="(cItem,cIndex) in item.data"
  178. :class="{'shop-rules-label-active': cItem.value === rules[item.key]}"
  179. :key="cIndex"
  180. @click="triggerChangeRule(cItem,index)"
  181. >
  182. <view class="line-1">{{cItem.label}}</view>
  183. </view>
  184. </view>
  185. </view>
  186. </view>
  187. </scroll-view>
  188. </view>
  189. <!-- 数量 -->
  190. <view class="row aCenter shop-step">
  191. <view class="flex-all-1">数量</view>
  192. <v-step :value="buyNumber" @input="changeBuyNumber"></v-step>
  193. </view>
  194. <!-- 按钮 -->
  195. <view class="shop-buy-button-warp center">
  196. <view v-if="failMessage" class="shop-buy-button control-button center control-fail-button overflow"><view class="line-1">{{failMessage}}</view></view>
  197. <view v-else-if="isLogin" class="shop-buy-button center control-button"
  198. :class="{'control-button-car':buyType===2}"
  199. @click="triggerBuy(buyType)"
  200. >{{buyType===2?'加入购物车':'立即购买'}}</view>
  201. <view v-else @click="routerLogin" class="shop-buy-button control-button control-button-group-login center" >授权登录</view>
  202. </view>
  203. </view>
  204. </view>
  205. </modal>
  206. <poster ref="poster" :authorize="authorize" @openSetting="openSetting"></poster>
  207. </view>
  208. </v-header>
  209. </template>
  210. <script>
  211. import {
  212. mapState
  213. } from 'vuex';
  214. import layoutComment from '@/layout/layout-commet/main.vue';
  215. import uniRate from '@/components/uni-rate/uni-rate';
  216. import modalSelect from '@/components/modal-select/main.vue';
  217. import mixins from './mixins/index';
  218. import modal from '@/components/modal/main.vue';
  219. import vHeader from '@/components/v-header/main.vue';
  220. import vStep from '@/components/v-step/main.vue';
  221. import layoutUseCoupon from '@/layout/layout-use-coupon/main.vue';
  222. import vImage from '@/components/v-image/main';
  223. import poster from '@/components/poster/poster';
  224. import dot from '@/components/dot/main';
  225. export default {
  226. mixins,
  227. components: {
  228. layoutComment,
  229. uniRate,
  230. modalSelect,
  231. modal,
  232. vHeader,
  233. vImage,
  234. vStep,
  235. layoutUseCoupon,
  236. poster,
  237. dot
  238. },
  239. computed: {
  240. ...mapState(['config','car']),
  241. }
  242. }
  243. </script>
  244. <style lang="scss" src="./product.scss"></style>