|
@@ -0,0 +1,142 @@
|
|
|
+<template>
|
|
|
+ <el-scrollbar class="z-1 min-h-30px" wrap-class="w-full" ref="containerRef">
|
|
|
+ <div
|
|
|
+ class="flex flex-row text-12px"
|
|
|
+ :style="{
|
|
|
+ gap: `${property.space}px`,
|
|
|
+ width: scrollbarWidth
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ class="box-content"
|
|
|
+ :style="{
|
|
|
+ background: property.bgImg
|
|
|
+ ? `url(${property.bgImg}) 100% center / 100% 100% no-repeat`
|
|
|
+ : '#fff',
|
|
|
+ width: `${couponWidth}px`,
|
|
|
+ color: property.textColor
|
|
|
+ }"
|
|
|
+ v-for="(coupon, index) in couponList"
|
|
|
+ :key="index"
|
|
|
+ >
|
|
|
+ <!-- 布局1:1列-->
|
|
|
+ <div v-if="property.columns === 1" class="m-l-16px flex flex-row justify-between p-8px">
|
|
|
+ <div class="flex flex-col justify-evenly gap-4px">
|
|
|
+ <!-- 优惠值 -->
|
|
|
+ <CouponDiscount :coupon="coupon" />
|
|
|
+ <!-- 优惠描述 -->
|
|
|
+ <CouponDiscountDesc :coupon="coupon" />
|
|
|
+ <!-- 有效期 -->
|
|
|
+ <CouponValidTerm :coupon="coupon" />
|
|
|
+ </div>
|
|
|
+ <div class="flex flex-col justify-evenly">
|
|
|
+ <div
|
|
|
+ class="rounded-20px p-x-8px p-y-2px"
|
|
|
+ :style="{
|
|
|
+ color: property.button.color,
|
|
|
+ background: property.button.bgColor
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ 立即领取
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- 布局2:2列-->
|
|
|
+ <div
|
|
|
+ v-else-if="property.columns === 2"
|
|
|
+ class="m-l-16px flex flex-row justify-between p-8px"
|
|
|
+ >
|
|
|
+ <div class="flex flex-col justify-evenly gap-4px">
|
|
|
+ <!-- 优惠值 -->
|
|
|
+ <CouponDiscount :coupon="coupon" />
|
|
|
+ <div>{{ coupon.name }}</div>
|
|
|
+ </div>
|
|
|
+ <div class="flex flex-col">
|
|
|
+ <div
|
|
|
+ class="h-full w-20px rounded-20px p-x-2px p-y-8px text-center"
|
|
|
+ :style="{
|
|
|
+ color: property.button.color,
|
|
|
+ background: property.button.bgColor
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ 立即领取
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- 布局3:3列-->
|
|
|
+ <div v-else class="flex flex-col items-center justify-around gap-4px p-4px">
|
|
|
+ <!-- 优惠值 -->
|
|
|
+ <CouponDiscount :coupon="coupon" />
|
|
|
+ <div>{{ coupon.name }}</div>
|
|
|
+ <div
|
|
|
+ class="rounded-20px p-x-8px p-y-2px"
|
|
|
+ :style="{
|
|
|
+ color: property.button.color,
|
|
|
+ background: property.button.bgColor
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ 立即领取
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-scrollbar>
|
|
|
+</template>
|
|
|
+<script setup lang="ts">
|
|
|
+import { CouponCardProperty } from './config'
|
|
|
+import * as CouponTemplateApi from '@/api/mall/promotion/coupon/couponTemplate'
|
|
|
+import { CouponDiscount } from './component'
|
|
|
+import {
|
|
|
+ CouponDiscountDesc,
|
|
|
+ CouponValidTerm
|
|
|
+} from '@/components/DiyEditor/components/mobile/CouponCard/component'
|
|
|
+
|
|
|
+/** 商品卡片 */
|
|
|
+defineOptions({ name: 'CouponCard' })
|
|
|
+// 定义属性
|
|
|
+const props = defineProps<{ property: CouponCardProperty }>()
|
|
|
+// 商品列表
|
|
|
+const couponList = ref<CouponTemplateApi.CouponTemplateVO[]>([])
|
|
|
+watch(
|
|
|
+ () => props.property.couponIds,
|
|
|
+ async () => {
|
|
|
+ if (props.property.couponIds?.length > 0) {
|
|
|
+ couponList.value = await CouponTemplateApi.getCouponTemplateList(props.property.couponIds)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ immediate: true,
|
|
|
+ deep: true
|
|
|
+ }
|
|
|
+)
|
|
|
+
|
|
|
+// 手机宽度
|
|
|
+const phoneWidth = ref(375)
|
|
|
+// 容器
|
|
|
+const containerRef = ref()
|
|
|
+// 滚动条宽度
|
|
|
+const scrollbarWidth = ref('100%')
|
|
|
+// 优惠券的宽度
|
|
|
+const couponWidth = ref(375)
|
|
|
+// 计算布局参数
|
|
|
+watch(
|
|
|
+ () => [props.property, phoneWidth, couponList.value.length],
|
|
|
+ () => {
|
|
|
+ // 每列的宽度为:(总宽度 - 间距 * (列数 - 1))/ 列数
|
|
|
+ couponWidth.value =
|
|
|
+ (phoneWidth.value * 0.95 - props.property.space * (props.property.columns - 1)) /
|
|
|
+ props.property.columns
|
|
|
+ // 显示滚动条
|
|
|
+ scrollbarWidth.value = `${
|
|
|
+ couponWidth.value * couponList.value.length +
|
|
|
+ props.property.space * (couponList.value.length - 1)
|
|
|
+ }px`
|
|
|
+ },
|
|
|
+ { immediate: true, deep: true }
|
|
|
+)
|
|
|
+onMounted(() => {
|
|
|
+ // 提取手机宽度
|
|
|
+ phoneWidth.value = containerRef.value?.wrapRef?.offsetWidth || 375
|
|
|
+})
|
|
|
+</script>
|
|
|
+<style scoped lang="scss"></style>
|