123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- <!-- 装修营销组件:优惠券 -->
- <template>
- <scroll-view class="scroll-box" scroll-x scroll-anchoring :style="[bgStyle, { marginLeft: `${data.space}px` }]">
- <view class="coupon-box ss-flex" :style="couponList.length === 2 ? couponBoxStyleTwo : couponBoxStyleNormal">
- <view class="coupon-item" :style="[couponBg, { marginLeft: `${data.space}px` }]"
- v-for="(item, index) in couponList" :key="index">
- <su-coupon :size="SIZE_LIST[columns - 1]" :textColor="data.textColor" background="" :couponId="item.id"
- :title="item.name" :type="formatCouponDiscountType(item)" :value="formatCouponDiscountValue(item)"
- :sellBy="formatValidityType(item)">
- <template v-slot:btn>
- <!-- 两列时,领取按钮坚排 -->
- <button v-if="columns === 2" @click.stop="onGetCoupon(item.id)"
- class="ss-reset-button card-btn vertical" :style="[btnStyles]">
- <view class="btn-text">立即领取</view>
- </button>
- <button v-else class="ss-reset-button card-btn" :style="[btnStyles]"
- @click.stop="onGetCoupon(item.id)">
- 立即领取
- </button>
- </template>
- </su-coupon>
- </view>
- </view>
- </scroll-view>
- </template>
- <script setup>
- import sheep from '@/sheep';
- import CouponApi from '@/sheep/api/promotion/coupon';
- import {
- ref,
- onMounted,
- computed
- } from 'vue';
- import {
- CouponTemplateValidityTypeEnum,
- PromotionDiscountTypeEnum
- } from "@/sheep/util/const";
- import {
- floatToFixed2,
- formatDate
- } from "@/sheep/util";
- const props = defineProps({
- data: {
- type: Object,
- default: () => ({}),
- },
- styles: {
- type: Object,
- default: () => ({}),
- },
- });
- const {
- columns,
- button
- } = props.data;
- const SIZE_LIST = ['lg', 'md', 'xs']
- const couponBg = {
- background: `url(${sheep.$url.cdn(props.data.bgImg)}) no-repeat top center / 100% 100%`,
- };
- const btnStyles = {
- background: button.bgColor,
- color: button.color,
- };
- // 两列优惠券时的排版方式
- const couponBoxStyleNormal = {
- 'display': 'flex',
- 'justify-content': 'space-between'
- };
- // 非两列优惠券时的排版方式
- const couponBoxStyleTwo = {
- 'display': 'flex',
- 'justify-content': 'space-around'
- };
- // 设置背景样式
- const bgStyle = computed(() => {
- // 直接从 props.styles 解构
- const {
- bgType,
- bgImg,
- bgColor
- } = props.styles;
- // 根据 bgType 返回相应的样式
- return {
- background: bgType === 'img' ? `url(${bgImg}) no-repeat top center / 100% 100%` : bgColor
- };
- });
- // 格式化【折扣类型】
- const formatCouponDiscountType = (coupon) => {
- if (coupon.discountType === PromotionDiscountTypeEnum.PRICE.type) {
- return 'reduce'
- }
- if (coupon.discountType === PromotionDiscountTypeEnum.PERCENT.type) {
- return 'percent'
- }
- return `未知【${coupon.discountType}】`
- }
- // 格式化【折扣】
- const formatCouponDiscountValue = (coupon) => {
- if (coupon.discountType === PromotionDiscountTypeEnum.PRICE.type) {
- return floatToFixed2(coupon.discountPrice)
- }
- if (coupon.discountType === PromotionDiscountTypeEnum.PERCENT.type) {
- return coupon.discountPercent
- }
- return `未知【${coupon.discountType}】`
- }
- // 格式化【有效期限】
- const formatValidityType = (row) => {
- if (row.validityType === CouponTemplateValidityTypeEnum.DATE.type) {
- return `${formatDate(row.validStartTime)} 至 ${formatDate(row.validEndTime)}`
- }
- if (row.validityType === CouponTemplateValidityTypeEnum.TERM.type) {
- return `领取后第 ${row.fixedStartTerm} - ${row.fixedEndTerm} 天内可用`
- }
- return '未知【' + row.validityType + '】'
- }
- const couponList = ref([]);
- // 立即领取优惠券
- async function onGetCoupon(id) {
- const {
- error,
- msg
- } = await CouponApi.takeCoupon(id);
- if (error === 0) {
- uni.showToast({
- title: msg,
- icon: 'none',
- });
- return
- }
- await getCouponTemplateList()
- }
- const getCouponTemplateList = async () => {
- const {
- data
- } = await CouponApi.getCouponTemplateListByIds(props.data.couponIds.join(','));
- couponList.value = data;
- }
- onMounted(() => {
- getCouponTemplateList()
- });
- </script>
- <style lang="scss" scoped>
- .card-btn {
- width: 140rpx;
- height: 50rpx;
- border-radius: 25rpx;
- font-size: 24rpx;
- line-height: 50rpx;
- &.vertical {
- width: 50rpx;
- height: 140rpx;
- margin: auto 20rpx auto 0;
- .btn-text {
- font-size: 24rpx;
- text-align: center;
- writing-mode: vertical-lr;
- }
- }
- }
- .coupon-item {
- &:nth-of-type(1) {
- margin-left: 0 !important;
- }
- }
- </style>
|