shop-applet/pages/activity/collect_coupons/index.vue

372 lines
9.1 KiB
Vue

<template>
<view class='my-coupon' :style="viewColor">
<view class='header'>
<view class='nav acea-row row-around'>
<view class='item' :class='type==-1 ? "on": ""' @click="statusClick(-1)">
<view>全部</view>
</view>
<view class='item' :class='type==10 ? "on": ""' @click="statusClick(10)">
<view>通用券</view>
</view>
<view class='item' :class='type==11 ? "on": ""' @click="statusClick(11)">
<view>品类券</view>
</view>
<view class='item' :class='type==12 ? "on": ""' @click="statusClick(12)">
<view>跨店券</view>
</view>
<view class='item' :class='type==0 ? "on": ""' @click="statusClick(0)">
<view>店铺券</view>
</view>
</view>
</view>
<view class="listBox">
<block v-for="(item) in list" :key='item.coupon_id'>
<view class="list acea-row row-around">
<view class="left cross" v-if="item.ProductLst.length == 1 || item.ProductLst.length == 0">
<view v-if="item.ProductLst.length == 1" class="cross-left" v-for="(items,index) in item.ProductLst" :key='index'>
<easyLoadimage :image-src="items.image"></easyLoadimage>
</view>
<view v-if="item.ProductLst.length == 0" class="cross-left">
<image src="../static/images/no_product.png"></image>
</view>
<view class="tips cross-right">
<view class="title line2">{{item.title || ''}}</view>
<view class="time">{{item.create_time}}</view>
</view>
</view>
<view class="left" v-else>
<view class="tips line1">{{item.title || ''}}</view>
<view class="info">
<view class="info-box" v-for="(items,index) in item.ProductLst" :key='index'>
<easyLoadimage :image-src="items.image"></easyLoadimage>
<view class="money">¥ {{items.price}}</view>
</view>
</view>
</view>
<view class="right">
<view class="couponlogo" v-if="item.type == 10">通用券</view>
<view class="couponlogo" v-if="item.type == 11">品类券</view>
<view class="couponlogo" v-if="item.type == 12">跨店券</view>
<view class="couponlogo" v-if="item.type == 0">店铺券</view>
<view class="title">
<view>
<p><text class='font1'>¥</text><text class='font2'>{{parsePrice(item.coupon_price)}}</text></p>
<p>
<text class='font3' v-if="item.use_min_price == 0">无使用门槛</text>
<text class='font3' v-else>满{{parsePrice(item.use_min_price)}}元可用</text>
</p>
</view>
<view class="btn" :class="item.ProductLst.length == 0 ? 'disabled' : ''" v-if="!item.issue" @click="receiveCoupon(item)">立即领取</view>
<navigator :url="'/pages/columnGoods/goods_coupon_list/index?coupon_id='+item.coupon_id" class='btn shiyong' hover-class="none" v-if="item.issue && item.ProductLst.length > 0">
去使用
</navigator>
<view v-if="item.issue && item.ProductLst.length == 0" class='btn shiyong disabled'>去使用</view>
</view>
</view>
</view>
</block>
</view>
<view class="loadingicon acea-row row-center-wrapper">
<text class="loading iconfont icon-jiazai" :hidden="loading == false" style="color:#33;"></text>
</view>
<view class='noCommodity' v-if="!list.length && loaded">
<view class='pictrue'>
<image src='/static/images/noCoupon.png'></image>
</view>
</view>
</view>
</template>
<script>
import {getCouponLst} from '@/api/activity.js';
import {setCouponReceive} from '@/api/api.js';
import { mapGetters } from "vuex";
import easyLoadimage from '@/components/easy-loadimage/easy-loadimage.vue';
export default {
computed: mapGetters(['viewColor']),
components: {
easyLoadimage
},
data() {
return {
type: '',
list:[],
loading: false,
loaded: false,
page: 1,
limit: 15,
}
},
onLoad: function() {
this.statusClick(-1)
},
methods: {
parsePrice(price){
if(price >= 100){
return parseFloat(price)
}else{
return price
}
},
// 领取优惠券
receiveCoupon(item) {
let that = this;
setCouponReceive(item.coupon_id).then(res => {
item.issue = 1
uni.showToast({
title: res.message,
icon: 'none'
})
}).catch(err => {
uni.showToast({
title: err,
icon: 'none'
})
})
},
getList(){
if(this.loading || this.loaded) return ;
this.loading = true;
getCouponLst({
product:1,
type: this.type == -1 ? '' : this.type,
page: this.page,
limit: this.limit
}).then(res=>{
this.list = this.list.concat(res.data.list);
this.loading = false;
this.loaded = res.data.list.length != this.limit;
this.page ++;
})
},
//切换类型
statusClick: function(status) {
if (status == this.type) return;
this.loaded = false;
this.loading = false;
this.page = 1;
this.list = [];
this.type = status;
this.getList()
},
},
// 滚动监听
onPageScroll(e) {
// 传入scrollTop值并触发所有easy-loadimage组件下的滚动监听事件
uni.$emit('scroll');
},
onReachBottom: function() {
this.getList();
}
}
</script>
<style lang="scss">
.my-coupon .header {
height: 200rpx;
padding: 0 15rpx;
background-color: var(--view-theme);
border-bottom-left-radius: 10%;
border-bottom-right-radius: 10%;
.nav {
border-radius: 6rpx;
padding-top: 30rpx;
.item {
text-align: center;
font-size: 26rpx;
color: #FFFFFF;
padding: 29rpx 0;
opacity: 0.7;
line-height: 2rpx;
.num {
margin-top: 18rpx;
}
}
.item.on {
opacity: 1;
font-weight: bold;
border-bottom: 5rpx solid #FFFFFF;
}
}
}
.my-coupon .listBox {
margin: -73rpx auto 0 auto;
padding: 0 30rpx;
.list {
width: 100%;
height: 260rpx;
overflow: hidden;
background: #FFFFFF;
border-radius: 12rpx;
margin-bottom: 25rpx;
text-align: center;
.cross{
display: flex;
.cross-left{
margin-top: 6rpx;
.easy-loadimage,image{
width: 200rpx;
height: 200rpx;
border-radius: 12rpx;
}
}
.cross-right{
margin-left: 20rpx;
margin-top: 6rpx;
.title{
overflow:hidden;
text-overflow:ellipsis;
display:-webkit-box;
-webkit-box-orient:vertical;
-webkit-line-clamp:2;
}
.time{
margin-top: 40rpx;
font-size: 22rpx;
font-weight: 400;
color: #666666;
}
}
}
.left{
width: 75%;
height: 210rpx;
margin-top: 20rpx;
border-right: 2rpx dashed #E5E5E5;
text-align: left;
padding-left: 30rpx;
.tips{
font-size: 26rpx;
font-weight: 600;
color: #282828;
display: block;
overflow: auto;
}
.info{
margin-top: 18rpx;
display: flex;
justify-content: flex-start;
.info-box{
margin-right: 25rpx;
.easy-loadimage{
display: inline-block;
width: 130rpx;
height: 130rpx;
border-radius: 8rpx;
}
.money{
text-align: center;
font-size: 24rpx;
font-weight: 400;
color: #666666;
margin-top: 4rpx;
}
}
}
}
.right{
width: 25%;
height: 100%;
position: relative;
&::before,&::after{
content: "";
display: inline-block;
width: 24rpx;
height: 24rpx;
background: #f5f5f5;
border-radius: 100%;
position: absolute;
bottom: -12rpx;
}
&::before{
left: -12rpx;
}
&::after{
top: -12rpx;
left: -12rpx;
}
.couponlogo{
width: 112rpx;
height: 32rpx;
margin: 0 auto;
font-size: 20rpx;
font-weight: 400;
line-height: 38rpx;
color: #9B5434;
background-image: url(@/static/images/couponlogo.png);
background-size: 112rpx 32rpx;
}
.title{
width: 146rpx;
height:169rpx;
margin: 30rpx auto 0;
color: var(--view-priceColor);
font-weight: 600;
.font1{
font-size: 26rpx;
}
.font2{
font-size: 32rpx;
}
.font3{
font-size: 24rpx;
font-weight: 400;
color: var(--view-theme);
}
p{
margin-top: 10rpx;
}
.btn{
width: 142rpx;
background: linear-gradient(270deg, var(--view-bntColor21) 0%, var(--view-bntColor22) 100%);
border-radius: 26rpx;
font-size: 24rpx;
font-weight: 400;
color: #FFFFFF;
line-height: 44rpx;
text-align: center;
margin-top: 20rpx;
&.disabled{
pointer-events: none;
background: #ccc;
color: #fff;
border-color: #ccc;
cursor: not-allowed;
}
}
.shiyong{
border: 2rpx solid var(--view-theme);
background: none;
color: var(--view-theme);
border-radius: 26rpx;
&.disabled{
pointer-events: none;
color: #ccc;
border-color: #ccc;
cursor: not-allowed;
background: none;
}
}
}
}
}
.list:nth-child(1){
.right{
&::after{
background-color: var(--view-theme);
}
}
}
}
.noCommodity{
width: 100%;
margin-top: 4rpx;
background-color: #f5f5f5;
.pictrue{
margin: 0 auto;
}
}
</style>