“项目-任务-工单式”活页教材-Uni-App混合开发

任务5-1操作步骤:已下单订单状态

2025-01-09  本文已影响0人  吴国友

任务五 工单1

效果图:

5.1.1 订单信息效果图.png

1、团队小组成员已在支付结算界面完成操作后,将模拟的订单数据存储于store的order中,并通过mapState(['order'])方法获取了模拟的订单信息。
利用Object.keys(order).length来判断用户是否存在商品订单,并据此执行相应的界面逻辑处理。若Object.keys(order).length的值为0,则展示无订单状态;若其值不为0,则展示取餐详情。

<view class="container">
        <!-- 无订单 begin -->
        <view v-if="!Object.keys(order).length"
...
...
                <view>您还没有点单</view>
                <view>快去犒劳一下自己吧~</view>
            </view>
...
        </view>
        <!-- 无订单 end -->
        <!-- 取餐详情 begin -->
        <template v-else>
            <view class="order-box">
...
...

在订单存在的情况下,可以通过order.status来判断当前奶茶的制作进度状态。若取餐类型为“自取”,则奶茶的进度存在三种状态;若取餐类型为“外卖”,则存在四种状态。具体状态如图5.1.2、5.1.3所示。相关代码如下:


5.1.2 奶茶制作状态(自取).png
5.1.3 奶茶制作状态(外卖).png
    <view class="steps__text-column">
        <view class="steps__text-column-item" :class="{active: order.status >= 1}">
            <view class="steps__column-item-line bg-transparent"></view>
            <view class="steps__text-column-item-text">已下单</view>
            <view class="steps__column-item-line"></view>
        </view>
        <view class="steps__text-column-item" :class="{active: order.status >= 2}">
            <view class="steps__column-item-line"></view>
            <view class="steps__text-column-item-text">制作中</view>
            <view class="steps__column-item-line"></view>
        </view>
        <view class="steps__text-column-item" :class="{active: order.status >= 3}"
            v-if="order.typeCate == 2">
            <view class="steps__column-item-line"></view>
            <view class="steps__text-column-item-text">配送中</view>
            <view class="steps__column-item-line"></view>
        </view>
        <view class="steps__text-column-item" :class="{active: order.status >= 4}">
            <view class="steps__column-item-line"></view>
            <view class="steps__text-column-item-text">
                {{ order.typeCate == 2 ? '已送达' : '请取餐' }}
            </view>
            <view class="steps__column-item-line bg-transparent"></view>
        </view>
    </view>

订单信息包含下单时间,需将util.js工具类引入至common文件夹以备后用,在main.js中执行引入操作,详见图5.1.4。通过调用formatDateTime()方法,将时间戳转换为yyyy-MM-dd hh:mm:ss格式的时间,具体操作参见图5.1.5。


5.1.4 main.js中引入.png 5.1.5 引入util.js工具类.png

鉴于订单状态信息布局涉及众多参数,详细说明请参见表1。



2、若“取餐信息”界面中未显示用户订单信息,用户可通过点击“去点餐”按钮,利用@tap="menu"方法实现跳转至点餐界面。具体实现代码如下所示。

    menu() {
        uni.switchTab({
            url: '/pages/menu/menu'
        })
    }

涉及take-fooods.vue代码

