Как создать приложение для бронирования с помощью Vue?

Управление бронированием – неотъемлемая часть бизнеса в сфере услуг, где составление расписания и привлечение клиентов имеют решающее значение, например в ресторанах.

С помощью Back4app, Twilio API и Vue вы можете создать простое приложение для бронирования столиков в ресторане с такими функциями, как бронирование, получение подтверждающих сообщений и просмотр зарезервированных мест.

В этой статье вы создадите и развернете приложение для бронирования с помощью Vue на передней панели, Back4app для управления бэкендом и развертывания, а также Twilio для связи с пользователями через Whatsapp.

Обзор проекта

В этом руководстве вы создадите простое приложение для бронирования с помощью Vue. Приложение для бронирования будет иметь вид ReservationForm и вид ReservationList.

Гости взаимодействуют с представлением ReservationForm, чтобы ввести данные о своем бронировании, такие как имя, электронная почта, дата, время и номер телефона. Они также видят все сделанные бронирования в представлении ReservationList.

Вы будете использовать следующее:

  • Back4app Backend: Вы создадите бэкэнд Back4app для хранения и управления данными о бронировании из вашего приложения Vue в базе данных.
  • API Twilio: Вы интегрируете Twilio API в свое приложение Vue для отправки подтверждающих сообщений по WhatsApp гостям, забронировавшим номер.
  • Агент искусственного интеллекта Back4pp: Вы создадите четыре облачные функции с помощью агента искусственного интеллекта Back4app, которые вы интегрируете в свое приложение Vue для обработки:
    • Хранение данных о бронировании в базе данных Back4App
    • Проверка доступности даты и времени для резервирования
    • Отправка сообщения об успехе в WhatsApp с помощью Twilio API, сообщающего гостю, что его бронь была сделана.
    • Просмотр уже сделанных гостями бронирований в вашей базе данных.
  • Контейнеры Back4app: Вы развернете свое приложение Vue в контейнере Back4app, чтобы сделать его доступным онлайн.

Создание приложения Vue

В этом разделе мы расскажем вам о том, как настроить среду разработки и создать шаблон приложения для резервирования.

Настройка среды разработки

Чтобы создать приложение Vue, выполните следующую команду в терминале:

npm create vue

Команда выше предложит вам назвать ваше приложение и включить определенные функции для него, например, добавить TypeScript, поддержку JSX и т. д. Выберите “нет” для всех опций, кроме “Vue Router”. Он понадобится вам для навигации между представлениями.

Затем перейдите в созданную директорию и выполните приведенную ниже команду для установки необходимых зависимостей:

npm install

Затем установите Parse SDK, выполнив приведенную ниже команду:

npm install parse

Parse SDK позволяет вам взаимодействовать между вашим приложением Vue и бэкендом Back4app.

После настройки среды разработки приступайте к созданию представлений приложения резервирования.

Создание представлений вашего приложения

Создайте представления ReservationForm и ReservationList в каталоге представлений вашего приложения.

Затем включите маршрутизацию между этими двумя представлениями, добавив приведенный ниже код в файл index.js в каталоге маршрутизатора:

// index.js
import { createRouter, createWebHistory } from "vue-router";
import ReservationForm from "@/views/ReservationForm.vue";

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: "/",
      name: "Home",
      component: ReservationForm,
    },
    {
      path: "/reservations",
      name: "Reservations",
      component: () => import("@/views/ReservationList.vue"),
    },
  ],
});

export default router;

Блок кода выше устанавливает маршрутизацию в вашем приложении Vue. Он определяет маршрут / и маршрут /reservations. Когда гости обращаются к URL-адресу приложения, блок кода направляет их к представлению ReservationForm в качестве маршрута Home.

Маршрут /reservations направляет пользователей к представлению ReservationList. Этот маршрут загружается лениво, то есть ваше приложение загружает его только при необходимости, что помогает повысить производительность приложения.

Далее, чтобы пользователи могли перемещаться между двумя маршрутами, настройте файл App.vue на отображение навигационной панели, показывающей ссылки на маршруты:

//App.vue
<script setup>
import { RouterLink, RouterView } from 'vue-router'
</script>

<template>
  <header>
    <div class="wrapper" id="app">
      <nav>
        <RouterLink to="/">Home</RouterLink>
        <RouterLink to="/reservations">View Reservations</RouterLink>
      </nav>
    </div>
  </header>
  <RouterView />
</template>

