feat:【antd】【mall】优化满减送的界面

This commit is contained in:
YunaiV
2025-11-29 11:17:37 +08:00
parent 56409edff4
commit 0ffebd6de4
2 changed files with 136 additions and 105 deletions

View File

@@ -102,46 +102,53 @@ onMounted(async () => {
</script> </script>
<template> <template>
<div class="w-full"> <div>
<Button type="link" class="pl-0" @click="handleSelect">添加优惠券</Button> <!-- 已选优惠券列表 -->
<div v-if="list.length > 0" class="mb-2 flex flex-col gap-2">
<div <div
v-for="(item, index) in list" v-for="(item, index) in list"
:key="item.id" :key="item.id"
class="coupon-list-item mb-2 flex justify-between rounded-lg border border-dashed border-gray-300 p-2" class="flex items-center justify-between rounded-md border border-gray-200 bg-white px-3 py-2 transition-all hover:border-blue-400 hover:shadow-sm"
> >
<div class="coupon-list-item-left flex flex-wrap items-center gap-2"> <div class="flex flex-wrap items-center gap-3">
<div>优惠券名称{{ item.name }}</div> <span class="font-medium text-gray-800">{{ item.name }}</span>
<div> <span class="flex items-center gap-1 text-sm text-gray-500">
范围 <DictTag
<DictTag :type="DICT_TYPE.PROMOTION_PRODUCT_SCOPE"
:type="DICT_TYPE.PROMOTION_PRODUCT_SCOPE" :value="item.productScope"
:value="item.productScope" />
/> </span>
<span class="flex items-center gap-1 text-sm text-gray-500">
<DictTag
:type="DICT_TYPE.PROMOTION_DISCOUNT_TYPE"
:value="item.discountType"
/>
{{ discountFormat(item) }}
</span>
</div> </div>
<div class="flex items-center"> <div class="flex shrink-0 items-center gap-2">
优惠 <span class="text-gray-500"></span>
<DictTag <Input
:type="DICT_TYPE.PROMOTION_DISCOUNT_TYPE" v-model:value="item.giveCount"
:value="item.discountType" class="!w-20"
placeholder=""
type="number"
size="small"
/> />
{{ discountFormat(item) }} <span class="text-gray-500"></span>
<Button type="link" danger size="small" @click="handleDelete(index)">
删除
</Button>
</div> </div>
</div> </div>
<div class="coupon-list-item-right flex items-center gap-2">
<span></span>
<Input
v-model:value="item.giveCount"
class="!w-150px"
placeholder=""
type="number"
/>
<span></span>
<Button type="link" danger @click="handleDelete(index)">删除</Button>
</div>
</div> </div>
<!-- 优惠券选择 --> <!-- 添加按钮 -->
<Button type="link" class="!pl-0" @click="handleSelect">
+ 添加优惠券
</Button>
<!-- 优惠券选择弹窗 -->
<CouponSelect <CouponSelect
ref="selectRef" ref="selectRef"
:take-type="CouponTemplateTakeTypeEnum.ADMIN.type" :take-type="CouponTemplateTakeTypeEnum.ADMIN.type"

View File

@@ -8,6 +8,7 @@ import { PromotionConditionTypeEnum } from '@vben/constants';
import { useVModel } from '@vueuse/core'; import { useVModel } from '@vueuse/core';
import { import {
Button, Button,
Card,
Col, Col,
Form, Form,
FormItem, FormItem,
@@ -61,76 +62,92 @@ function handleDelete(ruleIndex: number) {
<Row :gutter="[16, 16]"> <Row :gutter="[16, 16]">
<template v-if="formData.rules"> <template v-if="formData.rules">
<Col v-for="(rule, index) in formData.rules" :key="index" :span="24"> <Col v-for="(rule, index) in formData.rules" :key="index" :span="24">
<!-- 规则标题 --> <Card size="small" class="rounded-lg">
<div class="mb-4 flex items-center"> <!-- 规则标题 -->
<span class="text-base font-bold">活动层级 {{ index + 1 }}</span> <template #title>
<Button <div class="flex items-center">
v-if="index !== 0" <span class="text-base font-medium">
type="link" 活动层级 {{ index + 1 }}
danger </span>
class="ml-2"
@click="handleDelete(index)"
>
删除
</Button>
</div>
<Form :model="rule" layout="horizontal">
<!-- 优惠门槛 -->
<FormItem label="优惠门槛" :label-col="{ span: 4 }">
<div class="flex items-center gap-2">
<span></span>
<InputNumber
v-if="isPriceCondition"
v-model:value="rule.limit"
:min="0"
:precision="2"
:step="0.1"
class="!w-40"
placeholder="请输入金额"
/>
<Input
v-else
v-model:value="rule.limit"
:min="0"
class="!w-40"
placeholder="请输入数量"
type="number"
/>
<span>{{ isPriceCondition ? '元' : '件' }}</span>
</div> </div>
</FormItem> </template>
<!-- 优惠内容 --> <template v-if="index !== 0" #extra>
<FormItem <Button
label="优惠内容" type="link"
:label-col="{ span: 4 }" danger
:wrapper-col="{ span: 20 }" size="small"
> @click="handleDelete(index)"
<div class="flex flex-col gap-2"> >
<span>订单金额优惠</span> 删除
<div class="flex items-center gap-2"> </Button>
<span></span> </template>
<Form :model="rule" layout="horizontal">
<!-- 优惠门槛 -->
<FormItem label="优惠门槛:" :colon="false" class="mb-3">
<div
class="flex items-center gap-2 rounded-md bg-gray-50 px-3 py-2"
>
<span></span>
<InputNumber <InputNumber
v-model:value="rule.discountPrice" v-if="isPriceCondition"
v-model:value="rule.limit"
:min="0" :min="0"
:precision="2" :precision="2"
:step="0.1" :step="0.1"
class="!w-32" class="!w-40"
placeholder="请输入金额" placeholder="请输入金额"
/> />
<span></span> <Input
</div> v-else
<div class="flex items-center gap-2"> v-model:value="rule.limit"
<span>包邮:</span> :min="0"
<Switch class="!w-40"
v-model:checked="rule.freeDelivery" placeholder="请输入数量"
checked-children="" type="number"
un-checked-children=""
/> />
<span>{{ isPriceCondition ? '元' : '件' }}</span>
</div> </div>
<div> </FormItem>
<div>送积分:</div> <!-- 优惠内容 -->
<div class="mt-2 flex items-center gap-2"> <FormItem label="优惠内容:" :colon="false" class="!mb-0">
<div class="flex flex-col gap-3">
<!-- 订单金额优惠 -->
<div
class="flex items-center gap-2 rounded-md bg-gray-50 px-3 py-2"
>
<span class="!w-21 shrink-0 text-sm text-gray-500">
订单金额优惠
</span>
<span></span>
<InputNumber
v-model:value="rule.discountPrice"
:min="0"
:precision="2"
:step="0.1"
class="!w-32"
placeholder="请输入金额"
/>
<span></span>
</div>
<!-- 包邮 -->
<div
class="flex items-center gap-2 rounded-md bg-gray-50 px-3 py-2"
>
<span class="w-20 shrink-0 text-sm text-gray-500">包邮</span>
<Switch
v-model:checked="rule.freeDelivery"
checked-children=""
un-checked-children=""
/>
</div>
<!-- 送积分 -->
<div
class="flex items-center gap-2 rounded-md bg-gray-50 px-3 py-2"
>
<span class="w-20 shrink-0 text-sm text-gray-500">
送积分
</span>
<span></span> <span></span>
<InputNumber <InputNumber
v-model:value="rule.point" v-model:value="rule.point"
@@ -140,17 +157,24 @@ function handleDelete(ruleIndex: number) {
/> />
<span>积分</span> <span>积分</span>
</div> </div>
<!-- 送优惠券 -->
<div
class="flex flex-col items-start gap-2 rounded-md bg-gray-50 px-3 py-2"
>
<span class="w-20 shrink-0 text-sm text-gray-500">
送优惠券
</span>
<RewardRuleCouponSelect
:model-value="rule"
@update:model-value="
(val) => (formData.rules![index] = val)
"
/>
</div>
</div> </div>
<div class="flex items-center gap-2"> </FormItem>
<span class="w-20">送优惠券:</span> </Form>
<RewardRuleCouponSelect </Card>
:model-value="rule"
@update:model-value="(val) => (formData.rules![index] = val)"
/>
</div>
</div>
</FormItem>
</Form>
</Col> </Col>
</template> </template>