422 lines
15 KiB
Vue
422 lines
15 KiB
Vue
<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>
|