Блок кода выше отображает файл App.vue, который выступает в качестве основного макета вашего приложения. Блок кода импортирует компоненты RouterLink и RouterView из библиотеки Vue Router, представляя каждый маршрут компонентом RouterLink.

Компонент RouterLink принимает параметр to prop для указания маршрута, на который направляется ссылка. Компонент RouterView выступает в качестве заполнителя, динамически отображая содержимое текущего маршрута.

В файле ReservationForm.vue добавьте приведенный ниже блок кода, чтобы создать форму для ввода данных о бронировании:

// ReservationForm.vue
<template>
  <div>
    <form>
      <input v-model="reservation.name" placeholder="Name" required />
      <input
        v-model="reservation.email"
        type="email"
        placeholder="Email"
        required
      />
      <input
        v-model="reservation.date"
        type="date"
        placeholder="Date"
        required
      />
      <input
        v-model="reservation.time"
        type="time"
        placeholder="Time"
        required
      />
      <input
        v-model="reservation.phoneNumber"
        type="tel"
        placeholder="Phone Number"
        required
      />
      <button type="submit">Create Reservation</button>
    </form>
  </div>
</template>

<script setup>
import { ref } from "vue";
const reservation = ref({
  name: "",
  email: "",
  date: "",
  time: "",
  phoneNumber: "",
});
</script>

Приведенный выше блок кода создает элемент формы с обязательными полями для ввода различных данных, таких как имя пользователя, электронная почта, дата, время и номер телефона.

В приведенном выше блоке кода создается реактивный объект резервирования для хранения данных о пользователе с помощью функции ref из библиотеки vue.

Затем добавьте следующий блок кода в файл ReservationList.vue, чтобы отобразить список бронирований, сделанных пользователями:

// ReservationList.vue
<template>
  <div>
    <ul v-if="reservations.length" class="wrapper">
      <li
        v-for="reservation in reservations"
        :key="reservation.objectId"
        class="card"
      >
        <p>Name: {{ reservation.name }}</p>
        <p>Date: {{ new Date(reservation.date).toLocaleDateString() }}</p>
        <p>Time: {{ reservation.time }}</p>
        <p>Phone: {{ reservation.phoneNumber }}</p>
      </li>
    </ul>
    <p v-else>No reservations found.</p>
  </div>
</template>

<script setup>
import { ref } from "vue";

const reservations = ref([]);
</script>

В приведенном выше блоке кода используется директива vue условного оператора v-if для отображения существующих бронирований, если таковые имеются.

Если резервирование существует, блок кода с помощью директивы v-for перебирает каждую резервацию в массиве резерваций и отображает сделанные резервации.

Стилизация представлений вашего приложения

Добавьте следующий блок стилей в представление ReservationList, чтобы управлять внешним видом списка и других элементов:

// ReservationList.vue
<style scoped>
h1{
  margin-block-end: 2rem;
}

.card{
  background-color: #D99858;
  display: flex;
  flex-direction: column;
  gap: 1rem;
  border-radius: 12px;
  padding: 2rem;
  align-items: center;
}

li{
  color: #FFFFFF;
}

.wrapper{
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 2rem;
}

div{
  padding-inline-start: 1rem;
}

</style>

Добавьте приведенный ниже блок стилей к представлению ReservationForm, чтобы управлять внешним видом формы:

// ReservationForm.vue
<style scoped>

  form{
    display: flex;
    flex-direction: column;
    gap: 1rem;
    align-items: center;
  }

</style>

Наконец, определите глобальные стили для вашего приложения Vue, добавив следующие CSS-стили в файл main.css в директории assets:

/* main.css */
@import url('<https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap>');

