Создание приложения для заказа еды Jamstack с помощью Strapi, Gridsome и Snipcart 4/6

Эта статья является гостевой серией великого Ekene Eze . Он возглавляет команду опытных разработчиков в Flutterwave и написал это сообщение в блоге через программу Write for the Community.

В этой серии статей вы познакомитесь с процессами настройки вашего собственного приложения для заказа еды и, как следствие, любого приложения для электронной коммерции с использованием современных инструментов разработки, таких как Strapi, Gridsome и Snipcart.

Содержание: 1. Часть 1 - Создание приложения Strapi и создание продуктов 2. Часть 2 - Настройка проекта Gridsome 3. Часть 3 - Использование продуктов с помощью Gridsome и GraphQL 4. Часть 4 - Создание отдельных представлений продукта с помощью шаблонов Gridsome 5. Часть 5 - Реализация корзины и оформления заказа с помощью Snipcart 6. Часть 6 - Развертывание приложений

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

Создание отображения отдельного продукта с помощью шаблонов Gridsome

На данный момент у нас есть страница со списком продуктов, на которой мы можем просмотреть все продукты. Но нажатие на любой из продуктов приведет к странице 404, как мы видим ниже:

Далее давайте дадим возможность пользователям просматривать страницы продуктов с помощью шаблонов Gridsome. Gridsome использует шаблоны для создания отдельных страниц для нодов в коллекции. Посмотрим, как это работает. В src/templates папке проекта создайте новый файл с именем Product.vue и настройте его так:

<!-- src/templates/Product.vue -->
<template>
  <Layout>
    <template>
      <v-card elevation="0" class="mx-auto center mt-5 mb-3" max-width="900">
        <v-img
          class="white--text align-end"
          height="200px"
          width="300px"
          :src="`http://localhost:1337${this.$page.product.image}`"
        >
        </v-img>
        <v-card-title>{{ this.$page.product.title }}</v-card-title>
        <v-card-text class="text--primary">
          <div>{{ this.$page.product.description }}</div>
        </v-card-text>
        <v-card-subtitle class="pb-0">
          <h3>Instructions</h3>
          {{ this.$page.product.instructions }}
        </v-card-subtitle>
        <v-card-actions>
          <v-btn
            rounded
            outlined
            color="orange"
            text
          >
            Add to cart
          </v-btn>
          <v-spacer></v-spacer>
          <v-rating
            :value="this.$page.product.rating"
            color="amber"
            dense
            half-increments
            readonly
            size="14"
          ></v-rating>
          <span>
            <v-card-title>${{ this.$page.product.price }}</v-card-title>
          </span>
        </v-card-actions>
      </v-card>
    </template>
  </Layout>
</template>

<page-query>
query Products($id: ID!) {
  product(id: $id) {
    id
    title
    image
    description
    price,
    instructions,
    rating
  }
}
</page-query>

<script>
export default {};
</script>

В приведенном выше фрагменте мы создали новый шаблон продукта с одним представлением. В шаблоне мы используем компоненты пользовательского интерфейса Vuetify (card, buttons и т. Д.), чтобы организовать отображения деталей продукта. Наконец, чтобы гарантировать, что мы направляем соответствующий продукт на его эквивалентную страницу сведений, мы пишем, page query, запрос, который будет возвращать сведения об отдельных продуктах с учетом ID идентификатора, который мы передаем в него.

Чтобы обеспечить такое поведение, нам необходимо обновить gridsome.config.js файл в корневом каталоге проекта:

    // gridsome.config.js
    module.exports = {
      siteName: "Gridsome",
      plugins: [],
      templates: {
        Product: "/products/:id",
      },
    };

Вот как настроить шаблоны и маршруты Gridsome. Вы можете узнать больше об этом и других возможных вариантах конфигурации здесь.

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

Теперь, когда у нас есть шаблон и настройка одностраничных маршрутов, давайте для полноты добавим в заголовок элементы навигации «Магазин» и «Поддержка».

Навигация

В Gridsome каждый новый файл, созданный в pages каталоге, автоматически сопоставляется с новым маршрутом. Это означает, что для отображения разных страниц маршрута /shop и маршрута /support все, что нам нужно сделать, это создать эти страницы и заполнить их выбранным содержимым. В моем случае я буду отображать все те же продукты, что и на главной странице /shop, и отображать контактную форму на странице /support. Создайте новый pages/shop.vue файл и обновите его приведенным ниже фрагментом:

    <!-- src/pages/shop.vue -->
    <template>
      <Layout>
        <Products />
      </Layout>
    </template>
    <page-query>
    query{
      products: allProduct{
        edges{
          node{
            id,
            title,
            description,
            rating,
            image,
            price
          }
        }
      }
    }
    </page-query>
    <script>
    import Products from "../components/Products";
    export default {
      components: {
        Products,
      },
    };
    </script>

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