<template>
    <view class="container">
        <!-- 无订单 begin -->
        <view v-if="!Object.keys(order).length"
            class="d-flex w-100 h-100 flex-column just-content-center align-items-center">
            <image src="/static/images/loading.gif" class="drinks-img"></image>
            <view class="tips d-flex flex-column align-items-center font-size-base text-color-assist">
                <view>您还没有点单</view>
                <view>快去犒劳一下自己吧~</view>
            </view>
            <button type="primary" class="drink-btn" size="default" @tap="menu">去点餐</button>
            <view class="font-size-sm text-color-primary" @tap="orders">查看历史订单</view>
        </view>
        <!-- 无订单 end -->
        <!-- 取餐详情 begin -->
        <template v-else>
            <view class="order-box">
                <view class="bg-white">
                    <view class="section">
                        <!-- store info begin -->
                        <list-cell :hover="false">
                            <view class="w-100 d-flex align-items-center">
                                <view class="d-flex flex-column w-60">
                                    <view class="w-100 font-size-lg text-color-base text-truncate">
                                        {{ order.store.name }}</view>
                                </view>
                                <view class="d-flex justify-content-end align-items-center w-40">
                                    <image src="/static/images/order/mobile.png"
                                        style="width: 60rpx; height: 60rpx;margin-right: 30rpx;"></image>
                                    <image src="/static/images/order/navigation.png"
                                        style="width: 60rpx; height: 60rpx;"></image>
                                </view>
                            </view>
                        </list-cell>
                        <!-- store info end -->
                        <list-cell :hover="false" padding="50rpx 30rpx">
                            <view class="w-100 d-flex flex-column">
                                <view class="d-flex align-items-center just-content-center" v-if="order.typeCate == 1">
                                    <view class="sort-num">{{ order.sort_num }}</view>
                                </view>
                                <!-- steps begin -->
                                <view class="d-flex just-content-center">
                                    <view class="steps d-flex flex-column"
                                        :class="{'w-80': order.typeCate == 1, 'w-100': order.typeCate == 2}">
                                        <!-- 步骤 -->
                                        <view class="steps__img-column">
                                            <view class="steps__img-column-item">
                                                <image src="/static/images/order/ordered_selected.png"
                                                    v-if="order.status >= 1"></image>
                                                <image src="/static/images/order/ordered_selected.png" v-else></image>
                                            </view>
                                            <view class="steps__img-column-item" :class="{active: order.status >= 2}">
                                                <image src="/static/images/order/production_selected.png"
                                                    v-if="order.status >= 2"></image>
                                                <image src="/static/images/order/production.png" v-else></image>
                                            </view>
                                            <view class="steps__img-column-item" :class="{active: order.status >= 3}"
                                                v-if="order.typeCate == 2">
                                                <image src="/static/images/order/delivery_selected.png"
                                                    v-if="order.status >= 3"></image>
                                                <image src="/static/images/order/delivered.png" v-else></image>
                                            </view>
                                            <view class="steps__img-column-item" :class="{active: order.status >= 4}">
                                                <image src="/static/images/order/delivered_selected.png"
                                                    v-if="order.status >= 4"></image>
                                                <image src="/static/images/order/delivered.png" v-else></image>
                                            </view>
                                        </view>
                                        <!-- 步骤文字 -->
                                        <view class="steps__text-column">
                                            <view class="steps__text-column-item" :class="{active: order.status >= 1}">
                                                <view class="steps__column-item-line bg-transparent"></view>
                                                <view class="steps__text-column-item-text">已下单</view>
                                                <view class="steps__column-item-line"></view>
                                            </view>
                                            <view class="steps__text-column-item" :class="{active: order.status >= 2}">
                                                <view class="steps__column-item-line"></view>
                                                <view class="steps__text-column-item-text">制作中</view>
                                                <view class="steps__column-item-line"></view>
                                            </view>
                                            <view class="steps__text-column-item" :class="{active: order.status >= 3}"
                                                v-if="order.typeCate == 2">
                                                <view class="steps__column-item-line"></view>
                                                <view class="steps__text-column-item-text">配送中</view>
                                                <view class="steps__column-item-line"></view>
                                            </view>
                                            <view class="steps__text-column-item" :class="{active: order.status >= 4}">
                                                <view class="steps__column-item-line"></view>
                                                <view class="steps__text-column-item-text">
                                                    {{ order.typeCate == 2 ? '已送达' : '请取餐' }}
                                                </view>
                                                <view class="steps__column-item-line bg-transparent"></view>
                                            </view>
                                        </view>
                                    </view>
                                </view>
                                <!-- steps end -->
                                <view v-if="order.status<=1"
                                    class="d-flex just-content-center align-items-center font-size-base text-color-assist mb-40">
                                    您前面还有 <text class="text-color-primary mr-10 ml-10">4</text> 单待制作
                                </view>
                                <!-- goods begin -->
                                <view class="w-100 d-flex flex-column position-relative mt-30"
                                    style="margin-bottom: -40rpx;">
                                    <view class="w-100 d-flex align-items-center mb-40"
                                        v-for="(good, index) in order.goods" :key="index">
                                        <view class="d-flex flex-column w-60 overflow-hidden">
                                            <view class="font-size-lg text-color-base mb-10 text-truncate">
                                                {{ good.name }}</view>
                                            <view class="font-size-sm text-color-assist text-truncate">
                                                {{ good.property }}</view>
                                        </view>
                                        <view class="d-flex w-40 align-items-center justify-content-between pl-30">
                                            <view class="font-size-base text-color-base">x{{ good.number }}</view>
                                            <view class="font-size-base text-color-base font-weight-bold">
                                                ¥{{ good.price }}</view>
                                        </view>
                                    </view>
                                </view>
                                <!-- goods end -->
                            </view>
                        </list-cell>
                    </view>
                    <view class="section">
                        <!-- payment and amount begin -->
                        <list-cell :hover="false" padding="50rpx 30rpx">
                            <view class="w-100 d-flex flex-column">
                                <view class="pay-cell">
                                    <view>支付方式</view>
                                    <view class="font-weight-bold">{{ order.pay_mode }}</view>
                                </view>
                                <view class="pay-cell">
                                    <view>金额总计</view>
                                    <view class="font-weight-bold">¥{{ order.amount }}</view>
                                </view>
                            </view>
                        </list-cell>
                        <!-- payment and amount end -->
                    </view>
                    <view class="section">
                        <!-- order info begin -->
                        <list-cell :hover="false" padding="50rpx 30rpx">
                            <view class="w-100 d-flex flex-column">
                                <view class="pay-cell">
                                    <view>下单时间</view>
                                    <view class="font-weight-bold">{{ $util.formatDateTime(order.created_at) }}</view>
                                </view>
                                <view class="pay-cell">
                                    <view>下单门店</view>
                                    <view class="font-weight-bold">{{ order.store.name }}</view>
                                </view>
                                <view class="pay-cell">
                                    <view>支付方式</view>
                                    <view class="font-weight-bold">{{ order.pay_mode }}</view>
                                </view>
                                <view class="pay-cell">
                                    <view>订单号</view>
                                    <view class="font-weight-bold">{{ order.order_no }}</view>
                                </view>
                            </view>
                        </list-cell>
                        <!-- order info end -->
                    </view>
                    <!-- order other info begin -->
                    <list-cell :hover="false" padding="50rpx 30rpx 120rpx" last>
                        <view class="w-100 d-flex flex-column">
                            <view class="pay-cell">
                                <view>取单号</view>
                                <view class="font-weight-bold">{{ order.sort_num }}</view>
                            </view>
                            <view class="pay-cell">
                                <view>享用方式</view>
                                <view class="font-weight-bold">自取</view>
                            </view>
                            <view class="pay-cell">
                                <view>取餐时间</view>
                                <view class="font-weight-bold">立即取餐</view>
                            </view>
                            <view class="pay-cell">
                                <view>完成制作时间</view>
                                <view class="font-weight-bold">{{ order.productioned_time }}</view>
                            </view>
                            <view class="pay-cell">
                                <view>备注</view>
                                <view class="font-weight-bold">{{ order.postscript }}</view>
                            </view>
                        </view>
                    </list-cell>
                    <!-- order other info end -->
                </view>
            </view>
        </template>
        <!-- 取餐详情 end -->
    </view>
