discount-detail.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <template>
  2. <div class="discount-detail">
  3. <div class="banner">
  4. <img :src="discountDetail.pcBackgroundPic" class="bg" />
  5. <div class="text-box">
  6. <div class="time">
  7. <span class="time-icon"></span>
  8. {{$t('discountDetail.DistanceToEnd')}}
  9. <div class="much-time" v-if="day">
  10. <span class="day">{{day}}</span>{{$t('day')}}
  11. </div>
  12. <div class="number-box">
  13. <span class="number">{{hour}}</span>
  14. <span class="colon">:</span>
  15. <span class="number">{{min}}</span>
  16. <span class="colon">:</span>
  17. <span class="number">{{second}}</span>
  18. </div>
  19. </div>
  20. <div class="shop-logo">
  21. <img :src="discountDetail.shopLogo" alt />
  22. </div>
  23. <div class="shop-name">{{discountDetail.shopName}}{{$t('discountDetail.SpecialSession')}}</div>
  24. <div class="info">{{discountDetail.discountName}}</div>
  25. </div>
  26. </div>
  27. <div class="goods-list discount-prod" v-if="discountProdList.length">
  28. <div class="list-con">
  29. <!-- 商品 -->
  30. <div
  31. class="item"
  32. v-for="item in discountProdList"
  33. :key="item.prodId"
  34. @click="toDiscountProdDet(item.prodId)"
  35. >
  36. <div class="goods-img">
  37. <img v-if="item.pic" :src="item.pic" alt @error="handlePicError" />
  38. <img v-else src="~/assets/img/def.png" alt />
  39. </div>
  40. <div class="goods-msg">
  41. <div class="goods-name">{{item.prodName}}</div>
  42. <div class="activity-price">
  43. {{$t('discountDetail.eventReferencePrice')}}:
  44. <div class="price">
  45. <span class="big">{{parsePrice(item.activityPrice)[0]}}</span>
  46. .{{parsePrice(item.activityPrice)[1]}}
  47. </div>
  48. <div class="old-price">¥{{item.price.toFixed(2)}}</div>
  49. </div>
  50. </div>
  51. </div>
  52. <!-- /商品 -->
  53. </div>
  54. <!-- 页码 -->
  55. <pagination v-model="current" :pages="pages" @changePage="getDiscountProdList"></pagination>
  56. <!-- /页码 -->
  57. </div>
  58. <!-- 商品列表为空 -->
  59. <div class="empty" v-if="!discountProdList.length">
  60. <div class="img">
  61. <img src="~/assets/images/emptyPic/not-found.png" alt />
  62. </div>
  63. <div class="action">
  64. <div class="text">{{$t('sorryNoRelatedProducts')}}</div>
  65. <nuxt-link to="/special-discount" class="btn">{{$t('lookAtOther')}}</nuxt-link>
  66. </div>
  67. </div>
  68. <!-- 商品列表为空 -->
  69. </div>
  70. </template>
  71. <script>
  72. import Pagination from '~/components/pagination'
  73. export default {
  74. components: {
  75. Pagination
  76. },
  77. data () {
  78. return {
  79. discountDetail: {}, //活动详情
  80. discountId: this.$route.query.discountId, //接收活动列表id
  81. day: 0, //天
  82. hour: 0, //时
  83. min: 0, //分
  84. second: 0, //秒
  85. discountProdList: [], //限时特惠商品列表
  86. current: 1, // 当前页数
  87. pages: 1, // 总页数
  88. endTime: '', //结束时间
  89. timer: ''
  90. }
  91. },
  92. mounted () {
  93. // 获取活动详情
  94. this.$axios.get('/marking/discount/getDiscountByDiscountId/' + this.discountId).then(({ data }) => {
  95. this.discountDetail = data
  96. this.endTime = data.endTime
  97. this.countTime()
  98. })
  99. // 获取限时特惠商品列表
  100. this.getDiscountProdList(1)
  101. },
  102. //离开时结束倒计时
  103. beforeDestroy () {
  104. clearTimeout(this.timer)
  105. },
  106. methods: {
  107. /**
  108. * 加载默认图片
  109. */
  110. handlePicError(e){
  111. e.target.src=require('@/assets/img/def.png')
  112. },
  113. // 倒计时
  114. countTime () {
  115. // 获取当前时间
  116. let date = new Date()
  117. let now = date.getTime()
  118. // // 设置截止时间
  119. let end = new Date(this.endTime).getTime()
  120. // 时间差
  121. let leftTime = end - now
  122. // 定义变量 d,h,m,s保存倒计时的时间
  123. if (leftTime >= 0) {
  124. // 天
  125. this.day = Math.floor(leftTime / 1000 / 60 / 60 / 24)
  126. // 时
  127. let h = Math.floor(leftTime / 1000 / 60 / 60 % 24)
  128. this.hour = h < 10 ? '0' + h : h
  129. // 分
  130. let m = Math.floor(leftTime / 1000 / 60 % 60)
  131. this.min = m < 10 ? '0' + m : m
  132. // 秒
  133. let s = Math.floor(leftTime / 1000 % 60)
  134. this.second = s < 10 ? '0' + s : s
  135. } else {
  136. this.day = 0
  137. this.hour = '00'
  138. this.min = '00'
  139. this.second = '00'
  140. }
  141. // 等于0的时候不调用
  142. if (Number(this.day) === 0 && Number(this.hour) === 0 && Number(this.min) === 0 && Number(this.second) === 0) {
  143. this.$router.push({ path: '/special-discount'})
  144. return
  145. } else {
  146. // 递归每秒调用countTime方法,显示动态时间效果,
  147. this.timer = setTimeout(this.countTime, 1000)
  148. }
  149. },
  150. //获取限时特惠商品列表
  151. getDiscountProdList (cur) {
  152. this.$axios.get('/marking/discount/prodList', {
  153. params: {
  154. discountId: this.discountId, //活动id
  155. current: cur, //当前页
  156. size: 20
  157. }
  158. }).then(({ data }) => {
  159. this.discountProdList = data.records
  160. this.pages = data.pages
  161. })
  162. },
  163. // 价格过滤
  164. parsePrice (value) {
  165. var val = Number(value)
  166. if (!val) {
  167. val = 0;
  168. }
  169. // 截取小数点后两位,并以小数点为切割点将val转化为数组
  170. return val.toFixed(2).split(".");
  171. },
  172. // 跳转到商品详情
  173. toDiscountProdDet (prodId) {
  174. const newPage = this.$router.resolve({ path: '/detail/' + prodId })
  175. window.open(newPage.href,'_blank')
  176. }
  177. }
  178. }
  179. </script>
  180. <style scoped src='~/assets/css/discount-detail.css'></style>