feat: 新增费用设置页面并对齐原型交互

This commit is contained in:
2026-02-16 16:39:27 +08:00
parent c71c8f1b09
commit aebd0c285b
23 changed files with 2568 additions and 0 deletions

View File

@@ -0,0 +1,118 @@
<script setup lang="ts">
/**
* 文件职责:起送与配送费设置卡片。
* 1. 展示起送金额、基础配送费、免配送费门槛字段。
* 2. 通过回调上抛字段更新,保存/重置由父级处理。
*/
import { Button, Card, InputNumber } from 'ant-design-vue';
interface Props {
baseDeliveryFee: number;
freeDeliveryThreshold: null | number;
isSaving: boolean;
minimumOrderAmount: number;
onSetBaseDeliveryFee: (value: number) => void;
onSetFreeDeliveryThreshold: (value: null | number) => void;
onSetMinimumOrderAmount: (value: number) => void;
}
const props = defineProps<Props>();
const emit = defineEmits<{
(event: 'reset'): void;
(event: 'save'): void;
}>();
function toNumber(value: null | number | string, fallback = 0) {
const parsed = Number(value);
return Number.isFinite(parsed) ? parsed : fallback;
}
</script>
<template>
<Card :bordered="false" class="fees-card">
<template #title>
<span class="section-title">起送与配送费</span>
</template>
<div class="fees-field-grid">
<div class="fees-field">
<label>起送金额</label>
<div class="fees-input-row">
<span class="fees-unit">¥</span>
<InputNumber
:value="props.minimumOrderAmount"
:min="0"
:precision="2"
:step="1"
:controls="false"
class="fees-input"
placeholder="如15.00"
@update:value="
(value) =>
props.onSetMinimumOrderAmount(
toNumber(value, props.minimumOrderAmount),
)
"
/>
</div>
<div class="fees-hint">低于此金额的订单无法下单</div>
</div>
<div class="fees-field">
<label>基础配送费</label>
<div class="fees-input-row">
<span class="fees-unit">¥</span>
<InputNumber
:value="props.baseDeliveryFee"
:min="0"
:precision="2"
:step="1"
:controls="false"
class="fees-input"
placeholder="如3.00"
@update:value="
(value) =>
props.onSetBaseDeliveryFee(
toNumber(value, props.baseDeliveryFee),
)
"
/>
</div>
<div class="fees-hint">每笔订单默认收取的配送费</div>
</div>
<div class="fees-field">
<label>免配送费门槛</label>
<div class="fees-input-row">
<span class="fees-unit">¥</span>
<InputNumber
:value="props.freeDeliveryThreshold ?? undefined"
:min="0"
:precision="2"
:step="1"
:controls="false"
class="fees-input"
placeholder="如30.00"
@update:value="
(value) =>
props.onSetFreeDeliveryThreshold(
value === null || value === undefined
? null
: toNumber(value, props.freeDeliveryThreshold ?? 0),
)
"
/>
</div>
<div class="fees-hint">订单满此金额免配送费留空则不启用</div>
</div>
</div>
<div class="fees-actions">
<Button :disabled="props.isSaving" @click="emit('reset')">重置</Button>
<Button type="primary" :loading="props.isSaving" @click="emit('save')">
保存设置
</Button>
</div>
</Card>
</template>