shop-applet/pages/index/component/coupon.vue

297 lines
7.4 KiB
Vue
Raw Normal View History

2024-05-14 17:25:13 +08:00
<template>
<view class="coupon_main" :style="'margin: 0 '+prConfig+'rpx'">
<view class="coupon_count" :style="'margin-top:' + mbConfig +'rpx;border-radius:'+bgStyle+'rpx'" v-if="couponList.length">
<view class="acea-row coupon-title">
<text>领优惠券</text>
<navigator v-if="merId" :url="'/pages/store/home/index?id='+merId+'&coupon=1'" class="more-box" hover-class="none">
<view class="txt">查看更多 <text class="iconfont icon-jiantou"></text></view>
</navigator>
<navigator v-else url="/pages/activity/collect_coupons/index" class="more-box" hover-class="none">
<view class="txt">查看更多 <text class="iconfont icon-jiantou"></text></view>
</navigator>
</view>
<scroll-view scroll-x="true" style="white-space: nowrap; vertical-align: middle;" show-scrollbar="false">
<view class="wrapper" v-if="style == 0">
<view class="item item0" style="margin-right: 20rpx;" v-for="(item,index) in couponList"
:key="index" hover-class="none">
<view class="top" :style="{color:`${themeColor}`,backgroundImage: `url(${domain}/static/images/coupon-bg.png)`}">
<view class="money"><text>¥</text>{{item.coupon_price}}</view>
<view class="info">{{item.use_min_price}}元可用</view>
</view>
<navigator hover-class="none" :style="{background:`${themeColor}`}" v-if="item.issue" :url="'/pages/columnGoods/goods_coupon_list/index?coupon_id='+item.coupon_id" class="coupon-btn"><text>去使用</text></navigator>
<view :style="{background:`${themeColor}`}" class="coupon-btn" v-else @click="receiveCoupon(item)"><text>立即领取</text></view>
</view>
</view>
<view class="wrapper" v-else-if="style == 1">
<view class="item item1" :style="{background:`${themeColor}`}" v-for="(item,index) in couponList"
:key="index" hover-class="none">
<view class="itemCon acea-row row-between-wrapper">
<view class="text" :style="{color:`${themeColor}`}">
<view class="money"><text>¥</text>{{item.coupon_price}}</view>
<view class="info">{{item.use_min_price}}元可用</view>
</view>
<navigator v-if="item.issue" :url="'/pages/columnGoods/goods_coupon_list/index?coupon_id='+item.coupon_id" class="bnt"><text>去使用</text></navigator>
<view class="bnt" v-else @click="receiveCoupon(item)"><text>立即领取</text></view>
</view>
</view>
</view>
</scroll-view>
</view>
<authorize @onLoadFun="onLoadFun" :isAuto="isAuto" :isShowAuth="isShowAuth" @authColse="authColse"></authorize>
</view>
</template>
<script>
import {setCouponReceive} from '@/api/api.js';
import {getCouponLst} from '@/api/activity.js'
import authorize from '@/components/Authorize';
import { HTTP_REQUEST_URL } from '@/config/app';
import {
mapGetters
} from "vuex";
export default {
name: 'coupon',
props: {
dataConfig: {
type: Object,
default: () => {}
},
merId: {
type: String || Number,
default: ''
}
},
computed: mapGetters(['isLogin']),
components: {
authorize
},
watch:{
isLogin:{
handler:function(newV,oldV){
if(newV){
this.getCoupon();
}
},
deep:true
}
},
data() {
return {
domain: HTTP_REQUEST_URL,
couponList: [],
style: this.dataConfig.tabConfig&&this.dataConfig.tabConfig.tabVal || 0,
themeColor: this.dataConfig.themeColor.color[0].item,
mbConfig: this.dataConfig.mbConfig.val*2,
prConfig: this.dataConfig.prConfig&&this.dataConfig.prConfig.val*2,
bgStyle: this.dataConfig.bgStyle.type ? 20 : 0,
isShowAuth: false, //是否隐藏授权
isAuto: false, //没有授权的不会自动授权
};
},
created() {},
mounted() {
this.getCoupon();
},
methods: {
getCoupon: function() {
let that = this;
getCouponLst({
mer_id: that.merId,
page: 1,
limit: 10
}).then(res => {
that.$set(that, 'couponList', res.data.list);
}).catch(err => {
return that.$util.Tips({
title: err
});
});
},
receiveCoupon: function(item) {
let that = this;
if (that.isLogin === false) {
this.isAuto = true;
this.isShowAuth = true
} else {
setCouponReceive(item.coupon_id).then(res => {
item.issue = 1
uni.showToast({
title: res.message,
icon: 'none'
})
}).catch(err => {
uni.showToast({
title: err,
icon: 'none'
})
})
}
},
// 授权回调
onLoadFun() {
this.isShowAuth = false
},
// 授权关闭
authColse: function(e) {
this.isShowAuth = e
},
// 打开授权
authOpen: function() {
let that = this;
if (that.isLogin === false) {
this.isAuto = true;
this.isShowAuth = true
}
},
}
}
</script>
<style lang="scss" scoped>
.coupon_main {
.coupon_count{
background: #ffffff;
padding: 0 0 30rpx 20rpx;
}
.coupon-title {
justify-content: space-between;
align-items: center;
padding: 20rpx 20rpx 20rpx 10rpx;
font-size: 28rpx;
font-weight: bold;
color: #282828;
.more-box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: 24rpx;
color: #999999;
image {
width: 20rpx;
height: 20rpx;
margin-top: 10rpx;
margin: 10rpx 0 0 5rpx;
}
.txt {
display: block;
.iconfont{
font-size: 22rpx;
}
}
}
}
.item {
position: relative;
&.item0{
margin-right: 28rpx;
width: 260rpx;
height: 194rpx;
position: relative;
display: flex;
justify-content: flex-end;
align-items: flex-end;
.top{
text-align: center;
position: absolute;
top: 0;
left: 10rpx;
width: 240rpx;
height: 124rpx;
background-size: 100% 100%;
color: #E93323;
.money{
margin: 8rpx 0 2rpx;
font-size: 52rpx;
font-weight: bold;
text{
font-size: 28rpx;
font-weight: normal;
}
}
.info{
font-size: 24rpx;
}
}
.coupon-btn{
width: 260rpx;
height: 160rpx;
text-align: center;
font-size: 28rpx;
display: flex;
align-items: end;
justify-items: center;
justify-content: flex-end;
border-radius: 24rpx;
background: #E93323;
text{
display: inline-block;
color: #ffffff;
width: 100%;
position: absolute;
bottom: 20rpx;
}
}
}
&.item1{
width: 244rpx;
height: 126rpx;
background: #BBBBBB;
border-radius: 14rpx;
color: #fff;
margin-right: 24rpx;
&::before {
position: absolute;
content: ' ';
width: 20rpx;
height: 20rpx;
border-radius: 50%;
background-color: #fff;
left: -8rpx;
top: 54rpx;
}
}
.itemCon {
width: 244rpx;
height: 128rpx;
.text {
width: 198rpx;
height: 130rpx;
padding: 18rpx 0;
margin: -2rpx 0 0 -1rpx;
background-color: #f7f7f7;
border-radius: 14rpx;
.money {
font-size: 48rpx;
text-align: center;
font-weight: bold;
text {
font-size: 24rpx;
}
}
.info {
font-size: 24rpx;
text-align: center;
}
}
.bnt {
float: right;
position: relative;
height: 100%;
font-size: 20rpx;
writing-mode: vertical-lr;
line-height: 1.2;
width: 46rpx;
height: 128rpx;
display: flex;
align-items: center;
justify-content: center;
}
}
}
.wrapper {
display: flex;
}
}
</style>