244 lines
7.9 KiB
Vue
244 lines
7.9 KiB
Vue
<template>
|
|
<div class="coupons-list flex">
|
|
<template v-for="(item, index) in couponsList">
|
|
<div v-show="item.isShow" class="item" :key="index" @click.capture="onHandle(item.id, item.is_get)">
|
|
<div :class="[
|
|
'info white',
|
|
{ gray: type == 2 || type == 1 || item.is_get },
|
|
]">
|
|
<div class="info-hd flex">
|
|
<div>
|
|
<price-formate :price="item.money" :first-size="38" :second-size="38" />
|
|
</div>
|
|
<div class="m-l-8 flex1">
|
|
<div class="line1">{{ item.name }}</div>
|
|
<div class="xs line1">{{ item.condition_type_desc }}</div>
|
|
</div>
|
|
</div>
|
|
<div class="info-time xs">{{ item.user_time_desc }}</div>
|
|
</div>
|
|
<div class="tips flex row-between" @click.stop="onShowTips(index)">
|
|
<div class="muted xs">{{ item.use_scene_desc }}</div>
|
|
<div v-if="item.use_goods_type != 1 && (type == 1 || type == 2 || type == 0)">
|
|
<i :class="
|
|
showTips[index] ? 'el-icon-arrow-up' : 'el-icon-arrow-down'
|
|
"></i>
|
|
<div class="tips-con xs lighter" v-if="item.use_scene_desc != '全场通用' && showTips[index]">
|
|
{{ item.use_goods_desc }}
|
|
</div>
|
|
</div>
|
|
<div class="primary sm" v-if="type == 3 && !item.is_get">
|
|
立即领取
|
|
</div>
|
|
</div>
|
|
<img v-if="item.is_get" class="receice" src="~/static/images/coupons_img_receive.png" alt="" />
|
|
<div class="choose xs" v-if="type == 4 && id == item.id">已选择</div>
|
|
</div>
|
|
</template>
|
|
|
|
<div class="more muted" v-if="showMore && list.length > 4" @click="changeShow">
|
|
{{ isMore ? '收起' : '更多' }}
|
|
<i :class="isMore ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import {
|
|
mapActions
|
|
} from "vuex";
|
|
export default {
|
|
props: {
|
|
list: {
|
|
type: Array,
|
|
default: () => [],
|
|
},
|
|
type: {
|
|
type: Number,
|
|
},
|
|
showMore: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
},
|
|
data() {
|
|
return {
|
|
showTips: [],
|
|
couponsList: [],
|
|
id: "",
|
|
isMore: false,
|
|
};
|
|
},
|
|
methods: {
|
|
...mapActions(["getPublicData"]),
|
|
onHandle(id, isGet) {
|
|
this.id = id;
|
|
const {
|
|
type
|
|
} = this;
|
|
switch (type) {
|
|
case 0:
|
|
// 可使用
|
|
break;
|
|
case 1:
|
|
break;
|
|
// 使用
|
|
case 2:
|
|
break;
|
|
//不可以用
|
|
case 3:
|
|
// 领券
|
|
if(!isGet) {
|
|
this.getCoupon();
|
|
}
|
|
break;
|
|
case 4:
|
|
//使用
|
|
if (this.selectId == id) {
|
|
this.id = "";
|
|
}
|
|
this.$emit("use", this.id);
|
|
this.selectId = this.id;
|
|
break;
|
|
}
|
|
},
|
|
async getCoupon() {
|
|
const {
|
|
msg,
|
|
code
|
|
} = await this.$post("coupon/getCoupon", {
|
|
coupon_id: this.id,
|
|
});
|
|
if (code == 1) {
|
|
this.$message({
|
|
message: msg,
|
|
type: "success",
|
|
});
|
|
this.getPublicData();
|
|
this.$emit("reflash");
|
|
}
|
|
},
|
|
onShowTips(index) {
|
|
const {
|
|
showTips
|
|
} = this;
|
|
|
|
this.showTips[index] = showTips[index] ? 0 : 1;
|
|
// 拷贝数组
|
|
this.showTips = Object.assign([], this.showTips);
|
|
},
|
|
changeShow() {
|
|
this.isMore = !this.isMore;
|
|
this.list.forEach((item, index) => {
|
|
item.isShow = true;
|
|
if (!this.isMore && index >= 4) {
|
|
item.isShow = false;
|
|
}
|
|
});
|
|
this.couponsList = [...this.list];
|
|
},
|
|
},
|
|
watch: {
|
|
list: {
|
|
handler: function(val) {
|
|
if (val.length) {
|
|
// 默认选中第一张
|
|
if (this.type == 4) {
|
|
this.id = val[0].id;
|
|
this.selectId = this.id;
|
|
this.$emit("use", this.id);
|
|
}
|
|
}
|
|
let arr = val.map((item) => {
|
|
return 0;
|
|
});
|
|
this.showTips = arr;
|
|
this.list.forEach((item, index) => {
|
|
item.isShow = true;
|
|
if (this.showMore) {
|
|
if (index >= 4) {
|
|
item.isShow = false;
|
|
}
|
|
}
|
|
});
|
|
this.couponsList = this.list;
|
|
},
|
|
immediate: true,
|
|
deep: true,
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.coupons-list {
|
|
padding: 0 18px;
|
|
flex-wrap: wrap;
|
|
position: relative;
|
|
|
|
.item {
|
|
margin-bottom: 20px;
|
|
margin-right: 16px;
|
|
position: relative;
|
|
cursor: pointer;
|
|
|
|
.info {
|
|
padding: 0 10px;
|
|
background: url("~/static/images/bg_coupon_s.png") no-repeat;
|
|
width: 240px;
|
|
height: 80px;
|
|
background-size: 100%;
|
|
|
|
&.gray {
|
|
background-image: url("~/static/images/bg_coupon.png");
|
|
}
|
|
|
|
.info-hd {
|
|
overflow: hidden;
|
|
}
|
|
}
|
|
|
|
.tips {
|
|
position: relative;
|
|
background-color: #f2f2f2;
|
|
height: 30px;
|
|
padding: 0 8px;
|
|
|
|
.tips-con {
|
|
width: 100%;
|
|
left: 0;
|
|
background-color: #f2f2f2;
|
|
position: absolute;
|
|
top: 30px;
|
|
padding: 10px;
|
|
z-index: 99;
|
|
}
|
|
}
|
|
|
|
.receice {
|
|
position: absolute;
|
|
top: 0;
|
|
right: 0;
|
|
width: 58px;
|
|
height: 45px;
|
|
}
|
|
|
|
.choose {
|
|
position: absolute;
|
|
top: 0;
|
|
right: 0;
|
|
background-color: #ffe72c;
|
|
color: $--color-primary;
|
|
padding: 1px 5px;
|
|
}
|
|
}
|
|
|
|
.more {
|
|
position: absolute;
|
|
bottom: 20px;
|
|
cursor: pointer;
|
|
right: 30px;
|
|
}
|
|
}
|
|
</style>
|