*{
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
body{
  font-family: "Montserrat", sans-serif;
  background-color: #333333;
  color: #FFFFFF;
}
nav {
  padding: 10px;
  display: flex;
  justify-content: space-between;
}
nav a{
  color: inherit;
  text-decoration: none;
  font-weight: 500;
  color: #888888;
  margin-block-end: 3rem;
}
nav a:hover{
  color: #D99858;
}
header{
  padding: 1rem;
}
button {
  background-color: #FFFFFF;
  color: #D99858;
  border: none;
  padding: 0.7rem 0.9rem;
  font-size: 14px;
  border-radius: 7px;
  font-weight: 500;
}
button:hover {
  background-color: #D99858;
  color: #FFFFFF; 
}
input{
  inline-size: 100%;
  border: none;
  border-radius: 5px;
  outline: none;
  padding: 1rem;
  font-family: "Montserrat", sans-serif;
}
.container{
  inline-size: 60%;
  margin: auto;
}

После создания шаблона приложения для бронирования создайте Back4app Backend для хранения информации о бронировании в базе данных.

Создание бэкэнда Back4app

Создание бэкенда на Back4app требует наличия учетной записи Back4app. Если у вас его нет, вы можете зарегистрироваться бесплатно.

Войдите в свою учетную запись и нажмите кнопку “NEW APP” в правом верхнем углу. Это приведет вас на страницу, где вы выберете опцию “Backend as a Service“.

При нажатии кнопки “Backend as a Service” вам будет предложено дать имя экземпляру приложения и выбрать тип базы данных для вашего приложения. Выберите базу данных PostgreSQL и нажмите кнопку “Создать“.

После того как Back4app настроит ваше приложение, вы будете направлены на ваш экземпляр приложения, как показано ниже.

Приборная панель Back4app

Получите “Идентификатор приложения” и “Ключ JavaScript” в разделе “Безопасность и ключи“. Вы можете найти этот раздел, нажав “Настройки приложения” в боковой панели.

Ключи безопасности Back4app

Затем создайте файл .env и добавьте в него “ID приложения” и “Javascript Key“, чтобы загрузить их в качестве переменных окружения в вашем приложении:

VITE_BACK4APP_APPLICATION_ID = <YOUR_APP_ID>
VITE_BACK4APP_JAVASCRIPT_KEY = YOUR_JAVASCRIPT_KEY>

Теперь измените свой файл main.js, чтобы инициализировать Parse в приложении Vue. Например:

//  main.js
import "./assets/main.css";
import { createApp } from "vue";
import App from "./App.vue";
import router from "./router";
import Parse from "parse/dist/parse.min.js";

Parse.initialize(
  `${import.meta.env.VITE_BACK4APP_APPLICATION_ID}`,
  `${import.meta.env.VITE_BACK4APP_JAVASCRIPT_KEY}`,
);

Parse.serverURL = "<https://parseapi.back4app.com/>";

const app = createApp(App);

app.use(router);

app.mount("#app");

Приведенный выше блок кода импортирует и инициализирует Parse SDK в вашем приложении Vue, позволяя вашему приложению взаимодействовать с бэкендом Back4app.

Теперь вам нужно сохранить данные о бронировании в базе данных Back4app. Для хранения данных о бронировании гостя вы создадите класс в своей базе данных с помощью AI-агента Back4app.

В этом классе будут храниться данные о бронировании, такие как имя, электронная почта, дата и т. д.

Создание класса резервирования и облачных функций с помощью агента ИИ

Найдите вкладку “AI Agent” в верхней левой части экрана и передайте агенту нижеприведенную подсказку, чтобы он создал класс в базе данных:

Create database tables in my Back4app app with the following information.

1. Reservation Class:
Class Name: Reservation

Fields:
objectId (String, Automatically generated by Back4App).
name (String, Required)
email (String, Required)
date (Date, Required)
time (String, Required)
phoneNumber (String, Required)

Populate the database tables with test data.

My Parse App ID: <Your Parse App ID>

Вы должны получить ответ, аналогичный приведенному ниже:

Ответ агента ИИ

После успешного создания класса Reservation с полями для хранения данных о бронировании. Вы создадите четыре облачные функции с агентом AI, которые будут взаимодействовать с созданной вами базой данных.

Предложите агенту ИИ следующую команду для создания облачной функции для хранения данных в классе Reservation:

Create a Cloud Code function "createReservation" that takes in necessary 
arguments to create a new reservation in the Reservation class.

Вы должны получить ответ, аналогичный приведенному ниже:

Ответ агента ИИ

После создания функции createReservation подайте агенту AI следующую команду, чтобы проверить доступность даты и времени, которые гость хочет забронировать:

Create a Cloud Code function "checkAvailability" to check the availability of a reserved time and date. Create this second Cloud Code function in the same file.

Вы должны получить ответ, аналогичный приведенному ниже:

Ответ агента ИИ

Отправка сообщений WhatsApp с помощью API WhatsApp от Twilio требует создания и настройки учетной записи Twilio. Twilio предоставляет API, позволяющий пользователям отправлять сообщения Whatsapp из вашего приложения.

Получите SID учетной записи Twilio, токен аутентификации Twilio и номер Whatsapp из своей учетной записи Twilio и предложите агенту ИИ создать облачную функцию sendWhatsAppConfirmation с помощью API Twilio:

Create a Cloud Function with Twilio's WhatsApp API to send a WhatsApp confirmation message. Here are the Twilio account details you will need:
Twilio Account SID: <Your Twilio Account SID>
Auth Token: <Your Twilio Authentication Token>
WhatsApp number: <The Twilio WhatsApp Number>

Вы должны получить ответ, аналогичный приведенному ниже:

Ответ агента ИИ

Затем предложите агенту ИИ создать последнюю облачную функцию для просмотра всех бронирований, хранящихся в базе данных:

Write a cloud code function to view all reservations stored in the database in the same file with the other three cloud functions.

Вы должны получить ответ, аналогичный приведенному ниже:

Ответ агента ИИ

Вы создали все функции, необходимые для вашего приложения, с помощью экземпляра Back4app. Следующим шагом будет интеграция облачных функций на бэкенде Back4app в ваше приложение Vue.

Интеграция облачных функций в приложение Vue

В этом разделе вы узнаете, как интегрировать облачные функции в приложение Vue. Вы можете вызывать облачные функции, определенные на Back4app’s Backend, в своем приложении Vue, выполнив функцию Parse.cloud.run().

Измените блок шаблона в файле ReservationForm.vue, чтобы при отправке формы запускалась функция submitReservation:

// ReservationForm.vue
<template>
  <div>
    <form @submit.prevent="submitReservation">
      // calls the function on form submission
      <input v-model="reservation.name" placeholder="Name" required />
      <input
        v-model="reservation.email"
        type="email"
        placeholder="Email"
        required
      />
      <input
        v-model="reservation.date"
        type="date"
        placeholder="Date"
        required
      />
      <input
        v-model="reservation.time"
        type="time"
        placeholder="Time"
        required
      />
      <input
        v-model="reservation.phoneNumber"
        type="tel"
        placeholder="Phone Number"
        required
      />
      <button type="submit">Create Reservation</button>
    </form>
  </div>
</template>

Далее измените блок сценариев в файле ReservationForm.vue, чтобы определить функцию submitReservation и запустить облачные функции, связанные с отправкой формы:

// ReservationForm.vue
<script setup>
import { ref } from "vue";
import Parse from "parse/dist/parse.min.js";

const reservation = ref({
  name: "",
  email: "",
  date: "",
  time: "",
  phoneNumber: "",
});

const submitReservation = async () => {
  try {
    const availabilityResult = await Parse.Cloud.run("checkAvailability", {
      date: reservation.value.date,
      time: reservation.value.time,
    });

    if (availabilityResult.available) {
      const creationResult = await Parse.Cloud.run("createReservation", {
        ...reservation.value,
        date: {
          __type: "Date",
          iso: new Date(
            reservation.value.date + "T" + reservation.value.time,
          ).toISOString(),
        },
      });

      if (creationResult) {
        await Parse.Cloud.run("sendWhatsAppConfirmation", {
          to: reservation.value.phoneNumber,
          reserveeName: reservation.value.name,
          body: "Your reservation has been confirmed.",
        });

        alert(
          "Reservation created and confirmation has been sent via WhatsApp.",
        );
      }
    } else {
      alert("Sorry, the chosen date and time are not available.");
    }
  } catch (error) {
    console.error("Error creating reservation:", error);
    alert("Error while processing your reservation: " + error.message);
  }
};
</script>

В приведенном выше блоке кода вызывается функция submitReservation для обработки отправки брони.

Сначала функция проверяет доступность выбранных даты и времени, вызывая облачную функцию checkAvailability.

Если указанные дата и время доступны, блок кода вызывает другую облачную функцию, createReservation, для создания бронирования с данными гостя.

Затем блок кода вызывает облачную функцию sendWhatsAppConfirmation для отправки сообщения WhatsApp, чтобы уведомить гостя об успешном бронировании временного интервала.

Далее, чтобы гости могли просматривать все зарезервированные временные интервалы, измените блок сценария в файле ReservationList.vue, чтобы запустить облачную функцию getAllReservations:

// ReservationList.vue
<script setup>
import { ref, onBeforeMount } from "vue";
import Parse from "parse/dist/parse.min.js";

const reservations = ref([]);

const fetchReservations = async () => {
  try {
    const result = await Parse.Cloud.run("getAllReservations");
    reservations.value = result;
  } catch (error) {
    console.error("Error retrieving reservations:", error);
    alert(error.message);
  }
};

onBeforeMount(fetchReservations);
</script>

Блок кода выше вызывает функцию fetchReservations непосредственно перед тем, как Vue смонтирует компонент с помощью функции onBeforeMount vue.

Функция fetchReservations запускает облачную функцию getAllReservations для получения всех бронирований, хранящихся в классе Reservation в базе данных Back4app.

Тестирование приложения

Перед развертыванием приложения в контейнере Back4app протестируйте его, чтобы убедиться в полной функциональности всех функций.

Запустите приложение, выполнив приведенную ниже команду:

npm run dev

Выполнение приведенной выше команды запускает ваше приложение по адресу http://localhost:5173/.

Перейдите на страницу http://localhost:5173/, чтобы просмотреть ваше приложение, как показано на рисунке ниже:

Форма бронирования

Если вы перейдете на вкладку “Просмотр брони“, вы увидите брони, которыми ваш агент AI заполнил базу данных.

Список резервирования по умолчанию

Создайте новую бронь, заполнив форму и нажав кнопку “Создать бронь“.

Создание резервации

Чтобы проверить, успешно ли прошло ваше бронирование, перейдите на вкладку “Просмотр брони“, где вы увидите свою бронь.

Бронирование

Наконец, откройте приложение WhatsApp, чтобы просмотреть сообщение с подтверждением, отправленное на ваш номер WhatsApp.

Подтверждение WhatsApp

Развертывание приложения с агентом искусственного интеллекта Back4app на контейнерах Back4app

Чтобы развернуть приложение в контейнере Back4app, вам нужно создать Dockerfile для вашего приложения Vue.

Создайте Dockerfile в корневом каталоге вашего проекта и добавьте в него блок кода, приведенный ниже:

# Dockerfile

FROM node:18

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

FROM nginx:1.19.0-alpine

COPY --from=0 /app/dist /usr/share/nginx/html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

После создания Dockerfile разместите свой код в репозитории GitHub. Чтобы развернуть приложение с GitHub с помощью агента искусственного интеллекта, Back4app требует установить приложение Back4App Containers GitHub App на вашем аккаунте GitHub.

Вам также нужно будет предоставить приложению необходимые разрешения для доступа к репозиторию кода вашего приложения.

Затем перейдите на домашнюю страницу Back4app и нажмите кнопку “Новое приложение“, расположенную в правом верхнем углу вашего дисплея.

Это приведет вас к экрану настроек, где вам нужно будет выбрать тип приложения, которое вы хотите создать.

Выберите опцию Back4app Agent, как показано на изображении ниже.

Создайте новую домашнюю страницу приложения

Когда вы выберете опцию Back4app Agent, вы будете перенаправлены на страницу агента Back4app AI.

Дайте агенту ИИ указанную ниже подсказку, чтобы начать процесс развертывания приложения:

Deploy my "YOUR_REPOSITORY_URL" repository on GitHub to a Back4App Container.
Here are the required environmental variables:
VITE_BACK4APP_APPLICATION_ID = "BACK4APP_APP_ID"
VITE_BACK4APP_JAVASCRIPT_KEY = "BACK4APP_JAVASCRIPT_KEY"

Замените заполнители их реальными значениями. Вышеприведенная подсказка запустит процесс развертывания.

После завершения агент ИИ ответит, сообщив об успехе или ожидании развертывания. Если вы получили сообщение об ожидании развертывания, вы можете отслеживать статус развертывания вашего приложения на панели контейнера Back4app.

Вы должны получить ответ, аналогичный изображенному ниже:

Ответ агента ИИ

Кроме того, вы можете вручную развернуть свое приложение в контейнере Back4app.

Заключение

В этой статье вы создали и развернули функциональное приложение для бронирования столиков в ресторане, используя Back4app, Vue и API Twilio.

С помощью вашего приложения пользователи могут бронировать места, которые хранятся в вашем бэкенде Back4app. Они могут просматривать сделанные ими бронирования через интерфейсы, созданные Vue и работающие на основе облачного кода Back4app, который вы сгенерировали с помощью агента искусственного интеллекта.

Кроме того, ваше приложение подтверждает успешное бронирование через сообщения WhatsApp с помощью API Twilio.

Полный код, используемый в этом руководстве, вы можете найти на этом репозитории GitHub.


Leave a reply

Your email address will not be published.