jiuyiUniapp/shop/pages/user/coupon/detail.vue

380 lines
7.7 KiB
Vue

<template>
<view
class="coupon-detail"
:style="{ backgroundColor: couponList.length === 0 ? '#fff' : '' }"
>
<!-- 优惠券详情 -->
<view
class="sub-list valid"
:style="{ marginTop: state === 3 ? '40upx' : 0 }"
>
<view class="row" v-for="(row, index) in couponList" :key="index">
<!-- content -->
<view class="carrier">
<view class="left">
<view class="in1line title">
<text class="cell-icon">{{
parseInt(row.range_type, 10) === 2 ? '限' : '全'
}}</text>
{{ row.title }}
</view>
<view class="term" v-if="state !== 2">
{{ row.start_time | time }} ~ {{ row.end_time | time }}
</view>
<view class="term" v-else>
使用时间:{{ row.use_time | timeFull }}
</view>
<view class="icon shixiao" v-if="state === 3" />
<view class="used" v-if="state === 2">已使用</view>
<view class="usage">
{{
parseInt(row.max_fetch, 10) === 0
? '不限'
: `每人限领 ${row.max_fetch}`
}}
总领取 {{ row.get_count }}
<text v-if="row.percentage">剩余{{ row.percentage }}%</text>
</view>
</view>
<view class="right" :class="{ invalid: state !== 1 }">
<view class="ticket">
<view class="num">
{{ row.money ? moneySymbol + row.money : row.discount + '折' }}
</view>
</view>
<view class="criteria"> 满{{ row.at_least }}使用 </view>
<view class="btn-group">
<view
class="use view"
@tap="show(row)"
v-if="parseInt(row.range_type, 10) === 2"
>
商品
</view>
<view class="use" @tap="getCoupon(row)">
领取
</view>
</view>
</view>
</view>
</view>
</view>
<uni-drawer
class="rf-drawer"
:visible="showRight"
mode="right"
@close="closeDrawer()"
>
<view class="rf-drawer-title">可用商品列表</view>
<view class="rf-drawer-list">
<view
class="rf-drawer-item"
@tap="navTo(`/pages/product/product?id=${item.id}`)"
v-for="item in currentCoupon.usableProduct"
:key="item.id"
>
<view class="left">
<view class="title">{{
item.name
.split('】')[0]
.split('【')
.join('')
}}</view>
<text class="desc in2line">{{ item.name.split('】')[1] }}</text>
</view>
<text class="iconfont iconyou"></text>
</view>
</view>
<view class="close">
<button
class="btn"
plain="true"
size="small"
type="primary"
@tap="hide"
>
关闭
</button>
</view>
</uni-drawer>
<rf-empty
:info="'暂无优惠券'"
v-if="couponList.length === 0 && !loading"
></rf-empty>
<!--加载动画-->
<rfLoading isFullScreen :active="loading"></rfLoading>
</view>
</template>
<script>
/**
* @des 优惠券详情
*
* @author 237524947@qq.com
* @date 2019-12-09 10:13
* @copyright 2019
*/
import { couponDetail, couponReceive } from '@/api/userInfo';
import moment from '@/common/moment';
import uniDrawer from '@/components/uni-drawer/uni-drawer';
export default {
components: {
uniDrawer
},
data() {
return {
headerTop: 0,
// 控制滑动效果
typeClass: 'valid',
theIndex: null,
oldIndex: null,
state: 1,
isStop: false,
couponList: [],
loadingType: 'more',
token: null,
pageNum :0,
showRight: false,
currentCoupon: {},
moneySymbol: this.moneySymbol,
loading: true
};
},
filters: {
time(val) {
return moment(val * 1000).format('YYYY-MM-DD');
},
timeFull(val) {
return moment(val * 1000).format('YYYY-MM-DD HH:mm:ss');
}
},
onLoad(options) {
this.initData(options);
},
methods: {
show(item) {
if (item.usableProduct.length === 0) return;
this.currentCoupon = item;
this.showRight = true;
},
hide() {
this.showRight = false;
},
closeDrawer() {
this.showRight = false;
},
// 初始化数据
initData(options) {
this.getMyCouponDetail(options.id);
},
// 获取优惠券
async getCoupon(item) {
if (!this.$mStore.getters.hasLogin) {
this.$mHelper.toast('请您先登录!');
return;
}
if (parseInt(item.is_get, 10) === 0) {
this.$mHelper.toast('该优惠券暂不可领取!');
return;
}
await this.$http
.post(`${couponReceive}`, {
id: item.id
})
.then(() => {
this.$mHelper.toast('领取成功');
setTimeout(() => {
this.couponList = [];
this.getMyCouponDetail(item.id);
}, 1.5 * 1000);
});
},
// 统一跳转接口
navTo(route) {
this.$mRouter.push({ route });
},
// 获取我的收货地址列表
async getMyCouponDetail(id) {
await this.$http
.get(`${couponDetail}`, {
id
})
.then(r => {
this.loading = false;
this.couponList.push(r);
})
.catch(() => {
this.loading = false;
});
}
}
};
</script>
<style lang="scss">
.list {
display: flex;
width: 100%;
position: relative;
}
.sub-list {
width: 100%;
padding-top: 10upx;
.row {
width: 92%;
height: 24vw;
margin: 10upx auto;
border-radius: 8upx;
align-items: center;
position: relative;
overflow: hidden;
z-index: 4;
border: 0;
.carrier {
background-color: #fff;
position: absolute;
width: 100%;
padding: 0 0;
height: 100%;
z-index: 3;
display: flex;
.left {
flex: 1;
.title {
padding-top: 3vw;
width: 90%;
margin: 0 5%;
font-size: 36upx;
.cell-icon {
display: inline-block;
height: 32upx;
margin-top: 15upx;
width: 32upx;
font-size: 22upx;
color: #fff;
text-align: center;
line-height: 32upx;
background: #f85e52;
border-radius: 4upx;
margin-right: 12upx;
&.hb {
background: #ffaa0e;
}
&.lpk {
background: #3ab54a;
}
}
}
.term {
width: 90%;
margin: 0 5%;
font-size: 26upx;
color: #999;
}
.usage {
width: 90%;
margin: 0 5%;
font-size: 26upx;
color: $font-color-light;
}
position: relative;
.gap-top,
.gap-bottom {
position: absolute;
width: 20upx;
height: 20upx;
right: -10upx;
border-radius: 100%;
background-color: #f5f5f5;
}
.gap-top {
top: -10upx;
}
.gap-bottom {
bottom: -10upx;
}
.used {
position: absolute;
right: 10upx;
bottom: 5upx;
font-size: $font-sm;
color: $base-color;
}
.shixiao {
position: absolute;
right: 0;
top: -20upx;
font-size: 150upx;
z-index: 6;
color: rgba(153, 153, 153, 0.2);
}
}
.right {
width: 28%;
color: #fff;
text-align: center;
background: linear-gradient(
to right,
rgba(250, 67, 106, 0.72),
rgba(250, 67, 106, 0.64)
);
.ticket,
.criteria {
width: 100%;
}
.ticket {
padding-top: 20upx;
.num {
font-size: $font-lg + 12upx;
font-weight: 600;
line-height: 1.2;
}
.unit {
font-size: 24upx;
}
}
.criteria {
font-size: $font-base;
}
.btn-group {
display: flex;
justify-content: space-between;
align-items: center;
.use {
flex: 1;
margin: 0 6upx;
height: 40upx;
justify-content: center;
align-items: center;
font-size: 24upx;
background-color: #fff;
color: $base-color;
border-radius: 40upx;
padding: 0 4upx;
}
}
}
}
}
}
.drawer {
.close {
.btn {
width: 320upx;
height: 76upx;
line-height: 76upx;
border-radius: 50px;
margin-top: 70upx;
background: $uni-color-primary;
color: #fff;
font-size: $font-lg;
border: none;
&:after {
border-radius: 100px;
}
}
}
}
</style>