Files
TakeoutSaaS.C-Side-Mini-Pro…/src/pages/trade/checkout/index.vue

231 lines
9.3 KiB
Vue
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="checkout-page">
<!-- Empty State -->
<view v-if="!itemCount" class="checkout-page__empty-card">
<text class="checkout-page__empty-title">购物车还是空的</text>
<text class="checkout-page__empty-desc">先去点餐页加购吧</text>
<view class="checkout-page__empty-btn" @click="goMenu">
<text>去点餐</text>
</view>
</view>
<template v-else>
<!-- Scene Tabs -->
<view class="checkout-page__scene-tabs">
<view
v-for="option in appStore.sceneOptions"
:key="option.value"
class="checkout-page__scene-tab"
:class="{ 'checkout-page__scene-tab--active': appStore.scene === option.value }"
@click="appStore.setScene(option.value)"
>
<text>{{ option.label }}</text>
</view>
</view>
<!-- Store Card -->
<view class="checkout-page__oc-card">
<view class="checkout-page__store">
<view class="checkout-page__store-icon">
<text>🏠</text>
</view>
<view class="checkout-page__store-info">
<text class="checkout-page__store-name">{{ appStore.currentStore.name }}</text>
<view class="checkout-page__store-meta">
<view class="checkout-page__mode-badge">
<text>{{ sceneLabel }}{{ sceneSuffix }}</text>
</view>
<text class="checkout-page__store-hint">{{ sceneHint }}</text>
</view>
</view>
</view>
</view>
<!-- Delivery: Address -->
<view v-if="appStore.scene === 'Delivery'" class="checkout-page__oc-card">
<view class="checkout-page__dash-divider" />
<view class="checkout-page__address" @click="goSceneContext">
<view class="checkout-page__addr-icon">
<text>📍</text>
</view>
<view class="checkout-page__addr-body">
<view class="checkout-page__addr-name">
<text>{{ draftName }}</text>
<text class="checkout-page__addr-phone">{{ draftPhone }}</text>
</view>
<text class="checkout-page__addr-detail">
{{ fulfillmentStore.addressText || '请填写配送地址' }}
</text>
</view>
<text class="checkout-page__addr-arrow"></text>
</view>
</view>
<!-- Pickup: Contact + info -->
<view v-if="appStore.scene === 'Pickup'" class="checkout-page__oc-card">
<view class="checkout-page__oc-card-body">
<view class="checkout-page__pickup-contact">
<view class="checkout-page__addr-icon checkout-page__addr-icon--green">
<text>👤</text>
</view>
<view class="checkout-page__pickup-contact-body">
<view class="checkout-page__addr-name">
<text>{{ draftName }}</text>
<text class="checkout-page__addr-phone">{{ draftPhone }}</text>
</view>
<text class="checkout-page__addr-detail">自提门店{{ appStore.currentStore.name }}</text>
</view>
</view>
<view class="checkout-page__pickup-hint">
<text>🕐</text>
<text class="checkout-page__pickup-hint-text">预计取餐时间 15 分钟后</text>
</view>
</view>
</view>
<!-- DineIn: Table Number -->
<view v-if="appStore.scene === 'DineIn'" class="checkout-page__oc-card">
<view class="checkout-page__oc-card-body">
<view class="checkout-page__dinein-table">
<view class="checkout-page__addr-icon checkout-page__addr-icon--green">
<text>📅</text>
</view>
<view class="checkout-page__table-num">
<text class="checkout-page__table-label">桌号</text>
<text class="checkout-page__table-value">{{ fulfillmentStore.tableNo || '--' }}</text>
</view>
</view>
<view class="checkout-page__dinein-contact">
<view class="checkout-page__addr-icon checkout-page__addr-icon--green checkout-page__addr-icon--sm">
<text>👤</text>
</view>
<view>
<text class="checkout-page__dinein-name">{{ draftName }}</text>
<text class="checkout-page__dinein-phone">{{ draftPhone }}</text>
</view>
</view>
<view class="checkout-page__pickup-hint">
<text>🛡</text>
<text class="checkout-page__pickup-hint-text">下单后商家将尽快制作请留意取餐提醒</text>
</view>
</view>
</view>
<!-- Customer Info -->
<view class="checkout-page__oc-card">
<view class="checkout-page__oc-card-body">
<text class="checkout-page__field-title">顾客信息</text>
<input class="field-input" :value="draftName" placeholder="请输入顾客姓名" @input="handleNameInput" />
<input class="field-input checkout-page__field-gap" :value="draftPhone" type="number" placeholder="请输入手机号" @input="handlePhoneInput" />
</view>
</view>
<!-- Product List -->
<view class="checkout-page__oc-card">
<view class="checkout-page__goods-title">
<text class="checkout-page__goods-title-text">商品清单</text>
<text class="checkout-page__goods-count"> {{ itemCount }} </text>
</view>
<view class="checkout-page__goods-list">
<view v-for="line in lineList" :key="line.lineKey" class="checkout-page__good">
<image
v-if="line.coverImageUrl"
class="checkout-page__good-img"
:src="line.coverImageUrl"
mode="aspectFill"
/>
<view class="checkout-page__good-info">
<text class="checkout-page__good-name">{{ line.name }}</text>
<text v-if="line.specText" class="checkout-page__good-spec">{{ line.specText }}</text>
</view>
<view class="checkout-page__good-right">
<text class="checkout-page__good-price"><text class="checkout-page__good-unit">¥</text>{{ line.lineAmountText }}</text>
<text class="checkout-page__good-qty">×{{ line.quantity }}</text>
</view>
</view>
</view>
</view>
<!-- Remark -->
<view class="checkout-page__oc-card">
<view class="checkout-page__remark">
<text class="checkout-page__remark-title"> 订单备注</text>
<input class="field-input" type="text" placeholder="如少冰、少辣、不要香菜等" :value="remark" @input="handleRemarkInput" />
</view>
</view>
<!-- Fees -->
<view class="checkout-page__oc-card">
<view class="checkout-page__fees">
<view class="checkout-page__fee-row">
<text class="checkout-page__fee-label">商品小计</text>
<text class="checkout-page__fee-value">¥{{ estimate.originalAmountText }}</text>
</view>
<view class="checkout-page__fee-row">
<text class="checkout-page__fee-label">打包费</text>
<text class="checkout-page__fee-value">¥{{ estimate.packagingFeeText }}</text>
</view>
<view v-if="appStore.scene === 'Delivery'" class="checkout-page__fee-row">
<text class="checkout-page__fee-label">配送费</text>
<text class="checkout-page__fee-value">¥{{ estimate.deliveryFeeText }}</text>
</view>
<view v-if="estimate.discountAmount > 0" class="checkout-page__fee-row">
<text class="checkout-page__fee-label">优惠抵扣</text>
<text class="checkout-page__fee-value checkout-page__fee-value--green">-¥{{ estimate.discountAmountText }}</text>
</view>
<view class="checkout-page__fee-row checkout-page__fee-row--total">
<text class="checkout-page__fee-label">应付金额</text>
<text class="checkout-page__fee-value checkout-page__fee-value--total">
<text class="checkout-page__fee-unit">¥</text>{{ estimate.payableAmountText }}
</text>
</view>
</view>
</view>
<!-- Bottom Submit Bar -->
<view class="checkout-page__submit-bar">
<view class="checkout-page__submit-left">
<text class="checkout-page__submit-label">应付金额</text>
<view class="checkout-page__submit-price">
<text class="checkout-page__submit-unit">¥</text>
<text class="checkout-page__submit-value">{{ estimate.payableAmountText }}</text>
</view>
<text v-if="estimate.discountAmount > 0" class="checkout-page__submit-saved">已优惠 ¥{{ estimate.discountAmountText }}</text>
</view>
<view class="checkout-page__submit-btn" @click="submitOrder">
<text>{{ submitting ? '提交中...' : '提交订单' }}</text>
</view>
</view>
</template>
</view>
</template>
<script setup lang="ts">
import { useCheckoutPage } from './composables/useCheckoutPage'
const {
appStore,
draftName,
draftPhone,
estimate,
fulfillmentStore,
goMenu,
goSceneContext,
handleNameInput,
handlePhoneInput,
handleRemarkInput,
itemCount,
lineList,
remark,
sceneHint,
sceneLabel,
sceneSuffix,
submitOrder,
submitting
} = useCheckoutPage()
</script>
<style lang="scss">
@use './styles/index.scss';
</style>