Проделаем то же самое с маршрутом /support , создадим новый pages/support.vue файл. В этом файле мы собираемся отобразить форму, в которой пользователи могут вводить свои вопросы и отправлять их администраторам сайта. Поскольку у меня есть привычка имплементировать валидации в моих формах, я буду использовать их vee-validate для обработки валидаций в форме. Установите его с помощью следующей команды:

npm i vee-validate

Затем откройте support.vue файл и обновите его приведенным ниже фрагментом:

    <!-- src/pages/support.vue -->
    <template>
      <Layout>
        <validation-observer ref="observer">
          <form class="center mb-4 mt-3">
            <h3>Contact us</h3>
            <validation-provider
              v-slot="{ errors }"
              name="Name"
              rules="required|max:10"
            >
              <v-text-field
                v-model="name"
                :counter="10"
                :error-messages="errors"
                label="Name"
                required
              ></v-text-field>
            </validation-provider>
            <validation-provider
              v-slot="{ errors }"
              name="email"
              rules="required|email"
            >
              <v-text-field
                v-model="email"
                :error-messages="errors"
                label="E-mail"
                required
              ></v-text-field>
            </validation-provider>
            <validation-provider v-slot="{ errors }" name="select" rules="required">
              <v-select
                v-model="select"
                :items="items"
                :error-messages="errors"
                label="Query type"
                data-vv-name="select"
                required
              ></v-select>
            </validation-provider>
            <v-textarea
              outlined
              name="input-7-4"
              label="What problem do you have"
              value="Tell us more about the problem"
            ></v-textarea>
            <v-textarea
              outlined
              name="input-7-4"
              label="What's your business like"
              value="Tell us more about your business"
            ></v-textarea>
            <v-btn class="mr-4" @click="submit"> Send </v-btn>
            <v-btn @click="clear"> Clear </v-btn>
          </form>
        </validation-observer>
        <div class="separator"></div>
      </Layout>
    </template>
    <script>
    import { required, email, max } from "vee-validate/dist/rules";
    import {
      extend,
      ValidationObserver,
      ValidationProvider,
      setInteractionMode,
    } from "vee-validate";
    setInteractionMode("eager");
    extend("required", {
      ...required,
      message: "{_field_} can not be empty",
    });
    extend("max", {
      ...max,
      message: "{_field_} may not be greater than {length} characters",
    });
    extend("email", {
      ...email,
      message: "Email must be valid",
    });
    export default {
      components: {
        ValidationProvider,
        ValidationObserver,
      },
      data: () => ({
        name: "",
        email: "",
        select: null,
        errors: null,
        items: ["Orders", "Delivery", "Tech support", "Refund"],
        checkbox: null,
      }),
      methods: {
        submit() {
          this.$refs.observer.validate();
        },
        clear() {
          this.name = "";
          this.email = "";
          this.select = null;
          this.checkbox = null;
          this.$refs.observer.reset();
        },
      },
    };
    </script>
    <style>

    </style>

Мы создали форму с полями для имени клиента, электронной почты и типа запроса. Мы также добавили текстовую область, чтобы пользователь мог предоставить более подробную информацию о своих проблемах. Конечно, это все примеры, и их следует заменить любым контентом, который вы сочтете более подходящим для вашего варианта использования. Если вы новичок vee-validate, это фреймворк на основе Vue.js, который упрощает проверку входных данных формы и отображение ошибок. подробнее об имплементировании валидации здесь.

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

Вывод

В этой части мы смогли создать отдельное отображение продукта с помощью шаблонов Gridsome. Мы также смогли настроить /shop и /support навигацию с соответствующими страницами, отображаемыми в браузере. Мы также использовали vee-validate для обработки проверки ввода формы на странице поддержки. В следующей части мы собираемся добавить функции корзины и оформления заказа в наше приложение Gridsome, чтобы пользователи действительно могли заказывать блюда из нашего ресторана. Увидимся там!

Поделиться Комментарии

Поделиться новостью

comments powered by Disqus