<template> <div> <headerNav title="我的优惠券"/> <van-cell-group> <van-field center clearable placeholder="请输入优惠码" v-model="couponCode" > <van-button slot="button" size="small" type="primary" :loading="exchangeLoading" @click="onExchange">兑换</van-button> </van-field> </van-cell-group> <van-tabs > <van-tab title="未使用"> <ul> <van-list v-model="unusedData.loading" :finished="unusedData.finished" @load="onLoad" > <li v-for="(item,index) in unusedData.list" :key="index" :class="'couponitem '+(item.show?'show':'') "> <div class="couponTop"> <div class="cpnamount"> <div class="amountWrap"> <div class="amount" v-if="item.preferentialType === 1"> <span class="amountSign" >¥</span> <span class="amountNum">{{item.priceOff / 100}}</span> </div> <div class="amount" v-else="item.preferentialType === 2"> <span class="amountNum">{{item.percentOff / 10.0}}</span> <span class="amountSign">折</span> </div> <div class="condition"> <span>满 {{item.priceAvailable / 100.0}} 元可用</span> </div> </div> </div> <div class="couponInfoWrap"> <div class="cpninfo"> <div class="detail"> <span class="name">{{item.title}}</span></div> </div> <div class="validity"> <span>{{item.validStartTime | formatDate('yyyy-MM-dd')}} ~ {{item.validEndTime | formatDate('yyyy-MM-dd')}}</span> </div> <van-button type="danger" size="mini">立即使用</van-button> </div> </div> <!-- <div class="couponMid " v-if="item.Info!=''">--> <!-- <span>详细信息</span>--> <!-- <van-icon name="arrow" class="down" @click="onShowInfo(item.Id,index)" />--> <!-- </div>--> <!-- <div class="info" v-if="item.Info!=''" >--> <!-- <div class="text">--> <!-- {{item.Info}}--> <!-- </div>--> <!-- </div>--> <!-- todo 芋艿,后续做优化。指定哪些商品 / 分类可用 --> <div class="info" v-if="item.Info!=''" > <div class="text"> {{item.Info}} </div> </div> </li> </van-list> </ul> </van-tab> <van-tab title="使用记录"> <ul class="gray" > <van-list v-model="usedData.loading" :finished="usedData.finished" @load="onLoadUse" > <li v-for="(item,index) in usedData.list" :key="index" class="couponitem"> <div class="couponTop"> <div class="cpnamount"> <div class="amountWrap"> <div class="amount" v-if="item.preferentialType === 1"> <span class="amountSign" >¥</span> <span class="amountNum">{{item.priceOff / 100}}</span> </div> <div class="amount" v-else="item.preferentialType === 2"> <span class="amountNum">{{item.percentOff / 10.0}}</span> <span class="amountSign">折</span> </div> <div class="condition"> <span>满 {{item.priceAvailable}} 元可用</span> </div> </div> </div> <div class="couponInfoWrap"> <div class="cpninfo"> <div class="detail"> <span class="name">{{item.title}}</span></div> </div> <div class="validity"> <span>{{item.validStartTime | formatDate('yyyy-MM-dd')}} ~ {{item.validEndTime | formatDate('yyyy-MM-dd')}}</span> </div> </div> </div> </li> </van-list> </ul> </van-tab> <van-tab title="已过期"> <ul class="gray" > <van-list v-model="expireData.loading" :finished="expireData.finished" @load="onLoadEnd" > <li v-for="(item,index) in expireData.list" :key="index" class="couponitem"> <div class="couponTop"> <div class="cpnamount"> <div class="amountWrap"> <div class="amount" v-if="item.preferentialType === 1"> <span class="amountSign" >¥</span> <span class="amountNum">{{item.priceOff / 100}}</span> </div> <div class="amount" v-else="item.preferentialType === 2"> <span class="amountNum">{{item.percentOff / 10.0}}</span> <span class="amountSign">折</span> </div> <div class="condition"> <span>满 {{item.priceAvailable}} 元可用</span> </div> </div> </div> <div class="couponInfoWrap"> <div class="cpninfo"> <div class="detail"> <span class="name">{{item.title}}</span></div> </div> <div class="validity"> <span>{{item.validStartTime | formatDate('yyyy-MM-dd')}} ~ {{item.validEndTime | formatDate('yyyy-MM-dd')}}</span> </div> </div> </div> </li> </van-list> </ul> </van-tab> </van-tabs> </div> </template> <script> import { ExchangeCoupon } from "../../api/user.js"; import { getCouponPage } from "../../api/promotion.js"; export default { components: { }, data() { return { // loading:false, // finished:false, // list:[], // page:0, // // // useLoading:false, // useFinished:false, // useList:[], // usePage:0, // // // endLoading:false, // endFinished:false, // endList:[], // endPage:0, couponCode:'', exchangeLoading:false, unusedData: { page: 0, pageSize: 10, list: [], loading: false, finished: false, }, usedData: { page: 0, pageSize: 10, list: [], loading: false, finished: false, }, expireData: { page: 0, pageSize: 10, list: [], loading: false, finished: false, }, }; }, computed: { }, methods: { onLoad() { // 进入下一页 let page = this.unusedData.page + 1; getCouponPage(1, page, this.unusedData.pageSize).then(data => { // debugger; // 设置下页面 this.unusedData.page = page; // 数据保存到 list 中 this.unusedData.list.push(...data.list); // 判断页数 if (this.unusedData.list.length >= data.total) { this.unusedData.finished = true; } // 标记不在加载中 this.unusedData.loading = false; }); // GetCoupon({page:this.page}).then(response=>{ // response.List.forEach(item => { // item.show=false; // this.list.push(item); // }); // this.loading = false; // if(response.TotalPage<=this.page){ // this.finished = true; // } // // }) }, // onShowInfo(id,index){ // this.list.forEach((item,itemIndex) => { // if(index==itemIndex){ // item.show=!item.show; // return; // } // }); // }, onLoadUse() { // 进入下一页 let page = this.usedData.page + 1; getCouponPage(2, page, this.usedData.pageSize).then(data => { // debugger; // 设置下页面 this.usedData.page = page; // 数据保存到 list 中 this.usedData.list.push(...data.list); // 判断页数 if (this.usedData.list.length >= data.total) { this.usedData.finished = true; } // 标记不在加载中 this.usedData.loading = false; }); }, onLoadEnd() { // 进入下一页 let page = this.expireData.page + 1; getCouponPage(3, page, this.expireData.pageSize).then(data => { // debugger; // 设置下页面 this.expireData.page = page; // 数据保存到 list 中 this.expireData.list.push(...data.list); // 判断页数 if (this.expireData.list.length >= data.total) { this.expireData.finished = true; } // 标记不在加载中 this.expireData.loading = false; }); }, onExchange(){ if(this.exchangeLoading){ return; } this.exchangeLoading=true; ExchangeCoupon(this.couponCode).then(response=>{ this.$toast('兑换成功'); this.exchangeLoading=false; this.$router.go(0); }) } } }; </script> <style lang="less"> .couponitem { padding: 0 10px; margin-top: 10px; position: relative; font-size: 12px; .couponTop { background-color: #fcebeb; border-left: 1px solid #f3d4d4; border-right: 1px solid #f3d4d4; border-bottom: 1px dashed #f3d4d4; border-radius: 8px; border-top-left-radius: 5px; border-top-right-radius: 5px; .cpnamount { position: relative; height: 90px; width: 34.08%; text-align: center; float: left; border-right: 1px dashed #f3d4d4; } .amountWrap { width: 100%; position: absolute; top: 50%; -webkit-transform: translate(0, -50%); transform: translate(0, -50%); .amount { font-size: 15px; .amountSign { margin-right: 3px; } .amountNum { font-size: 39px; line-height: 1; font-weight: bold; } } } } .couponInfoWrap { position: relative; margin-left: 37.465%; height: 90px; .cpninfo { position: absolute; top: 26px; -webkit-transform: translate(0, -50%); transform: translate(0, -50%); width: 100%; .detail { padding-right: 15px; word-break: break-all; .name { font-size: 13px; color: #000; } } } .validity { position: absolute; bottom: 16px; font-size: 10px; } button{ right: 16px; position: absolute; bottom: 16px; } } .couponMid { position: relative; height: 31px; line-height: 31px; padding-left: 16px; font-size: 12px; background-color: #fcebeb; border-left: 1px solid #f3d4d4; border-right: 1px solid #f3d4d4; border-bottom: 1px solid #f3d4d4; border-radius: 8px; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; i{ right: 16px; position: absolute; top: 8px; -webkit-transform: rotate(90deg); transform: rotate(90deg); } } .info{ display: none; background-color: #fcebeb; border-left: 1px solid #f3d4d4; border-right: 1px solid #f3d4d4; border-bottom: 1px solid #f3d4d4; border-bottom-left-radius: 8px; border-bottom-right-radius: 8px; padding: 10px 25px 12px 15px; font-size: 12px; } } .show{ .couponMid { border-bottom: 1px dashed #f3d4d4; border-bottom-left-radius: 0; border-bottom-right-radius: 0; i{ -webkit-transform: rotate(-90deg); transform: rotate(-90deg); } } .info{ display: block; } } .gray{ -webkit-filter: grayscale(100%);filter:progid:DXImageTransform.Microsoft.BasicImage(graysale=1); } </style>