coupons.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. <template>
  2. <div class="coupons">
  3. <div class="content">
  4. <div class="coupon-banner">
  5. <img src="~/assets/images/coupon-center.jpg" alt />
  6. </div>
  7. <div class="coupons-con" v-if="dataList.length">
  8. <div class="tit">
  9. <span class="bg-l"></span>{{$t('coupons.generalCoupon')}}
  10. <span class="bg-r"></span>
  11. </div>
  12. <div class="con-box">
  13. <div
  14. :class="['item', (item.canGoUse) ? 'received' : ((!item.stocks) ? 'robbed' : '')]"
  15. v-for="(item, index) in dataList"
  16. :key="item.couponId"
  17. >
  18. <div class="text">
  19. <div class="coupon-price">
  20. <span class="symbol" v-if="item.couponType === 1">¥</span>
  21. <span class="big" v-if="item.couponType === 1">{{item.reduceAmount}}</span>
  22. <span class="big" v-if="item.couponType === 2">{{item.couponDiscount}}</span>
  23. <span class="symbol-s" v-if="item.couponType === 2">{{$t('fold')}}</span>
  24. <span class="limit" v-if="$t('full')=='满'">{{$t('full')}}{{$t('yuan')}}{{item.cashCondition}}{{$t('available')}}</span>
  25. <span class="limit" v-if="$t('full')!='满'" style="maxWidth:110px">{{$t('available')}} {{$t('over')}}{{$t('yuan')}}{{item.cashCondition}}</span>
  26. </div>
  27. <div class="range" v-if="item.suitableProdType == 0">{{$t('coupons.canUsedPurchaseFullRangeOfProducts')}}</div>
  28. <div class="range" v-if="item.suitableProdType != 0">{{$t('coupons.onlySomeProductsOnThePlatformCanPurchased')}}</div>
  29. <div class="time" v-if="item.validTimeType === 1" style="lineClamp:2">{{$t('coupons.validUntil')}}:{{item.endTime}}</div>
  30. <div class="time" v-if="item.validTimeType === 2" style="lineClamp:2">{{$t('coupons.onlyAfterCouponing')}} {{item.validDays}} {{$t('coupons.useWithinDays')}}</div>
  31. </div>
  32. <div class="rest">
  33. <div
  34. class="number"
  35. >{{item.stocks === 0?$t('coupons.soldOut'):$t('coupons.robbed')+parseInt((item.sourceStock - item.stocks) * 100 /item.sourceStock)+'%'}}</div>
  36. <div class="scale">
  37. <span
  38. class="percent"
  39. :style="{width:[item.stocks === 0?'100%' : ((item.sourceStock - item.stocks) * 100 /item.sourceStock)+'%']}"
  40. ></span>
  41. </div>
  42. <a
  43. href="javascript:void(0);"
  44. class="btn"
  45. v-if="!item.canGoUse && item.stocks"
  46. @click="receiveCoupon(item,index,1)"
  47. >{{$t('coupons.getItNow')}}</a>
  48. <a
  49. href="javascript:void(0);"
  50. class="btn"
  51. v-if="item.canGoUse"
  52. @click="useCoupon(item)"
  53. >{{$t('coupons.goToUse')}}</a>
  54. <a href="javascript:void(0);" class="btn" v-if="!item.canGoUse && !item.stocks">{{$t('coupons.soldOut')}}</a>
  55. </div>
  56. <div class="icon received-icon" v-if="item.canGoUse && language == 'zh'"></div>
  57. <div class="icon-en" v-if="item.canGoUse && language == 'en'">
  58. <img src="~/assets/images/coupon-received-en.png" alt="">
  59. </div>
  60. <div class="icon robbed-icon" v-if="!item.canGoUse && !item.stocks && language == 'zh'"></div>
  61. <div class="icon-en" v-if="!item.canGoUse && !item.stocks && language == 'en'">
  62. <img src="~/assets/images/coupon-robbed-en.png" alt="">
  63. </div>
  64. </div>
  65. </div>
  66. </div>
  67. <div class="coupons-con" v-if="dataListProd && dataListProd.length">
  68. <div class="tit">
  69. <span class="bg-l"></span>{{$t('coupons.recommendedCoupons')}}
  70. <span class="bg-r"></span>
  71. </div>
  72. <div class="con-box">
  73. <div
  74. :class="['s-item' , (item.canGoUse) ? 'received' : ((!item.stocks) ? 'robbed' : '') , (item.prods.length == 1) ? 'single': '']"
  75. v-for="(item,index) in dataListProd"
  76. :key="item.couponId"
  77. >
  78. <!-- 多商品 -->
  79. <div class="goods-box" v-if="item.prods.length > 1">
  80. <div class="shop-msg">
  81. <div class="logo">
  82. <img :src="item.shopLogo" alt />
  83. </div>
  84. <div class="name">{{item.shopName}}</div>
  85. </div>
  86. <div class="prods">
  87. <div class="p-item" v-for="(prod,index) in item.prods" :key="index">
  88. <div class="img">
  89. <img v-if="prod.pic" :src="prod.pic" alt @error="handlePicError" />
  90. <img v-else src="~/assets/img/def.png" alt />
  91. </div>
  92. <div class="price">¥{{prod.price}}</div>
  93. </div>
  94. </div>
  95. </div>
  96. <div class="rest" v-if="item.prods.length > 1">
  97. <div class="coupon-price">
  98. <span class="symbol" v-if="item.couponType === 1">¥</span>
  99. <span class="big" v-if="item.couponType === 1">{{item.reduceAmount}}</span>
  100. <span class="big" v-if="item.couponType === 2">{{item.couponDiscount}}</span>
  101. <span class="symbol-s" v-if="item.couponType === 2">{{$t('fold')}}</span>
  102. </div>
  103. <!-- <div class="limit">{{$t('full')}}{{item.cashCondition}}{{$t('yuan')}}{{$t('available')}}</div> -->
  104. <div class="limit" v-if="$t('full')=='满'">{{$t('full')}}{{$t('yuan')}}{{item.cashCondition}}{{$t('available')}}</div>
  105. <div class="limit" v-if="$t('full')!='满'" style="maxWidth:110px">{{$t('available')}} {{$t('over')}}{{$t('yuan')}}{{item.cashCondition}}</div>
  106. <div class="scale">
  107. <div
  108. class="number"
  109. >{{item.stocks === 0?$t('coupons.soldOut'):$t('coupons.robbed') + parseInt((item.sourceStock - item.stocks) * 100 /item.sourceStock)+'%'}}</div>
  110. <div
  111. class="percent"
  112. :style="{width:[item.stocks === 0?'100%' : parseInt((item.sourceStock - item.stocks) * 100 /item.sourceStock)+'%']}"
  113. ></div>
  114. </div>
  115. <a
  116. href="javascript:void(0);"
  117. class="btn"
  118. v-if="!item.canGoUse && item.stocks"
  119. @click="receiveCoupon(item,index,2)"
  120. >{{$t('coupons.getItNow')}}</a>
  121. <a
  122. href="javascript:void(0);"
  123. class="btn"
  124. v-if="item.canGoUse"
  125. @click="useCoupon(item)"
  126. >{{$t('coupons.goToUse')}}</a>
  127. <a href="javascript:void(0);" class="btn" v-if="!item.canGoUse && !item.stocks">{{$t('coupons.soldOut')}}</a>
  128. </div>
  129. <!-- /多商品 -->
  130. <!-- 单商品 -->
  131. <div class="single-box" v-if="item.prods.length == 1">
  132. <div class="img">
  133. <img :src="item.prods[0].pic" alt @error="handlePicError"/>
  134. </div>
  135. <div class="text-box">
  136. <div class="goods-name">{{item.prods[0].prodName}}</div>
  137. <div class="scale-box">
  138. <div
  139. class="number"
  140. >{{item.stocks === 0?$t('coupons.soldOut'):$t('coupons.robbed') + parseInt((item.sourceStock - item.stocks) * 100 /item.sourceStock)+'%'}}</div>
  141. <div class="scale">
  142. <div
  143. class="percent"
  144. :style="{width:[item.stocks === 0?'100%' : parseInt((item.sourceStock - item.stocks) * 100 /item.sourceStock)+'%']}"
  145. ></div>
  146. </div>
  147. </div>
  148. <div class="coupon-info">
  149. <div class="coupon-price">
  150. <span class="symbol" v-if="item.couponType === 1">¥</span>
  151. <span class="big" v-if="item.couponType === 1">{{item.reduceAmount}}</span>
  152. <span class="big" v-if="item.couponType === 2">{{item.couponDiscount}}</span>
  153. <span class="symbol-s" v-if="item.couponType === 2">{{$t('fold')}}</span>
  154. <div class="limit" v-if="$t('full')=='满'">{{$t('full')}}{{$t('yuan')}}{{item.cashCondition}}{{$t('available')}}</div>
  155. <div class="limit" v-if="$t('full')!='满'" style="maxWidth:110px">{{$t('available')}} {{$t('over')}}{{$t('yuan')}}{{item.cashCondition}}</div>
  156. </div>
  157. <a
  158. href="javascript:void(0);"
  159. class="btn"
  160. v-if="!item.canGoUse && item.stocks"
  161. @click="receiveCoupon(item,index,2)"
  162. >{{$t('coupons.getItNow')}}</a>
  163. <a
  164. href="javascript:void(0);"
  165. class="btn"
  166. v-if="item.canGoUse"
  167. @click="useCoupon(item)"
  168. >{{$t('coupons.useNow')}}</a>
  169. <a
  170. href="javascript:void(0);"
  171. class="btn"
  172. v-if="!item.canGoUse && !item.stocks"
  173. >{{$t('coupons.soldOut')}}</a>
  174. </div>
  175. </div>
  176. </div>
  177. <!-- /单商品 -->
  178. <div class="icon received-icon" v-if="item.canGoUse && language == 'zh'"></div>
  179. <div class="icon-en" v-if="item.canGoUse && language == 'en'">
  180. <img src="~/assets/images/coupon-received-en.png" alt="">
  181. </div>
  182. <div class="icon robbed-icon" v-if="!item.canGoUse && !item.stocks"></div>
  183. <div class="icon-en" v-if="!item.canGoUse && !item.stocks && language == 'en'">
  184. <img src="~/assets/images/coupon-robbed-en.png" alt="">
  185. </div>
  186. </div>
  187. </div>
  188. </div>
  189. <pagination v-model="current" :pages="pages" @changePage="getProdCouponList"></pagination>
  190. <!-- 商品列表为空 -->
  191. <div class="empty" v-if="(!dataList.length && !dataListProd.length) || (!dataList && !dataListProd)">
  192. <div class="img">
  193. <img src="~/assets/images/emptyPic/coupon-empty.png" alt />
  194. </div>
  195. <div class="action">
  196. <div class="text">{{$t('coupons.sorryNoCouponsAvailable')}}</div>
  197. <nuxt-link to="/" class="btn">{{$t('backToHome')}}</nuxt-link>
  198. </div>
  199. </div>
  200. <!-- /商品列表为空 -->
  201. </div>
  202. </div>
  203. </template>
  204. <script>
  205. import Pagination from '~/components/pagination'
  206. import Cookie from 'js-cookie'
  207. export default {
  208. components: {
  209. Pagination
  210. },
  211. data () {
  212. return {
  213. dataList: [], // 通用券列表
  214. dataListProd: [], // 商品券列表
  215. pages: 0, // 总页数
  216. current: this.$route.query.current || 1, // 当前页数
  217. selectedCouponId: 0, // 要领取的优惠券id
  218. language: this.$store.state.locale,
  219. }
  220. },
  221. mounted () {
  222. document.title = this.$t('userCenter.couponCenter')
  223. this.getGeneralCouponList()
  224. this.getProdCouponList(1)
  225. },
  226. methods: {
  227. /**
  228. * 加载默认图片
  229. */
  230. handlePicError(e){
  231. e.target.src=require('@/assets/img/def.png')
  232. },
  233. /**
  234. * 获取通用券列表
  235. */
  236. getGeneralCouponList () {
  237. let url = Cookie.get('token') ? '/p/myCoupon/generalCouponList' : '/coupon/generalCouponList'
  238. this.$axios.get(url).then(({ data }) => {
  239. this.initCouponCanGoUseFlag(data);
  240. this.dataList = data
  241. })
  242. },
  243. /**
  244. * 获取商品券列表
  245. */
  246. getProdCouponList () {
  247. let url = Cookie.get('token') ? '/p/myCoupon/getCouponPage' : '/coupon/getCouponPage'
  248. this.$axios.get(url, {
  249. params: {
  250. current: this.current,
  251. size: 20,
  252. }
  253. }).then(({ data }) => {
  254. console.log(data.records)
  255. this.initCouponCanGoUseFlag(data.records);
  256. this.dataListProd = data.records
  257. this.pages = data.pages
  258. })
  259. },
  260. /**
  261. * 初始化优惠券去可以使用的标记
  262. */
  263. initCouponCanGoUseFlag (couponList) {
  264. couponList.forEach(coupon => {
  265. coupon.canGoUse = coupon.curUserReceiveCount >= coupon.limitNum;
  266. });
  267. },
  268. /**
  269. * 设置优惠券可以去使用的标记
  270. */
  271. setCouponCanGoUseFlag (index, couponType) {
  272. if (couponType == 1) {
  273. var tempCouponList = this.dataList;
  274. console.log(tempCouponList)
  275. tempCouponList[index].canGoUse = true;
  276. tempCouponList[index].stocks -= 1;
  277. this.dataList = tempCouponList
  278. } else if (couponType == 2) {
  279. var tempCouponList = this.dataListProd;
  280. tempCouponList[index].canGoUse = true;
  281. tempCouponList[index].stocks -= 1;
  282. this.dataListProd = tempCouponList
  283. }
  284. },
  285. /**
  286. * 领取优惠券
  287. */
  288. receiveCoupon (item, index, coupontype) {
  289. if (item.couponId) {
  290. this.$axios.post('/p/myCoupon/receive', item.couponId).then(({ data }) => {
  291. if (data) {
  292. this.$message({
  293. message: data,
  294. type: 'success',
  295. duration: 1500
  296. })
  297. }
  298. this.setCouponCanGoUseFlag(index, coupontype);
  299. })
  300. }
  301. },
  302. /**
  303. * 立即使用
  304. */
  305. useCoupon (item) {
  306. let url = '/list?st=4';
  307. let couponId = item.couponId;
  308. let prodList = item.prods
  309. if (prodList && prodList.length == 1) {
  310. this.$router.push({ path: '/detail/' + prodList[0].prodId });
  311. } else {
  312. if (couponId) {
  313. url += "&couponId=" + couponId;
  314. }
  315. this.$router.push({ path: url });
  316. }
  317. },
  318. }
  319. }
  320. </script>
  321. <style scoped src='~/assets/css/coupons.css'></style>