</template>

<script>
    import {
        mapState
    } from 'vuex'
    export default {
        data() {
            return {

            }
        },
        computed: {
            ...mapState(['order'])
        },
        methods: {
            menu() {
                uni.switchTab({
                    url: '/pages/menu/menu'
                })
            },
            orders() {
                //如果未登录,如何判断是否登录
                if (!this.$store.getters.isLogin) {
                    uni.navigateTo({
                        url: '/pages/login/login'
                    })
                    return
                }
                //如果已登录
                uni.navigateTo({
                    url: '/pages/orders/orders'
                })
            },
        }
    }
</script>

<style lang="scss" scoped>
    /* #ifdef H5 */
    page {
        min-height: 100%;
        background-color: $bg-color;
    }

    /* #endif */
    .order-box {
        padding: 20rpx;
        /* #ifdef H5 */
        margin-bottom: 100rpx;
        /* #endif */
    }

    .drinks-img {
        width: 260rpx;
        height: 260rpx;
    }

    .tips {
        margin: 60rpx 0 80rpx;
        line-height: 48rpx;
    }

    .drink-btn {
        width: 320rpx;
        border-radius: 50rem !important;
        margin-bottom: 40rpx;
        font-size: $font-size-base;
        line-height: 3.0;
    }


    @mixin arch {
        content: "";
        position: absolute;
        background-color: $bg-color;
        width: 30rpx;
        height: 30rpx;
        bottom: -15rpx;
        z-index: 10;
        border-radius: 100%;
    }

    .section {
        position: relative;

        &::before {
            @include arch;
            left: -15rpx;
        }

        &::after {
            @include arch;
            right: -15rpx;
        }
    }

    .pay-cell {
        width: 100%;
        display: flex;
        align-items: center;
        justify-content: space-between;
        font-size: $font-size-base;
        color: $text-color-base;
        margin-bottom: 40rpx;

        &:nth-last-child(1) {
            margin-bottom: 0;
        }
    }

    .sort-num {
        font-size: 64rpx;
        font-weight: bold;
        color: $text-color-base;
        line-height: 2;
    }

    .steps__img-column {
        display: flex;
        margin: 30rpx 0;

        .steps__img-column-item {
            flex: 1;
            display: flex;
            align-items: center;
            justify-content: center;

            image {
                width: 80rpx;
                height: 80rpx;
            }
        }
    }

    .steps__text-column {
        display: flex;
        margin-bottom: 40rpx;

        .steps__text-column-item {
            flex: 1;
            display: inline-flex;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: $font-size-base;
            color: $text-color-assist;

            &.active {
                color: $text-color-base;
                font-weight: bold;

                .steps__column-item-line {
                    background-color: $text-color-base;
                }
            }

            .steps__column-item-line {
                flex: 1;
                height: 2rpx;
                background-color: #919293;
                transform: scaleY(0.5);
            }

            .steps__text-column-item-text {
                margin: 0 8px;
            }
        }
    }
</style>
上一篇 下一篇

猜你喜欢

热点阅读