|
|
@@ -0,0 +1,374 @@
|
|
|
+<template>
|
|
|
+ <!-- 订单详情页面 -->
|
|
|
+ <view class="content">
|
|
|
+ <!-- 菜品清单 -->
|
|
|
+ <view class="card">
|
|
|
+ <!-- 店铺信息 -->
|
|
|
+ <view class="store-info">
|
|
|
+ <view class="store-info-title">正旗手选海鲜烧烤(东港店)</view>
|
|
|
+ <view class="store-info-address">辽宁省大连市甘井子区高新技术产业园区礼贤街39A号一层</view>
|
|
|
+ </view>
|
|
|
+ <view class="card-header">
|
|
|
+ <view class="card-header-title">菜品详情</view>
|
|
|
+ </view>
|
|
|
+ <view class="card-content">
|
|
|
+ <view class="info-food">
|
|
|
+ <view v-for="(item, index) in foodList" :key="item.id || index" class="food-item">
|
|
|
+ <!-- 菜品图片 -->
|
|
|
+ <image :src="getFileUrl(item.image)" mode="aspectFill" class="food-item__image"></image>
|
|
|
+
|
|
|
+ <!-- 菜品信息 -->
|
|
|
+ <view class="food-item__info">
|
|
|
+ <view class="food-item__name">{{ item.name }}</view>
|
|
|
+ <view class="food-item__desc" v-if="item.tags && item.tags.length > 0">
|
|
|
+ <text v-for="(tag, tagIndex) in item.tags" :key="tagIndex" class="food-item__tag">
|
|
|
+ {{ tag.text }}<text v-if="tagIndex < item.tags.length - 1">,</text>
|
|
|
+ </text>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <!-- 价格和数量 -->
|
|
|
+ <view class="food-item__right">
|
|
|
+ <view class="food-item__price">
|
|
|
+ <text class="price-main">¥{{ item.price }}</text>
|
|
|
+ </view>
|
|
|
+ <view class="food-item__quantity">{{ item.quantity || 1 }}份</view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <view class="card-header">
|
|
|
+ <view class="card-header-title">价格明细</view>
|
|
|
+ </view>
|
|
|
+ <view class="card-content">
|
|
|
+ <view class="info-item">
|
|
|
+ <view class="info-item-label">菜品总价</view>
|
|
|
+ <view class="info-item-value">1234567890</view>
|
|
|
+ </view>
|
|
|
+ <view class="info-item">
|
|
|
+ <view class="info-item-label">餐具费</view>
|
|
|
+ <view class="info-item-value">1234567890</view>
|
|
|
+ </view>
|
|
|
+ <view class="info-item">
|
|
|
+ <view class="info-item-label">优惠券</view>
|
|
|
+ <view class="info-item-value">1234567890</view>
|
|
|
+ </view>
|
|
|
+ <view class="price-line">
|
|
|
+ <view class="price-line-label">合计</view>
|
|
|
+ <view class="price-line-value">¥890</view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+
|
|
|
+ <!-- 订单卡片 -->
|
|
|
+ <view class="card">
|
|
|
+ <view class="card-header">
|
|
|
+ <view class="card-header-title">订单信息</view>
|
|
|
+ </view>
|
|
|
+ <view class="card-content">
|
|
|
+ <view class="info-item">
|
|
|
+ <view class="info-item-label">订单编号</view>
|
|
|
+ <view class="info-item-value">1234567890</view>
|
|
|
+ </view>
|
|
|
+ <view class="info-item">
|
|
|
+ <view class="info-item-label">就餐桌号</view>
|
|
|
+ <view class="info-item-value">1234567890</view>
|
|
|
+ </view>
|
|
|
+ <view class="info-item">
|
|
|
+ <view class="info-item-label">用餐人数</view>
|
|
|
+ <view class="info-item-value">1234567890</view>
|
|
|
+ </view>
|
|
|
+ <view class="info-item">
|
|
|
+ <view class="info-item-label">下单时间</view>
|
|
|
+ <view class="info-item-value">1234567890</view>
|
|
|
+ </view>
|
|
|
+ <view class="info-item">
|
|
|
+ <view class="info-item-label">联系电话</view>
|
|
|
+ <view class="info-item-value">1234567890</view>
|
|
|
+ </view>
|
|
|
+ <view class="info-item">
|
|
|
+ <view class="info-item-label">备注信息</view>
|
|
|
+ <view class="info-item-value">1234567890</view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <!-- 底部按钮 -->
|
|
|
+ <view class="bottom-button">
|
|
|
+ <view class="bottom-button-text1 " hover-class="hover-active" @click="handleConfirmOrder">去加餐</view>
|
|
|
+ <view class="bottom-button-text" hover-class="hover-active" @click="handleConfirmPay">去结算</view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ </view>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { onLoad } from "@dcloudio/uni-app";
|
|
|
+import { ref } from "vue";
|
|
|
+import { go } from "@/utils/utils.js";
|
|
|
+import { getFileUrl } from "@/utils/file.js";
|
|
|
+
|
|
|
+const payType = ref('confirmOrder'); // confirmOrder 确认下单 confirmPay 确认支付
|
|
|
+
|
|
|
+// 菜品列表数据(示例数据,实际应该从购物车或订单数据中获取)
|
|
|
+const foodList = ref([
|
|
|
+ {
|
|
|
+ id: 1,
|
|
|
+ name: '石板肉酱豆腐',
|
|
|
+ price: 19.9,
|
|
|
+ image: '/static/demo.png',
|
|
|
+ tags: [
|
|
|
+ { text: '份', type: 'normal' },
|
|
|
+ { text: '微辣', type: 'spicy' }
|
|
|
+ ],
|
|
|
+ quantity: 1
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 2,
|
|
|
+ name: '经典三杯鸡',
|
|
|
+ price: 26.9,
|
|
|
+ image: '/static/demo.png',
|
|
|
+ tags: [
|
|
|
+ { text: '份', type: 'normal' }
|
|
|
+ ],
|
|
|
+ quantity: 1
|
|
|
+ }
|
|
|
+]);
|
|
|
+
|
|
|
+const handleConfirmOrder = () => {
|
|
|
+ go('/pages/result/index');
|
|
|
+};
|
|
|
+
|
|
|
+onLoad((e) => {
|
|
|
+ if (e.payType) payType.value = e.payType;
|
|
|
+ // TODO: 从存储或接口获取订单菜品数据
|
|
|
+ // const cartList = uni.getStorageSync('cartList') || [];
|
|
|
+ // foodList.value = cartList.filter(item => item.quantity > 0);
|
|
|
+});
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.content {
|
|
|
+ padding: 0 30rpx 300rpx;
|
|
|
+}
|
|
|
+
|
|
|
+.card {
|
|
|
+ background-color: #fff;
|
|
|
+ border-radius: 24rpx;
|
|
|
+ padding: 30rpx 0;
|
|
|
+ margin-top: 20rpx;
|
|
|
+
|
|
|
+ .card-header {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ padding: 0 30rpx;
|
|
|
+ height: 40rpx;
|
|
|
+ position: relative;
|
|
|
+ font-size: 27rpx;
|
|
|
+ color: #151515;
|
|
|
+ font-weight: bold;
|
|
|
+ }
|
|
|
+
|
|
|
+ .tag {
|
|
|
+ width: 10rpx;
|
|
|
+ height: 42rpx;
|
|
|
+ background: linear-gradient(35deg, #FCB73F 0%, #FC733D 100%);
|
|
|
+ border-radius: 0rpx 0rpx 0rpx 0rpx;
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ top: 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ .card-content {
|
|
|
+ padding: 0 30rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .info-item {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ margin-top: 20rpx;
|
|
|
+ font-size: 27rpx;
|
|
|
+
|
|
|
+ .info-item-label {
|
|
|
+ color: #666666;
|
|
|
+ }
|
|
|
+
|
|
|
+ .info-item-value {
|
|
|
+ color: #151515;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .info-item-textarea {
|
|
|
+ width: 100%;
|
|
|
+ height: 115rpx;
|
|
|
+ border-radius: 8rpx;
|
|
|
+ border: 1rpx solid #F2F2F2;
|
|
|
+ margin-top: 20rpx;
|
|
|
+ font-size: 23rpx;
|
|
|
+ color: #AAAAAA;
|
|
|
+ box-sizing: border-box;
|
|
|
+ padding: 20rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .info-food {
|
|
|
+ margin-top: 20rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .food-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ padding: 20rpx 0;
|
|
|
+
|
|
|
+ &:last-child {
|
|
|
+ border-bottom: none;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__image {
|
|
|
+ width: 118rpx;
|
|
|
+ height: 118rpx;
|
|
|
+ border-radius: 8rpx;
|
|
|
+ flex-shrink: 0;
|
|
|
+ background-color: #f5f5f5;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__info {
|
|
|
+ flex: 1;
|
|
|
+ margin-left: 20rpx;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ justify-content: center;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__name {
|
|
|
+ font-size: 28rpx;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #151515;
|
|
|
+ margin-bottom: 8rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__desc {
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: #666666;
|
|
|
+ line-height: 1.5;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__tag {
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: #666666;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__right {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: flex-end;
|
|
|
+ justify-content: center;
|
|
|
+ margin-left: 20rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__price {
|
|
|
+ display: flex;
|
|
|
+ align-items: baseline;
|
|
|
+ color: #151515;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-bottom: 8rpx;
|
|
|
+
|
|
|
+ .price-symbol {
|
|
|
+ font-size: 20rpx;
|
|
|
+ margin-right: 2rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .price-main {
|
|
|
+ font-size: 28rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .price-decimal {
|
|
|
+ font-size: 24rpx;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &__quantity {
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: #797979;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .price-line {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ margin-top: 20rpx;
|
|
|
+ font-size: 27rpx;
|
|
|
+ color: #151515;
|
|
|
+ border-top: 1rpx solid rgba(170, 170, 170, 0.15);
|
|
|
+ font-weight: bold;
|
|
|
+ padding-top: 20rpx;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.bottom-button {
|
|
|
+ width: 100%;
|
|
|
+ background-color: #fff;
|
|
|
+ padding: 20rpx 30rpx;
|
|
|
+ box-sizing: border-box;
|
|
|
+ position: fixed;
|
|
|
+ bottom: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ z-index: 999;
|
|
|
+ padding-bottom: env(safe-area-inset-bottom);
|
|
|
+ box-shadow: 0rpx -11rpx 46rpx 0rpx rgba(0, 0, 0, 0.05);
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ .bottom-button-text1 {
|
|
|
+ font-size: 32rpx;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #fff;
|
|
|
+ width: 324rpx;
|
|
|
+ height: 80rpx;
|
|
|
+ border-radius: 23rpx 23rpx 23rpx 23rpx;
|
|
|
+ border: 2rpx solid #F47D1F;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ color: #F47D1F;
|
|
|
+ justify-content: center;
|
|
|
+ }
|
|
|
+
|
|
|
+ .bottom-button-text {
|
|
|
+ font-size: 32rpx;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #fff;
|
|
|
+ background: linear-gradient(90deg, #FCB73F 0%, #FC743D 100%);
|
|
|
+ border-radius: 23rpx 23rpx 23rpx 23rpx;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ width: 324rpx;
|
|
|
+ height: 80rpx;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.store-info {
|
|
|
+ border-bottom: 1rpx solid rgba(170, 170, 170, 0.15);
|
|
|
+ box-sizing: border-box;
|
|
|
+ margin: 0 30rpx 30rpx;
|
|
|
+
|
|
|
+ .store-info-title {
|
|
|
+ font-size: 27rpx;
|
|
|
+ color: #151515;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-bottom: 10rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .store-info-address {
|
|
|
+ font-size: 23rpx;
|
|
|
+ color: #AAAAAA;
|
|
|
+ margin-bottom: 30rpx;
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|