• vue-homePage 包房预定


    <template>
        <div class="page-home">
            <group>
                <group-title>就餐时间 <span class="time-tip">需提前两天预订</span></group-title>
                <cell title="请选择" :value="datetime" @click.native="showCalendar" is-link></cell>
            </group>
    
            <popup v-model="calendarOptions.show">
                <popup-header
                        left-text="取消"
                        right-text=""
                        title="请选择日期"
                        @on-click-left="dateCancel">
                </popup-header>
                <inline-calendar
                        ref="calendar"
                        @on-change="dateChanged"
                        class="inline-calendar-demo"
                        v-model="calendarOptions.value"
                        v-show="calendarOptions.show"
                        :show-last-month="false"
                        :show-next-month="false"
                        :start-date="startDate"
                        :return-six-rows="false"
                        :replace-text-list="calendarOptions.replaceTextList"
                        :render-function="calendarOptions.buildSlotFn"
                        :disable-past="true"
                        :disable-date-function="calendarOptions.disableDateFunction">
                </inline-calendar>
            </popup>
            <div v-show="false">
                <popup-picker
                        title="选择时间"
                        :data="timeOptions.available"
                        v-model="timeOptions.value"
                        placeholder="选择时间"
                        :show="timeOptions.show"
                        @on-hide="timeHide"
                        @on-show="timeShow">
                </popup-picker>
            </div>
    
            <group-title>请选择包房</group-title>
            <grid>
                <template v-for="room of roomOptions.rooms">
                    <grid-item @click.native="chooseRoom(room)" :class="['room',{'room_active':roomOptions.selected == room.id}]" :label="room.name">
                        <icon slot="icon" name="chair" scale="3"></icon>
                    </grid-item>
                </template>
            </grid>
    
            <group label-width="5em">
                <div class="meal-package" @click="showMenu"><icon name="package" scale="2.5"></icon> 查看套餐</div>
                <popup-picker title="选择套餐" :data="mealOptions.meals" v-model="mealOptions.selectedMeal" @on-hide="mealConfirm"></popup-picker>
                <popup-picker title="就餐人数" :data="mealOptions.people" v-model="mealOptions.number" @on-hide="peopleConfirm"></popup-picker>
            </group>
    
            <group title="联系方式">
                <x-input title="姓名" v-model="order.username" name="username"></x-input>
                <x-input title="手机号" v-model="order.mobile" keyboard="number" is-type="china-mobile"></x-input>
            </group>
    
            <box gap="10px 10px" class='businessTime'>
                 <group-title >营业时间最晚9:30</group-title>
                <x-button @click.native="bookingRoom" :gradients="['#1D62F0', '#19D5FD']">预订包房</x-button>
            </box>
    
            <div v-transfer-dom>
                <popup v-model="mealOptions.show" height="100%" class="meal-page">
                    <popup-header
                            left-text=""
                            right-text="关闭"
                            title="套餐信息"
                            @on-click-right="mealCancel">
                    </popup-header>
    
                    <div class="meal-content" v-for="(items,key) in mealOptions.mealPackages">
                        <button-tab class="button-tab" v-model="mealOptions.tab[key]">
                            <template v-for="(item, idx, j) in items">
                                <button-tab-item @on-item-click="mealOptions.tab[key] = j">{{key}}元{{idx}}套餐</button-tab-item>
                            </template>
                        </button-tab>
                        <template v-for="(item, idx, i) in items" v-if="i === mealOptions.tab[key]">
                            <x-table full-bordered style="background-color:#fff;">
                                <thead>
                                    <tr>
                                        <th colspan="2">{{key}}元 {{idx}}套餐</th>
                                    </tr>
                                </thead>
                                <tbody>
                                <template v-for="(meal,type) in item">
                                    <template v-if="typeof meal === 'object'">
                                        <template v-for="detail,detailIdx in meal">
                                            <tr>
                                                <td v-if="detailIdx === 0" :rowspan="meal.length">{{type}}</td>
                                                <td>{{detail}}</td>
                                            </tr>
                                        </template>
                                    </template>
                                    <template v-else>
                                        <tr>
                                            <td width="30%">{{type}}</td>
                                            <td>{{meal}}</td>
                                        </tr>
                                    </template>
                                </template>
                                </tbody>
                            </x-table>
                        </template>
                    </div>
                </popup>
            </div>
        </div>
    
    </template>
    
    <script>
        import { Grid, GridItem, GroupTitle, InlineCalendar, Popup, PopupPicker, Group, Cell,
            PopupHeader, XInput, Box, XButton, Divider, ButtonTab, ButtonTabItem, XTable } from 'vux'
    
        export default {
            data() {
                return {
                    calendarOptions:{
                        show: false,
                        value: '',
                        listValue: '',
                        replaceTextList: {'TODAY':''},
                        useCustomFn: false,
                        buildSlotFn: (line, index, data) => {
    //                        return /8/.test(data.date) ? '<div style="font-size:12px;text-align:center;">订满</div>' : '<div style="height:19px;"></div>'
                        },
                        disablePast: true,
                        disableFuture: false,
                        disableWeekend: false,
                        disableDateFunction (date) {
                        //    if (date.formatedDate === '2018-1-16') {
                        //        return false
                        //    }
                        },
                    },
                    timeOptions:{
                        available: [['中午','晚饭']],
                        value: [],
                        show: false
                    },
                    roomOptions: {
                        rooms: {
                            room_1: {
                                id: 1,
                                name: '包房一 (1~6人)',
                                active: false,
                                people: [1,2,3,4,5,6]
                            },
                            room_2: {
                                id: 2,
                                name: '包房二 (7~16人)',
                                active: false,
                                people: [7,8,9,10,11,12,13,14,15,16]
                            }
                        },
                        selected: null,
                    },
                    order: {
                        date: '',
                        hour: '',
                        room_id: null,
                        room_name: null,
                        username: null,
                        mobile: null,
                        employee_id: null,
                        people: null,
                        meal: null
                    },
                    mealOptions: {
                        meals: [['1000元','1200元','1500元','1800元','2000元','2600元','3000元','4000元'],
                        ['A 套餐','B 套餐', 'C 套餐']],
                        selectedMeal: [],
                        number: [],
                        people: [],
                        show: false,
                        tab:{
                            '1000':0,
                            '1200':0,
                            '1500':0,
                            '1800':0,
                            '2000':0,
                            '2600':0,
                            '3000':0,
                            '4000':0
                        }
                    },
                }
            },
            computed:{
                datetime() {
                    return this.calendarOptions.value+' '+this.timeOptions.value
                },
                startDate() {
                    const nowDate = new Date();
                    nowDate.setDate(nowDate.getDate() + 2);
                    var y = nowDate.getFullYear();
                    var m = nowDate.getMonth() + 1;
                    var d = nowDate.getDate();
                    var startDate = y + "-" + m + "-" + d;
                    console.log(startDate);
                    return startDate;
                },
            },
            methods: {
                chooseRoom(room) {
                    this.roomOptions.selected = room.id
                    this.order.room_id = room.id
                    this.order.room_name = room.name
                    this.mealOptions.people = []
                    this.mealOptions.people.push(room.people)
                },
                showCalendar() {
                    this.calendarOptions.show = !this.calendarOptions.show
                },
                dateChanged(){
                    this.timeOptions.show = true
                },
                dateCancel() {
                    this.calendarOptions.show = false
                },
                timeShow() {
                    this.calendarOptions.show = false
                },
                timeHide(confirm) {
                    this.timeOptions.show = false
                    if (confirm){
                        this.calendarOptions.show = false
                        this.order.date = this.calendarOptions.value
                        this.order.hour = this.timeOptions.value[0]
                    }else {
                        this.calendarOptions.show = true
                    }
                },
                bookingRoom() {
                    let result = this.validate()
                    if (result.code === 'error') {
                        this.$vux.toast.show({
                            text: result.msg,
                            type: 'text'
                        })
                        return false
                    }
    
                    this.$http.post('/zhongrong/api/booking-room',{ZhongrongRoomOrder:this.order}).then((response) => {
                        if (response.data.status == 1) {
                            this.$vux.toast.show({
                                text: '预订成功',
                                type: 'success'
                            })
                            setTimeout(() => {
                                this.$router.push({path:'/user'});
                            }, 1000)
                        } else {
                            this.$vux.toast.show({
                                text: response.data.message,
                                type: 'cancel'
                            })
                        }
                    }).catch((error) => {
                        this.$vux.toast.show({
                            text: '预订错误:网络出现问题',
                            type: 'cancel'
                        })
                    })
                },
                validate(){
                    if (this.order.date === '' || this.order.hour === '') {
                        return { code : 'error', msg: '请选择时间'}
                    }
    
                    if (this.order.room_id === null) {
                        return { code : 'error', msg: '请选择包房'}
                    }
    
                    if (this.order.mobile === null) {
                        return { code : 'error', msg: '请输入手机号'}
                    }
    
                    if (this.order.username === null || this.order.username === '') {
                        return { code : 'error', msg: '请填写贵姓'}
                    }
    
                    if (this.order.meal === null || this.order.meal === '') {
                        return { code : 'error', msg: '请选择套餐'}
                    }
    
                    if (this.order. people === null || this.order.people === '') {
                        return { code : 'error', msg: '请选择人数'}
                    }
    
                    return {code :'success'}
                },
                showMenu() {
                    this.$http.get('/zhongrong/api/get-meal-package').then((response) => {
                        if (response.data.status == 1) {
                            console.log(response.data)
                            this.$nextTick(() => {
                                this.mealOptions.mealPackages = response.data.data
                                this.mealOptions.show = true
                            })
                        } else {
                            this.$vux.toast.show({
                                text: '加载套餐信息失败',
                                type: 'cancel'
                            })
                        }
                    }).catch((error) => {
                        this.$vux.toast.show({
                            text: '网络出现问题',
                            type: 'cancel'
                        })
                    })
                },
                mealCancel(){
                    this.mealOptions.show = false
                },
                mealConfirm(confirm) {
                    if(confirm){
                        this.order.meal = this.mealOptions.selectedMeal.join(' ')
                    }
                },
                peopleConfirm(confirm) {
                    if(confirm){
                        this.order.people = this.mealOptions.number[0]
                    }
                }
            },
            mounted(){
                this.order.employee_id = document.getElementById('employee-id').value
            },
            components: {
                Grid,
                GridItem,
                GroupTitle,
                InlineCalendar,
                Popup,
                PopupPicker,
                Group,
                Cell,
                PopupHeader,
                XInput,
                XButton,
                Box,
                Divider,
                ButtonTab,
                ButtonTabItem,
                XTable
            }
        }
    </script>
    
    <style lang="scss">
        .room{
            color: #242424;
        }
        .room_active {
            .weui-grid__label{
                color: #09bb07;
            }
            color: #09bb07;
        }
    
        .time-tip{
            float: right;
            color: #00b3ee;
        }
        .meal-package{
            line-height:2.5em;
            color: #00b3ee;
            text-align: center;
    
            > svg{
                vertical-align: sub;
            }
        }
        .meal-content{
            margin: 0px 10px 15px 10px;
        }
        .button-tab{
            margin: 15px 10px;
        }
    </style>
  • 相关阅读:
    java 图片识别文字(中英文混合)
    KeePassXC v2.7.0beta1 翻译文件
    《道经》摘要
    两次取反(!!)的作用
    CBR || VBR || ABR || CVBR
    AVInputFormat AVOutputFormat
    map/set iterators incompatible
    Mysql快速插入千万条数据的实战教程转
    GD32F107RC调试,CAN2不能进入接收中断的原因
    BGFX多线程渲染
  • 原文地址:https://www.cnblogs.com/MR-cui/p/8327806.html
Copyright © 2020-2023  润新知