wxapp/components/page/coupon/index.vue
2024-08-03 19:57:17 +08:00

295 lines
8.0 KiB
Vue

<template>
<!-- 卡券组 -->
<view class="diy-goods" :style="{ background: itemStyle.background }">
<view class="goods-list" :class="[`display__${itemStyle.display}`, `column__${itemStyle.column}`]">
<scroll-view :scroll-x="itemStyle.display === 'slide'">
<view class="goods-item" v-for="(dataItem, index) in dataList" :key="index" @click="onTargetCoupon(dataItem.id, dataItem.type, dataItem.userCouponId)">
<!-- 单列卡券 -->
<block>
<view class="dis-flex">
<!-- 卡券图片 -->
<view class="goods-item_left">
<image class="image" :src="dataItem.image"></image>
</view>
<view class="goods-item_right">
<!-- 卡券名称 -->
<view class="goods-name twolist-hidden">
<text>{{ dataItem.name }}</text>
</view>
<view class="goods-item_desc">
<!-- 卡券卖点 -->
<view class="desc-selling_point dis-flex">
<text class="onelist-hidden">{{ dataItem.sellingPoint }}</text>
</view>
<view class="coupon-attr">
<view class="attr-l">
<!-- 参与人数 -->
<view class="desc-goods_sales dis-flex">
<text v-if="dataItem.type === 'C'">已领取{{ dataItem.gotNum }},剩余{{ dataItem.leftNum }}</text>
<text v-if="dataItem.type === 'P'">已预存{{ dataItem.gotNum }},剩余{{ dataItem.leftNum }}</text>
<text v-if="dataItem.type === 'T'">已领取{{ dataItem.gotNum }}</text>
</view>
<!-- 卡券面额 -->
<view v-if="dataItem.amount > 0" class="desc_footer">
<text class="price_x">¥{{ dataItem.amount }}</text>
</view>
</view>
<view class="attr-r">
<!--领券按钮-->
<view class="receive" v-if="dataItem.type === 'C' && dataItem.isReceive === false">
<text>立即领取</text>
</view>
<view class="receive state" v-if="dataItem.type === 'C' && dataItem.isReceive === true">
<text>已领取</text>
</view>
<view class="receive" v-if="dataItem.type === 'P' && dataItem.isReceive === false">
<text>立即预存</text>
</view>
<view v-if="dataItem.type === 'T' && dataItem.isReceive === false" class="receive">
<text>领取次卡</text>
</view>
<view v-if="dataItem.type === 'T' && dataItem.isReceive === true" class="receive state">
<text>已领取</text>
</view>
</view>
</view>
</view>
</view>
</view>
</block>
</view>
</scroll-view>
</view>
</view>
</template>
<script>
import * as couponApi from '@/api/coupon'
import * as pageApi from '@/api/page'
export default {
name: "Coupon",
/**
* 组件的属性列表
* 用于组件自定义设置
*/
props: {
itemIndex: String,
itemStyle: Object,
params: Object,
dataList: Array
},
/**
* 组件的方法列表
* 更新属性和数据的方法与更新页面数据的方法类似
*/
methods: {
/**
* 卡券详情页
*/
onTargetCoupon(couponId, type, userCouponId) {
if (type === 'P') {
this.$navTo(`pages/prestore/buy`, { couponId })
} else {
if (type === 'C') {
this.$navTo(`pages/coupon/detail`, { couponId: couponId, userCouponId: userCouponId })
} else if(type === 'T') {
this.$navTo(`pages/timer/detail`, { couponId: couponId, userCouponId: userCouponId })
}
}
}
}
}
</script>
<style lang="scss" scoped>
.diy-goods {
.goods-list {
padding: 4rpx;
box-sizing: border-box;
.goods-item {
box-sizing: border-box;
padding: 6rpx;
.goods-image {
position: relative;
width: 80rpx;
height: 63rpx;
border-radius: 5rpx;
padding-bottom: 100%;
overflow: hidden;
background: #fff;
&:after {
content: '';
display: block;
margin-top: 100%;
}
.image {
position: absolute;
width: 80rpx;
height: 63rpx;
border-radius: 5rpx;
top: 0;
left: 0;
-o-object-fit: cover;
object-fit: cover;
}
}
.detail {
padding: 8rpx;
background: #fff;
.goods-name {
height: 64rpx;
line-height: 1.3;
white-space: normal;
color: #484848;
font-size: 26rpx;
}
.detail-price {
.goods-price {
margin-right: 8rpx;
}
.line-price {
text-decoration: line-through;
}
}
}
}
&.display__slide {
white-space: nowrap;
font-size: 0;
.goods-item {
display: inline-block;
}
}
&.display__list {
.goods-item {
float: left;
}
}
&.column__2 {
.goods-item {
width: 50%;
}
}
&.column__3 {
.goods-item {
width: 33.33333%;
}
}
&.column__1 {
.goods-item {
width: 100%;
height: 240rpx;
margin-bottom: 12rpx;
padding: 20rpx;
box-sizing: border-box;
background: #fff;
line-height: 1.6;
&:last-child {
margin-bottom: 0;
}
}
.goods-item_left {
display: flex;
width: 35%;
background: #fff;
align-items: center;
.image {
display: block;
margin-top: 20rpx;
width: 200rpx;
height: 157rpx;
border-radius: 6rpx;
}
}
.goods-item_right {
position: relative;
width: 65%;
.goods-name {
margin-top: 20rpx;
height: 40rpx;
line-height: 1.0;
white-space: normal;
color: #484848;
font-size: 30rpx;
}
}
.goods-item_desc {
margin-top: 0rpx;
.coupon-attr {
.attr-l {
float:left;
width: 70%;
}
.attr-r {
margin-top:20rpx;
float:left;
}
}
}
.desc-selling_point {
width: 400rpx;
font-size: 24rpx;
color: #e49a3d;
}
.receive {
height: 46rpx;
width: 128rpx;
line-height: 46rpx;
text-align: center;
border: 1px solid #f8df00;
border-radius: 5rpx;
color: #f86d48;
background: #f8df98;
font-size: 22rpx;
&.state {
border: none;
color: #cccccc;
background: #F5F5F5;
}
}
.desc-goods_sales {
color: #999;
font-size: 24rpx;
}
.desc_footer {
font-size: 24rpx;
.price_x {
margin-right: 16rpx;
color: #f03c3c;
font-size: 30rpx;
}
.price_y {
text-decoration: line-through;
}
}
}
}
}
</style>