| | |
| | | <template> |
| | | <div class="container mx-auto px-4 py-8 bg-white"> |
| | | <!-- 面包屑导航 --> |
| | | <div class="mb-6 text-gray-500"> |
| | | <!-- <div class="mb-6 text-gray-500"> |
| | | <el-breadcrumb separator="/"> |
| | | <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item> |
| | | <el-breadcrumb-item>订单支付</el-breadcrumb-item> |
| | | </el-breadcrumb> |
| | | </div> |
| | | </div> --> |
| | | |
| | | <div class="max-w-4xl mx-auto"> |
| | | <!-- 订单信息 --> |
| | | <div class="bg-gray-50 p-6 rounded-lg mb-6"> |
| | | <div class="flex justify-between items-center mb-4"> |
| | | <h2 class="text-xl font-medium">订单提交成功</h2> |
| | | <div class="text-gray-500">请在 <span class="text-red-500 font-medium">23小时59分</span> 内完成支付</div> |
| | | <div class="text-gray-500"> |
| | | 请在 |
| | | <span class="text-red text-red-500 font-medium" style="color: red; font-weight: 500; font-size: 16px">{{ |
| | | formattedTime |
| | | }}</span> |
| | | 内完成支付 |
| | | </div> |
| | | </div> |
| | | <div class="text-2xl font-bold mb-4"> |
| | | 应付金额:<span class="text-red-500">¥{{ orderInfo.totalAmount }}</span> |
| | | 应付金额:<span class="text-red-500" style="font-size: 24px; color: green">¥{{ orderInfo.totalAmount }}</span> |
| | | </div> |
| | | <div class="text-gray-600"> |
| | | <p>订单编号:{{ orderInfo.orderNo }}</p> |
| | |
| | | :class="{ 'border-blue-500 bg-blue-50': paymentMethod === 'wechat' }" |
| | | @click="paymentMethod = 'wechat'" |
| | | > |
| | | <div class="flex justify-between items-center"> |
| | | <div class="flex items-center gap-3"> |
| | | <img src="@/assets/icons/wechat-pay.svg" alt="微信支付" class="w-8 h-8" /> |
| | | <div class="flex items-center"> |
| | | <!-- <div class="flex items-center gap-3"> |
| | | <img src="@/assets/icons/PAY-WEIXIN.png" alt="微信支付" class="w-8 h-8" /> |
| | | <span class="font-medium">微信支付</span> |
| | | </div> --> |
| | | <!-- <el-radio v-model="paymentMethod" label="wechat" /> --> |
| | | <el-radio v-model="paymentMethod" value="wechat" size="large" border> |
| | | <div class="flex items-center gap-3"> |
| | | <img src="@/assets/icons/PAY-WEIXIN.png" alt="微信支付" class="w-8 h-8" /> |
| | | <span class="font-medium">微信支付</span> |
| | | </div> |
| | | <el-radio v-model="paymentMethod" label="wechat" /> |
| | | </el-radio> |
| | | <el-radio v-model="paymentMethod" value="alipay" size="large" border> |
| | | <div class="flex items-center gap-3"> |
| | | <img src="@/assets/icons/PAY-ALI.png" alt="支付宝" class="w-8 h-8" /> |
| | | <span class="font-medium">支付宝</span> |
| | | </div> |
| | | |
| | | </el-radio> |
| | | </div> |
| | | </div> |
| | | |
| | | <div |
| | | class="border rounded-lg p-4" |
| | | :class="{ 'border-blue-500 bg-blue-50': paymentMethod === 'alipay' }" |
| | | @click="paymentMethod = 'alipay'" |
| | | > |
| | | <div class="flex justify-between items-center"> |
| | | <div class="flex items-center gap-3"> |
| | | <img src="@/assets/icons/alipay.svg" alt="支付宝" class="w-8 h-8" /> |
| | | <span class="font-medium">支付宝</span> |
| | | </div> |
| | | <el-radio v-model="paymentMethod" label="alipay" /> |
| | | </div> |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | <!-- 二维码支付区域 --> |
| | |
| | | |
| | | <!-- 支付按钮 --> |
| | | <div class="mt-8 text-center"> |
| | | <el-button type="primary" size="large" class="w-64" @click="handlePayment"> |
| | | <!-- <el-button type="primary" size="large" class="w-64" @click="handlePayment"> |
| | | 立即支付 ¥{{ orderInfo.totalAmount }} |
| | | </el-button> |
| | | <div class="mt-4"> |
| | | <el-button text @click="cancelPayment">取消支付</el-button> |
| | | </el-button> --> |
| | | <div class="mt-4 text-danger"> |
| | | <el-button type="danger" @click="cancelPayment">取消支付</el-button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | |
| | | <script setup lang="ts"> |
| | | import { ElMessage } from 'element-plus'; |
| | | import { computed, ref } from 'vue'; |
| | | import { computed, ref, onMounted, onUnmounted } from 'vue'; |
| | | import { useRouter } from 'vue-router'; |
| | | import wechartQrcode from '@/assets/qrcode/qrcode-wechat.png'; |
| | | import alipayQrcode from '@/assets/qrcode/qrcode-alipay.png'; |
| | | |
| | | const router = useRouter(); |
| | | const paymentMethod = ref(''); |
| | | const paymentMethod = ref('wechat'); |
| | | |
| | | // 模拟订单信息 |
| | | const orderInfo = ref({ |
| | | orderNo: 'DD' + Date.now(), |
| | | totalAmount: '询价', |
| | | createTime: new Date().toLocaleString(), |
| | | // 倒计时相关状态 |
| | | const remainingMinutes = ref(15); |
| | | const remainingSeconds = ref(0); |
| | | let countdownTimer: number | null = null; |
| | | |
| | | // 格式化时间显示 |
| | | const formattedTime = computed(() => { |
| | | return `${remainingMinutes.value}分${remainingSeconds.value.toString().padStart(2, '0')}秒`; |
| | | }); |
| | | |
| | | // 开始倒计时 |
| | | const startCountdown = () => { |
| | | const endTime = Date.now() + 15 * 60 * 1000; // 15分钟的毫秒数 |
| | | |
| | | countdownTimer = window.setInterval(() => { |
| | | const now = Date.now(); |
| | | const diff = endTime - now; |
| | | |
| | | if (diff <= 0) { |
| | | // 时间到,清除定时器并跳转 |
| | | clearInterval(countdownTimer!); |
| | | ElMessage.warning('支付超时,订单已取消'); |
| | | router.replace('/home'); |
| | | return; |
| | | } |
| | | |
| | | remainingMinutes.value = Math.floor(diff / (1000 * 60)); |
| | | remainingSeconds.value = Math.floor((diff % (1000 * 60)) / 1000); |
| | | }, 1000); |
| | | }; |
| | | |
| | | // 根据支付方式获取对应的二维码图片 |
| | | const getQRCodeImage = computed(() => { |
| | | return paymentMethod.value === 'wechat' ? '/src/assets/qrcode/wechat-qr.svg' : '/src/assets/qrcode/alipay-qr.svg'; |
| | | return paymentMethod.value === 'wechat' ? wechartQrcode : alipayQrcode; |
| | | }); |
| | | |
| | | // 处理支付 |
| | |
| | | // 取消支付 |
| | | const cancelPayment = () => { |
| | | ElMessage.info('取消支付'); |
| | | router.push('/'); |
| | | router.replace('/home'); |
| | | }; |
| | | |
| | | // 模拟订单信息 |
| | | const orderInfo = ref({ |
| | | orderNo: 'DD' + Date.now(), |
| | | totalAmount: '询价', |
| | | createTime: new Date().toLocaleString(), |
| | | }); |
| | | |
| | | onMounted(() => { |
| | | const savedProduct = localStorage.getItem('currentProduct'); |
| | | if (savedProduct) { |
| | | const productData = JSON.parse(savedProduct); |
| | | const price = productData.Price; |
| | | orderInfo.value.totalAmount = price; |
| | | } |
| | | // 启动倒计时 |
| | | startCountdown(); |
| | | }); |
| | | |
| | | // 组件卸载时清除定时器 |
| | | onUnmounted(() => { |
| | | if (countdownTimer) { |
| | | clearInterval(countdownTimer); |
| | | } |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped> |